{"version":3,"file":"ngwr-context-menu.mjs","sources":["../../../projects/lib/context-menu/context-menu-item.ts","../../../projects/lib/context-menu/context-menu-item.html","../../../projects/lib/context-menu/context-menu.ts","../../../projects/lib/context-menu/context-menu-panel.ts","../../../projects/lib/context-menu/context-menu-divider.ts","../../../projects/lib/context-menu/ngwr-context-menu.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { type ConnectedPosition, type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n  Component,\n  DestroyRef,\n  ElementRef,\n  ViewContainerRef,\n  ViewEncapsulation,\n  computed,\n  inject,\n  input,\n} from '@angular/core';\n\nimport { WrIcon, type WrIconName } from 'ngwr/icon';\nimport { WR_OVERLAY } from 'ngwr/overlay';\n\nimport { WrContextMenu } from './context-menu';\nimport type { WrContextMenuPanel } from './context-menu-panel';\n\n/** Hover delay (ms) before a submenu opens. */\nconst SUBMENU_OPEN_DELAY = 120;\n/** Grace window (ms) before a submenu closes when the cursor leaves it. */\nconst SUBMENU_CLOSE_DELAY = 240;\n/** Animation duration of the submenu — mirrors the root menu CSS. */\nconst SUBMENU_TRANSITION_MS = 220;\n\n/**\n * Single row inside a `<wr-context-menu>`. Mirrors `<wr-dropdown-item>` —\n * rendered as a menu item with an optional leading icon and an optional\n * nested `[submenu]` that opens to the right on hover.\n *\n * @example\n * ```html\n * <wr-context-menu #menu>\n *   <wr-context-menu-item icon=\"copy\" (click)=\"copy()\">Copy</wr-context-menu-item>\n *   <wr-context-menu-item icon=\"more\" [submenu]=\"extras\">More…</wr-context-menu-item>\n * </wr-context-menu>\n *\n * <wr-context-menu #extras>\n *   <wr-context-menu-item (click)=\"duplicate()\">Duplicate</wr-context-menu-item>\n *   <wr-context-menu-item (click)=\"archive()\">Archive</wr-context-menu-item>\n * </wr-context-menu>\n * ```\n */\n@Component({\n  selector: 'wr-context-menu-item',\n  templateUrl: './context-menu-item.html',\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    role: 'menuitem',\n    '[class]': 'classes()',\n    '[attr.tabindex]': '-1',\n    '[attr.aria-disabled]': 'disabled() ? true : null',\n    '[attr.aria-haspopup]': 'submenu() ? \"menu\" : null',\n    '[attr.aria-expanded]': 'submenu() ? (submenuOpen ? \"true\" : \"false\") : null',\n    '(mouseenter)': 'onMouseEnter()',\n    '(mouseleave)': 'onMouseLeave($event)',\n    '(click)': 'onClick()',\n    '(keydown.enter)': 'activate($event)',\n    '(keydown.space)': 'activate($event)',\n    '(keydown.arrowRight)': 'onArrowRight($event)',\n    '(keydown.arrowLeft)': 'onArrowLeft($event)',\n  },\n  imports: [WrIcon],\n})\nexport class WrContextMenuItem {\n  /** Optional leading icon name. @default null */\n  readonly icon = input<WrIconName | null>(null);\n\n  /** Disable interaction (suppresses pointer + keyboard). @default false */\n  readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n  /**\n   * Optional nested `<wr-context-menu>`. When set, hovering the item\n   * (or pressing →) opens it to the right with a chevron indicator.\n   */\n  readonly submenu = input<WrContextMenuPanel | null>(null);\n\n  protected readonly classes = computed(() => {\n    const parts = ['wr-context-menu-item'];\n    if (this.disabled()) parts.push('wr-context-menu-item--disabled');\n    if (this.submenu()) parts.push('wr-context-menu-item--has-submenu');\n    return parts.join(' ');\n  });\n\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly overlay = inject(WR_OVERLAY);\n  private readonly vcr = inject(ViewContainerRef);\n  private readonly scrollStrategies = inject(ScrollStrategyOptions);\n  private readonly destroyRef = inject(DestroyRef);\n\n  private submenuRef: OverlayRef | null = null;\n  private openTimer: ReturnType<typeof setTimeout> | null = null;\n  private closeTimer: ReturnType<typeof setTimeout> | null = null;\n  protected submenuOpen = false;\n\n  /**\n   * Global registry of open submenus keyed by the host element of the\n   * item that owns them. Used to cascade-close descendants when a\n   * parent submenu is disposed — Angular's onDestroy on detached\n   * portals doesn't always tear down the deepest grand-children's\n   * overlays in the right order, leaving orphaned floating panes.\n   */\n  private static readonly openSubmenus = new Map<HTMLElement, WrContextMenuItem>();\n\n  /**\n   * Dispose every open submenu pane on the page. Called by the root\n   * `WrContextMenu` when its own overlay closes — destroyRef cascade\n   * isn't reliable across separate overlay panes (each pane lives in\n   * the CDK overlay container, not inside the parent pane's view).\n   */\n  static disposeAll(immediate: boolean): void {\n    for (const [, owner] of [...WrContextMenuItem.openSubmenus]) {\n      owner.disposeSubmenu(immediate);\n    }\n  }\n\n  constructor() {\n    this.destroyRef.onDestroy(() => this.disposeSubmenu(true));\n  }\n\n  /**\n   * @internal Pointer activation — selecting a leaf item dismisses the\n   * whole menu chain. The consumer's own `(click)` binding on the host\n   * runs in the same event; we defer the close to a microtask so that\n   * handler (the actual \"select\") always completes before the overlay\n   * tears down, regardless of listener registration order. Items that\n   * own a submenu (or are disabled) don't dismiss — clicking them just\n   * drills into / ignores the row.\n   */\n  protected onClick(): void {\n    if (this.disabled() || this.submenu()) return;\n    queueMicrotask(() => WrContextMenu.closeActive());\n  }\n\n  /** @internal Keyboard activation — Enter / Space. */\n  protected activate(event: Event): void {\n    if (this.disabled()) return;\n    if (this.submenu()) {\n      event.preventDefault();\n      this.scheduleOpen(0);\n      return;\n    }\n    event.preventDefault();\n    this.host.nativeElement.click();\n  }\n\n  /** @internal Right-arrow opens the submenu. */\n  protected onArrowRight(event: Event): void {\n    if (this.disabled() || !this.submenu()) return;\n    event.preventDefault();\n    this.scheduleOpen(0);\n  }\n\n  /** @internal Left-arrow closes the submenu (if open). */\n  protected onArrowLeft(event: Event): void {\n    if (!this.submenu() || !this.submenuOpen) return;\n    event.preventDefault();\n    this.scheduleClose(0);\n  }\n\n  /** @internal Hover schedules a submenu open after a small delay. */\n  protected onMouseEnter(): void {\n    if (this.disabled() || !this.submenu()) return;\n    this.cancelClose();\n    this.scheduleOpen(SUBMENU_OPEN_DELAY);\n  }\n\n  /** @internal Hover-out schedules a close with a grace window. */\n  protected onMouseLeave(event: MouseEvent): void {\n    if (!this.submenu()) return;\n    this.cancelOpen();\n    // Only skip the close when the cursor is moving into MY OWN submenu\n    // (the user is drilling further down). Moving elsewhere — sibling\n    // item, ancestor menu, or completely off the chain — should close\n    // this item's submenu and let the cascade-on-dispose tear down any\n    // descendants.\n    if (this.relatedTargetIsInsideOwnSubmenu(event)) return;\n    this.scheduleClose(SUBMENU_CLOSE_DELAY);\n  }\n\n  // Submenu lifecycle\n\n  private scheduleOpen(delay: number): void {\n    if (this.submenuRef) return;\n    this.cancelOpen();\n    if (delay === 0) {\n      this.openSubmenu();\n      return;\n    }\n    this.openTimer = setTimeout(() => {\n      this.openTimer = null;\n      this.openSubmenu();\n    }, delay);\n  }\n\n  private scheduleClose(delay: number): void {\n    this.cancelClose();\n    if (delay === 0) {\n      this.disposeSubmenu(false);\n      return;\n    }\n    this.closeTimer = setTimeout(() => {\n      this.closeTimer = null;\n      this.disposeSubmenu(false);\n    }, delay);\n  }\n\n  private cancelOpen(): void {\n    if (this.openTimer !== null) {\n      clearTimeout(this.openTimer);\n      this.openTimer = null;\n    }\n  }\n\n  private cancelClose(): void {\n    if (this.closeTimer !== null) {\n      clearTimeout(this.closeTimer);\n      this.closeTimer = null;\n    }\n  }\n\n  private openSubmenu(): void {\n    const panel = this.submenu();\n    if (!panel || this.submenuRef) return;\n\n    // Position to the right of the item, vertically aligned with the\n    // item's top. Falls back to opening to the LEFT if there's no room.\n    const positions: ConnectedPosition[] = [\n      { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: 4 },\n      { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -4 },\n    ];\n\n    const positionStrategy = this.overlay\n      .position()\n      .flexibleConnectedTo(this.host)\n      .withPositions(positions)\n      .withPush(true);\n\n    this.submenuRef = this.overlay.create({\n      positionStrategy,\n      scrollStrategy: this.scrollStrategies.reposition(),\n      panelClass: ['wr-context-menu-overlay', 'wr-context-menu-overlay--submenu'],\n    });\n\n    const portal = new TemplatePortal(panel.contentTpl(), this.vcr);\n    this.submenuRef.attach(portal);\n\n    // Mirror the open animation pattern from the root menu directive.\n    const pane = this.submenuRef.overlayElement;\n    requestAnimationFrame(() => pane.classList.add('wr-context-menu-overlay--open'));\n\n    // Track mouse entering / leaving the submenu so we don't auto-close\n    // when the cursor crosses the gap between item and submenu pane.\n    pane.addEventListener('mouseenter', this.onSubmenuEnter);\n    pane.addEventListener('mouseleave', this.onSubmenuLeave);\n\n    this.submenuOpen = true;\n    WrContextMenuItem.openSubmenus.set(this.host.nativeElement, this);\n  }\n\n  /** Bound handlers (= preserves identity for removeEventListener). */\n  private readonly onSubmenuEnter = (): void => {\n    this.cancelClose();\n    // Cursor is inside our pane — keep the whole chain (root + every\n    // ancestor submenu) alive.\n    WrContextMenu.keepChainAlive();\n  };\n  private readonly onSubmenuLeave = (event: MouseEvent): void => {\n    // Only stay open if the cursor is moving into a DESCENDANT submenu\n    // of ours (an item inside our pane opening its own submenu). Moving\n    // back up to an ancestor menu, sideways to a sibling, or completely\n    // off-chain should dismiss this submenu (cascade-on-dispose then\n    // tears down any deeper levels we own).\n    if (this.relatedTargetIsInsideDescendantSubmenu(event)) return;\n    this.scheduleClose(SUBMENU_CLOSE_DELAY);\n    // If the cursor left ALL menu panes (root + every submenu), tear\n    // down the whole chain. Otherwise just close this pane and let the\n    // user continue navigating ancestors.\n    if (!this.relatedTargetIsInsideAnyMenu(event)) {\n      WrContextMenu.scheduleChainClose();\n    }\n  };\n\n  private relatedTargetIsInsideAnyMenu(event: MouseEvent): boolean {\n    const related = event.relatedTarget;\n    if (!(related instanceof Element)) return false;\n    return !!related.closest('.wr-context-menu-overlay');\n  }\n\n  /**\n   * `true` when the cursor moved from this item directly into the pane\n   * of its own (just-opening) submenu — drilling down. Sibling items\n   * and ancestor menus do NOT count.\n   */\n  private relatedTargetIsInsideOwnSubmenu(event: MouseEvent): boolean {\n    const related = event.relatedTarget;\n    if (!(related instanceof Element) || !this.submenuRef) return false;\n    return this.submenuRef.overlayElement.contains(related);\n  }\n\n  /**\n   * `true` when the cursor moved from our submenu pane into another\n   * submenu pane whose owner-item lives INSIDE ours — the user is\n   * drilling further down the chain (e.g., from the Share submenu into\n   * the Export-as submenu). Moving back up the chain returns false so\n   * we close.\n   */\n  private relatedTargetIsInsideDescendantSubmenu(event: MouseEvent): boolean {\n    const related = event.relatedTarget;\n    if (!(related instanceof Element) || !this.submenuRef) return false;\n    const targetPane = related.closest('.wr-context-menu-overlay');\n    if (!targetPane) return false;\n    const myPane = this.submenuRef.overlayElement;\n    if (targetPane === myPane) return true;\n    // Find the owner-item of the pane the cursor is heading into. If\n    // that owner-item is inside our own pane, the destination is a\n    // descendant submenu.\n    for (const [ownerEl, owner] of WrContextMenuItem.openSubmenus) {\n      if (owner.submenuRef?.overlayElement === targetPane) {\n        return myPane.contains(ownerEl);\n      }\n    }\n    return false;\n  }\n\n  private disposeSubmenu(immediate: boolean): void {\n    this.cancelOpen();\n    this.cancelClose();\n    const ref = this.submenuRef;\n    if (!ref) return;\n    this.submenuRef = null;\n    this.submenuOpen = false;\n    WrContextMenuItem.openSubmenus.delete(this.host.nativeElement);\n\n    const pane = ref.overlayElement;\n    pane.removeEventListener('mouseenter', this.onSubmenuEnter);\n    pane.removeEventListener('mouseleave', this.onSubmenuLeave);\n\n    // Cascade-close any descendant submenus whose owner-item lives inside\n    // the pane we're about to dispose. Without this, when a parent submenu\n    // closes (via hover-out grace timer), a grandchild submenu whose owner\n    // is rendered inside the parent's portal is orphaned — its OverlayRef\n    // stays alive in the DOM with no parent to reach it from.\n    for (const [ownerEl, owner] of WrContextMenuItem.openSubmenus) {\n      if (pane.contains(ownerEl)) owner.disposeSubmenu(immediate);\n    }\n\n    if (immediate) {\n      ref.dispose();\n      return;\n    }\n    pane.classList.remove('wr-context-menu-overlay--open');\n    setTimeout(() => ref.dispose(), SUBMENU_TRANSITION_MS);\n  }\n}\n","@if (icon(); as name) {\n  <wr-icon class=\"wr-context-menu-item__icon\" [name]=\"name\" size=\"14\" />\n}\n<span class=\"wr-context-menu-item__label\"><ng-content /></span>\n@if (submenu()) {\n  <svg\n    class=\"wr-icon__svg wr-context-menu-item__chevron\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    aria-hidden=\"true\"\n  >\n    <path d=\"m9 18 6-6-6-6\" />\n  </svg>\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { DestroyRef, Directive, ElementRef, ViewContainerRef, inject, input } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { WR_OVERLAY } from 'ngwr/overlay';\n\nimport { WrContextMenuItem } from './context-menu-item';\nimport type { WrContextMenuPanel } from './context-menu-panel';\n\n/**\n * Attach to any element to show a `<wr-context-menu>` at the pointer\n * position when the user right-clicks or otherwise sends a `contextmenu`\n * event (Shift+F10, etc.). The native browser menu is suppressed for the\n * host element.\n *\n * @example\n * ```html\n * <div [wrContextMenu]=\"menu\">Right-click me</div>\n * <wr-context-menu #menu>\n *   <wr-context-menu-item (click)=\"copy()\">Copy</wr-context-menu-item>\n *   <wr-context-menu-item (click)=\"remove()\">Delete</wr-context-menu-item>\n * </wr-context-menu>\n * ```\n *\n * @see https://ngwr.dev/components/context-menu\n */\n@Directive({\n  selector: '[wrContextMenu]',\n  host: {\n    '(contextmenu)': 'onContextMenu($event)',\n  },\n})\nexport class WrContextMenu {\n  /** Menu to open. Pass a `<wr-context-menu>` template reference. */\n  readonly menu = input.required<WrContextMenuPanel>({ alias: 'wrContextMenu' });\n\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly overlay = inject(WR_OVERLAY);\n  private readonly vcr = inject(ViewContainerRef);\n  private readonly scrollStrategies = inject(ScrollStrategyOptions);\n  private readonly destroyRef = inject(DestroyRef);\n\n  private overlayRef: OverlayRef | null = null;\n  private closingTimer: ReturnType<typeof setTimeout> | null = null;\n  private leaveTimer: ReturnType<typeof setTimeout> | null = null;\n\n  /**\n   * Single open root menu at a time. Submenu items use this to signal\n   * chain-level hover state: when the cursor enters ANY pane in the\n   * chain (root or submenu) `keepChainAlive()` cancels the close timer;\n   * when the cursor leaves ALL panes `scheduleChainClose()` starts it.\n   * The whole chain (root → submenus) tears down through the root's\n   * close (submenus react to their owner-item destroyRef + the static\n   * registry in `WrContextMenuItem`).\n   */\n  private static activeRoot: WrContextMenu | null = null;\n\n  /** Called from a submenu pane's mouseenter — keep the whole chain alive. */\n  static keepChainAlive(): void {\n    WrContextMenu.activeRoot?.cancelLeaveTimer();\n  }\n\n  /** Called from a submenu pane's mouseleave when the cursor left ALL menus. */\n  static scheduleChainClose(): void {\n    WrContextMenu.activeRoot?.scheduleLeave();\n  }\n\n  /**\n   * Called from a `<wr-context-menu-item>` click — selecting an item\n   * dismisses the whole chain (root + any open submenus). Items live in\n   * a detached overlay portal, so they reach their owning root through\n   * this static handle rather than DI.\n   */\n  static closeActive(): void {\n    WrContextMenu.activeRoot?.closeOverlay();\n  }\n\n  /**\n   * Open/close animation duration in ms. Matches the longest SCSS\n   * transition on `.wr-context-menu-overlay` (the spring-scale curve).\n   * The directive holds the overlay alive for this long during close\n   * so the exit animation can play before the pane is removed from\n   * the DOM.\n   */\n  private static readonly TRANSITION_MS = 220;\n  /**\n   * Grace window after the cursor leaves the root pane. Long enough\n   * for the user to dip momentarily into the gap between the root and\n   * a submenu (or back from a submenu), short enough to feel snappy\n   * on a deliberate hover-out.\n   */\n  private static readonly LEAVE_DELAY = 240;\n\n  constructor() {\n    this.destroyRef.onDestroy(() => this.closeOverlay());\n  }\n\n  /** @internal Right-click handler — opens at the pointer (or re-positions if already open). */\n  protected onContextMenu(event: MouseEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n    // Re-open at the new position even if it was already open.\n    // Use page coords (document-relative) so the menu anchors to the\n    // zone it was opened over — scrolling the page carries the menu\n    // along with the content, matching native + PrimeNG behavior.\n    this.closeOverlay();\n    this.openOverlay(event.pageX, event.pageY);\n  }\n\n  /** Close the menu. */\n  close(): void {\n    this.closeOverlay();\n  }\n\n  // Overlay\n\n  private openOverlay(x: number, y: number): void {\n    // GlobalPositionStrategy uses margins, which led to flaky positioning\n    // (`position: static` inline overridden by our `!important`, etc.).\n    // Use it just to create the overlay, then write the coords directly to\n    // the pane element via `top`/`left` so the menu sits exactly where the\n    // user clicked and never moves until we close it.\n    this.overlayRef = this.overlay.create({\n      positionStrategy: this.overlay.position().global(),\n      // `noop` so scroll doesn't dismiss the menu. With absolute coords\n      // pinned to viewport (`position: fixed` in the panel CSS), the menu\n      // visually stays put as the page scrolls underneath.\n      scrollStrategy: this.scrollStrategies.noop(),\n      panelClass: ['wr-context-menu-overlay'],\n    });\n\n    const portal = new TemplatePortal(this.menu().contentTpl(), this.vcr);\n    this.overlayRef.attach(portal);\n\n    // Position model: the pane uses `position: fixed` (panel CSS) but we\n    // want the menu to anchor to the DOCUMENT — when the user scrolls,\n    // the menu should travel with the content it was opened over (native\n    // browser + PrimeNG behavior). Strategy:\n    //\n    //   - Record the page coords (pageX/pageY = document-relative).\n    //   - Each frame the user scrolls, set top/left to (pageX/Y minus the\n    //     current scroll offset). At scroll 0 this matches clientX/Y; as\n    //     scroll grows the menu shifts up/left visually, which is exactly\n    //     what `position: absolute` inside an un-fixed container would do\n    //     naturally — we just have to emulate it manually because CDK's\n    //     overlay container is `position: fixed`.\n    const pane = this.overlayRef.overlayElement;\n    pane.style.right = 'auto';\n    pane.style.bottom = 'auto';\n    pane.style.margin = '0';\n\n    const sync = (): void => {\n      pane.style.top = `${y - window.scrollY}px`;\n      pane.style.left = `${x - window.scrollX}px`;\n    };\n    sync();\n\n    // Trigger the open transition on the next frame — adding the class\n    // synchronously with attach would skip the initial 0→1 frame and\n    // the menu would just appear without animating.\n    requestAnimationFrame(() => pane.classList.add('wr-context-menu-overlay--open'));\n\n    // Hover-out closes the menu after a grace window, unless the\n    // cursor moved INTO a descendant submenu (any other\n    // `.wr-context-menu-overlay`). Re-entering the root cancels the\n    // scheduled close so the user can dip out and back without losing\n    // the menu.\n    const onPaneLeave = (event: MouseEvent): void => {\n      const related = event.relatedTarget;\n      // Moving into ANY other menu pane (a submenu) keeps the chain\n      // alive — the submenu's own mouseenter will cancel any pending\n      // chain-close. Only schedule when the cursor genuinely left the\n      // chain.\n      if (related instanceof Element && related.closest('.wr-context-menu-overlay')) return;\n      this.scheduleLeave();\n    };\n    const onPaneEnter = (): void => this.cancelLeaveTimer();\n    pane.addEventListener('mouseleave', onPaneLeave);\n    pane.addEventListener('mouseenter', onPaneEnter);\n    WrContextMenu.activeRoot = this;\n    this.overlayRef.detachments().subscribe(() => {\n      pane.removeEventListener('mouseleave', onPaneLeave);\n      pane.removeEventListener('mouseenter', onPaneEnter);\n    });\n    // Capture-phase listener on document catches scroll events from ANY\n    // ancestor (window, html, body, custom scroll containers), so the\n    // menu stays anchored to the click position even inside scrollable\n    // layouts.\n    document.addEventListener('scroll', sync, { capture: true, passive: true });\n    // On resize the page layout reflows — the original pageX/pageY no\n    // longer points at whatever the user right-clicked. Dismiss the menu\n    // rather than dragging it across a now-stale coordinate (matches\n    // PrimeNG / native behavior).\n    const onResize = (): void => this.closeOverlay();\n    window.addEventListener('resize', onResize, { passive: true });\n    this.overlayRef.detachments().subscribe(() => {\n      document.removeEventListener('scroll', sync, { capture: true });\n      window.removeEventListener('resize', onResize);\n    });\n\n    // The right-click that opens the menu still has `mouseup` + `auxclick`\n    // events pending. CDK's `outsidePointerEvents()` listens to pointerdown\n    // / auxclick and would fire on those — closing the menu the instant\n    // the user lifts their finger. Two-part guard:\n    //   1. Track the open timestamp.\n    //   2. Ignore any outside events that arrive within a short window\n    //      after the open (long enough to cover the original mouseup +\n    //      auxclick, short enough that a deliberate second click is\n    //      still respected).\n    const openedAt = performance.now();\n    const ref = this.overlayRef;\n    ref\n      .outsidePointerEvents()\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => {\n        if (performance.now() - openedAt < 200) return;\n        this.closeOverlay();\n      });\n\n    this.overlayRef\n      .keydownEvents()\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(event => {\n        if (event.key === 'Escape') {\n          event.preventDefault();\n          this.closeOverlay();\n          this.host.nativeElement.focus();\n        }\n      });\n  }\n\n  private closeOverlay(): void {\n    if (!this.overlayRef) return;\n    this.cancelLeaveTimer();\n    if (WrContextMenu.activeRoot === this) WrContextMenu.activeRoot = null;\n    // Submenu panes live in the CDK overlay container, not inside the\n    // root pane's view — destroyRef cascade through portal detach\n    // doesn't reach them. Close them all explicitly first so they\n    // don't float when the root is dismissed (outside-click, Esc, etc).\n    WrContextMenuItem.disposeAll(false);\n    const ref = this.overlayRef;\n    const pane = ref.overlayElement;\n    // Detach immediately would skip the exit animation. Remove the open\n    // class first so the SCSS transition runs back to the default\n    // (faded + scaled-down) state, then dispose after the transition.\n    pane.classList.remove('wr-context-menu-overlay--open');\n    if (this.closingTimer !== null) clearTimeout(this.closingTimer);\n    this.closingTimer = setTimeout(() => {\n      ref.dispose();\n      this.closingTimer = null;\n    }, WrContextMenu.TRANSITION_MS);\n    // Mark immediately so a subsequent right-click opens a fresh menu\n    // rather than landing on the disposing one.\n    this.overlayRef = null;\n  }\n\n  private cancelLeaveTimer(): void {\n    if (this.leaveTimer !== null) {\n      clearTimeout(this.leaveTimer);\n      this.leaveTimer = null;\n    }\n  }\n\n  private scheduleLeave(): void {\n    this.cancelLeaveTimer();\n    this.leaveTimer = setTimeout(() => {\n      this.leaveTimer = null;\n      this.closeOverlay();\n    }, WrContextMenu.LEAVE_DELAY);\n  }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Component, TemplateRef, ViewEncapsulation, viewChild } from '@angular/core';\n\n/**\n * Container for the rows shown when a {@link WrContextMenu} opens.\n * The component itself doesn't render; the directive portals the inner\n * template into an overlay positioned at the pointer.\n *\n * @example\n * ```html\n * <div [wrContextMenu]=\"menu\">Right-click me</div>\n * <wr-context-menu #menu>\n *   <wr-context-menu-item icon=\"copy\" (click)=\"copy()\">Copy</wr-context-menu-item>\n *   <wr-context-menu-item icon=\"trash\" (click)=\"remove()\">Delete</wr-context-menu-item>\n * </wr-context-menu>\n * ```\n */\n@Component({\n  selector: 'wr-context-menu',\n  template: '<ng-template><div class=\"wr-context-menu\" role=\"menu\"><ng-content /></div></ng-template>',\n  exportAs: 'wrContextMenu',\n  encapsulation: ViewEncapsulation.None,\n  host: { style: 'display:none' },\n})\nexport class WrContextMenuPanel {\n  /** The internal template the directive portals into the overlay. @internal */\n  readonly contentTpl = viewChild.required(TemplateRef);\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Component, ViewEncapsulation } from '@angular/core';\n\n/**\n * Thin horizontal separator inside a `<wr-context-menu>`. Use it to\n * group related items (e.g., a destructive action below a divider, or\n * a \"More\" section below the primary items).\n *\n * @example\n * ```html\n * <wr-context-menu #menu>\n *   <wr-context-menu-item (click)=\"copy()\">Copy</wr-context-menu-item>\n *   <wr-context-menu-item (click)=\"paste()\">Paste</wr-context-menu-item>\n *   <wr-context-menu-divider />\n *   <wr-context-menu-item (click)=\"remove()\">Delete</wr-context-menu-item>\n * </wr-context-menu>\n * ```\n */\n@Component({\n  selector: 'wr-context-menu-divider',\n  template: '',\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    class: 'wr-context-menu-divider',\n    role: 'separator',\n    'aria-orientation': 'horizontal',\n  },\n})\nexport class WrContextMenuDivider {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}