ng-primitives 0.112.2 → 0.112.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -350,6 +350,9 @@ const [NgpMenuStateToken, ngpMenu, injectMenuState, provideMenuState] = createPr
350
350
  ngpFocusTrap({
351
351
  focusOrigin: openOrigin,
352
352
  });
353
+ // Register this element as the overlay outlet so floating-ui positions it correctly,
354
+ // even when this directive is on a nested child component rather than the portal root.
355
+ overlay.registerOutletElement(element.nativeElement);
353
356
  // Host bindings
354
357
  attrBinding(element, 'role', 'menu');
355
358
  attrBinding(element, 'data-placement', overlay.finalPlacement);
@@ -1 +1 @@
1
- {"version":3,"file":"ng-primitives-menu.mjs","sources":["../../../../packages/ng-primitives/menu/src/config/menu-config.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/menu/menu-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item-state.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item.ts","../../../../packages/ng-primitives/menu/src/menu-item-checkbox/menu-item-checkbox-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-checkbox/menu-item-checkbox.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio-group/menu-item-radio-group-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio/menu-item-radio-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-indicator/menu-item-indicator.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio-group/menu-item-radio-group.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio/menu-item-radio.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu/menu.ts","../../../../packages/ng-primitives/menu/src/ng-primitives-menu.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\nimport { NgpFlip, NgpOffset, NgpShift } from 'ng-primitives/portal';\nimport type { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\n\nexport type NgpMenuTriggerType = 'click' | 'hover' | 'focus' | 'enter' | 'arrowkey';\n\nexport interface NgpMenuConfig {\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n offset: NgpOffset;\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n placement: NgpMenuPlacement;\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n flip: NgpFlip;\n\n /**\n * Define the container element or selector in to which the menu should be attached.\n * @default 'body'\n */\n container: HTMLElement | string | null;\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default scroll\n */\n scrollBehavior: 'reposition' | 'block' | 'close';\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n wrap: boolean;\n\n /**\n * Cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n cooldown: number;\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n triggers: NgpMenuTriggerType[];\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n showDelay: number;\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n hideDelay: number;\n}\n\nexport const defaultMenuConfig: NgpMenuConfig = {\n offset: 4,\n placement: 'bottom-start',\n flip: true,\n container: 'body',\n scrollBehavior: 'block',\n shift: undefined,\n wrap: true,\n cooldown: 0,\n triggers: ['click'],\n showDelay: 0,\n hideDelay: 0,\n};\n\nexport const NgpMenuConfigToken = new InjectionToken<NgpMenuConfig>('NgpMenuConfigToken');\n\n/**\n * Provide the default Menu configuration\n * @param config The Menu configuration\n * @returns The provider\n */\nexport function provideMenuConfig(config: Partial<NgpMenuConfig>): Provider[] {\n return [\n {\n provide: NgpMenuConfigToken,\n useValue: { ...defaultMenuConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Menu configuration\n * @returns The global Menu configuration\n */\nexport function injectMenuConfig(): NgpMenuConfig {\n return inject(NgpMenuConfigToken, { optional: true }) ?? defaultMenuConfig;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport {\n computed,\n effect,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n NgpShift,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n} from 'ng-primitives/state';\nimport { NgpMenuTriggerType } from '../config/menu-config';\nimport { NgpMenuPlacement } from './menu-trigger';\n\nexport interface NgpMenuTriggerState<T = unknown> {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The context provided to the menu.\n */\n readonly context: WritableSignal<T>;\n\n /**\n * The focus origin that was used to open the menu.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The new placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The new offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set the context provided to the menu.\n * @param context - The new context\n */\n setContext(context: T): void;\n\n /**\n * Show the menu.\n * @param origin - The focus origin\n */\n show(origin?: FocusOrigin): void;\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void;\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set the menu content.\n * @param menu - The new menu\n */\n setMenu(menu: NgpOverlayContent<any>): void;\n\n /**\n * Set whether the pointer is over the menu content.\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpMenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n /**\n * The container in which the menu should be attached.\n */\n readonly container?: Signal<HTMLElement | string | null>;\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * How the menu behaves when the window is scrolled.\n */\n readonly scrollBehavior?: Signal<'reposition' | 'block' | 'close'>;\n /**\n * Context to provide to the menu.\n */\n readonly context?: Signal<T>;\n /**\n * Cooldown duration in milliseconds.\n */\n readonly cooldown?: Signal<number>;\n\n /**\n * Which trigger types are enabled.\n */\n readonly triggers?: Signal<NgpMenuTriggerType[]>;\n\n /**\n * The delay before showing the menu.\n */\n readonly showDelay?: Signal<number>;\n\n /**\n * The delay before hiding the menu.\n */\n readonly hideDelay?: Signal<number>;\n}\n\nexport const [\n NgpMenuTriggerStateToken,\n ngpMenuTrigger,\n _injectMenuTriggerState,\n provideMenuTriggerState,\n] = createPrimitive(\n 'NgpMenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('bottom-start' as NgpMenuPlacement),\n offset: _offset = signal(4),\n flip: _flip = signal(true),\n context: _context = signal<T>(undefined as T),\n container,\n scrollBehavior,\n cooldown,\n triggers = signal(['click'] as NgpMenuTriggerType[]),\n showDelay = signal(0),\n hideDelay = signal(0),\n }: NgpMenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const directionality = inject(Directionality);\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const offset = controlled(_offset);\n const context = controlled(_context);\n\n // Internal state\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n const closeOrigin = signal<FocusOrigin>('program');\n\n // Track whether pointer is over trigger or content (for hover triggers)\n const pointerOverTrigger = signal(false);\n const pointerOverContent = signal(false);\n const isPointerOverMenuArea = computed(() => pointerOverTrigger() || pointerOverContent());\n\n // Reset pointer tracking when menu closes\n effect(() => {\n const isOpen = open();\n\n // When menu closes, reset pointer tracking state\n if (!isOpen) {\n pointerOverTrigger.set(false);\n pointerOverContent.set(false);\n }\n });\n\n // Computed signal to determine if focus should be restored\n // Only restore if opened via keyboard OR closed via keyboard\n const shouldRestoreFocus = computed(\n () => openOrigin() === 'keyboard' || closeOrigin() === 'keyboard',\n );\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n dataBinding(element, 'data-placement', placement);\n\n // Event listeners - conditionally add based on enabled triggers\n listener(element, 'click', onClick);\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'focus', onFocus);\n listener(element, 'blur', onBlur);\n listener(element, 'keydown', onKeydown);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.() || !triggers().includes('click')) {\n return;\n }\n toggle(event);\n }\n\n function onPointerEnter(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(true);\n\n // If already open, cancel any pending hide\n if (open()) {\n overlay()?.cancelPendingClose();\n return;\n }\n\n show('mouse');\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(false);\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!overlay()) {\n return;\n }\n\n // Use a small delay to allow moving to content\n setTimeout(() => {\n // Only hide if pointer is not over trigger or content\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50); // Small grace period for moving between trigger and content\n }\n\n function onFocus(): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If already open, do nothing\n if (open()) {\n return;\n }\n\n show('keyboard');\n }\n\n function onBlur(event: FocusEvent): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!overlay()) {\n return;\n }\n\n // Check if focus is moving to an element inside the menu\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n if (relatedTarget) {\n const menuElements = overlay()?.getElements() ?? [];\n const isFocusInMenu = menuElements.some(el => el.contains(relatedTarget));\n if (isFocusInMenu) {\n return;\n }\n }\n\n hide();\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (disabled?.()) {\n return;\n }\n\n const enabledTriggers = triggers();\n\n // Handle Enter key - toggle behavior\n if (event.key === 'Enter' && enabledTriggers.includes('enter')) {\n event.preventDefault();\n const origin: FocusOrigin = 'keyboard';\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n return;\n }\n\n // Handle arrow keys - placement-aware\n if (!enabledTriggers.includes('arrowkey')) {\n return;\n }\n\n const isArrowKey =\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight';\n\n if (!isArrowKey) {\n return;\n }\n\n // Get RTL direction\n const isRtl = directionality.value === 'rtl';\n\n // Check if arrow direction matches placement\n const currentPlacement = placement();\n let shouldOpen = false;\n\n if (currentPlacement.startsWith('bottom') && event.key === 'ArrowDown') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('top') && event.key === 'ArrowUp') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('right')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isRightArrow && !isRtl) || (isLeftArrow && isRtl);\n } else if (currentPlacement.startsWith('left')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isLeftArrow && !isRtl) || (isRightArrow && isRtl);\n }\n\n if (shouldOpen && !open()) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // Store the origin used to open the menu\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n const currentOverlay = overlay();\n if (!currentOverlay) {\n return;\n }\n\n // Hide the overlay (this will trigger onClose callback which updates closeOrigin)\n currentOverlay.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n viewContainerRef,\n injector,\n context,\n container: container?.(),\n placement: placement,\n offset: offset(),\n flip: flip(),\n closeOnOutsideClick: true,\n closeOnEscape: true,\n restoreFocus: shouldRestoreFocus,\n onClose: (origin: FocusOrigin) => closeOrigin.set(origin),\n scrollBehaviour: scrollBehavior?.() ?? 'block',\n overlayType: 'menu',\n cooldown: cooldown?.(),\n showDelay: showDelay(),\n hideDelay: hideDelay(),\n };\n\n overlay.set(createOverlay(config));\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setContext(newContext: T): void {\n context.set(newContext);\n }\n\n /**\n * Called by menu content when pointer enters/leaves\n * @internal\n */\n function setPointerOverContent(isOver: boolean): void {\n pointerOverContent.set(isOver);\n\n if (!isOver && open() && triggers().includes('hover')) {\n // Use a small delay to allow pointer to move back to trigger\n setTimeout(() => {\n // Only hide if pointer is not over trigger or content\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50);\n }\n }\n\n return {\n menu: deprecatedSetter(menu, 'setMenu'),\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n context: deprecatedSetter(context, 'setContext'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n setContext,\n setPointerOverContent,\n flip,\n } satisfies NgpMenuTriggerState<T>;\n },\n);\n\nexport function injectMenuTriggerState<T>(): Signal<NgpMenuTriggerState<T>> {\n return _injectMenuTriggerState() as Signal<NgpMenuTriggerState<T>>;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { computed, inject } from '@angular/core';\nimport { ngpFocusTrap } from 'ng-primitives/focus-trap';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { injectOverlay } from 'ng-primitives/portal';\nimport { attrBinding, createPrimitive, listener, styleBinding } from 'ng-primitives/state';\nimport { Subject } from 'rxjs';\nimport { injectMenuTriggerState } from '../menu-trigger/menu-trigger-state';\n\nexport interface NgpMenuState {\n /**\n * Close the menu and any parent menus.\n * @param origin - The focus origin\n */\n closeAllMenus(origin: FocusOrigin): void;\n /**\n * Subject that emits when submenus should be closed.\n * @internal\n */\n readonly closeSubmenus: Subject<HTMLElement>;\n}\n\nexport interface NgpMenuProps {}\n\nexport const [NgpMenuStateToken, ngpMenu, injectMenuState, provideMenuState] = createPrimitive(\n 'NgpMenu',\n ({}: NgpMenuProps) => {\n const element = injectElementRef();\n const overlay = injectOverlay();\n const directionality = inject(Directionality, { optional: true });\n const menuTrigger = injectMenuTriggerState();\n const parentMenu = injectMenuState({ optional: true, skipSelf: true });\n\n // Always trap focus in menus per WAI-ARIA guidelines (Tab should not navigate within menus)\n // Pass the open origin so focus trap uses the correct origin for :focus-visible styling\n const openOrigin = computed(() => menuTrigger()?.openOrigin() ?? 'program');\n ngpFocusTrap({\n focusOrigin: openOrigin,\n });\n\n // Host bindings\n attrBinding(element, 'role', 'menu');\n attrBinding(element, 'data-placement', overlay.finalPlacement);\n attrBinding(element, 'data-overlay', '');\n styleBinding(element, 'left.px', () => overlay.position().x ?? null);\n styleBinding(element, 'top.px', () => overlay.position().y ?? null);\n styleBinding(element, '--ngp-menu-trigger-width.px', overlay.triggerWidth);\n styleBinding(element, '--ngp-menu-transform-origin', overlay.transformOrigin);\n styleBinding(element, '--ngp-menu-available-width.px', overlay.availableWidth);\n styleBinding(element, '--ngp-menu-available-height.px', overlay.availableHeight);\n\n // Event listeners for pointer tracking and keyboard\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'keydown', onKeydown);\n\n // Subject to notify children to close submenus\n const closeSubmenus = new Subject<HTMLElement>();\n\n // Methods\n function onPointerEnter(): void {\n menuTrigger()?.setPointerOverContent(true);\n }\n\n function onPointerLeave(): void {\n menuTrigger()?.setPointerOverContent(false);\n }\n\n function onKeydown(event: KeyboardEvent): void {\n // Handle Escape key - close all menus and restore focus to root trigger\n // We handle this here instead of using overlay's closeOnEscape to ensure\n // proper focus restoration through the closeAllMenus chain\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n closeAllMenus('keyboard');\n return;\n }\n\n // Only handle arrow close keys for top-level menus (no parent submenu)\n // Submenus are handled by menu-item-state via NgpSubmenuTrigger\n if (parentMenu()) {\n return;\n }\n\n const placement = overlay.finalPlacement();\n if (!placement) {\n return;\n }\n\n const isRtl = (directionality?.value ?? 'ltr') === 'rtl';\n\n // Determine which arrow key should close based on placement\n // Note: Only Left/Right arrows close menus (for side-placed menus).\n // Up/Down arrows are reserved for roving focus navigation within the menu.\n let shouldClose = false;\n\n if (placement.startsWith('right')) {\n // Right-placed menu: Left Arrow closes (or Right Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowRight' : 'ArrowLeft');\n } else if (placement.startsWith('left')) {\n // Left-placed menu: Right Arrow closes (or Left Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowLeft' : 'ArrowRight');\n }\n\n if (shouldClose) {\n event.preventDefault();\n event.stopPropagation();\n menuTrigger()?.hide('keyboard');\n }\n }\n\n function closeAllMenus(origin: FocusOrigin): void {\n menuTrigger().hide(origin);\n parentMenu()?.closeAllMenus(origin);\n }\n\n return {\n closeAllMenus,\n closeSubmenus,\n } satisfies NgpMenuState;\n },\n);\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport {\n computed,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n} from 'ng-primitives/state';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { injectMenuState } from '../menu/menu-state';\n\nexport interface NgpSubmenuTriggerState {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The focus origin used to open the submenu.\n * Used by the submenu's focus trap for :focus-visible styling.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Show the menu.\n * @param origin - The focus origin (keyboard, mouse, touch, or program)\n */\n show(origin?: FocusOrigin): void;\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n */\n hide(origin?: FocusOrigin): void;\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set the menu template or component.\n * @param menu - The menu content\n */\n setMenu(menu: NgpOverlayContent<any> | undefined): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The menu placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The menu offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin): void;\n\n /**\n * Set whether the pointer is over the menu content.\n * For submenus, this is a no-op as hover is handled via showSubmenuOnHover.\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpSubmenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n}\n\nexport const [\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n injectSubmenuTriggerState,\n provideSubmenuTriggerState,\n] = createPrimitive(\n 'NgpSubmenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('right-start'),\n offset: _offset = signal(0),\n flip: _flip = signal(true),\n }: NgpSubmenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const parentMenu = injectMenuState({ optional: true });\n const focusMonitor = inject(FocusMonitor);\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const offset = controlled(_offset);\n\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n\n // Subscribe to parent menu's closeSubmenus\n parentMenu()\n ?.closeSubmenus.pipe(safeTakeUntilDestroyed())\n .subscribe(submenuElement => {\n // if the element is not the trigger, we want to close the menu\n if (submenuElement === element.nativeElement) {\n return;\n }\n\n hide('mouse');\n });\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'pointerenter', showSubmenuOnHover);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.()) {\n return;\n }\n toggle(event);\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled, don't show the menu\n if (disabled?.()) {\n return;\n }\n\n // Store the origin used to open the menu (for focus-visible styling in submenu)\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled or the menu is not open, do nothing\n if (disabled?.() || !open()) {\n return;\n }\n\n // Hide the overlay\n overlay()?.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n // Note: restoreFocus is false because submenus should never auto-restore focus.\n // When closeAllMenus is called, the ROOT menu's overlay handles focus restoration.\n // When closing just the submenu (Left Arrow), the caller handles focus explicitly.\n // closeOnEscape is false because we handle Escape in menu-state.ts to ensure\n // proper focus restoration through closeAllMenus.\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n injector,\n placement,\n offset: offset(),\n flip: flip(),\n closeOnOutsideClick: true,\n closeOnEscape: false,\n restoreFocus: false,\n viewContainerRef,\n };\n\n overlay.set(createOverlay(config));\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n\n if ((isRightArrow && !isRtl) || (isLeftArrow && isRtl)) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function showSubmenuOnHover(event: Event): void {\n if (event instanceof PointerEvent === false) {\n return;\n }\n\n // if this was triggered by a touch event, we don't want to show the submenu\n // as it will be shown by the click event - this prevents the submenu from being toggled\n if (event.pointerType === 'touch') {\n return;\n }\n\n show('mouse');\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function focus(origin: FocusOrigin): void {\n focusMonitor.focusVia(element.nativeElement, origin, { preventScroll: true });\n }\n\n // No-op for submenus - hover behavior is handled via showSubmenuOnHover on the trigger element\n\n function setPointerOverContent(_isOver: boolean): void {\n // Submenus don't need pointer tracking on content because:\n // 1. The submenu trigger handles hover via showSubmenuOnHover\n // 2. Closing on hover-out is handled by the parent menu's closeSubmenus mechanism\n }\n\n return {\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n menu: deprecatedSetter(menu, 'setMenu'),\n flip: deprecatedSetter(flip, 'setFlip'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n focus,\n setPointerOverContent,\n } satisfies NgpSubmenuTriggerState;\n },\n);\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { NgpMenuTriggerStateToken } from '../menu-trigger/menu-trigger-state';\nimport {\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n provideSubmenuTriggerState,\n} from './submenu-trigger-state';\n\n@Directive({\n selector: '[ngpSubmenuTrigger]',\n exportAs: 'ngpSubmenuTrigger',\n providers: [\n provideSubmenuTriggerState(),\n // Also provide as NgpMenuTriggerStateToken so the submenu's menu-state\n // can find this trigger's openOrigin for :focus-visible styling\n { provide: NgpMenuTriggerStateToken, useExisting: NgpSubmenuTriggerStateToken },\n ],\n})\nexport class NgpSubmenuTrigger<T = unknown> {\n /**\n * Access the submenu template ref.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpSubmenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpSubmenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'right-start'\n */\n readonly placement = input<NgpMenuPlacement>('right-start', {\n alias: 'ngpSubmenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(0, {\n alias: 'ngpSubmenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(true, {\n alias: 'ngpSubmenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Access the menu trigger state.\n */\n private readonly state = ngpSubmenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n */\n hide(origin: FocusOrigin = 'program'): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin = 'program'): void {\n this.state.focus(origin);\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { inject, Injector, signal, Signal } from '@angular/core';\nimport { ngpButton } from 'ng-primitives/button';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, listener } from 'ng-primitives/state';\nimport { injectMenuState } from '../menu/menu-state';\nimport { NgpSubmenuTrigger } from '../submenu-trigger/submenu-trigger';\n\nexport interface NgpMenuItemState {}\n\nexport interface NgpMenuItemProps {\n /**\n * Whether the menu item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n\n /**\n * Whether the menu should close when this item is selected.\n * @default signal(true)\n */\n readonly closeOnSelect?: Signal<boolean>;\n\n /**\n * The ARIA role for the menu item.\n * @default 'menuitem'\n */\n readonly role?: string;\n}\n\nexport const [NgpMenuItemStateToken, ngpMenuItem, injectMenuItemState, provideMenuItemState] =\n createPrimitive(\n 'NgpMenuItem',\n ({\n disabled = signal(false),\n closeOnSelect = signal(true),\n role = 'menuitem',\n }: NgpMenuItemProps) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const parentMenu = injectMenuState({ optional: true });\n\n ngpButton({ disabled });\n\n // Host bindings\n attrBinding(element, 'role', role);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'mouseenter', showSubmenuOnHover);\n\n // Methods\n function onClick(event: MouseEvent): void {\n // we do this here to avoid circular dependency issues\n const trigger = injector.get(NgpSubmenuTrigger, null, { self: true, optional: true });\n\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if this is a submenu trigger, we don't want to close the menu, we want to open the submenu\n // if closeOnSelect is false, we don't want to close the menu (e.g., checkbox/radio items)\n if (!trigger && closeOnSelect()) {\n parentMenu()?.closeAllMenus(origin);\n }\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n // if there is no parent menu, we don't want to do anything\n const trigger = injector.get(NgpSubmenuTrigger, null, { optional: true, skipSelf: true });\n\n if (!trigger) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isLeftArrow = event.key === 'ArrowLeft';\n const isRightArrow = event.key === 'ArrowRight';\n\n if ((isLeftArrow && !isRtl) || (isRightArrow && isRtl)) {\n event.preventDefault();\n\n if (trigger) {\n trigger.hide('keyboard');\n // Explicitly focus the submenu trigger since submenus have restoreFocus: false\n trigger.focus('keyboard');\n }\n }\n }\n\n function showSubmenuOnHover(): void {\n parentMenu()?.closeSubmenus.next(element.nativeElement);\n }\n\n return {} satisfies NgpMenuItemState;\n },\n );\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItem, provideMenuItemState } from './menu-item-state';\n\n/**\n * The `NgpMenuItem` directive represents a menu item.\n */\n@Directive({\n selector: '[ngpMenuItem]',\n exportAs: 'ngpMenuItem',\n providers: [provideMenuItemState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItem {\n /** Whether the menu item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemDisabled',\n transform: booleanAttribute,\n });\n\n /** Whether the menu should close when this item is selected */\n readonly closeOnSelect = input<boolean, BooleanInput>(true, {\n alias: 'ngpMenuItemCloseOnSelect',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItem({ disabled: this.disabled, closeOnSelect: this.closeOnSelect });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n emitter,\n listener,\n} from 'ng-primitives/state';\nimport { Observable } from 'rxjs';\nimport { ngpMenuItem } from '../menu-item/menu-item-state';\n\nexport interface NgpMenuItemCheckboxState {\n /**\n * Whether the checkbox is checked.\n */\n readonly checked: Signal<boolean>;\n\n /**\n * Emits when the checked state changes.\n */\n readonly checkedChange: Observable<boolean>;\n\n /**\n * Toggle the checkbox value.\n */\n toggle(): void;\n}\n\nexport interface NgpMenuItemCheckboxProps {\n /**\n * Whether the checkbox is checked.\n */\n readonly checked?: Signal<boolean>;\n\n /**\n * Whether the checkbox is disabled.\n */\n readonly disabled?: Signal<boolean>;\n\n /**\n * Callback fired when the checked state changes.\n */\n readonly onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const [\n NgpMenuItemCheckboxStateToken,\n ngpMenuItemCheckbox,\n injectMenuItemCheckboxState,\n provideMenuItemCheckboxState,\n] = createPrimitive(\n 'NgpMenuItemCheckbox',\n ({\n checked: _checked = signal(false),\n disabled = signal(false),\n onCheckedChange,\n }: NgpMenuItemCheckboxProps): NgpMenuItemCheckboxState => {\n const element = injectElementRef();\n const checked = controlled(_checked);\n const checkedChange = emitter<boolean>();\n\n // Use base menu item behavior but don't close on select\n ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemcheckbox' });\n\n // Host bindings\n attrBinding(element, 'aria-checked', checked);\n dataBinding(element, 'data-checked', checked);\n\n // Toggle on click\n listener(element, 'click', () => toggle());\n\n function toggle(): void {\n if (disabled()) {\n return;\n }\n\n const nextChecked = !checked();\n checked.set(nextChecked);\n onCheckedChange?.(nextChecked);\n checkedChange.emit(nextChecked);\n }\n\n return {\n checked,\n checkedChange: checkedChange.asObservable(),\n toggle,\n } satisfies NgpMenuItemCheckboxState;\n },\n);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, output } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItemCheckbox, provideMenuItemCheckboxState } from './menu-item-checkbox-state';\n\n/**\n * The `NgpMenuItemCheckbox` directive represents a menu item that can be toggled on and off.\n */\n@Directive({\n selector: '[ngpMenuItemCheckbox]',\n exportAs: 'ngpMenuItemCheckbox',\n providers: [provideMenuItemCheckboxState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItemCheckbox {\n /** Whether the checkbox is checked */\n readonly checked = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemCheckboxChecked',\n transform: booleanAttribute,\n });\n\n /** Event emitted when the checked state changes */\n readonly checkedChange = output<boolean>({\n alias: 'ngpMenuItemCheckboxCheckedChange',\n });\n\n /** Whether the menu item checkbox is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemCheckboxDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItemCheckbox({\n checked: this.checked,\n disabled: this.disabled,\n onCheckedChange: value => this.checkedChange.emit(value),\n });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, controlled, createPrimitive, emitter } from 'ng-primitives/state';\nimport { Observable } from 'rxjs';\n\nexport interface NgpMenuItemRadioGroupState {\n /**\n * The current value of the radio group.\n */\n readonly value: Signal<string | null>;\n\n /**\n * Emits when the value changes.\n */\n readonly valueChange: Observable<string>;\n\n /**\n * Select a radio item by value.\n */\n select(value: string): void;\n}\n\nexport interface NgpMenuItemRadioGroupProps {\n /**\n * The current value of the radio group.\n */\n readonly value?: Signal<string | null>;\n\n /**\n * Callback fired when the value changes.\n */\n readonly onValueChange?: (value: string) => void;\n}\n\nexport const [\n NgpMenuItemRadioGroupStateToken,\n ngpMenuItemRadioGroup,\n injectMenuItemRadioGroupState,\n provideMenuItemRadioGroupState,\n] = createPrimitive(\n 'NgpMenuItemRadioGroup',\n ({\n value: _value = signal(null),\n onValueChange,\n }: NgpMenuItemRadioGroupProps): NgpMenuItemRadioGroupState => {\n const element = injectElementRef();\n const value = controlled(_value);\n const valueChange = emitter<string>();\n\n // Host bindings\n attrBinding(element, 'role', 'group');\n\n function select(newValue: string): void {\n if (value() === newValue) {\n return;\n }\n\n value.set(newValue);\n onValueChange?.(newValue);\n valueChange.emit(newValue);\n }\n\n return {\n value,\n valueChange: valueChange.asObservable(),\n select,\n } satisfies NgpMenuItemRadioGroupState;\n },\n);\n","import { computed, Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, dataBinding, listener } from 'ng-primitives/state';\nimport { injectMenuItemRadioGroupState } from '../menu-item-radio-group/menu-item-radio-group-state';\nimport { ngpMenuItem } from '../menu-item/menu-item-state';\n\nexport interface NgpMenuItemRadioState {\n /**\n * Whether the radio item is checked.\n */\n readonly checked: Signal<boolean>;\n}\n\nexport interface NgpMenuItemRadioProps {\n /**\n * The value this radio item represents.\n */\n readonly value: Signal<string>;\n\n /**\n * Whether the radio item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n}\n\nexport const [\n NgpMenuItemRadioStateToken,\n ngpMenuItemRadio,\n injectMenuItemRadioState,\n provideMenuItemRadioState,\n] = createPrimitive(\n 'NgpMenuItemRadio',\n ({ value, disabled = signal(false) }: NgpMenuItemRadioProps): NgpMenuItemRadioState => {\n const element = injectElementRef();\n const radioGroup = injectMenuItemRadioGroupState();\n\n // Use base menu item behavior but don't close on select\n ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemradio' });\n\n // Computed checked state\n const checked = computed(() => radioGroup()?.value() === value());\n\n // Host bindings\n attrBinding(element, 'aria-checked', checked);\n dataBinding(element, 'data-checked', checked);\n\n // Select on click\n listener(element, 'click', () => {\n if (disabled()) {\n return;\n }\n radioGroup()?.select(value());\n });\n\n return {\n checked,\n } satisfies NgpMenuItemRadioState;\n },\n);\n","import { computed, Directive } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { dataBinding } from 'ng-primitives/state';\nimport { injectMenuItemCheckboxState } from '../menu-item-checkbox/menu-item-checkbox-state';\nimport { injectMenuItemRadioState } from '../menu-item-radio/menu-item-radio-state';\n\n/**\n * The `NgpMenuItemIndicator` directive renders inside a checkbox or radio menu item\n * and exposes `data-checked` based on the parent item's checked state.\n */\n@Directive({\n selector: '[ngpMenuItemIndicator]',\n exportAs: 'ngpMenuItemIndicator',\n})\nexport class NgpMenuItemIndicator {\n constructor() {\n const element = injectElementRef();\n const checkboxState = injectMenuItemCheckboxState({ optional: true });\n const radioState = injectMenuItemRadioState({ optional: true });\n\n const checked = computed(() => checkboxState()?.checked() ?? radioState()?.checked() ?? false);\n\n dataBinding(element, 'data-checked', checked);\n }\n}\n","import { Directive, input, output } from '@angular/core';\nimport {\n ngpMenuItemRadioGroup,\n provideMenuItemRadioGroupState,\n} from './menu-item-radio-group-state';\n\n/**\n * The `NgpMenuItemRadioGroup` directive represents a group of radio menu items.\n */\n@Directive({\n selector: '[ngpMenuItemRadioGroup]',\n exportAs: 'ngpMenuItemRadioGroup',\n providers: [provideMenuItemRadioGroupState()],\n})\nexport class NgpMenuItemRadioGroup {\n /** The current value of the radio group */\n readonly value = input<string | null>(null, {\n alias: 'ngpMenuItemRadioGroupValue',\n });\n\n /** Event emitted when the value changes */\n readonly valueChange = output<string>({\n alias: 'ngpMenuItemRadioGroupValueChange',\n });\n\n constructor() {\n ngpMenuItemRadioGroup({\n value: this.value,\n onValueChange: value => this.valueChange.emit(value),\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItemRadio, provideMenuItemRadioState } from './menu-item-radio-state';\n\n/**\n * The `NgpMenuItemRadio` directive represents a radio menu item within a radio group.\n */\n@Directive({\n selector: '[ngpMenuItemRadio]',\n exportAs: 'ngpMenuItemRadio',\n providers: [provideMenuItemRadioState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItemRadio {\n /** The value this radio item represents */\n readonly value = input.required<string>({\n alias: 'ngpMenuItemRadioValue',\n });\n\n /** Whether the radio item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemRadioDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItemRadio({ value: this.value, disabled: this.disabled });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, numberAttribute, Signal } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n coerceShift,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n NgpShift,\n NgpShiftInput,\n} from 'ng-primitives/portal';\nimport { injectMenuConfig, NgpMenuTriggerType } from '../config/menu-config';\nimport { ngpMenuTrigger, provideMenuTriggerState } from './menu-trigger-state';\n\n/**\n * The `NgpMenuTrigger` directive allows you to turn an element into a menu trigger.\n */\n@Directive({\n selector: '[ngpMenuTrigger]',\n exportAs: 'ngpMenuTrigger',\n providers: [provideMenuTriggerState()],\n})\nexport class NgpMenuTrigger<T = unknown> {\n /**\n * Access the global menu configuration.\n */\n private readonly config = injectMenuConfig();\n\n /**\n * Access the menu template ref or ComponentType.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpMenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n readonly placement = input<NgpMenuPlacement>(this.config.placement, {\n alias: 'ngpMenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(this.config.offset, {\n alias: 'ngpMenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(this.config.flip, {\n alias: 'ngpMenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift = input<NgpShift, NgpShiftInput>(this.config.shift, {\n alias: 'ngpMenuTriggerShift',\n transform: coerceShift,\n });\n\n /**\n * Define the container in which the menu should be attached.\n * @default document.body\n */\n readonly container = input<HTMLElement | string | null>(this.config.container, {\n alias: 'ngpMenuTriggerContainer',\n });\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default 'block'\n */\n readonly scrollBehavior = input<'reposition' | 'block' | 'close'>(this.config.scrollBehavior, {\n alias: 'ngpMenuTriggerScrollBehavior',\n });\n\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n readonly cooldown = input<number, NumberInput>(this.config.cooldown, {\n alias: 'ngpMenuTriggerCooldown',\n transform: numberAttribute,\n });\n\n /**\n * Provide context to the menu. This can be used to pass data to the menu content.\n */\n readonly context = input<T>(undefined, {\n alias: 'ngpMenuTriggerContext',\n });\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n readonly triggers = input<NgpMenuTriggerType[]>(this.config.triggers, {\n alias: 'ngpMenuTriggerOpenTriggers',\n });\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n readonly showDelay = input<number, NumberInput>(this.config.showDelay, {\n alias: 'ngpMenuTriggerShowDelay',\n transform: numberAttribute,\n });\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n readonly hideDelay = input<number, NumberInput>(this.config.hideDelay, {\n alias: 'ngpMenuTriggerHideDelay',\n transform: numberAttribute,\n });\n\n /**\n * The menu trigger state.\n */\n private readonly state = ngpMenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n shift: this.shift(),\n container: this.container,\n scrollBehavior: this.scrollBehavior,\n cooldown: this.cooldown,\n context: this.context as Signal<T>,\n triggers: this.triggers,\n showDelay: this.showDelay,\n hideDelay: this.hideDelay,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n}\n\nexport type NgpMenuPlacement =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-start'\n | 'top-end'\n | 'right-start'\n | 'right-end'\n | 'bottom-start'\n | 'bottom-end'\n | 'left-start'\n | 'left-end';\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { provideFocusTrapState } from 'ng-primitives/focus-trap';\nimport { ngpRovingFocusGroup, provideRovingFocusGroupState } from 'ng-primitives/roving-focus';\nimport { injectMenuConfig } from '../config/menu-config';\nimport { ngpMenu, provideMenuState } from './menu-state';\n\n/**\n * The `NgpMenu` is a container for menu items.\n */\n@Directive({\n selector: '[ngpMenu]',\n exportAs: 'ngpMenu',\n providers: [\n // ensure we don't inherit the focus group from the parent menu if there is one\n provideRovingFocusGroupState({ inherit: false }),\n provideMenuState({ inherit: false }),\n provideFocusTrapState(),\n ],\n})\nexport class NgpMenu {\n private readonly config = injectMenuConfig();\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n readonly wrap = input<boolean, BooleanInput>(this.config.wrap, {\n alias: 'ngpMenuWrap',\n transform: booleanAttribute,\n });\n\n private readonly state = ngpMenu({ wrap: this.wrap });\n\n constructor() {\n ngpRovingFocusGroup({ inherit: false, wrap: this.wrap });\n }\n\n /** @internal Close the menu and any parent menus */\n closeAllMenus(origin: FocusOrigin): void {\n this.state.closeAllMenus(origin);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-primitives-menu.mjs","sources":["../../../../packages/ng-primitives/menu/src/config/menu-config.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/menu/menu-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger-state.ts","../../../../packages/ng-primitives/menu/src/submenu-trigger/submenu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item-state.ts","../../../../packages/ng-primitives/menu/src/menu-item/menu-item.ts","../../../../packages/ng-primitives/menu/src/menu-item-checkbox/menu-item-checkbox-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-checkbox/menu-item-checkbox.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio-group/menu-item-radio-group-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio/menu-item-radio-state.ts","../../../../packages/ng-primitives/menu/src/menu-item-indicator/menu-item-indicator.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio-group/menu-item-radio-group.ts","../../../../packages/ng-primitives/menu/src/menu-item-radio/menu-item-radio.ts","../../../../packages/ng-primitives/menu/src/menu-trigger/menu-trigger.ts","../../../../packages/ng-primitives/menu/src/menu/menu.ts","../../../../packages/ng-primitives/menu/src/ng-primitives-menu.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\nimport { NgpFlip, NgpOffset, NgpShift } from 'ng-primitives/portal';\nimport type { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\n\nexport type NgpMenuTriggerType = 'click' | 'hover' | 'focus' | 'enter' | 'arrowkey';\n\nexport interface NgpMenuConfig {\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n offset: NgpOffset;\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n placement: NgpMenuPlacement;\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n flip: NgpFlip;\n\n /**\n * Define the container element or selector in to which the menu should be attached.\n * @default 'body'\n */\n container: HTMLElement | string | null;\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default scroll\n */\n scrollBehavior: 'reposition' | 'block' | 'close';\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n wrap: boolean;\n\n /**\n * Cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n cooldown: number;\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n triggers: NgpMenuTriggerType[];\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n showDelay: number;\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n hideDelay: number;\n}\n\nexport const defaultMenuConfig: NgpMenuConfig = {\n offset: 4,\n placement: 'bottom-start',\n flip: true,\n container: 'body',\n scrollBehavior: 'block',\n shift: undefined,\n wrap: true,\n cooldown: 0,\n triggers: ['click'],\n showDelay: 0,\n hideDelay: 0,\n};\n\nexport const NgpMenuConfigToken = new InjectionToken<NgpMenuConfig>('NgpMenuConfigToken');\n\n/**\n * Provide the default Menu configuration\n * @param config The Menu configuration\n * @returns The provider\n */\nexport function provideMenuConfig(config: Partial<NgpMenuConfig>): Provider[] {\n return [\n {\n provide: NgpMenuConfigToken,\n useValue: { ...defaultMenuConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Menu configuration\n * @returns The global Menu configuration\n */\nexport function injectMenuConfig(): NgpMenuConfig {\n return inject(NgpMenuConfigToken, { optional: true }) ?? defaultMenuConfig;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport {\n computed,\n effect,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n NgpShift,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n} from 'ng-primitives/state';\nimport { NgpMenuTriggerType } from '../config/menu-config';\nimport { NgpMenuPlacement } from './menu-trigger';\n\nexport interface NgpMenuTriggerState<T = unknown> {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The context provided to the menu.\n */\n readonly context: WritableSignal<T>;\n\n /**\n * The focus origin that was used to open the menu.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The new placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The new offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set the context provided to the menu.\n * @param context - The new context\n */\n setContext(context: T): void;\n\n /**\n * Show the menu.\n * @param origin - The focus origin\n */\n show(origin?: FocusOrigin): void;\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void;\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set the menu content.\n * @param menu - The new menu\n */\n setMenu(menu: NgpOverlayContent<any>): void;\n\n /**\n * Set whether the pointer is over the menu content.\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpMenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n /**\n * The container in which the menu should be attached.\n */\n readonly container?: Signal<HTMLElement | string | null>;\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * How the menu behaves when the window is scrolled.\n */\n readonly scrollBehavior?: Signal<'reposition' | 'block' | 'close'>;\n /**\n * Context to provide to the menu.\n */\n readonly context?: Signal<T>;\n /**\n * Cooldown duration in milliseconds.\n */\n readonly cooldown?: Signal<number>;\n\n /**\n * Which trigger types are enabled.\n */\n readonly triggers?: Signal<NgpMenuTriggerType[]>;\n\n /**\n * The delay before showing the menu.\n */\n readonly showDelay?: Signal<number>;\n\n /**\n * The delay before hiding the menu.\n */\n readonly hideDelay?: Signal<number>;\n}\n\nexport const [\n NgpMenuTriggerStateToken,\n ngpMenuTrigger,\n _injectMenuTriggerState,\n provideMenuTriggerState,\n] = createPrimitive(\n 'NgpMenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('bottom-start' as NgpMenuPlacement),\n offset: _offset = signal(4),\n flip: _flip = signal(true),\n context: _context = signal<T>(undefined as T),\n container,\n scrollBehavior,\n cooldown,\n triggers = signal(['click'] as NgpMenuTriggerType[]),\n showDelay = signal(0),\n hideDelay = signal(0),\n }: NgpMenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const directionality = inject(Directionality);\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const offset = controlled(_offset);\n const context = controlled(_context);\n\n // Internal state\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n const closeOrigin = signal<FocusOrigin>('program');\n\n // Track whether pointer is over trigger or content (for hover triggers)\n const pointerOverTrigger = signal(false);\n const pointerOverContent = signal(false);\n const isPointerOverMenuArea = computed(() => pointerOverTrigger() || pointerOverContent());\n\n // Reset pointer tracking when menu closes\n effect(() => {\n const isOpen = open();\n\n // When menu closes, reset pointer tracking state\n if (!isOpen) {\n pointerOverTrigger.set(false);\n pointerOverContent.set(false);\n }\n });\n\n // Computed signal to determine if focus should be restored\n // Only restore if opened via keyboard OR closed via keyboard\n const shouldRestoreFocus = computed(\n () => openOrigin() === 'keyboard' || closeOrigin() === 'keyboard',\n );\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n dataBinding(element, 'data-placement', placement);\n\n // Event listeners - conditionally add based on enabled triggers\n listener(element, 'click', onClick);\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'focus', onFocus);\n listener(element, 'blur', onBlur);\n listener(element, 'keydown', onKeydown);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.() || !triggers().includes('click')) {\n return;\n }\n toggle(event);\n }\n\n function onPointerEnter(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(true);\n\n // If already open, cancel any pending hide\n if (open()) {\n overlay()?.cancelPendingClose();\n return;\n }\n\n show('mouse');\n }\n\n function onPointerLeave(event: PointerEvent): void {\n if (disabled?.() || !triggers().includes('hover')) {\n return;\n }\n\n // Don't trigger on touch events\n if (event.pointerType === 'touch') {\n return;\n }\n\n pointerOverTrigger.set(false);\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!overlay()) {\n return;\n }\n\n // Use a small delay to allow moving to content\n setTimeout(() => {\n // Only hide if pointer is not over trigger or content\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50); // Small grace period for moving between trigger and content\n }\n\n function onFocus(): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If already open, do nothing\n if (open()) {\n return;\n }\n\n show('keyboard');\n }\n\n function onBlur(event: FocusEvent): void {\n if (disabled?.() || !triggers().includes('focus')) {\n return;\n }\n\n // If the overlay hasn't been created, there's nothing to cancel\n if (!overlay()) {\n return;\n }\n\n // Check if focus is moving to an element inside the menu\n const relatedTarget = event.relatedTarget as HTMLElement | null;\n if (relatedTarget) {\n const menuElements = overlay()?.getElements() ?? [];\n const isFocusInMenu = menuElements.some(el => el.contains(relatedTarget));\n if (isFocusInMenu) {\n return;\n }\n }\n\n hide();\n }\n\n function onKeydown(event: KeyboardEvent): void {\n if (disabled?.()) {\n return;\n }\n\n const enabledTriggers = triggers();\n\n // Handle Enter key - toggle behavior\n if (event.key === 'Enter' && enabledTriggers.includes('enter')) {\n event.preventDefault();\n const origin: FocusOrigin = 'keyboard';\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n return;\n }\n\n // Handle arrow keys - placement-aware\n if (!enabledTriggers.includes('arrowkey')) {\n return;\n }\n\n const isArrowKey =\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown' ||\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight';\n\n if (!isArrowKey) {\n return;\n }\n\n // Get RTL direction\n const isRtl = directionality.value === 'rtl';\n\n // Check if arrow direction matches placement\n const currentPlacement = placement();\n let shouldOpen = false;\n\n if (currentPlacement.startsWith('bottom') && event.key === 'ArrowDown') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('top') && event.key === 'ArrowUp') {\n shouldOpen = true;\n } else if (currentPlacement.startsWith('right')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isRightArrow && !isRtl) || (isLeftArrow && isRtl);\n } else if (currentPlacement.startsWith('left')) {\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n shouldOpen = (isLeftArrow && !isRtl) || (isRightArrow && isRtl);\n }\n\n if (shouldOpen && !open()) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // Store the origin used to open the menu\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n const currentOverlay = overlay();\n if (!currentOverlay) {\n return;\n }\n\n // Hide the overlay (this will trigger onClose callback which updates closeOrigin)\n currentOverlay.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n viewContainerRef,\n injector,\n context,\n container: container?.(),\n placement: placement,\n offset: offset(),\n flip: flip(),\n closeOnOutsideClick: true,\n closeOnEscape: true,\n restoreFocus: shouldRestoreFocus,\n onClose: (origin: FocusOrigin) => closeOrigin.set(origin),\n scrollBehaviour: scrollBehavior?.() ?? 'block',\n overlayType: 'menu',\n cooldown: cooldown?.(),\n showDelay: showDelay(),\n hideDelay: hideDelay(),\n };\n\n overlay.set(createOverlay(config));\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setContext(newContext: T): void {\n context.set(newContext);\n }\n\n /**\n * Called by menu content when pointer enters/leaves\n * @internal\n */\n function setPointerOverContent(isOver: boolean): void {\n pointerOverContent.set(isOver);\n\n if (!isOver && open() && triggers().includes('hover')) {\n // Use a small delay to allow pointer to move back to trigger\n setTimeout(() => {\n // Only hide if pointer is not over trigger or content\n if (!isPointerOverMenuArea()) {\n hide();\n }\n }, 50);\n }\n }\n\n return {\n menu: deprecatedSetter(menu, 'setMenu'),\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n context: deprecatedSetter(context, 'setContext'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n setContext,\n setPointerOverContent,\n flip,\n } satisfies NgpMenuTriggerState<T>;\n },\n);\n\nexport function injectMenuTriggerState<T>(): Signal<NgpMenuTriggerState<T>> {\n return _injectMenuTriggerState() as Signal<NgpMenuTriggerState<T>>;\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { computed, inject } from '@angular/core';\nimport { ngpFocusTrap } from 'ng-primitives/focus-trap';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { injectOverlay } from 'ng-primitives/portal';\nimport { attrBinding, createPrimitive, listener, styleBinding } from 'ng-primitives/state';\nimport { Subject } from 'rxjs';\nimport { injectMenuTriggerState } from '../menu-trigger/menu-trigger-state';\n\nexport interface NgpMenuState {\n /**\n * Close the menu and any parent menus.\n * @param origin - The focus origin\n */\n closeAllMenus(origin: FocusOrigin): void;\n /**\n * Subject that emits when submenus should be closed.\n * @internal\n */\n readonly closeSubmenus: Subject<HTMLElement>;\n}\n\nexport interface NgpMenuProps {}\n\nexport const [NgpMenuStateToken, ngpMenu, injectMenuState, provideMenuState] = createPrimitive(\n 'NgpMenu',\n ({}: NgpMenuProps) => {\n const element = injectElementRef();\n const overlay = injectOverlay();\n const directionality = inject(Directionality, { optional: true });\n const menuTrigger = injectMenuTriggerState();\n const parentMenu = injectMenuState({ optional: true, skipSelf: true });\n\n // Always trap focus in menus per WAI-ARIA guidelines (Tab should not navigate within menus)\n // Pass the open origin so focus trap uses the correct origin for :focus-visible styling\n const openOrigin = computed(() => menuTrigger()?.openOrigin() ?? 'program');\n ngpFocusTrap({\n focusOrigin: openOrigin,\n });\n\n // Register this element as the overlay outlet so floating-ui positions it correctly,\n // even when this directive is on a nested child component rather than the portal root.\n overlay.registerOutletElement(element.nativeElement);\n\n // Host bindings\n attrBinding(element, 'role', 'menu');\n attrBinding(element, 'data-placement', overlay.finalPlacement);\n attrBinding(element, 'data-overlay', '');\n styleBinding(element, 'left.px', () => overlay.position().x ?? null);\n styleBinding(element, 'top.px', () => overlay.position().y ?? null);\n styleBinding(element, '--ngp-menu-trigger-width.px', overlay.triggerWidth);\n styleBinding(element, '--ngp-menu-transform-origin', overlay.transformOrigin);\n styleBinding(element, '--ngp-menu-available-width.px', overlay.availableWidth);\n styleBinding(element, '--ngp-menu-available-height.px', overlay.availableHeight);\n\n // Event listeners for pointer tracking and keyboard\n listener(element, 'pointerenter', onPointerEnter);\n listener(element, 'pointerleave', onPointerLeave);\n listener(element, 'keydown', onKeydown);\n\n // Subject to notify children to close submenus\n const closeSubmenus = new Subject<HTMLElement>();\n\n // Methods\n function onPointerEnter(): void {\n menuTrigger()?.setPointerOverContent(true);\n }\n\n function onPointerLeave(): void {\n menuTrigger()?.setPointerOverContent(false);\n }\n\n function onKeydown(event: KeyboardEvent): void {\n // Handle Escape key - close all menus and restore focus to root trigger\n // We handle this here instead of using overlay's closeOnEscape to ensure\n // proper focus restoration through the closeAllMenus chain\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n closeAllMenus('keyboard');\n return;\n }\n\n // Only handle arrow close keys for top-level menus (no parent submenu)\n // Submenus are handled by menu-item-state via NgpSubmenuTrigger\n if (parentMenu()) {\n return;\n }\n\n const placement = overlay.finalPlacement();\n if (!placement) {\n return;\n }\n\n const isRtl = (directionality?.value ?? 'ltr') === 'rtl';\n\n // Determine which arrow key should close based on placement\n // Note: Only Left/Right arrows close menus (for side-placed menus).\n // Up/Down arrows are reserved for roving focus navigation within the menu.\n let shouldClose = false;\n\n if (placement.startsWith('right')) {\n // Right-placed menu: Left Arrow closes (or Right Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowRight' : 'ArrowLeft');\n } else if (placement.startsWith('left')) {\n // Left-placed menu: Right Arrow closes (or Left Arrow in RTL)\n shouldClose = event.key === (isRtl ? 'ArrowLeft' : 'ArrowRight');\n }\n\n if (shouldClose) {\n event.preventDefault();\n event.stopPropagation();\n menuTrigger()?.hide('keyboard');\n }\n }\n\n function closeAllMenus(origin: FocusOrigin): void {\n menuTrigger().hide(origin);\n parentMenu()?.closeAllMenus(origin);\n }\n\n return {\n closeAllMenus,\n closeSubmenus,\n } satisfies NgpMenuState;\n },\n);\n","import { FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport {\n computed,\n inject,\n Injector,\n signal,\n Signal,\n ViewContainerRef,\n WritableSignal,\n} from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n} from 'ng-primitives/state';\nimport { safeTakeUntilDestroyed } from 'ng-primitives/utils';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { injectMenuState } from '../menu/menu-state';\n\nexport interface NgpSubmenuTriggerState {\n /**\n * The menu template or component.\n */\n readonly menu: WritableSignal<NgpOverlayContent<any> | undefined>;\n\n /**\n * The computed placement of the menu.\n */\n readonly placement: WritableSignal<NgpMenuPlacement>;\n\n /**\n * Whether the menu is open.\n */\n readonly open: Signal<boolean>;\n\n /**\n * The offset of the menu.\n */\n readonly offset: WritableSignal<NgpOffset>;\n\n /**\n * The disabled state of the trigger.\n */\n readonly disabled: WritableSignal<boolean>;\n\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip: WritableSignal<NgpFlip>;\n\n /**\n * The focus origin used to open the submenu.\n * Used by the submenu's focus trap for :focus-visible styling.\n * @internal\n */\n readonly openOrigin: Signal<FocusOrigin>;\n\n /**\n * Show the menu.\n * @param origin - The focus origin (keyboard, mouse, touch, or program)\n */\n show(origin?: FocusOrigin): void;\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n */\n hide(origin?: FocusOrigin): void;\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void;\n\n /**\n * Set whether the trigger is disabled.\n * @param isDisabled - Whether the trigger is disabled\n */\n setDisabled(isDisabled: boolean): void;\n\n /**\n * Set the menu template or component.\n * @param menu - The menu content\n */\n setMenu(menu: NgpOverlayContent<any> | undefined): void;\n\n /**\n * Set the placement of the menu.\n * @param placement - The menu placement\n */\n setPlacement(placement: NgpMenuPlacement): void;\n\n /**\n * Set the offset of the menu.\n * @param offset - The menu offset\n */\n setOffset(offset: NgpOffset): void;\n\n /**\n * Set whether the menu should flip when there is not enough space.\n * @param shouldFlip - Whether the menu should flip\n */\n setFlip(shouldFlip: NgpFlip): void;\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin): void;\n\n /**\n * Set whether the pointer is over the menu content.\n * For submenus, this is a no-op as hover is handled via showSubmenuOnHover.\n * @param isOver - Whether the pointer is over the content\n * @internal\n */\n setPointerOverContent(isOver: boolean): void;\n}\n\nexport interface NgpSubmenuTriggerProps<T = unknown> {\n /**\n * Whether the trigger is disabled.\n */\n readonly disabled?: Signal<boolean>;\n /**\n * The menu template or component.\n */\n readonly menu?: Signal<NgpOverlayContent<T> | undefined>;\n /**\n * The placement of the menu.\n */\n readonly placement?: Signal<NgpMenuPlacement>;\n /**\n * The offset of the menu.\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Whether the menu should flip when there is not enough space.\n */\n readonly flip?: Signal<NgpFlip>;\n}\n\nexport const [\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n injectSubmenuTriggerState,\n provideSubmenuTriggerState,\n] = createPrimitive(\n 'NgpSubmenuTrigger',\n <T>({\n disabled: _disabled = signal(false),\n menu: _menu = signal<NgpOverlayContent<T> | undefined>(undefined),\n placement: _placement = signal('right-start'),\n offset: _offset = signal(0),\n flip: _flip = signal(true),\n }: NgpSubmenuTriggerProps<T>) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const parentMenu = injectMenuState({ optional: true });\n const focusMonitor = inject(FocusMonitor);\n\n // Controlled properties\n const menu = controlled(_menu);\n const disabled = controlled(_disabled);\n const placement = controlled(_placement);\n const flip = controlled(_flip);\n const offset = controlled(_offset);\n\n const overlay = signal<NgpOverlay<T> | null>(null);\n const open = computed(() => overlay()?.isOpen() ?? false);\n const openOrigin = signal<FocusOrigin>('program');\n\n // Subscribe to parent menu's closeSubmenus\n parentMenu()\n ?.closeSubmenus.pipe(safeTakeUntilDestroyed())\n .subscribe(submenuElement => {\n // if the element is not the trigger, we want to close the menu\n if (submenuElement === element.nativeElement) {\n return;\n }\n\n hide('mouse');\n });\n\n // Host bindings\n attrBinding(element, 'aria-haspopup', 'true');\n attrBinding(element, 'aria-expanded', open);\n dataBinding(element, 'data-open', open);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'pointerenter', showSubmenuOnHover);\n\n // Methods\n function onClick(event: MouseEvent): void {\n if (disabled?.()) {\n return;\n }\n toggle(event);\n }\n\n function toggle(event: MouseEvent): void {\n // determine the origin of the event, 0 is keyboard, 1 is mouse\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if the menu is open then hide it\n if (open()) {\n hide(origin);\n } else {\n show(origin);\n }\n }\n\n function show(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled, don't show the menu\n if (disabled?.()) {\n return;\n }\n\n // Store the origin used to open the menu (for focus-visible styling in submenu)\n openOrigin.set(origin);\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n // Show the overlay\n overlay()?.show();\n }\n\n function hide(origin: FocusOrigin = 'program'): void {\n // If the trigger is disabled or the menu is not open, do nothing\n if (disabled?.() || !open()) {\n return;\n }\n\n // Hide the overlay\n overlay()?.hide({ origin });\n }\n\n function createOverlayInstance(): void {\n const menuContent = menu?.();\n\n if (!menuContent) {\n throw new Error('Menu must be either a TemplateRef or a ComponentType');\n }\n\n // Create config for the overlay\n // Note: restoreFocus is false because submenus should never auto-restore focus.\n // When closeAllMenus is called, the ROOT menu's overlay handles focus restoration.\n // When closing just the submenu (Left Arrow), the caller handles focus explicitly.\n // closeOnEscape is false because we handle Escape in menu-state.ts to ensure\n // proper focus restoration through closeAllMenus.\n const config: NgpOverlayConfig<T> = {\n content: menuContent,\n triggerElement: element.nativeElement,\n injector,\n placement,\n offset: offset(),\n flip: flip(),\n closeOnOutsideClick: true,\n closeOnEscape: false,\n restoreFocus: false,\n viewContainerRef,\n };\n\n overlay.set(createOverlay(config));\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isRightArrow = event.key === 'ArrowRight';\n const isLeftArrow = event.key === 'ArrowLeft';\n\n if ((isRightArrow && !isRtl) || (isLeftArrow && isRtl)) {\n event.preventDefault();\n show('keyboard');\n }\n }\n\n function showSubmenuOnHover(event: Event): void {\n if (event instanceof PointerEvent === false) {\n return;\n }\n\n // if this was triggered by a touch event, we don't want to show the submenu\n // as it will be shown by the click event - this prevents the submenu from being toggled\n if (event.pointerType === 'touch') {\n return;\n }\n\n show('mouse');\n }\n\n function setDisabled(isDisabled: boolean): void {\n disabled.set(isDisabled);\n\n if (isDisabled && open()) {\n hide();\n }\n }\n\n function setMenu(newMenu: NgpOverlayContent<T> | undefined): void {\n menu.set(newMenu);\n }\n\n function setPlacement(newPlacement: NgpMenuPlacement): void {\n placement.set(newPlacement);\n }\n\n function setOffset(newOffset: NgpOffset): void {\n offset.set(newOffset);\n }\n\n function setFlip(shouldFlip: NgpFlip): void {\n flip.set(shouldFlip);\n }\n\n function focus(origin: FocusOrigin): void {\n focusMonitor.focusVia(element.nativeElement, origin, { preventScroll: true });\n }\n\n // No-op for submenus - hover behavior is handled via showSubmenuOnHover on the trigger element\n\n function setPointerOverContent(_isOver: boolean): void {\n // Submenus don't need pointer tracking on content because:\n // 1. The submenu trigger handles hover via showSubmenuOnHover\n // 2. Closing on hover-out is handled by the parent menu's closeSubmenus mechanism\n }\n\n return {\n placement: deprecatedSetter(placement, 'setPlacement'),\n offset: deprecatedSetter(offset, 'setOffset'),\n disabled: deprecatedSetter(disabled, 'setDisabled'),\n menu: deprecatedSetter(menu, 'setMenu'),\n flip: deprecatedSetter(flip, 'setFlip'),\n open,\n openOrigin,\n show,\n hide,\n toggle,\n setDisabled,\n setMenu,\n setFlip,\n setPlacement,\n setOffset,\n focus,\n setPointerOverContent,\n } satisfies NgpSubmenuTriggerState;\n },\n);\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n} from 'ng-primitives/portal';\nimport { NgpMenuPlacement } from '../menu-trigger/menu-trigger';\nimport { NgpMenuTriggerStateToken } from '../menu-trigger/menu-trigger-state';\nimport {\n NgpSubmenuTriggerStateToken,\n ngpSubmenuTrigger,\n provideSubmenuTriggerState,\n} from './submenu-trigger-state';\n\n@Directive({\n selector: '[ngpSubmenuTrigger]',\n exportAs: 'ngpSubmenuTrigger',\n providers: [\n provideSubmenuTriggerState(),\n // Also provide as NgpMenuTriggerStateToken so the submenu's menu-state\n // can find this trigger's openOrigin for :focus-visible styling\n { provide: NgpMenuTriggerStateToken, useExisting: NgpSubmenuTriggerStateToken },\n ],\n})\nexport class NgpSubmenuTrigger<T = unknown> {\n /**\n * Access the submenu template ref.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpSubmenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpSubmenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'right-start'\n */\n readonly placement = input<NgpMenuPlacement>('right-start', {\n alias: 'ngpSubmenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(0, {\n alias: 'ngpSubmenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(true, {\n alias: 'ngpSubmenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Access the menu trigger state.\n */\n private readonly state = ngpSubmenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n */\n hide(origin: FocusOrigin = 'program'): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n\n /**\n * Focus the trigger element.\n * @param origin - The focus origin\n */\n focus(origin: FocusOrigin = 'program'): void {\n this.state.focus(origin);\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { inject, Injector, signal, Signal } from '@angular/core';\nimport { ngpButton } from 'ng-primitives/button';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, listener } from 'ng-primitives/state';\nimport { injectMenuState } from '../menu/menu-state';\nimport { NgpSubmenuTrigger } from '../submenu-trigger/submenu-trigger';\n\nexport interface NgpMenuItemState {}\n\nexport interface NgpMenuItemProps {\n /**\n * Whether the menu item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n\n /**\n * Whether the menu should close when this item is selected.\n * @default signal(true)\n */\n readonly closeOnSelect?: Signal<boolean>;\n\n /**\n * The ARIA role for the menu item.\n * @default 'menuitem'\n */\n readonly role?: string;\n}\n\nexport const [NgpMenuItemStateToken, ngpMenuItem, injectMenuItemState, provideMenuItemState] =\n createPrimitive(\n 'NgpMenuItem',\n ({\n disabled = signal(false),\n closeOnSelect = signal(true),\n role = 'menuitem',\n }: NgpMenuItemProps) => {\n const element = injectElementRef();\n const injector = inject(Injector);\n const parentMenu = injectMenuState({ optional: true });\n\n ngpButton({ disabled });\n\n // Host bindings\n attrBinding(element, 'role', role);\n\n // Event listeners\n listener(element, 'click', onClick);\n listener(element, 'keydown', handleArrowKey);\n listener(element, 'mouseenter', showSubmenuOnHover);\n\n // Methods\n function onClick(event: MouseEvent): void {\n // we do this here to avoid circular dependency issues\n const trigger = injector.get(NgpSubmenuTrigger, null, { self: true, optional: true });\n\n const origin: FocusOrigin = event.detail === 0 ? 'keyboard' : 'mouse';\n\n // if this is a submenu trigger, we don't want to close the menu, we want to open the submenu\n // if closeOnSelect is false, we don't want to close the menu (e.g., checkbox/radio items)\n if (!trigger && closeOnSelect()) {\n parentMenu()?.closeAllMenus(origin);\n }\n }\n\n function handleArrowKey(event: Event): void {\n if (event instanceof KeyboardEvent === false) {\n return;\n }\n\n // if there is no parent menu, we don't want to do anything\n const trigger = injector.get(NgpSubmenuTrigger, null, { optional: true, skipSelf: true });\n\n if (!trigger) {\n return;\n }\n\n const direction = getComputedStyle(element.nativeElement).direction;\n const isRtl = direction === 'rtl';\n\n const isLeftArrow = event.key === 'ArrowLeft';\n const isRightArrow = event.key === 'ArrowRight';\n\n if ((isLeftArrow && !isRtl) || (isRightArrow && isRtl)) {\n event.preventDefault();\n\n if (trigger) {\n trigger.hide('keyboard');\n // Explicitly focus the submenu trigger since submenus have restoreFocus: false\n trigger.focus('keyboard');\n }\n }\n }\n\n function showSubmenuOnHover(): void {\n parentMenu()?.closeSubmenus.next(element.nativeElement);\n }\n\n return {} satisfies NgpMenuItemState;\n },\n );\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItem, provideMenuItemState } from './menu-item-state';\n\n/**\n * The `NgpMenuItem` directive represents a menu item.\n */\n@Directive({\n selector: '[ngpMenuItem]',\n exportAs: 'ngpMenuItem',\n providers: [provideMenuItemState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItem {\n /** Whether the menu item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemDisabled',\n transform: booleanAttribute,\n });\n\n /** Whether the menu should close when this item is selected */\n readonly closeOnSelect = input<boolean, BooleanInput>(true, {\n alias: 'ngpMenuItemCloseOnSelect',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItem({ disabled: this.disabled, closeOnSelect: this.closeOnSelect });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n emitter,\n listener,\n} from 'ng-primitives/state';\nimport { Observable } from 'rxjs';\nimport { ngpMenuItem } from '../menu-item/menu-item-state';\n\nexport interface NgpMenuItemCheckboxState {\n /**\n * Whether the checkbox is checked.\n */\n readonly checked: Signal<boolean>;\n\n /**\n * Emits when the checked state changes.\n */\n readonly checkedChange: Observable<boolean>;\n\n /**\n * Toggle the checkbox value.\n */\n toggle(): void;\n}\n\nexport interface NgpMenuItemCheckboxProps {\n /**\n * Whether the checkbox is checked.\n */\n readonly checked?: Signal<boolean>;\n\n /**\n * Whether the checkbox is disabled.\n */\n readonly disabled?: Signal<boolean>;\n\n /**\n * Callback fired when the checked state changes.\n */\n readonly onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const [\n NgpMenuItemCheckboxStateToken,\n ngpMenuItemCheckbox,\n injectMenuItemCheckboxState,\n provideMenuItemCheckboxState,\n] = createPrimitive(\n 'NgpMenuItemCheckbox',\n ({\n checked: _checked = signal(false),\n disabled = signal(false),\n onCheckedChange,\n }: NgpMenuItemCheckboxProps): NgpMenuItemCheckboxState => {\n const element = injectElementRef();\n const checked = controlled(_checked);\n const checkedChange = emitter<boolean>();\n\n // Use base menu item behavior but don't close on select\n ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemcheckbox' });\n\n // Host bindings\n attrBinding(element, 'aria-checked', checked);\n dataBinding(element, 'data-checked', checked);\n\n // Toggle on click\n listener(element, 'click', () => toggle());\n\n function toggle(): void {\n if (disabled()) {\n return;\n }\n\n const nextChecked = !checked();\n checked.set(nextChecked);\n onCheckedChange?.(nextChecked);\n checkedChange.emit(nextChecked);\n }\n\n return {\n checked,\n checkedChange: checkedChange.asObservable(),\n toggle,\n } satisfies NgpMenuItemCheckboxState;\n },\n);\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, output } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItemCheckbox, provideMenuItemCheckboxState } from './menu-item-checkbox-state';\n\n/**\n * The `NgpMenuItemCheckbox` directive represents a menu item that can be toggled on and off.\n */\n@Directive({\n selector: '[ngpMenuItemCheckbox]',\n exportAs: 'ngpMenuItemCheckbox',\n providers: [provideMenuItemCheckboxState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItemCheckbox {\n /** Whether the checkbox is checked */\n readonly checked = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemCheckboxChecked',\n transform: booleanAttribute,\n });\n\n /** Event emitted when the checked state changes */\n readonly checkedChange = output<boolean>({\n alias: 'ngpMenuItemCheckboxCheckedChange',\n });\n\n /** Whether the menu item checkbox is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemCheckboxDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItemCheckbox({\n checked: this.checked,\n disabled: this.disabled,\n onCheckedChange: value => this.checkedChange.emit(value),\n });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, controlled, createPrimitive, emitter } from 'ng-primitives/state';\nimport { Observable } from 'rxjs';\n\nexport interface NgpMenuItemRadioGroupState {\n /**\n * The current value of the radio group.\n */\n readonly value: Signal<string | null>;\n\n /**\n * Emits when the value changes.\n */\n readonly valueChange: Observable<string>;\n\n /**\n * Select a radio item by value.\n */\n select(value: string): void;\n}\n\nexport interface NgpMenuItemRadioGroupProps {\n /**\n * The current value of the radio group.\n */\n readonly value?: Signal<string | null>;\n\n /**\n * Callback fired when the value changes.\n */\n readonly onValueChange?: (value: string) => void;\n}\n\nexport const [\n NgpMenuItemRadioGroupStateToken,\n ngpMenuItemRadioGroup,\n injectMenuItemRadioGroupState,\n provideMenuItemRadioGroupState,\n] = createPrimitive(\n 'NgpMenuItemRadioGroup',\n ({\n value: _value = signal(null),\n onValueChange,\n }: NgpMenuItemRadioGroupProps): NgpMenuItemRadioGroupState => {\n const element = injectElementRef();\n const value = controlled(_value);\n const valueChange = emitter<string>();\n\n // Host bindings\n attrBinding(element, 'role', 'group');\n\n function select(newValue: string): void {\n if (value() === newValue) {\n return;\n }\n\n value.set(newValue);\n onValueChange?.(newValue);\n valueChange.emit(newValue);\n }\n\n return {\n value,\n valueChange: valueChange.asObservable(),\n select,\n } satisfies NgpMenuItemRadioGroupState;\n },\n);\n","import { computed, Signal, signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { attrBinding, createPrimitive, dataBinding, listener } from 'ng-primitives/state';\nimport { injectMenuItemRadioGroupState } from '../menu-item-radio-group/menu-item-radio-group-state';\nimport { ngpMenuItem } from '../menu-item/menu-item-state';\n\nexport interface NgpMenuItemRadioState {\n /**\n * Whether the radio item is checked.\n */\n readonly checked: Signal<boolean>;\n}\n\nexport interface NgpMenuItemRadioProps {\n /**\n * The value this radio item represents.\n */\n readonly value: Signal<string>;\n\n /**\n * Whether the radio item is disabled.\n */\n readonly disabled?: Signal<boolean>;\n}\n\nexport const [\n NgpMenuItemRadioStateToken,\n ngpMenuItemRadio,\n injectMenuItemRadioState,\n provideMenuItemRadioState,\n] = createPrimitive(\n 'NgpMenuItemRadio',\n ({ value, disabled = signal(false) }: NgpMenuItemRadioProps): NgpMenuItemRadioState => {\n const element = injectElementRef();\n const radioGroup = injectMenuItemRadioGroupState();\n\n // Use base menu item behavior but don't close on select\n ngpMenuItem({ disabled, closeOnSelect: signal(false), role: 'menuitemradio' });\n\n // Computed checked state\n const checked = computed(() => radioGroup()?.value() === value());\n\n // Host bindings\n attrBinding(element, 'aria-checked', checked);\n dataBinding(element, 'data-checked', checked);\n\n // Select on click\n listener(element, 'click', () => {\n if (disabled()) {\n return;\n }\n radioGroup()?.select(value());\n });\n\n return {\n checked,\n } satisfies NgpMenuItemRadioState;\n },\n);\n","import { computed, Directive } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { dataBinding } from 'ng-primitives/state';\nimport { injectMenuItemCheckboxState } from '../menu-item-checkbox/menu-item-checkbox-state';\nimport { injectMenuItemRadioState } from '../menu-item-radio/menu-item-radio-state';\n\n/**\n * The `NgpMenuItemIndicator` directive renders inside a checkbox or radio menu item\n * and exposes `data-checked` based on the parent item's checked state.\n */\n@Directive({\n selector: '[ngpMenuItemIndicator]',\n exportAs: 'ngpMenuItemIndicator',\n})\nexport class NgpMenuItemIndicator {\n constructor() {\n const element = injectElementRef();\n const checkboxState = injectMenuItemCheckboxState({ optional: true });\n const radioState = injectMenuItemRadioState({ optional: true });\n\n const checked = computed(() => checkboxState()?.checked() ?? radioState()?.checked() ?? false);\n\n dataBinding(element, 'data-checked', checked);\n }\n}\n","import { Directive, input, output } from '@angular/core';\nimport {\n ngpMenuItemRadioGroup,\n provideMenuItemRadioGroupState,\n} from './menu-item-radio-group-state';\n\n/**\n * The `NgpMenuItemRadioGroup` directive represents a group of radio menu items.\n */\n@Directive({\n selector: '[ngpMenuItemRadioGroup]',\n exportAs: 'ngpMenuItemRadioGroup',\n providers: [provideMenuItemRadioGroupState()],\n})\nexport class NgpMenuItemRadioGroup {\n /** The current value of the radio group */\n readonly value = input<string | null>(null, {\n alias: 'ngpMenuItemRadioGroupValue',\n });\n\n /** Event emitted when the value changes */\n readonly valueChange = output<string>({\n alias: 'ngpMenuItemRadioGroupValueChange',\n });\n\n constructor() {\n ngpMenuItemRadioGroup({\n value: this.value,\n onValueChange: value => this.valueChange.emit(value),\n });\n }\n}\n","import { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { ngpRovingFocusItem, provideRovingFocusItemState } from 'ng-primitives/roving-focus';\nimport { ngpMenuItemRadio, provideMenuItemRadioState } from './menu-item-radio-state';\n\n/**\n * The `NgpMenuItemRadio` directive represents a radio menu item within a radio group.\n */\n@Directive({\n selector: '[ngpMenuItemRadio]',\n exportAs: 'ngpMenuItemRadio',\n providers: [provideMenuItemRadioState(), provideRovingFocusItemState()],\n})\nexport class NgpMenuItemRadio {\n /** The value this radio item represents */\n readonly value = input.required<string>({\n alias: 'ngpMenuItemRadioValue',\n });\n\n /** Whether the radio item is disabled */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuItemRadioDisabled',\n transform: booleanAttribute,\n });\n\n constructor() {\n ngpMenuItemRadio({ value: this.value, disabled: this.disabled });\n ngpRovingFocusItem({ disabled: this.disabled });\n }\n}\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, numberAttribute, Signal } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n coerceShift,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n NgpShift,\n NgpShiftInput,\n} from 'ng-primitives/portal';\nimport { injectMenuConfig, NgpMenuTriggerType } from '../config/menu-config';\nimport { ngpMenuTrigger, provideMenuTriggerState } from './menu-trigger-state';\n\n/**\n * The `NgpMenuTrigger` directive allows you to turn an element into a menu trigger.\n */\n@Directive({\n selector: '[ngpMenuTrigger]',\n exportAs: 'ngpMenuTrigger',\n providers: [provideMenuTriggerState()],\n})\nexport class NgpMenuTrigger<T = unknown> {\n /**\n * Access the global menu configuration.\n */\n private readonly config = injectMenuConfig();\n\n /**\n * Access the menu template ref or ComponentType.\n */\n readonly menu = input<NgpOverlayContent<T>>(undefined, {\n alias: 'ngpMenuTrigger',\n });\n\n /**\n * Define if the trigger should be disabled.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpMenuTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the menu relative to the trigger.\n * @default 'bottom-start'\n */\n readonly placement = input<NgpMenuPlacement>(this.config.placement, {\n alias: 'ngpMenuTriggerPlacement',\n });\n\n /**\n * Define the offset of the menu relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(this.config.offset, {\n alias: 'ngpMenuTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define whether the menu should flip when there is not enough space for the menu.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(this.config.flip, {\n alias: 'ngpMenuTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Configure shift behavior to keep the menu in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift = input<NgpShift, NgpShiftInput>(this.config.shift, {\n alias: 'ngpMenuTriggerShift',\n transform: coerceShift,\n });\n\n /**\n * Define the container in which the menu should be attached.\n * @default document.body\n */\n readonly container = input<HTMLElement | string | null>(this.config.container, {\n alias: 'ngpMenuTriggerContainer',\n });\n\n /**\n * Defines how the menu behaves when the window is scrolled.\n * @default 'block'\n */\n readonly scrollBehavior = input<'reposition' | 'block' | 'close'>(this.config.scrollBehavior, {\n alias: 'ngpMenuTriggerScrollBehavior',\n });\n\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one menu to another within this duration,\n * the showDelay is skipped for the new menu.\n * @default 0\n */\n readonly cooldown = input<number, NumberInput>(this.config.cooldown, {\n alias: 'ngpMenuTriggerCooldown',\n transform: numberAttribute,\n });\n\n /**\n * Provide context to the menu. This can be used to pass data to the menu content.\n */\n readonly context = input<T>(undefined, {\n alias: 'ngpMenuTriggerContext',\n });\n\n /**\n * Define which trigger types are enabled for the menu.\n * @default ['click']\n */\n readonly triggers = input<NgpMenuTriggerType[]>(this.config.triggers, {\n alias: 'ngpMenuTriggerOpenTriggers',\n });\n\n /**\n * Define the delay before the menu is displayed (hover/focus triggers).\n * @default 0\n */\n readonly showDelay = input<number, NumberInput>(this.config.showDelay, {\n alias: 'ngpMenuTriggerShowDelay',\n transform: numberAttribute,\n });\n\n /**\n * Define the delay before the menu is hidden (hover/focus triggers).\n * @default 0\n */\n readonly hideDelay = input<number, NumberInput>(this.config.hideDelay, {\n alias: 'ngpMenuTriggerHideDelay',\n transform: numberAttribute,\n });\n\n /**\n * The menu trigger state.\n */\n private readonly state = ngpMenuTrigger<T>({\n disabled: this.disabled,\n menu: this.menu,\n placement: this.placement,\n offset: this.offset,\n flip: this.flip,\n shift: this.shift(),\n container: this.container,\n scrollBehavior: this.scrollBehavior,\n cooldown: this.cooldown,\n context: this.context as Signal<T>,\n triggers: this.triggers,\n showDelay: this.showDelay,\n hideDelay: this.hideDelay,\n });\n\n /**\n * Show the menu.\n */\n show(): void {\n this.state.show();\n }\n\n /**\n * Hide the menu.\n * @param origin - The focus origin\n * @internal\n */\n hide(origin?: FocusOrigin): void {\n this.state.hide(origin);\n }\n\n /**\n * Toggle the menu.\n * @param event - The mouse event\n */\n toggle(event: MouseEvent): void {\n this.state.toggle(event);\n }\n}\n\nexport type NgpMenuPlacement =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-start'\n | 'top-end'\n | 'right-start'\n | 'right-end'\n | 'bottom-start'\n | 'bottom-end'\n | 'left-start'\n | 'left-end';\n","import { FocusOrigin } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input } from '@angular/core';\nimport { provideFocusTrapState } from 'ng-primitives/focus-trap';\nimport { ngpRovingFocusGroup, provideRovingFocusGroupState } from 'ng-primitives/roving-focus';\nimport { injectMenuConfig } from '../config/menu-config';\nimport { ngpMenu, provideMenuState } from './menu-state';\n\n/**\n * The `NgpMenu` is a container for menu items.\n */\n@Directive({\n selector: '[ngpMenu]',\n exportAs: 'ngpMenu',\n providers: [\n // ensure we don't inherit the focus group from the parent menu if there is one\n provideRovingFocusGroupState({ inherit: false }),\n provideMenuState({ inherit: false }),\n provideFocusTrapState(),\n ],\n})\nexport class NgpMenu {\n private readonly config = injectMenuConfig();\n\n /**\n * Whether focus should wrap around when reaching the end of the menu.\n * @default true\n */\n readonly wrap = input<boolean, BooleanInput>(this.config.wrap, {\n alias: 'ngpMenuWrap',\n transform: booleanAttribute,\n });\n\n private readonly state = ngpMenu({ wrap: this.wrap });\n\n constructor() {\n ngpRovingFocusGroup({ inherit: false, wrap: this.wrap });\n }\n\n /** @internal Close the menu and any parent menus */\n closeAllMenus(origin: FocusOrigin): void {\n this.state.closeAllMenus(origin);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -603,6 +603,8 @@ class NgpOverlay {
603
603
  this.childOverlays = new Set();
604
604
  /** Signal tracking the portal instance */
605
605
  this.portal = signal(null, ...(ngDevMode ? [{ debugName: "portal" }] : []));
606
+ /** The dedicated outlet element registered by the overlay directive (e.g. NgpMenu) */
607
+ this.registeredOutletElement = null;
606
608
  /** Signal tracking the overlay position */
607
609
  this.position = signal({
608
610
  x: undefined,
@@ -808,8 +810,7 @@ class NgpOverlay {
808
810
  // Restore the portal
809
811
  this.portal.set(portal);
810
812
  // Re-setup positioning
811
- const elements = portal.getElements();
812
- const outletElement = elements.find(el => el.hasAttribute('data-overlay')) ?? elements[0];
813
+ const outletElement = this.findOutletElement(portal);
813
814
  if (outletElement) {
814
815
  this.setupPositioning(outletElement);
815
816
  }
@@ -947,13 +948,12 @@ class NgpOverlay {
947
948
  if (!portal) {
948
949
  return;
949
950
  }
950
- const elements = portal.getElements();
951
- if (elements.length === 0) {
951
+ const outletElement = this.findOutletElement(portal);
952
+ if (!outletElement) {
952
953
  return;
953
954
  }
954
- const overlayElement = elements[0];
955
955
  // Compute new position
956
- this.computePosition(overlayElement);
956
+ this.computePosition(outletElement);
957
957
  }
958
958
  /**
959
959
  * Completely destroy this overlay instance
@@ -969,6 +969,37 @@ class NgpOverlay {
969
969
  getElements() {
970
970
  return this.portal()?.getElements() ?? [];
971
971
  }
972
+ /**
973
+ * Register the dedicated outlet element for positioning.
974
+ * Called by overlay directives (e.g. NgpMenu) during construction to ensure
975
+ * the correct element is used for floating-ui positioning, even when the
976
+ * directive is on a nested child component rather than the portal root.
977
+ * @internal
978
+ */
979
+ registerOutletElement(element) {
980
+ this.registeredOutletElement = element;
981
+ // If positioning is already set up with the wrong element, re-setup with the correct one
982
+ if (this.isOpen() && this.disposePositioning) {
983
+ this.disposePositioning();
984
+ this.setupPositioning(element);
985
+ }
986
+ }
987
+ /**
988
+ * Find the dedicated outlet element within the portal.
989
+ * Uses the registered outlet element if available, otherwise looks for an element
990
+ * with `data-overlay` attribute on the portal root elements.
991
+ * Falls back to the first portal element if no dedicated outlet is found.
992
+ */
993
+ findOutletElement(portal) {
994
+ if (this.registeredOutletElement) {
995
+ return this.registeredOutletElement;
996
+ }
997
+ const elements = portal.getElements();
998
+ if (elements.length === 0) {
999
+ return null;
1000
+ }
1001
+ return elements.find(el => el.hasAttribute('data-overlay')) ?? elements[0];
1002
+ }
972
1003
  /**
973
1004
  * Register a child overlay for outside click detection.
974
1005
  * @internal
@@ -1038,7 +1069,7 @@ class NgpOverlay {
1038
1069
  // find a dedicated outlet element
1039
1070
  // this is the element that has the `data-overlay` attribute
1040
1071
  // if no such element exists, we use the first element in the portal
1041
- const outletElement = portal.getElements().find(el => el.hasAttribute('data-overlay')) ?? portal.getElements()[0];
1072
+ const outletElement = this.findOutletElement(portal);
1042
1073
  if (!outletElement) {
1043
1074
  throw new Error('Overlay element is not available.');
1044
1075
  }
@@ -1190,6 +1221,7 @@ class NgpOverlay {
1190
1221
  // (not before the await) so they remain valid if destruction is cancelled.
1191
1222
  if (this.destroyingPortal === portal) {
1192
1223
  this.destroyingPortal = null;
1224
+ this.registeredOutletElement = null;
1193
1225
  this.isOpen.set(false);
1194
1226
  this.finalPlacement.set(undefined);
1195
1227
  this.instantTransition.set(false);