@cocoar/ui-menu 0.1.0-beta.71 → 0.1.0-beta.75

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.
@@ -658,6 +658,27 @@ class CoarSubmenuItemComponent {
658
658
  * Prefer an inline `<ng-template>` child when possible.
659
659
  */
660
660
  submenuTemplate = input(null, ...(ngDevMode ? [{ debugName: "submenuTemplate" }] : []));
661
+ /**
662
+ * Optional data to pass to the submenu template.
663
+ *
664
+ * If provided, this data will be passed as the context to the submenu template,
665
+ * instead of inheriting the parent overlay's context.
666
+ *
667
+ * Use this to create clean boundaries between parent and submenu:
668
+ * - Simple case: `[submenuData]="context"` (pass full context)
669
+ * - Complex case: `[submenuData]="transformData(context)"` (pass only what submenu needs)
670
+ *
671
+ * @example
672
+ * ```html
673
+ * <!-- Pass specific data contract to submenu -->
674
+ * <coar-submenu-item
675
+ * label="Status"
676
+ * [submenuTemplate]="statusMenu"
677
+ * [submenuData]="{ selectedIds: context.selected.map(s => s.Id) }">
678
+ * </coar-submenu-item>
679
+ * ```
680
+ */
681
+ submenuData = input(undefined, ...(ngDevMode ? [{ debugName: "submenuData" }] : []));
661
682
  markedInlineTemplate;
662
683
  inlineTemplate;
663
684
  overlaySubmenuTemplate;
@@ -746,6 +767,8 @@ class CoarSubmenuItemComponent {
746
767
  openSubmenu(anchorElement) {
747
768
  // Validate early so the error points at the submenu item usage.
748
769
  this.submenuTemplateToRender();
770
+ // Determine what data to pass to the submenu template
771
+ const submenuContextData = this.submenuData();
749
772
  // All overlays use hoverTree preset for proper tree tracking
750
773
  const spec = Overlay.define((b) => {
751
774
  b.content((c) => c.fromTemplate(this.overlaySubmenuTemplate));
@@ -760,14 +783,15 @@ class CoarSubmenuItemComponent {
760
783
  if (containingOverlay) {
761
784
  // Inside an overlay: close siblings (direct children of parent) then open as child
762
785
  // First, create the child overlay
763
- this.submenuRef = this.overlayService.openChild(containingOverlay, spec, undefined);
786
+ // Pass submenuData if provided, otherwise undefined (inherits parent context via $implicit)
787
+ this.submenuRef = this.overlayService.openChild(containingOverlay, spec, submenuContextData);
764
788
  // Then close siblings, excluding the newly opened one
765
789
  containingOverlay.closeChildren(this.submenuRef);
766
790
  }
767
791
  else {
768
792
  // Inline menu: use cascade-level sibling closure
769
793
  this.cascade.closeSiblings();
770
- this.submenuRef = this.overlayService.open(spec, undefined);
794
+ this.submenuRef = this.overlayService.open(spec, submenuContextData);
771
795
  }
772
796
  // Expose the overlay ref to descendants so they can parent their own flyouts correctly.
773
797
  this.cascade.overlayRef = this.submenuRef;
@@ -808,7 +832,7 @@ class CoarSubmenuItemComponent {
808
832
  this.cdr.markForCheck();
809
833
  }
810
834
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: CoarSubmenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
811
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: CoarSubmenuItemComponent, isStandalone: true, selector: "coar-submenu-item, coar-sub-flyout", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, submenuTemplate: { classPropertyName: "submenuTemplate", publicName: "submenuTemplate", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
835
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.6", type: CoarSubmenuItemComponent, isStandalone: true, selector: "coar-submenu-item, coar-sub-flyout", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, submenuTemplate: { classPropertyName: "submenuTemplate", publicName: "submenuTemplate", isSignal: true, isRequired: false, transformFunction: null }, submenuData: { classPropertyName: "submenuData", publicName: "submenuData", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
812
836
  {
813
837
  provide: COAR_MENU_CASCADE,
814
838
  useFactory: () => new CoarMenuCascade(inject(COAR_MENU_CASCADE, { optional: true, skipSelf: true })),
@@ -887,7 +911,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
887
911
  useFactory: () => new CoarMenuCascade(inject(COAR_MENU_CASCADE, { optional: true, skipSelf: true })),
888
912
  },
889
913
  ], styles: [":host{display:block}.coar-submenu-item{display:flex;align-items:center;gap:var(--coar-menu-item-gap, .75rem);width:100%;box-sizing:border-box;padding:var(--coar-menu-item-padding, .5rem .75rem);font-family:var(--coar-menu-item-font-family, var(--coar-font-family-body, Poppins));font-size:var( --coar-menu-item-font-size, var(--coar-component-md-font-size, var(--coar-font-size-xs, 14px)) );font-weight:var(--coar-menu-item-font-weight, var(--coar-font-weight-regular, 400));line-height:var(--coar-menu-item-line-height, 1.5);color:var(--coar-menu-item-color, var(--coar-text-neutral-primary, #545454));background:var(--coar-menu-item-background, transparent);border-radius:0;position:relative;cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--coar-transition-fast, all .1s ease);outline:none}.coar-submenu-item:before{content:\"\";position:absolute;left:0;top:0;bottom:0;width:1px;background:var(--coar-menu-item-border-left-color, #d0d0d0);opacity:0;pointer-events:none;transition:width var(--coar-duration-fast) var(--coar-ease-out),background var(--coar-duration-fast) var(--coar-ease-out)}.coar-submenu-item:hover:not(.coar-submenu-item--disabled){background:var(--coar-menu-item-background-hover, #f0f1f2);color:var(--coar-menu-item-color-hover, var(--coar-text-neutral-primary, #545454))}.coar-submenu-item--open{background:var( --coar-menu-item-background-open, var(--coar-menu-item-background-active, #f0f1f2) )}.coar-submenu-item--open:before{width:2px;background:var( --coar-menu-item-border-left-color-active, var(--coar-border-accent-primary, #156db7) );opacity:1}:host-context(.coar-sub-expand__panel-inner) .coar-submenu-item:before{opacity:1}:host-context(.coar-menu--in-overlay) .coar-submenu-item:before{opacity:1}.coar-submenu-item:focus-visible{background:var(--coar-menu-item-background-focus, #f0f1f2);outline:2px solid var(--coar-menu-item-outline-focus, var(--coar-border-accent-primary, #156db7));outline-offset:-2px}.coar-submenu-item--disabled{color:var(--coar-menu-item-color-disabled, var(--coar-text-neutral-disabled, #999999));cursor:not-allowed;opacity:.6}.coar-submenu-item__icon{flex-shrink:0;display:var(--coar-menu-icon-slot-display, inline-flex);align-items:center;justify-content:center;width:var(--coar-menu-item-icon-slot-size, 16px);height:var(--coar-menu-item-icon-slot-size, 16px);opacity:1}.coar-submenu-item__icon:has(coar-icon[icon-name=square-rounded-dashed]){opacity:.15}.coar-submenu-item__label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.coar-submenu-item__arrow{flex-shrink:0;margin-left:auto;opacity:.6;transition:var(--coar-transition-fast, all .1s ease)}.coar-submenu-item:hover:not(.coar-submenu-item--disabled) .coar-submenu-item__arrow{opacity:1}\n"] }]
890
- }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], submenuTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "submenuTemplate", required: false }] }], markedInlineTemplate: [{
914
+ }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], submenuTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "submenuTemplate", required: false }] }], submenuData: [{ type: i0.Input, args: [{ isSignal: true, alias: "submenuData", required: false }] }], markedInlineTemplate: [{
891
915
  type: ContentChild,
892
916
  args: [CoarSubmenuTemplateDirective, { descendants: false }]
893
917
  }], inlineTemplate: [{
@@ -1 +1 @@
1
- {"version":3,"file":"cocoar-ui-menu.mjs","sources":["../../../../libs/ui-menu/src/lib/coar-menu-aim.ts","../../../../libs/ui-menu/src/lib/coar-menu-aim-config.ts","../../../../libs/ui-menu/src/lib/coar-menu-cascade.ts","../../../../libs/ui-menu/src/lib/coar-menu-aim-config.directive.ts","../../../../libs/ui-menu/src/lib/coar-menu.component.ts","../../../../libs/ui-menu/src/lib/coar-menu.component.html","../../../../libs/ui-menu/src/lib/coar-menu-item.component.ts","../../../../libs/ui-menu/src/lib/coar-menu-item.component.html","../../../../libs/ui-menu/src/lib/coar-menu-divider.component.ts","../../../../libs/ui-menu/src/lib/coar-menu-heading.component.ts","../../../../libs/ui-menu/src/lib/coar-submenu-template.directive.ts","../../../../libs/ui-menu/src/lib/coar-submenu-item.component.ts","../../../../libs/ui-menu/src/lib/coar-sub-expand.component.ts","../../../../libs/ui-menu/src/cocoar-ui-menu.ts"],"sourcesContent":["export interface CoarMenuAimPoint {\n readonly x: number;\n readonly y: number;\n readonly t: number;\n}\n\nexport type CoarMenuAimDirection = 'right' | 'left';\n\nexport function shouldDelaySubmenuSwitch(\n previous: CoarMenuAimPoint | null,\n current: CoarMenuAimPoint,\n submenuRect: DOMRect,\n direction: CoarMenuAimDirection,\n sampleMaxAgeMs = 200\n): boolean {\n if (!previous) return false;\n\n // If submenu rect is not measurable, don't delay.\n if (!Number.isFinite(submenuRect.left) || submenuRect.width <= 0 || submenuRect.height <= 0) {\n return false;\n }\n\n // If the last movement was long ago, don't apply aim heuristics.\n if (current.t - previous.t > sampleMaxAgeMs) return false;\n\n const dx = current.x - previous.x;\n\n // Require clear horizontal intent toward the submenu.\n if (direction === 'right' && dx <= 2) return false;\n if (direction === 'left' && dx >= -2) return false;\n\n // Use the NEAR edge of the submenu panel (closest to the parent menu).\n // This matches the classic \"menu aim\" wedge used to detect intent to enter the open submenu.\n // Right-opening submenu: use left edge; left-opening submenu: use right edge.\n const edgeX = direction === 'right' ? submenuRect.left : submenuRect.right;\n\n // Expand wedge slightly to be forgiving.\n const padY = 8;\n const cornerA = { x: edgeX, y: submenuRect.top - padY };\n const cornerB = { x: edgeX, y: submenuRect.bottom + padY };\n\n return pointInTriangle(current, previous, cornerA, cornerB);\n}\n\nfunction pointInTriangle(\n p: { x: number; y: number },\n a: { x: number; y: number },\n b: { x: number; y: number },\n c: { x: number; y: number }\n): boolean {\n const d1 = sign(p, a, b);\n const d2 = sign(p, b, c);\n const d3 = sign(p, c, a);\n\n const hasNeg = d1 < 0 || d2 < 0 || d3 < 0;\n const hasPos = d1 > 0 || d2 > 0 || d3 > 0;\n\n return !(hasNeg && hasPos);\n}\n\nfunction sign(\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n p3: { x: number; y: number }\n): number {\n return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y);\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface CoarMenuAimConfig {\n readonly enabled: boolean;\n /** Emits debug events consumed by the showcase to render the aim triangle overlay. */\n readonly debugEnabled: boolean;\n /** Delay before switching to a newly hovered sibling submenu when aim is detected. */\n readonly switchDelayMs: number;\n /** Maximum age of the last pointer sample used for intent detection. */\n readonly sampleMaxAgeMs: number;\n}\n\nexport interface CoarMenuAimConfigProvider {\n getMenuAimConfig(): CoarMenuAimConfig;\n}\n\nexport const DEFAULT_COAR_MENU_AIM_CONFIG: CoarMenuAimConfig = {\n enabled: true,\n debugEnabled: false,\n switchDelayMs: 500,\n sampleMaxAgeMs: 200,\n};\n\nexport const COAR_MENU_AIM_CONFIG = new InjectionToken<CoarMenuAimConfigProvider>(\n 'COAR_MENU_AIM_CONFIG'\n);\n","import { InjectionToken, inject } from '@angular/core';\nimport type { OverlayRef } from '@cocoar/ui-overlay';\nimport { shouldDelaySubmenuSwitch, type CoarMenuAimPoint } from './coar-menu-aim';\nimport {\n COAR_MENU_AIM_CONFIG,\n DEFAULT_COAR_MENU_AIM_CONFIG,\n type CoarMenuAimConfigProvider,\n} from './coar-menu-aim-config';\n\n/**\n * CoarMenuCascade: Tracks parent-child and sibling relationships for menu hierarchies.\n *\n * Responsibilities:\n * - Track overlay refs for nested submenu parenting\n * - Track children to enable sibling closure (for inline menus without a common parent overlay)\n */\nexport class CoarMenuCascade {\n overlayRef: OverlayRef | null = null;\n private children = new Set<CoarMenuCascade>();\n\n private readonly aimConfig: CoarMenuAimConfigProvider | null = inject(COAR_MENU_AIM_CONFIG, {\n optional: true,\n });\n\n private activeChild: CoarMenuCascade | null = null;\n private pointerHistory: CoarMenuAimPoint[] = [];\n private pointerAbort: AbortController | null = null;\n\n private pendingSwitchTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingChild: CoarMenuCascade | null = null;\n private pendingActivate: (() => void) | null = null;\n private activePanelCleanup: (() => void) | null = null;\n\n constructor(readonly parent: CoarMenuCascade | null) {\n // Register with parent to enable sibling tracking\n if (parent) {\n parent.children.add(this);\n }\n }\n\n requestOpenFromChild(\n child: CoarMenuCascade,\n activate: () => void,\n pointer: { x: number; y: number }\n ): void {\n const aim = this.aimConfig?.getMenuAimConfig() ?? DEFAULT_COAR_MENU_AIM_CONFIG;\n if (!aim.enabled) {\n this.activateNow(child, activate);\n return;\n }\n\n if (typeof document === 'undefined') {\n this.activateNow(child, activate);\n return;\n }\n\n const now = Date.now();\n const point: CoarMenuAimPoint = { x: pointer.x, y: pointer.y, t: now };\n this.pushPointerPoint(point);\n\n if (!this.activeChild || this.activeChild === child) {\n this.activateNow(child, activate);\n return;\n }\n\n const submenuRect = this.getActiveChildSubmenuRect();\n if (!submenuRect) {\n this.activateNow(child, activate);\n return;\n }\n\n const previous =\n this.pointerHistory.length >= 2 ? this.pointerHistory[this.pointerHistory.length - 2] : null;\n const direction = this.inferSubmenuDirection(submenuRect, point);\n\n const shouldDelay = shouldDelaySubmenuSwitch(\n previous,\n point,\n submenuRect,\n direction,\n aim.sampleMaxAgeMs\n );\n\n this.emitAimDebugIfEnabled(\n aim.debugEnabled,\n shouldDelay,\n previous,\n point,\n submenuRect,\n direction\n );\n\n if (!shouldDelay) {\n this.activateNow(child, activate);\n return;\n }\n\n this.scheduleSwitch(child, activate, aim.switchDelayMs);\n }\n\n private emitAimDebugIfEnabled(\n debugEnabled: boolean,\n shouldDelay: boolean,\n previous: CoarMenuAimPoint | null,\n current: CoarMenuAimPoint,\n submenuRect: DOMRect,\n direction: 'right' | 'left'\n ): void {\n if (typeof window === 'undefined') return;\n\n // Backward-compatible global override for ad-hoc debugging.\n const w = window as unknown as { __COAR_MENU_AIM_DEBUG__?: boolean };\n if (!debugEnabled && !w.__COAR_MENU_AIM_DEBUG__) return;\n\n try {\n window.dispatchEvent(\n new CustomEvent('coar-menu-aim', {\n detail: {\n shouldDelay,\n previous,\n current,\n submenuRect: {\n left: submenuRect.left,\n top: submenuRect.top,\n right: submenuRect.right,\n bottom: submenuRect.bottom,\n },\n direction,\n },\n })\n );\n } catch {\n // ignore\n }\n }\n\n notifyChildOpened(child: CoarMenuCascade): void {\n if (this.activeChild === child) {\n this.attachActivePanelListener();\n }\n }\n\n notifyChildClosed(child: CoarMenuCascade): void {\n if (this.activeChild === child) {\n this.activeChild = null;\n this.detachActivePanelListener();\n this.cancelPendingSwitch();\n this.stopPointerTracking();\n }\n }\n\n private activateNow(child: CoarMenuCascade, activate: () => void): void {\n this.cancelPendingSwitch();\n this.activeChild = child;\n this.ensurePointerTracking();\n activate();\n }\n\n private scheduleSwitch(child: CoarMenuCascade, activate: () => void, delayMs: number): void {\n this.cancelPendingSwitch();\n\n this.pendingChild = child;\n this.pendingActivate = activate;\n this.pendingSwitchTimer = setTimeout(() => {\n const pendingChild = this.pendingChild;\n const pendingActivate = this.pendingActivate;\n\n this.pendingChild = null;\n this.pendingActivate = null;\n this.pendingSwitchTimer = null;\n\n if (!pendingChild || !pendingActivate) return;\n this.activeChild = pendingChild;\n this.ensurePointerTracking();\n pendingActivate();\n }, delayMs);\n }\n\n private cancelPendingSwitch(): void {\n if (this.pendingSwitchTimer) {\n clearTimeout(this.pendingSwitchTimer);\n this.pendingSwitchTimer = null;\n }\n this.pendingChild = null;\n this.pendingActivate = null;\n }\n\n private ensurePointerTracking(): void {\n if (this.pointerAbort) return;\n if (typeof document === 'undefined') return;\n\n const abort = new AbortController();\n this.pointerAbort = abort;\n\n const onMove = (e: PointerEvent) => {\n this.pushPointerPoint({ x: e.clientX, y: e.clientY, t: Date.now() });\n };\n\n document.addEventListener('pointermove', onMove, { signal: abort.signal, passive: true });\n }\n\n private stopPointerTracking(): void {\n if (!this.pointerAbort) return;\n this.pointerAbort.abort();\n this.pointerAbort = null;\n this.pointerHistory = [];\n }\n\n private pushPointerPoint(point: CoarMenuAimPoint): void {\n this.pointerHistory.push(point);\n if (this.pointerHistory.length > 5) {\n this.pointerHistory = this.pointerHistory.slice(-5);\n }\n }\n\n private getActiveChildSubmenuRect(): DOMRect | null {\n const panelEl = this.activeChild?.overlayRef?.getPanelElement?.();\n if (!panelEl) return null;\n return panelEl.getBoundingClientRect();\n }\n\n private inferSubmenuDirection(rect: DOMRect, point: { x: number; y: number }): 'right' | 'left' {\n // If the submenu's left edge is to the right of the pointer, it's a right-opening flyout.\n // Otherwise, assume left.\n return rect.left >= point.x ? 'right' : 'left';\n }\n\n private attachActivePanelListener(): void {\n this.detachActivePanelListener();\n\n const panelEl = this.activeChild?.overlayRef?.getPanelElement?.();\n if (!panelEl) return;\n\n const onEnter = () => {\n // Once the user reaches the currently open submenu panel, don't allow a delayed switch\n // to steal focus/open another sibling submenu.\n this.cancelPendingSwitch();\n };\n\n panelEl.addEventListener('pointerenter', onEnter);\n this.activePanelCleanup = () => panelEl.removeEventListener('pointerenter', onEnter);\n }\n\n private detachActivePanelListener(): void {\n this.activePanelCleanup?.();\n this.activePanelCleanup = null;\n }\n\n /**\n * Close all sibling submenus at the cascade level.\n * Used for inline menus where siblings don't have a common parent overlay.\n */\n closeSiblings(): void {\n if (this.parent) {\n for (const sibling of this.parent.children) {\n if (sibling !== this && sibling.overlayRef) {\n sibling.overlayRef.close();\n }\n }\n }\n }\n\n destroy(): void {\n this.detachActivePanelListener();\n this.cancelPendingSwitch();\n this.stopPointerTracking();\n if (this.parent) {\n this.parent.children.delete(this);\n }\n }\n}\n\nexport const COAR_MENU_CASCADE = new InjectionToken<CoarMenuCascade>('COAR_MENU_CASCADE');\n","import { Directive, input, inject } from '@angular/core';\nimport {\n COAR_MENU_AIM_CONFIG,\n DEFAULT_COAR_MENU_AIM_CONFIG,\n type CoarMenuAimConfig,\n type CoarMenuAimConfigProvider,\n} from './coar-menu-aim-config';\n\n@Directive({\n selector: '[coarMenuAimConfig]',\n standalone: true,\n providers: [{ provide: COAR_MENU_AIM_CONFIG, useExisting: CoarMenuAimConfigDirective }],\n})\nexport class CoarMenuAimConfigDirective implements CoarMenuAimConfigProvider {\n private readonly parent = inject(COAR_MENU_AIM_CONFIG, { optional: true, skipSelf: true });\n\n /** Enable/disable menu-aim for this menu tree. */\n readonly aimEnabled = input<boolean | undefined>(undefined);\n\n /** Emit debug events for menu-aim visualization (showcase only). */\n readonly aimDebugEnabled = input<boolean | undefined>(undefined);\n\n /** Delay before switching to a newly hovered sibling submenu when aim is detected. */\n readonly aimSwitchDelayMs = input<number | undefined>(undefined);\n\n /** Maximum age of the last pointer sample used for intent detection. */\n readonly aimSampleMaxAgeMs = input<number | undefined>(undefined);\n\n getMenuAimConfig(): CoarMenuAimConfig {\n const base = this.parent?.getMenuAimConfig() ?? DEFAULT_COAR_MENU_AIM_CONFIG;\n\n return {\n enabled: this.aimEnabled() ?? base.enabled,\n debugEnabled: this.aimDebugEnabled() ?? base.debugEnabled,\n switchDelayMs: this.aimSwitchDelayMs() ?? base.switchDelayMs,\n sampleMaxAgeMs: this.aimSampleMaxAgeMs() ?? base.sampleMaxAgeMs,\n };\n }\n}\n","import { Component, ChangeDetectionStrategy, inject, input } from '@angular/core';\nimport { COAR_MENU_CASCADE, CoarMenuCascade } from './coar-menu-cascade';\nimport { COAR_OVERLAY_REF } from '@cocoar/ui-overlay';\nimport { CoarMenuAimConfigDirective } from './coar-menu-aim-config.directive';\n\n/**\n * CoarMenu: Shell component providing menu styling container.\n *\n * Responsibilities:\n * - Apply consistent menu styling via CSS variables\n * - Provide semantic menu container (<menu> or <div role=\"menu\">)\n * - Provide root cascade for sibling submenu tracking\n * - No logic - just a styled wrapper\n *\n * Use standalone for inline menus, or as content in CoarOverlayService for context menus/flyouts.\n *\n * @example\n * ```html\n * <coar-menu>\n * <coar-menu-item>Action 1</coar-menu-item>\n * <coar-menu-item>Action 2</coar-menu-item>\n * <coar-menu-divider></coar-menu-divider>\n * <coar-menu-item>Action 3</coar-menu-item>\n * </coar-menu>\n * ```\n */\n@Component({\n selector: 'coar-menu',\n standalone: true,\n imports: [],\n hostDirectives: [\n {\n directive: CoarMenuAimConfigDirective,\n inputs: ['aimEnabled', 'aimDebugEnabled', 'aimSwitchDelayMs', 'aimSampleMaxAgeMs'],\n },\n ],\n templateUrl: './coar-menu.component.html',\n styleUrl: './coar-menu.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'menu',\n class: 'coar-menu',\n '[class.coar-menu--in-overlay]': 'isInOverlay()',\n '[style.--coar-menu-icon-slot-display]': 'showIconColumn() ? null : \"none\"',\n '[style.--coar-menu-item-icon-slot-size]': 'showIconColumn() ? null : \"0px\"',\n },\n providers: [\n {\n provide: COAR_MENU_CASCADE,\n useFactory: () => {\n // Check if we're inside an overlay\n const inOverlay = inject(COAR_OVERLAY_REF, { optional: true });\n const parentCascade = inject(COAR_MENU_CASCADE, { optional: true, skipSelf: true });\n\n if (inOverlay && parentCascade) {\n // We're a menu inside a submenu overlay\n // Create a new cascade as a child of the parent, so sibling submenu-items\n // at this level can track each other\n return new CoarMenuCascade(parentCascade);\n }\n\n // For root menus (inline or context menu), create a new root cascade\n return new CoarMenuCascade(parentCascade);\n },\n },\n ],\n})\nexport class CoarMenuComponent {\n private readonly overlayRef = inject(COAR_OVERLAY_REF, { optional: true });\n\n /**\n * Controls whether the menu reserves and renders an icon column.\n *\n * Default is enabled to avoid layout shift for stateful icons (e.g. checkmarks).\n * Set to false for text-only menus (icons will not render).\n */\n readonly showIconColumn = input(true);\n\n /**\n * Check if this menu is rendered inside an overlay (flyout).\n * Used to enable border visibility for menu items.\n */\n protected isInOverlay(): boolean {\n return this.overlayRef !== null;\n }\n}\n","<ng-content />\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n output,\n HostListener,\n inject,\n} from '@angular/core';\nimport { CoarIconComponent, type CoreIconName } from '@cocoar/ui-components';\nimport { COAR_MENU_PARENT } from '@cocoar/ui-overlay';\n\n/**\n * Event emitted when a menu item is clicked.\n * Provides control over menu closing behavior.\n */\nexport interface CoarMenuItemClickEvent {\n /** Call this to keep the menu open after clicking (prevents auto-close) */\n keepMenuOpen(): void;\n /** Original mouse event */\n event: MouseEvent;\n}\n\n/**\n * CoarMenuItem: Individual menu item with optional icon and submenu support.\n *\n * Responsibilities:\n * - Render item text and optional icon\n * - Handle click events\n * - Support disabled state\n * - Visual states: hover, active, focus\n * - Trigger submenu (accordion or flyout via parent menu logic)\n *\n * Does NOT manage overlay directly - parent menu handles flyout logic.\n *\n * @example\n * ```html\n * <coar-menu-item (itemClick)=\"onSave()\">Save</coar-menu-item>\n * <coar-menu-item icon=\"copy\">Copy</coar-menu-item>\n * <coar-menu-item [disabled]=\"true\">Unavailable</coar-menu-item>\n *\n * <!-- Prevent menu from closing on click: -->\n * <coar-menu-item (itemClick)=\"toggle($event)\">Toggle Setting</coar-menu-item>\n *\n * toggle(event: CoarMenuItemClickEvent) {\n * event.keepMenuOpen(); // Keep menu open\n * this.setting = !this.setting;\n * }\n * ```\n */\n@Component({\n selector: 'coar-menu-item',\n standalone: true,\n imports: [CoarIconComponent],\n templateUrl: './coar-menu-item.component.html',\n styleUrl: './coar-menu-item.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'menuitem',\n class: 'coar-menu-item',\n '[class.coar-menu-item--disabled]': 'disabled()',\n '[attr.aria-disabled]': 'disabled()',\n '[attr.tabindex]': 'disabled() ? -1 : 0',\n },\n})\nexport class CoarMenuItemComponent {\n private readonly parentOverlay = inject(COAR_MENU_PARENT, { optional: true });\n\n /** Item text content */\n readonly label = input<string>();\n\n /** Optional icon identifier (rendered via CoarIconComponent) */\n readonly icon = input<CoreIconName | undefined>(undefined);\n\n /** Disabled state prevents interaction */\n readonly disabled = input(false);\n\n /** Emitted when user clicks/selects the item. Menu closes by default unless preventDefault() is called. */\n readonly itemClick = output<CoarMenuItemClickEvent>();\n\n /** Emitted when user hovers over item (for flyout trigger) */\n readonly itemHover = output<Event>();\n\n @HostListener('click', ['$event'])\n onClick(event: MouseEvent): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n // Always stop propagation to prevent overlay's outside-click handler\n event.stopPropagation();\n\n let shouldClose = true;\n\n const clickEvent: CoarMenuItemClickEvent = {\n event,\n keepMenuOpen: () => {\n shouldClose = false;\n },\n };\n\n this.itemClick.emit(clickEvent);\n\n // Close root overlay after Angular's change detection and OUTSIDE the hover area\n const parentOverlay = this.parentOverlay;\n if (shouldClose && parentOverlay) {\n setTimeout(() => {\n // Close the ROOT overlay to ensure the entire menu tree closes\n const root = parentOverlay.getRoot();\n root.close();\n }, 10);\n }\n }\n\n @HostListener('mouseenter', ['$event'])\n onMouseEnter(event: MouseEvent): void {\n if (!this.disabled()) {\n this.itemHover.emit(event);\n }\n }\n\n @HostListener('keydown.enter')\n @HostListener('keydown.space')\n onKeyboardActivate(): void {\n if (this.disabled()) {\n return;\n }\n\n let shouldClose = true;\n\n const clickEvent: CoarMenuItemClickEvent = {\n event: new MouseEvent('click'), // Synthetic event for keyboard\n keepMenuOpen: () => {\n shouldClose = false;\n },\n };\n\n this.itemClick.emit(clickEvent);\n\n const parentOverlay = this.parentOverlay;\n if (shouldClose && parentOverlay) {\n setTimeout(() => {\n // Close the ROOT overlay to ensure the entire menu tree closes\n const root = parentOverlay.getRoot();\n root.close();\n }, 10);\n }\n }\n}\n","<span class=\"coar-menu-item__icon\" aria-hidden=\"true\">\n <coar-icon [name]=\"icon() || 'square-rounded-dashed'\" size=\"sm\" aria-hidden=\"true\" />\n</span>\n<span class=\"coar-menu-item__label\">\n @if (label()) {\n {{ label() }}\n } @else {\n <ng-content />\n }\n</span>\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n/**\n * CoarMenuDivider: Visual separator between menu items.\n *\n * Simple horizontal line for grouping menu items.\n *\n * @example\n * ```html\n * <coar-menu>\n * <coar-menu-item>Cut</coar-menu-item>\n * <coar-menu-item>Copy</coar-menu-item>\n * <coar-menu-divider></coar-menu-divider>\n * <coar-menu-item>Paste</coar-menu-item>\n * </coar-menu>\n * ```\n */\n@Component({\n selector: 'coar-menu-divider',\n standalone: true,\n imports: [],\n template: '',\n styleUrl: './coar-menu-divider.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'separator',\n class: 'coar-menu-divider',\n },\n})\nexport class CoarMenuDividerComponent {}\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\n\n/**\n * CoarMenuHeading: Non-interactive section label for menu groups.\n *\n * Responsibilities:\n * - Display section/group heading text\n * - Provide visual separation between menu sections\n * - Non-interactive (no hover, no click, not focusable)\n *\n * @example\n * ```html\n * <coar-menu>\n * <coar-menu-heading>Foundations</coar-menu-heading>\n * <coar-menu-item routerLink=\"/typography\">Typography</coar-menu-item>\n * <coar-menu-item routerLink=\"/colors\">Colors</coar-menu-item>\n *\n * <coar-menu-heading>Form Controls</coar-menu-heading>\n * <coar-menu-item routerLink=\"/text-input\">Text Input</coar-menu-item>\n * </coar-menu>\n * ```\n */\n@Component({\n selector: 'coar-menu-heading',\n standalone: true,\n imports: [],\n template: `\n <div class=\"coar-menu-heading\">\n @if (label()) {\n {{ label() }}\n } @else {\n <ng-content />\n }\n </div>\n `,\n styleUrl: './coar-menu-heading.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'coar-menu-heading-host',\n },\n})\nexport class CoarMenuHeadingComponent {\n /** Optional explicit label text (alternative to content projection) */\n readonly label = input<string>();\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\n\n/**\n * Marks an inline submenu template for a `coar-submenu-item`.\n *\n * This is optional: if a submenu item contains exactly one direct child `<ng-template>`,\n * that template will be used even without this directive.\n */\n@Directive({\n selector: 'ng-template[coarSubmenu]',\n standalone: true,\n})\nexport class CoarSubmenuTemplateDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n input,\n ContentChild,\n ViewChild,\n TemplateRef,\n inject,\n DestroyRef,\n Injector,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CoarIconComponent, type CoreIconName } from '@cocoar/ui-components';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n CoarOverlayService,\n coarHoverMenuPreset,\n Overlay,\n COAR_MENU_PARENT,\n} from '@cocoar/ui-overlay';\nimport { COAR_MENU_CASCADE, CoarMenuCascade } from './coar-menu-cascade';\nimport { CoarSubmenuTemplateDirective } from './coar-submenu-template.directive';\n\n/**\n * CoarSubmenuItem: Menu item that opens a submenu on hover.\n *\n * Responsibilities:\n * - Render parent item with icon and label\n * - Manage submenu overlay lifecycle\n * - Support nested submenus (can contain other submenu-items)\n *\n * @example\n * ```html\n * <coar-submenu-item label=\"Share\" icon=\"🔗\">\n * <ng-template>\n * <coar-menu-item icon=\"✉️\" (itemClick)=\"sendEmail()\">Email</coar-menu-item>\n * <coar-menu-item icon=\"🔗\" (itemClick)=\"copyLink()\">Copy Link</coar-menu-item>\n * </ng-template>\n * </coar-submenu-item>\n *\n * <!-- Optional: explicitly mark the template -->\n * <coar-submenu-item label=\"Share\" icon=\"🔗\">\n * <ng-template coarSubmenu>\n * ...\n * </ng-template>\n * </coar-submenu-item>\n *\n * <!-- Also supported (legacy / external template): -->\n * <coar-submenu-item label=\"Share\" icon=\"🔗\" [submenuTemplate]=\"shareMenu\" />\n * ```\n */\n@Component({\n selector: 'coar-submenu-item, coar-sub-flyout',\n standalone: true,\n imports: [CommonModule, CoarIconComponent],\n template: `\n <div\n class=\"coar-submenu-item\"\n [class.coar-submenu-item--disabled]=\"disabled()\"\n [class.coar-submenu-item--open]=\"isOpen\"\n [attr.role]=\"'menuitem'\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (mouseenter)=\"onMouseEnter($event)\"\n (click)=\"onClick($event)\"\n (keydown.enter)=\"onKeyboardActivate($event)\"\n (keydown.space)=\"onKeyboardActivate($event)\"\n >\n <span class=\"coar-submenu-item__icon\" aria-hidden=\"true\">\n <coar-icon [name]=\"icon() || 'square-rounded-dashed'\" size=\"sm\" aria-hidden=\"true\" />\n </span>\n <span class=\"coar-submenu-item__label\">{{ label() }}</span>\n <coar-icon\n name=\"chevron-right\"\n size=\"xs\"\n class=\"coar-submenu-item__arrow\"\n aria-hidden=\"true\"\n />\n </div>\n\n <ng-template #overlaySubmenuTemplate>\n <ng-container\n *ngTemplateOutlet=\"submenuTemplateToRender(); injector: submenuTemplateInjector\"\n />\n </ng-template>\n `,\n styleUrl: './coar-submenu-item.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: COAR_MENU_CASCADE,\n useFactory: () =>\n new CoarMenuCascade(inject(COAR_MENU_CASCADE, { optional: true, skipSelf: true })),\n },\n ],\n})\nexport class CoarSubmenuItemComponent {\n private readonly overlayService = inject(CoarOverlayService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly cascade = inject(COAR_MENU_CASCADE);\n private readonly parentOverlay = inject(COAR_MENU_PARENT, { optional: true });\n private readonly injector = inject(Injector);\n\n // Ensures the submenu TemplateRef is instantiated with a parent injector that contains\n // the correct cascade instance for this submenu item. Without this, TemplateRefs declared\n // outside of this component can end up resolving menu context from the declaration site.\n protected readonly submenuTemplateInjector = Injector.create({\n providers: [{ provide: COAR_MENU_CASCADE, useValue: this.cascade }],\n parent: this.injector,\n });\n\n constructor() {\n // Cleanup cascade when component is destroyed\n this.destroyRef.onDestroy(() => {\n this.cascade.destroy();\n // Ensure state is cleared on destroy\n if (this.isOpen) {\n this.isOpen = false;\n this.submenuRef = null;\n }\n });\n }\n\n /** Label text for the menu item */\n readonly label = input.required<string>();\n\n /** Optional icon identifier */\n readonly icon = input<CoreIconName | undefined>(undefined);\n\n /** Disabled state prevents interaction */\n readonly disabled = input(false);\n\n /**\n * Optional external submenu template.\n *\n * Prefer an inline `<ng-template>` child when possible.\n */\n readonly submenuTemplate = input<TemplateRef<unknown> | null>(null);\n\n @ContentChild(CoarSubmenuTemplateDirective, { descendants: false })\n private readonly markedInlineTemplate?: CoarSubmenuTemplateDirective;\n\n @ContentChild(TemplateRef, { descendants: false })\n private readonly inlineTemplate?: TemplateRef<unknown>;\n\n @ViewChild('overlaySubmenuTemplate') private overlaySubmenuTemplate!: TemplateRef<unknown>;\n\n private submenuRef: ReturnType<typeof this.overlayService.open> | null = null;\n isOpen = false;\n\n protected submenuTemplateToRender(): TemplateRef<unknown> {\n const template =\n this.markedInlineTemplate?.templateRef ?? this.inlineTemplate ?? this.submenuTemplate();\n\n if (!template) {\n throw new Error(\n 'CoarSubmenuItemComponent: missing submenu content. Provide either an inline <ng-template> child or set [submenuTemplate].'\n );\n }\n\n return template;\n }\n\n onMouseEnter(event: MouseEvent): void {\n if (this.disabled()) {\n return;\n }\n\n // Defensive: sync state with actual overlay status\n if (this.submenuRef) {\n if (this.submenuRef.isClosed) {\n // Overlay is closed, clear everything\n this.submenuRef = null;\n this.isOpen = false;\n this.cdr.markForCheck();\n } else if (!this.isOpen) {\n // Overlay is open but state is wrong - fix it\n this.isOpen = true;\n this.cdr.markForCheck();\n }\n }\n\n // Open submenu if not already open\n if (!this.submenuRef) {\n const anchor = event.currentTarget as HTMLElement;\n\n // Menu-aim: when a different sibling submenu is already open, delay switching\n // if the pointer trajectory suggests the user is heading into the open submenu panel.\n const parent = this.cascade.parent;\n if (parent) {\n parent.requestOpenFromChild(this.cascade, () => this.openSubmenu(anchor), {\n x: event.clientX,\n y: event.clientY,\n });\n } else {\n this.openSubmenu(anchor);\n }\n }\n }\n\n onClick(event: MouseEvent): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (this.submenuRef?.isClosed) {\n this.submenuRef = null;\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n\n // For accessibility: toggle on click/Enter/Space\n if (this.submenuRef) {\n this.closeSubmenu();\n } else {\n this.openSubmenu(event.currentTarget as HTMLElement);\n }\n }\n\n onKeyboardActivate(event: Event): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (this.submenuRef?.isClosed) {\n this.submenuRef = null;\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n\n const target = event.currentTarget as HTMLElement;\n if (this.submenuRef) {\n this.closeSubmenu();\n } else {\n this.openSubmenu(target);\n }\n }\n\n private openSubmenu(anchorElement: HTMLElement): void {\n // Validate early so the error points at the submenu item usage.\n this.submenuTemplateToRender();\n\n // All overlays use hoverTree preset for proper tree tracking\n const spec = Overlay.define<void>((b) => {\n b.content((c) => c.fromTemplate(this.overlaySubmenuTemplate));\n b.anchor({ kind: 'element', element: anchorElement });\n b.position({ placement: ['right-start', 'left-start'], offset: -4, flip: true, shift: true });\n }, coarHoverMenuPreset);\n\n // Prefer the cascade parent's overlayRef when available.\n // With Angular content projection, submenu content can be instantiated in the *root* overlay\n // injector even when it's rendered inside a child overlay. The cascade chain preserves the\n // correct containing overlay via overlayRef.\n const containingOverlay = this.cascade.parent?.overlayRef ?? this.parentOverlay;\n\n if (containingOverlay) {\n // Inside an overlay: close siblings (direct children of parent) then open as child\n // First, create the child overlay\n this.submenuRef = this.overlayService.openChild(containingOverlay, spec, undefined);\n\n // Then close siblings, excluding the newly opened one\n containingOverlay.closeChildren(this.submenuRef);\n } else {\n // Inline menu: use cascade-level sibling closure\n this.cascade.closeSiblings();\n this.submenuRef = this.overlayService.open(spec, undefined);\n }\n\n // Expose the overlay ref to descendants so they can parent their own flyouts correctly.\n this.cascade.overlayRef = this.submenuRef;\n this.cascade.parent?.notifyChildOpened(this.cascade);\n\n this.isOpen = true;\n this.cdr.markForCheck();\n\n const openedRef = this.submenuRef;\n\n // Clear the active styling as soon as a close is initiated (e.g. hoverTree timer,\n // outside click, or sibling submenu switch). Otherwise the item can look \"stuck\"\n // while the overlay finishes its close transition.\n const originalClose = openedRef.close.bind(openedRef);\n openedRef.close = (result?: unknown) => {\n if (this.submenuRef === openedRef && this.isOpen) {\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n\n originalClose(result);\n };\n\n openedRef.afterClosed$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n // Only clear state if this is still the current overlay\n // (prevents race condition when rapidly opening new overlays)\n if (this.submenuRef === openedRef) {\n this.submenuRef = null;\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n\n if (this.cascade.overlayRef === openedRef) {\n this.cascade.overlayRef = null;\n }\n\n this.cascade.parent?.notifyChildClosed(this.cascade);\n });\n }\n\n // Parent overlay is resolved via COAR_OVERLAY_REF when rendered inside an overlay.\n\n private closeSubmenu(): void {\n this.submenuRef?.close();\n this.submenuRef = null;\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n TemplateRef,\n booleanAttribute,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CoarIconComponent, type CoreIconName } from '@cocoar/ui-components';\nimport { CoarSubmenuTemplateDirective } from './coar-submenu-template.directive';\n\n/**\n * CoarSubExpand: Menu item that expands/collapses a submenu inline.\n *\n * Use this variant when you want nested options to stay visible (e.g. sidebar panels)\n * while still reusing the same menu item types inside the submenu.\n *\n * @example\n * ```html\n * <coar-menu>\n * <coar-sub-expand label=\"Filters\" icon=\"settings\" [(open)]=\"filtersOpen\">\n * <ng-template>\n * <coar-menu>\n * <coar-menu-item icon=\"plus\">Add Filter</coar-menu-item>\n * <coar-menu-item icon=\"trash\">Clear</coar-menu-item>\n * </coar-menu>\n * </ng-template>\n </coar-sub-expand>\n * </coar-menu>\n * ```\n */\n@Component({\n selector: 'coar-sub-expand',\n standalone: true,\n imports: [CommonModule, CoarIconComponent],\n template: `\n <div\n class=\"coar-sub-expand\"\n [class.coar-sub-expand--disabled]=\"disabled()\"\n [class.coar-sub-expand--open]=\"isOpen()\"\n [attr.role]=\"'menuitem'\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (click)=\"toggle($event)\"\n (keydown.enter)=\"toggle($event)\"\n (keydown.space)=\"toggle($event)\"\n >\n <span class=\"coar-sub-expand__icon\" aria-hidden=\"true\">\n <coar-icon [name]=\"icon() || 'square-rounded-dashed'\" size=\"sm\" aria-hidden=\"true\" />\n </span>\n <span class=\"coar-sub-expand__label\">{{ label() }}</span>\n <coar-icon\n [name]=\"isOpen() ? 'minus' : 'plus'\"\n size=\"xs\"\n class=\"coar-sub-expand__arrow\"\n aria-hidden=\"true\"\n />\n </div>\n\n <div\n class=\"coar-sub-expand__panel\"\n [class.coar-sub-expand__panel--open]=\"isOpen()\"\n [attr.aria-hidden]=\"isOpen() ? null : 'true'\"\n role=\"group\"\n >\n <div class=\"coar-sub-expand__panel-inner\">\n <ng-container *ngTemplateOutlet=\"submenuTemplateToRender()\" />\n </div>\n </div>\n `,\n styleUrl: './coar-sub-expand.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CoarSubExpandComponent {\n /** Label text for the menu item */\n readonly label = input.required<string>();\n\n /** Optional icon identifier */\n readonly icon = input<CoreIconName | undefined>(undefined);\n\n /** Disabled state prevents interaction */\n readonly disabled = input(false);\n\n /** Expanded state (two-way bindable with [(open)]) */\n readonly open = input<boolean | undefined, unknown>(undefined, { transform: booleanAttribute });\n\n /** Emits when expanded state changes (for [(open)]) */\n readonly openChange = output<boolean>();\n\n private readonly openInternal = signal(false);\n\n protected readonly isOpen = computed(() => this.open() ?? this.openInternal());\n\n /** Optional external submenu template. Prefer an inline `<ng-template>` child when possible. */\n readonly submenuTemplate = input<TemplateRef<unknown> | null>(null);\n\n @ContentChild(CoarSubmenuTemplateDirective, { descendants: false })\n private readonly markedInlineTemplate?: CoarSubmenuTemplateDirective;\n\n @ContentChild(TemplateRef, { descendants: false })\n private readonly inlineTemplate?: TemplateRef<unknown>;\n\n protected submenuTemplateToRender(): TemplateRef<unknown> {\n const template =\n this.markedInlineTemplate?.templateRef ?? this.inlineTemplate ?? this.submenuTemplate();\n\n if (!template) {\n throw new Error(\n 'CoarSubExpandComponent: missing submenu content. Provide either an inline <ng-template> child or set [submenuTemplate].'\n );\n }\n\n return template;\n }\n\n constructor() {\n effect(() => {\n const value = this.open();\n if (value === undefined) return;\n\n this.openInternal.set(value);\n });\n }\n\n toggle(event: Event): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n const next = !this.isOpen();\n this.openInternal.set(next);\n this.openChange.emit(next);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.CoarMenuAimConfigDirective"],"mappings":"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"}
1
+ {"version":3,"file":"cocoar-ui-menu.mjs","sources":["../../../../libs/ui-menu/src/lib/coar-menu-aim.ts","../../../../libs/ui-menu/src/lib/coar-menu-aim-config.ts","../../../../libs/ui-menu/src/lib/coar-menu-cascade.ts","../../../../libs/ui-menu/src/lib/coar-menu-aim-config.directive.ts","../../../../libs/ui-menu/src/lib/coar-menu.component.ts","../../../../libs/ui-menu/src/lib/coar-menu.component.html","../../../../libs/ui-menu/src/lib/coar-menu-item.component.ts","../../../../libs/ui-menu/src/lib/coar-menu-item.component.html","../../../../libs/ui-menu/src/lib/coar-menu-divider.component.ts","../../../../libs/ui-menu/src/lib/coar-menu-heading.component.ts","../../../../libs/ui-menu/src/lib/coar-submenu-template.directive.ts","../../../../libs/ui-menu/src/lib/coar-submenu-item.component.ts","../../../../libs/ui-menu/src/lib/coar-sub-expand.component.ts","../../../../libs/ui-menu/src/cocoar-ui-menu.ts"],"sourcesContent":["export interface CoarMenuAimPoint {\n readonly x: number;\n readonly y: number;\n readonly t: number;\n}\n\nexport type CoarMenuAimDirection = 'right' | 'left';\n\nexport function shouldDelaySubmenuSwitch(\n previous: CoarMenuAimPoint | null,\n current: CoarMenuAimPoint,\n submenuRect: DOMRect,\n direction: CoarMenuAimDirection,\n sampleMaxAgeMs = 200\n): boolean {\n if (!previous) return false;\n\n // If submenu rect is not measurable, don't delay.\n if (!Number.isFinite(submenuRect.left) || submenuRect.width <= 0 || submenuRect.height <= 0) {\n return false;\n }\n\n // If the last movement was long ago, don't apply aim heuristics.\n if (current.t - previous.t > sampleMaxAgeMs) return false;\n\n const dx = current.x - previous.x;\n\n // Require clear horizontal intent toward the submenu.\n if (direction === 'right' && dx <= 2) return false;\n if (direction === 'left' && dx >= -2) return false;\n\n // Use the NEAR edge of the submenu panel (closest to the parent menu).\n // This matches the classic \"menu aim\" wedge used to detect intent to enter the open submenu.\n // Right-opening submenu: use left edge; left-opening submenu: use right edge.\n const edgeX = direction === 'right' ? submenuRect.left : submenuRect.right;\n\n // Expand wedge slightly to be forgiving.\n const padY = 8;\n const cornerA = { x: edgeX, y: submenuRect.top - padY };\n const cornerB = { x: edgeX, y: submenuRect.bottom + padY };\n\n return pointInTriangle(current, previous, cornerA, cornerB);\n}\n\nfunction pointInTriangle(\n p: { x: number; y: number },\n a: { x: number; y: number },\n b: { x: number; y: number },\n c: { x: number; y: number }\n): boolean {\n const d1 = sign(p, a, b);\n const d2 = sign(p, b, c);\n const d3 = sign(p, c, a);\n\n const hasNeg = d1 < 0 || d2 < 0 || d3 < 0;\n const hasPos = d1 > 0 || d2 > 0 || d3 > 0;\n\n return !(hasNeg && hasPos);\n}\n\nfunction sign(\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n p3: { x: number; y: number }\n): number {\n return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y);\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface CoarMenuAimConfig {\n readonly enabled: boolean;\n /** Emits debug events consumed by the showcase to render the aim triangle overlay. */\n readonly debugEnabled: boolean;\n /** Delay before switching to a newly hovered sibling submenu when aim is detected. */\n readonly switchDelayMs: number;\n /** Maximum age of the last pointer sample used for intent detection. */\n readonly sampleMaxAgeMs: number;\n}\n\nexport interface CoarMenuAimConfigProvider {\n getMenuAimConfig(): CoarMenuAimConfig;\n}\n\nexport const DEFAULT_COAR_MENU_AIM_CONFIG: CoarMenuAimConfig = {\n enabled: true,\n debugEnabled: false,\n switchDelayMs: 500,\n sampleMaxAgeMs: 200,\n};\n\nexport const COAR_MENU_AIM_CONFIG = new InjectionToken<CoarMenuAimConfigProvider>(\n 'COAR_MENU_AIM_CONFIG'\n);\n","import { InjectionToken, inject } from '@angular/core';\nimport type { OverlayRef } from '@cocoar/ui-overlay';\nimport { shouldDelaySubmenuSwitch, type CoarMenuAimPoint } from './coar-menu-aim';\nimport {\n COAR_MENU_AIM_CONFIG,\n DEFAULT_COAR_MENU_AIM_CONFIG,\n type CoarMenuAimConfigProvider,\n} from './coar-menu-aim-config';\n\n/**\n * CoarMenuCascade: Tracks parent-child and sibling relationships for menu hierarchies.\n *\n * Responsibilities:\n * - Track overlay refs for nested submenu parenting\n * - Track children to enable sibling closure (for inline menus without a common parent overlay)\n */\nexport class CoarMenuCascade {\n overlayRef: OverlayRef | null = null;\n private children = new Set<CoarMenuCascade>();\n\n private readonly aimConfig: CoarMenuAimConfigProvider | null = inject(COAR_MENU_AIM_CONFIG, {\n optional: true,\n });\n\n private activeChild: CoarMenuCascade | null = null;\n private pointerHistory: CoarMenuAimPoint[] = [];\n private pointerAbort: AbortController | null = null;\n\n private pendingSwitchTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingChild: CoarMenuCascade | null = null;\n private pendingActivate: (() => void) | null = null;\n private activePanelCleanup: (() => void) | null = null;\n\n constructor(readonly parent: CoarMenuCascade | null) {\n // Register with parent to enable sibling tracking\n if (parent) {\n parent.children.add(this);\n }\n }\n\n requestOpenFromChild(\n child: CoarMenuCascade,\n activate: () => void,\n pointer: { x: number; y: number }\n ): void {\n const aim = this.aimConfig?.getMenuAimConfig() ?? DEFAULT_COAR_MENU_AIM_CONFIG;\n if (!aim.enabled) {\n this.activateNow(child, activate);\n return;\n }\n\n if (typeof document === 'undefined') {\n this.activateNow(child, activate);\n return;\n }\n\n const now = Date.now();\n const point: CoarMenuAimPoint = { x: pointer.x, y: pointer.y, t: now };\n this.pushPointerPoint(point);\n\n if (!this.activeChild || this.activeChild === child) {\n this.activateNow(child, activate);\n return;\n }\n\n const submenuRect = this.getActiveChildSubmenuRect();\n if (!submenuRect) {\n this.activateNow(child, activate);\n return;\n }\n\n const previous =\n this.pointerHistory.length >= 2 ? this.pointerHistory[this.pointerHistory.length - 2] : null;\n const direction = this.inferSubmenuDirection(submenuRect, point);\n\n const shouldDelay = shouldDelaySubmenuSwitch(\n previous,\n point,\n submenuRect,\n direction,\n aim.sampleMaxAgeMs\n );\n\n this.emitAimDebugIfEnabled(\n aim.debugEnabled,\n shouldDelay,\n previous,\n point,\n submenuRect,\n direction\n );\n\n if (!shouldDelay) {\n this.activateNow(child, activate);\n return;\n }\n\n this.scheduleSwitch(child, activate, aim.switchDelayMs);\n }\n\n private emitAimDebugIfEnabled(\n debugEnabled: boolean,\n shouldDelay: boolean,\n previous: CoarMenuAimPoint | null,\n current: CoarMenuAimPoint,\n submenuRect: DOMRect,\n direction: 'right' | 'left'\n ): void {\n if (typeof window === 'undefined') return;\n\n // Backward-compatible global override for ad-hoc debugging.\n const w = window as unknown as { __COAR_MENU_AIM_DEBUG__?: boolean };\n if (!debugEnabled && !w.__COAR_MENU_AIM_DEBUG__) return;\n\n try {\n window.dispatchEvent(\n new CustomEvent('coar-menu-aim', {\n detail: {\n shouldDelay,\n previous,\n current,\n submenuRect: {\n left: submenuRect.left,\n top: submenuRect.top,\n right: submenuRect.right,\n bottom: submenuRect.bottom,\n },\n direction,\n },\n })\n );\n } catch {\n // ignore\n }\n }\n\n notifyChildOpened(child: CoarMenuCascade): void {\n if (this.activeChild === child) {\n this.attachActivePanelListener();\n }\n }\n\n notifyChildClosed(child: CoarMenuCascade): void {\n if (this.activeChild === child) {\n this.activeChild = null;\n this.detachActivePanelListener();\n this.cancelPendingSwitch();\n this.stopPointerTracking();\n }\n }\n\n private activateNow(child: CoarMenuCascade, activate: () => void): void {\n this.cancelPendingSwitch();\n this.activeChild = child;\n this.ensurePointerTracking();\n activate();\n }\n\n private scheduleSwitch(child: CoarMenuCascade, activate: () => void, delayMs: number): void {\n this.cancelPendingSwitch();\n\n this.pendingChild = child;\n this.pendingActivate = activate;\n this.pendingSwitchTimer = setTimeout(() => {\n const pendingChild = this.pendingChild;\n const pendingActivate = this.pendingActivate;\n\n this.pendingChild = null;\n this.pendingActivate = null;\n this.pendingSwitchTimer = null;\n\n if (!pendingChild || !pendingActivate) return;\n this.activeChild = pendingChild;\n this.ensurePointerTracking();\n pendingActivate();\n }, delayMs);\n }\n\n private cancelPendingSwitch(): void {\n if (this.pendingSwitchTimer) {\n clearTimeout(this.pendingSwitchTimer);\n this.pendingSwitchTimer = null;\n }\n this.pendingChild = null;\n this.pendingActivate = null;\n }\n\n private ensurePointerTracking(): void {\n if (this.pointerAbort) return;\n if (typeof document === 'undefined') return;\n\n const abort = new AbortController();\n this.pointerAbort = abort;\n\n const onMove = (e: PointerEvent) => {\n this.pushPointerPoint({ x: e.clientX, y: e.clientY, t: Date.now() });\n };\n\n document.addEventListener('pointermove', onMove, { signal: abort.signal, passive: true });\n }\n\n private stopPointerTracking(): void {\n if (!this.pointerAbort) return;\n this.pointerAbort.abort();\n this.pointerAbort = null;\n this.pointerHistory = [];\n }\n\n private pushPointerPoint(point: CoarMenuAimPoint): void {\n this.pointerHistory.push(point);\n if (this.pointerHistory.length > 5) {\n this.pointerHistory = this.pointerHistory.slice(-5);\n }\n }\n\n private getActiveChildSubmenuRect(): DOMRect | null {\n const panelEl = this.activeChild?.overlayRef?.getPanelElement?.();\n if (!panelEl) return null;\n return panelEl.getBoundingClientRect();\n }\n\n private inferSubmenuDirection(rect: DOMRect, point: { x: number; y: number }): 'right' | 'left' {\n // If the submenu's left edge is to the right of the pointer, it's a right-opening flyout.\n // Otherwise, assume left.\n return rect.left >= point.x ? 'right' : 'left';\n }\n\n private attachActivePanelListener(): void {\n this.detachActivePanelListener();\n\n const panelEl = this.activeChild?.overlayRef?.getPanelElement?.();\n if (!panelEl) return;\n\n const onEnter = () => {\n // Once the user reaches the currently open submenu panel, don't allow a delayed switch\n // to steal focus/open another sibling submenu.\n this.cancelPendingSwitch();\n };\n\n panelEl.addEventListener('pointerenter', onEnter);\n this.activePanelCleanup = () => panelEl.removeEventListener('pointerenter', onEnter);\n }\n\n private detachActivePanelListener(): void {\n this.activePanelCleanup?.();\n this.activePanelCleanup = null;\n }\n\n /**\n * Close all sibling submenus at the cascade level.\n * Used for inline menus where siblings don't have a common parent overlay.\n */\n closeSiblings(): void {\n if (this.parent) {\n for (const sibling of this.parent.children) {\n if (sibling !== this && sibling.overlayRef) {\n sibling.overlayRef.close();\n }\n }\n }\n }\n\n destroy(): void {\n this.detachActivePanelListener();\n this.cancelPendingSwitch();\n this.stopPointerTracking();\n if (this.parent) {\n this.parent.children.delete(this);\n }\n }\n}\n\nexport const COAR_MENU_CASCADE = new InjectionToken<CoarMenuCascade>('COAR_MENU_CASCADE');\n","import { Directive, input, inject } from '@angular/core';\nimport {\n COAR_MENU_AIM_CONFIG,\n DEFAULT_COAR_MENU_AIM_CONFIG,\n type CoarMenuAimConfig,\n type CoarMenuAimConfigProvider,\n} from './coar-menu-aim-config';\n\n@Directive({\n selector: '[coarMenuAimConfig]',\n standalone: true,\n providers: [{ provide: COAR_MENU_AIM_CONFIG, useExisting: CoarMenuAimConfigDirective }],\n})\nexport class CoarMenuAimConfigDirective implements CoarMenuAimConfigProvider {\n private readonly parent = inject(COAR_MENU_AIM_CONFIG, { optional: true, skipSelf: true });\n\n /** Enable/disable menu-aim for this menu tree. */\n readonly aimEnabled = input<boolean | undefined>(undefined);\n\n /** Emit debug events for menu-aim visualization (showcase only). */\n readonly aimDebugEnabled = input<boolean | undefined>(undefined);\n\n /** Delay before switching to a newly hovered sibling submenu when aim is detected. */\n readonly aimSwitchDelayMs = input<number | undefined>(undefined);\n\n /** Maximum age of the last pointer sample used for intent detection. */\n readonly aimSampleMaxAgeMs = input<number | undefined>(undefined);\n\n getMenuAimConfig(): CoarMenuAimConfig {\n const base = this.parent?.getMenuAimConfig() ?? DEFAULT_COAR_MENU_AIM_CONFIG;\n\n return {\n enabled: this.aimEnabled() ?? base.enabled,\n debugEnabled: this.aimDebugEnabled() ?? base.debugEnabled,\n switchDelayMs: this.aimSwitchDelayMs() ?? base.switchDelayMs,\n sampleMaxAgeMs: this.aimSampleMaxAgeMs() ?? base.sampleMaxAgeMs,\n };\n }\n}\n","import { Component, ChangeDetectionStrategy, inject, input } from '@angular/core';\nimport { COAR_MENU_CASCADE, CoarMenuCascade } from './coar-menu-cascade';\nimport { COAR_OVERLAY_REF } from '@cocoar/ui-overlay';\nimport { CoarMenuAimConfigDirective } from './coar-menu-aim-config.directive';\n\n/**\n * CoarMenu: Shell component providing menu styling container.\n *\n * Responsibilities:\n * - Apply consistent menu styling via CSS variables\n * - Provide semantic menu container (<menu> or <div role=\"menu\">)\n * - Provide root cascade for sibling submenu tracking\n * - No logic - just a styled wrapper\n *\n * Use standalone for inline menus, or as content in CoarOverlayService for context menus/flyouts.\n *\n * @example\n * ```html\n * <coar-menu>\n * <coar-menu-item>Action 1</coar-menu-item>\n * <coar-menu-item>Action 2</coar-menu-item>\n * <coar-menu-divider></coar-menu-divider>\n * <coar-menu-item>Action 3</coar-menu-item>\n * </coar-menu>\n * ```\n */\n@Component({\n selector: 'coar-menu',\n standalone: true,\n imports: [],\n hostDirectives: [\n {\n directive: CoarMenuAimConfigDirective,\n inputs: ['aimEnabled', 'aimDebugEnabled', 'aimSwitchDelayMs', 'aimSampleMaxAgeMs'],\n },\n ],\n templateUrl: './coar-menu.component.html',\n styleUrl: './coar-menu.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'menu',\n class: 'coar-menu',\n '[class.coar-menu--in-overlay]': 'isInOverlay()',\n '[style.--coar-menu-icon-slot-display]': 'showIconColumn() ? null : \"none\"',\n '[style.--coar-menu-item-icon-slot-size]': 'showIconColumn() ? null : \"0px\"',\n },\n providers: [\n {\n provide: COAR_MENU_CASCADE,\n useFactory: () => {\n // Check if we're inside an overlay\n const inOverlay = inject(COAR_OVERLAY_REF, { optional: true });\n const parentCascade = inject(COAR_MENU_CASCADE, { optional: true, skipSelf: true });\n\n if (inOverlay && parentCascade) {\n // We're a menu inside a submenu overlay\n // Create a new cascade as a child of the parent, so sibling submenu-items\n // at this level can track each other\n return new CoarMenuCascade(parentCascade);\n }\n\n // For root menus (inline or context menu), create a new root cascade\n return new CoarMenuCascade(parentCascade);\n },\n },\n ],\n})\nexport class CoarMenuComponent {\n private readonly overlayRef = inject(COAR_OVERLAY_REF, { optional: true });\n\n /**\n * Controls whether the menu reserves and renders an icon column.\n *\n * Default is enabled to avoid layout shift for stateful icons (e.g. checkmarks).\n * Set to false for text-only menus (icons will not render).\n */\n readonly showIconColumn = input(true);\n\n /**\n * Check if this menu is rendered inside an overlay (flyout).\n * Used to enable border visibility for menu items.\n */\n protected isInOverlay(): boolean {\n return this.overlayRef !== null;\n }\n}\n","<ng-content />\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n output,\n HostListener,\n inject,\n} from '@angular/core';\nimport { CoarIconComponent, type CoreIconName } from '@cocoar/ui-components';\nimport { COAR_MENU_PARENT } from '@cocoar/ui-overlay';\n\n/**\n * Event emitted when a menu item is clicked.\n * Provides control over menu closing behavior.\n */\nexport interface CoarMenuItemClickEvent {\n /** Call this to keep the menu open after clicking (prevents auto-close) */\n keepMenuOpen(): void;\n /** Original mouse event */\n event: MouseEvent;\n}\n\n/**\n * CoarMenuItem: Individual menu item with optional icon and submenu support.\n *\n * Responsibilities:\n * - Render item text and optional icon\n * - Handle click events\n * - Support disabled state\n * - Visual states: hover, active, focus\n * - Trigger submenu (accordion or flyout via parent menu logic)\n *\n * Does NOT manage overlay directly - parent menu handles flyout logic.\n *\n * @example\n * ```html\n * <coar-menu-item (itemClick)=\"onSave()\">Save</coar-menu-item>\n * <coar-menu-item icon=\"copy\">Copy</coar-menu-item>\n * <coar-menu-item [disabled]=\"true\">Unavailable</coar-menu-item>\n *\n * <!-- Prevent menu from closing on click: -->\n * <coar-menu-item (itemClick)=\"toggle($event)\">Toggle Setting</coar-menu-item>\n *\n * toggle(event: CoarMenuItemClickEvent) {\n * event.keepMenuOpen(); // Keep menu open\n * this.setting = !this.setting;\n * }\n * ```\n */\n@Component({\n selector: 'coar-menu-item',\n standalone: true,\n imports: [CoarIconComponent],\n templateUrl: './coar-menu-item.component.html',\n styleUrl: './coar-menu-item.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'menuitem',\n class: 'coar-menu-item',\n '[class.coar-menu-item--disabled]': 'disabled()',\n '[attr.aria-disabled]': 'disabled()',\n '[attr.tabindex]': 'disabled() ? -1 : 0',\n },\n})\nexport class CoarMenuItemComponent {\n private readonly parentOverlay = inject(COAR_MENU_PARENT, { optional: true });\n\n /** Item text content */\n readonly label = input<string>();\n\n /** Optional icon identifier (rendered via CoarIconComponent) */\n readonly icon = input<CoreIconName | undefined>(undefined);\n\n /** Disabled state prevents interaction */\n readonly disabled = input(false);\n\n /** Emitted when user clicks/selects the item. Menu closes by default unless preventDefault() is called. */\n readonly itemClick = output<CoarMenuItemClickEvent>();\n\n /** Emitted when user hovers over item (for flyout trigger) */\n readonly itemHover = output<Event>();\n\n @HostListener('click', ['$event'])\n onClick(event: MouseEvent): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n // Always stop propagation to prevent overlay's outside-click handler\n event.stopPropagation();\n\n let shouldClose = true;\n\n const clickEvent: CoarMenuItemClickEvent = {\n event,\n keepMenuOpen: () => {\n shouldClose = false;\n },\n };\n\n this.itemClick.emit(clickEvent);\n\n // Close root overlay after Angular's change detection and OUTSIDE the hover area\n const parentOverlay = this.parentOverlay;\n if (shouldClose && parentOverlay) {\n setTimeout(() => {\n // Close the ROOT overlay to ensure the entire menu tree closes\n const root = parentOverlay.getRoot();\n root.close();\n }, 10);\n }\n }\n\n @HostListener('mouseenter', ['$event'])\n onMouseEnter(event: MouseEvent): void {\n if (!this.disabled()) {\n this.itemHover.emit(event);\n }\n }\n\n @HostListener('keydown.enter')\n @HostListener('keydown.space')\n onKeyboardActivate(): void {\n if (this.disabled()) {\n return;\n }\n\n let shouldClose = true;\n\n const clickEvent: CoarMenuItemClickEvent = {\n event: new MouseEvent('click'), // Synthetic event for keyboard\n keepMenuOpen: () => {\n shouldClose = false;\n },\n };\n\n this.itemClick.emit(clickEvent);\n\n const parentOverlay = this.parentOverlay;\n if (shouldClose && parentOverlay) {\n setTimeout(() => {\n // Close the ROOT overlay to ensure the entire menu tree closes\n const root = parentOverlay.getRoot();\n root.close();\n }, 10);\n }\n }\n}\n","<span class=\"coar-menu-item__icon\" aria-hidden=\"true\">\n <coar-icon [name]=\"icon() || 'square-rounded-dashed'\" size=\"sm\" aria-hidden=\"true\" />\n</span>\n<span class=\"coar-menu-item__label\">\n @if (label()) {\n {{ label() }}\n } @else {\n <ng-content />\n }\n</span>\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n/**\n * CoarMenuDivider: Visual separator between menu items.\n *\n * Simple horizontal line for grouping menu items.\n *\n * @example\n * ```html\n * <coar-menu>\n * <coar-menu-item>Cut</coar-menu-item>\n * <coar-menu-item>Copy</coar-menu-item>\n * <coar-menu-divider></coar-menu-divider>\n * <coar-menu-item>Paste</coar-menu-item>\n * </coar-menu>\n * ```\n */\n@Component({\n selector: 'coar-menu-divider',\n standalone: true,\n imports: [],\n template: '',\n styleUrl: './coar-menu-divider.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'separator',\n class: 'coar-menu-divider',\n },\n})\nexport class CoarMenuDividerComponent {}\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\n\n/**\n * CoarMenuHeading: Non-interactive section label for menu groups.\n *\n * Responsibilities:\n * - Display section/group heading text\n * - Provide visual separation between menu sections\n * - Non-interactive (no hover, no click, not focusable)\n *\n * @example\n * ```html\n * <coar-menu>\n * <coar-menu-heading>Foundations</coar-menu-heading>\n * <coar-menu-item routerLink=\"/typography\">Typography</coar-menu-item>\n * <coar-menu-item routerLink=\"/colors\">Colors</coar-menu-item>\n *\n * <coar-menu-heading>Form Controls</coar-menu-heading>\n * <coar-menu-item routerLink=\"/text-input\">Text Input</coar-menu-item>\n * </coar-menu>\n * ```\n */\n@Component({\n selector: 'coar-menu-heading',\n standalone: true,\n imports: [],\n template: `\n <div class=\"coar-menu-heading\">\n @if (label()) {\n {{ label() }}\n } @else {\n <ng-content />\n }\n </div>\n `,\n styleUrl: './coar-menu-heading.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'coar-menu-heading-host',\n },\n})\nexport class CoarMenuHeadingComponent {\n /** Optional explicit label text (alternative to content projection) */\n readonly label = input<string>();\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\n\n/**\n * Marks an inline submenu template for a `coar-submenu-item`.\n *\n * This is optional: if a submenu item contains exactly one direct child `<ng-template>`,\n * that template will be used even without this directive.\n */\n@Directive({\n selector: 'ng-template[coarSubmenu]',\n standalone: true,\n})\nexport class CoarSubmenuTemplateDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n input,\n ContentChild,\n ViewChild,\n TemplateRef,\n inject,\n DestroyRef,\n Injector,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CoarIconComponent, type CoreIconName } from '@cocoar/ui-components';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n CoarOverlayService,\n coarHoverMenuPreset,\n Overlay,\n COAR_MENU_PARENT,\n} from '@cocoar/ui-overlay';\nimport { COAR_MENU_CASCADE, CoarMenuCascade } from './coar-menu-cascade';\nimport { CoarSubmenuTemplateDirective } from './coar-submenu-template.directive';\n\n/**\n * CoarSubmenuItem: Menu item that opens a submenu on hover.\n *\n * Responsibilities:\n * - Render parent item with icon and label\n * - Manage submenu overlay lifecycle\n * - Support nested submenus (can contain other submenu-items)\n *\n * @example\n * ```html\n * <coar-submenu-item label=\"Share\" icon=\"🔗\">\n * <ng-template>\n * <coar-menu-item icon=\"✉️\" (itemClick)=\"sendEmail()\">Email</coar-menu-item>\n * <coar-menu-item icon=\"🔗\" (itemClick)=\"copyLink()\">Copy Link</coar-menu-item>\n * </ng-template>\n * </coar-submenu-item>\n *\n * <!-- Optional: explicitly mark the template -->\n * <coar-submenu-item label=\"Share\" icon=\"🔗\">\n * <ng-template coarSubmenu>\n * ...\n * </ng-template>\n * </coar-submenu-item>\n *\n * <!-- Also supported (legacy / external template): -->\n * <coar-submenu-item label=\"Share\" icon=\"🔗\" [submenuTemplate]=\"shareMenu\" />\n * ```\n */\n@Component({\n selector: 'coar-submenu-item, coar-sub-flyout',\n standalone: true,\n imports: [CommonModule, CoarIconComponent],\n template: `\n <div\n class=\"coar-submenu-item\"\n [class.coar-submenu-item--disabled]=\"disabled()\"\n [class.coar-submenu-item--open]=\"isOpen\"\n [attr.role]=\"'menuitem'\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (mouseenter)=\"onMouseEnter($event)\"\n (click)=\"onClick($event)\"\n (keydown.enter)=\"onKeyboardActivate($event)\"\n (keydown.space)=\"onKeyboardActivate($event)\"\n >\n <span class=\"coar-submenu-item__icon\" aria-hidden=\"true\">\n <coar-icon [name]=\"icon() || 'square-rounded-dashed'\" size=\"sm\" aria-hidden=\"true\" />\n </span>\n <span class=\"coar-submenu-item__label\">{{ label() }}</span>\n <coar-icon\n name=\"chevron-right\"\n size=\"xs\"\n class=\"coar-submenu-item__arrow\"\n aria-hidden=\"true\"\n />\n </div>\n\n <ng-template #overlaySubmenuTemplate>\n <ng-container\n *ngTemplateOutlet=\"submenuTemplateToRender(); injector: submenuTemplateInjector\"\n />\n </ng-template>\n `,\n styleUrl: './coar-submenu-item.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: COAR_MENU_CASCADE,\n useFactory: () =>\n new CoarMenuCascade(inject(COAR_MENU_CASCADE, { optional: true, skipSelf: true })),\n },\n ],\n})\nexport class CoarSubmenuItemComponent {\n private readonly overlayService = inject(CoarOverlayService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly cascade = inject(COAR_MENU_CASCADE);\n private readonly parentOverlay = inject(COAR_MENU_PARENT, { optional: true });\n private readonly injector = inject(Injector);\n\n // Ensures the submenu TemplateRef is instantiated with a parent injector that contains\n // the correct cascade instance for this submenu item. Without this, TemplateRefs declared\n // outside of this component can end up resolving menu context from the declaration site.\n protected readonly submenuTemplateInjector = Injector.create({\n providers: [{ provide: COAR_MENU_CASCADE, useValue: this.cascade }],\n parent: this.injector,\n });\n\n constructor() {\n // Cleanup cascade when component is destroyed\n this.destroyRef.onDestroy(() => {\n this.cascade.destroy();\n // Ensure state is cleared on destroy\n if (this.isOpen) {\n this.isOpen = false;\n this.submenuRef = null;\n }\n });\n }\n\n /** Label text for the menu item */\n readonly label = input.required<string>();\n\n /** Optional icon identifier */\n readonly icon = input<CoreIconName | undefined>(undefined);\n\n /** Disabled state prevents interaction */\n readonly disabled = input(false);\n\n /**\n * Optional external submenu template.\n *\n * Prefer an inline `<ng-template>` child when possible.\n */\n readonly submenuTemplate = input<TemplateRef<unknown> | null>(null);\n\n /**\n * Optional data to pass to the submenu template.\n *\n * If provided, this data will be passed as the context to the submenu template,\n * instead of inheriting the parent overlay's context.\n *\n * Use this to create clean boundaries between parent and submenu:\n * - Simple case: `[submenuData]=\"context\"` (pass full context)\n * - Complex case: `[submenuData]=\"transformData(context)\"` (pass only what submenu needs)\n *\n * @example\n * ```html\n * <!-- Pass specific data contract to submenu -->\n * <coar-submenu-item\n * label=\"Status\"\n * [submenuTemplate]=\"statusMenu\"\n * [submenuData]=\"{ selectedIds: context.selected.map(s => s.Id) }\">\n * </coar-submenu-item>\n * ```\n */\n readonly submenuData = input<unknown>(undefined);\n\n @ContentChild(CoarSubmenuTemplateDirective, { descendants: false })\n private readonly markedInlineTemplate?: CoarSubmenuTemplateDirective;\n\n @ContentChild(TemplateRef, { descendants: false })\n private readonly inlineTemplate?: TemplateRef<unknown>;\n\n @ViewChild('overlaySubmenuTemplate') private overlaySubmenuTemplate!: TemplateRef<unknown>;\n\n private submenuRef: ReturnType<typeof this.overlayService.open> | null = null;\n isOpen = false;\n\n protected submenuTemplateToRender(): TemplateRef<unknown> {\n const template =\n this.markedInlineTemplate?.templateRef ?? this.inlineTemplate ?? this.submenuTemplate();\n\n if (!template) {\n throw new Error(\n 'CoarSubmenuItemComponent: missing submenu content. Provide either an inline <ng-template> child or set [submenuTemplate].'\n );\n }\n\n return template;\n }\n\n onMouseEnter(event: MouseEvent): void {\n if (this.disabled()) {\n return;\n }\n\n // Defensive: sync state with actual overlay status\n if (this.submenuRef) {\n if (this.submenuRef.isClosed) {\n // Overlay is closed, clear everything\n this.submenuRef = null;\n this.isOpen = false;\n this.cdr.markForCheck();\n } else if (!this.isOpen) {\n // Overlay is open but state is wrong - fix it\n this.isOpen = true;\n this.cdr.markForCheck();\n }\n }\n\n // Open submenu if not already open\n if (!this.submenuRef) {\n const anchor = event.currentTarget as HTMLElement;\n\n // Menu-aim: when a different sibling submenu is already open, delay switching\n // if the pointer trajectory suggests the user is heading into the open submenu panel.\n const parent = this.cascade.parent;\n if (parent) {\n parent.requestOpenFromChild(this.cascade, () => this.openSubmenu(anchor), {\n x: event.clientX,\n y: event.clientY,\n });\n } else {\n this.openSubmenu(anchor);\n }\n }\n }\n\n onClick(event: MouseEvent): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (this.submenuRef?.isClosed) {\n this.submenuRef = null;\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n\n // For accessibility: toggle on click/Enter/Space\n if (this.submenuRef) {\n this.closeSubmenu();\n } else {\n this.openSubmenu(event.currentTarget as HTMLElement);\n }\n }\n\n onKeyboardActivate(event: Event): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (this.submenuRef?.isClosed) {\n this.submenuRef = null;\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n\n const target = event.currentTarget as HTMLElement;\n if (this.submenuRef) {\n this.closeSubmenu();\n } else {\n this.openSubmenu(target);\n }\n }\n\n private openSubmenu(anchorElement: HTMLElement): void {\n // Validate early so the error points at the submenu item usage.\n this.submenuTemplateToRender();\n\n // Determine what data to pass to the submenu template\n const submenuContextData = this.submenuData();\n\n // All overlays use hoverTree preset for proper tree tracking\n const spec = Overlay.define<unknown>((b) => {\n b.content((c) => c.fromTemplate(this.overlaySubmenuTemplate));\n b.anchor({ kind: 'element', element: anchorElement });\n b.position({ placement: ['right-start', 'left-start'], offset: -4, flip: true, shift: true });\n }, coarHoverMenuPreset);\n\n // Prefer the cascade parent's overlayRef when available.\n // With Angular content projection, submenu content can be instantiated in the *root* overlay\n // injector even when it's rendered inside a child overlay. The cascade chain preserves the\n // correct containing overlay via overlayRef.\n const containingOverlay = this.cascade.parent?.overlayRef ?? this.parentOverlay;\n\n if (containingOverlay) {\n // Inside an overlay: close siblings (direct children of parent) then open as child\n // First, create the child overlay\n // Pass submenuData if provided, otherwise undefined (inherits parent context via $implicit)\n this.submenuRef = this.overlayService.openChild(containingOverlay, spec, submenuContextData);\n\n // Then close siblings, excluding the newly opened one\n containingOverlay.closeChildren(this.submenuRef);\n } else {\n // Inline menu: use cascade-level sibling closure\n this.cascade.closeSiblings();\n this.submenuRef = this.overlayService.open(spec, submenuContextData);\n }\n\n // Expose the overlay ref to descendants so they can parent their own flyouts correctly.\n this.cascade.overlayRef = this.submenuRef;\n this.cascade.parent?.notifyChildOpened(this.cascade);\n\n this.isOpen = true;\n this.cdr.markForCheck();\n\n const openedRef = this.submenuRef;\n\n // Clear the active styling as soon as a close is initiated (e.g. hoverTree timer,\n // outside click, or sibling submenu switch). Otherwise the item can look \"stuck\"\n // while the overlay finishes its close transition.\n const originalClose = openedRef.close.bind(openedRef);\n openedRef.close = (result?: unknown) => {\n if (this.submenuRef === openedRef && this.isOpen) {\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n\n originalClose(result);\n };\n\n openedRef.afterClosed$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n // Only clear state if this is still the current overlay\n // (prevents race condition when rapidly opening new overlays)\n if (this.submenuRef === openedRef) {\n this.submenuRef = null;\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n\n if (this.cascade.overlayRef === openedRef) {\n this.cascade.overlayRef = null;\n }\n\n this.cascade.parent?.notifyChildClosed(this.cascade);\n });\n }\n\n // Parent overlay is resolved via COAR_OVERLAY_REF when rendered inside an overlay.\n\n private closeSubmenu(): void {\n this.submenuRef?.close();\n this.submenuRef = null;\n this.isOpen = false;\n this.cdr.markForCheck();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n TemplateRef,\n booleanAttribute,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CoarIconComponent, type CoreIconName } from '@cocoar/ui-components';\nimport { CoarSubmenuTemplateDirective } from './coar-submenu-template.directive';\n\n/**\n * CoarSubExpand: Menu item that expands/collapses a submenu inline.\n *\n * Use this variant when you want nested options to stay visible (e.g. sidebar panels)\n * while still reusing the same menu item types inside the submenu.\n *\n * @example\n * ```html\n * <coar-menu>\n * <coar-sub-expand label=\"Filters\" icon=\"settings\" [(open)]=\"filtersOpen\">\n * <ng-template>\n * <coar-menu>\n * <coar-menu-item icon=\"plus\">Add Filter</coar-menu-item>\n * <coar-menu-item icon=\"trash\">Clear</coar-menu-item>\n * </coar-menu>\n * </ng-template>\n </coar-sub-expand>\n * </coar-menu>\n * ```\n */\n@Component({\n selector: 'coar-sub-expand',\n standalone: true,\n imports: [CommonModule, CoarIconComponent],\n template: `\n <div\n class=\"coar-sub-expand\"\n [class.coar-sub-expand--disabled]=\"disabled()\"\n [class.coar-sub-expand--open]=\"isOpen()\"\n [attr.role]=\"'menuitem'\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n (click)=\"toggle($event)\"\n (keydown.enter)=\"toggle($event)\"\n (keydown.space)=\"toggle($event)\"\n >\n <span class=\"coar-sub-expand__icon\" aria-hidden=\"true\">\n <coar-icon [name]=\"icon() || 'square-rounded-dashed'\" size=\"sm\" aria-hidden=\"true\" />\n </span>\n <span class=\"coar-sub-expand__label\">{{ label() }}</span>\n <coar-icon\n [name]=\"isOpen() ? 'minus' : 'plus'\"\n size=\"xs\"\n class=\"coar-sub-expand__arrow\"\n aria-hidden=\"true\"\n />\n </div>\n\n <div\n class=\"coar-sub-expand__panel\"\n [class.coar-sub-expand__panel--open]=\"isOpen()\"\n [attr.aria-hidden]=\"isOpen() ? null : 'true'\"\n role=\"group\"\n >\n <div class=\"coar-sub-expand__panel-inner\">\n <ng-container *ngTemplateOutlet=\"submenuTemplateToRender()\" />\n </div>\n </div>\n `,\n styleUrl: './coar-sub-expand.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CoarSubExpandComponent {\n /** Label text for the menu item */\n readonly label = input.required<string>();\n\n /** Optional icon identifier */\n readonly icon = input<CoreIconName | undefined>(undefined);\n\n /** Disabled state prevents interaction */\n readonly disabled = input(false);\n\n /** Expanded state (two-way bindable with [(open)]) */\n readonly open = input<boolean | undefined, unknown>(undefined, { transform: booleanAttribute });\n\n /** Emits when expanded state changes (for [(open)]) */\n readonly openChange = output<boolean>();\n\n private readonly openInternal = signal(false);\n\n protected readonly isOpen = computed(() => this.open() ?? this.openInternal());\n\n /** Optional external submenu template. Prefer an inline `<ng-template>` child when possible. */\n readonly submenuTemplate = input<TemplateRef<unknown> | null>(null);\n\n @ContentChild(CoarSubmenuTemplateDirective, { descendants: false })\n private readonly markedInlineTemplate?: CoarSubmenuTemplateDirective;\n\n @ContentChild(TemplateRef, { descendants: false })\n private readonly inlineTemplate?: TemplateRef<unknown>;\n\n protected submenuTemplateToRender(): TemplateRef<unknown> {\n const template =\n this.markedInlineTemplate?.templateRef ?? this.inlineTemplate ?? this.submenuTemplate();\n\n if (!template) {\n throw new Error(\n 'CoarSubExpandComponent: missing submenu content. Provide either an inline <ng-template> child or set [submenuTemplate].'\n );\n }\n\n return template;\n }\n\n constructor() {\n effect(() => {\n const value = this.open();\n if (value === undefined) return;\n\n this.openInternal.set(value);\n });\n }\n\n toggle(event: Event): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n const next = !this.isOpen();\n this.openInternal.set(next);\n this.openChange.emit(next);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.CoarMenuAimConfigDirective"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocoar/ui-menu",
3
- "version": "0.1.0-beta.71",
3
+ "version": "0.1.0-beta.75",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.0",
6
6
  "@angular/core": "^21.0.0",
@@ -223,6 +223,27 @@ declare class CoarSubmenuItemComponent {
223
223
  * Prefer an inline `<ng-template>` child when possible.
224
224
  */
225
225
  readonly submenuTemplate: _angular_core.InputSignal<TemplateRef<unknown> | null>;
226
+ /**
227
+ * Optional data to pass to the submenu template.
228
+ *
229
+ * If provided, this data will be passed as the context to the submenu template,
230
+ * instead of inheriting the parent overlay's context.
231
+ *
232
+ * Use this to create clean boundaries between parent and submenu:
233
+ * - Simple case: `[submenuData]="context"` (pass full context)
234
+ * - Complex case: `[submenuData]="transformData(context)"` (pass only what submenu needs)
235
+ *
236
+ * @example
237
+ * ```html
238
+ * <!-- Pass specific data contract to submenu -->
239
+ * <coar-submenu-item
240
+ * label="Status"
241
+ * [submenuTemplate]="statusMenu"
242
+ * [submenuData]="{ selectedIds: context.selected.map(s => s.Id) }">
243
+ * </coar-submenu-item>
244
+ * ```
245
+ */
246
+ readonly submenuData: _angular_core.InputSignal<unknown>;
226
247
  private readonly markedInlineTemplate?;
227
248
  private readonly inlineTemplate?;
228
249
  private overlaySubmenuTemplate;
@@ -235,7 +256,7 @@ declare class CoarSubmenuItemComponent {
235
256
  private openSubmenu;
236
257
  private closeSubmenu;
237
258
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarSubmenuItemComponent, never>;
238
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarSubmenuItemComponent, "coar-submenu-item, coar-sub-flyout", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "submenuTemplate": { "alias": "submenuTemplate"; "required": false; "isSignal": true; }; }, {}, ["markedInlineTemplate", "inlineTemplate"], never, true, never>;
259
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarSubmenuItemComponent, "coar-submenu-item, coar-sub-flyout", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "submenuTemplate": { "alias": "submenuTemplate"; "required": false; "isSignal": true; }; "submenuData": { "alias": "submenuData"; "required": false; "isSignal": true; }; }, {}, ["markedInlineTemplate", "inlineTemplate"], never, true, never>;
239
260
  }
240
261
 
241
262
  /**