@cocoar/ui-menu 0.1.0-beta.70

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.
@@ -0,0 +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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"}
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@cocoar/ui-menu",
3
+ "version": "0.1.0-beta.70",
4
+ "peerDependencies": {
5
+ "@angular/common": "^21.0.0",
6
+ "@angular/core": "^21.0.0",
7
+ "@cocoar/ui-components": "^0.0.1",
8
+ "@cocoar/ui-overlay": "^0.0.1"
9
+ },
10
+ "sideEffects": false,
11
+ "module": "fesm2022/cocoar-ui-menu.mjs",
12
+ "typings": "types/cocoar-ui-menu.d.ts",
13
+ "exports": {
14
+ "./package.json": {
15
+ "default": "./package.json"
16
+ },
17
+ ".": {
18
+ "types": "./types/cocoar-ui-menu.d.ts",
19
+ "default": "./fesm2022/cocoar-ui-menu.mjs"
20
+ }
21
+ },
22
+ "dependencies": {
23
+ "tslib": "^2.3.0"
24
+ }
25
+ }
@@ -0,0 +1,298 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, TemplateRef } from '@angular/core';
3
+ import { CoreIconName } from '@cocoar/ui-components';
4
+
5
+ interface CoarMenuAimConfig {
6
+ readonly enabled: boolean;
7
+ /** Emits debug events consumed by the showcase to render the aim triangle overlay. */
8
+ readonly debugEnabled: boolean;
9
+ /** Delay before switching to a newly hovered sibling submenu when aim is detected. */
10
+ readonly switchDelayMs: number;
11
+ /** Maximum age of the last pointer sample used for intent detection. */
12
+ readonly sampleMaxAgeMs: number;
13
+ }
14
+ interface CoarMenuAimConfigProvider {
15
+ getMenuAimConfig(): CoarMenuAimConfig;
16
+ }
17
+ declare const DEFAULT_COAR_MENU_AIM_CONFIG: CoarMenuAimConfig;
18
+ declare const COAR_MENU_AIM_CONFIG: InjectionToken<CoarMenuAimConfigProvider>;
19
+
20
+ declare class CoarMenuAimConfigDirective implements CoarMenuAimConfigProvider {
21
+ private readonly parent;
22
+ /** Enable/disable menu-aim for this menu tree. */
23
+ readonly aimEnabled: _angular_core.InputSignal<boolean | undefined>;
24
+ /** Emit debug events for menu-aim visualization (showcase only). */
25
+ readonly aimDebugEnabled: _angular_core.InputSignal<boolean | undefined>;
26
+ /** Delay before switching to a newly hovered sibling submenu when aim is detected. */
27
+ readonly aimSwitchDelayMs: _angular_core.InputSignal<number | undefined>;
28
+ /** Maximum age of the last pointer sample used for intent detection. */
29
+ readonly aimSampleMaxAgeMs: _angular_core.InputSignal<number | undefined>;
30
+ getMenuAimConfig(): CoarMenuAimConfig;
31
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarMenuAimConfigDirective, never>;
32
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CoarMenuAimConfigDirective, "[coarMenuAimConfig]", never, { "aimEnabled": { "alias": "aimEnabled"; "required": false; "isSignal": true; }; "aimDebugEnabled": { "alias": "aimDebugEnabled"; "required": false; "isSignal": true; }; "aimSwitchDelayMs": { "alias": "aimSwitchDelayMs"; "required": false; "isSignal": true; }; "aimSampleMaxAgeMs": { "alias": "aimSampleMaxAgeMs"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
33
+ }
34
+
35
+ /**
36
+ * CoarMenu: Shell component providing menu styling container.
37
+ *
38
+ * Responsibilities:
39
+ * - Apply consistent menu styling via CSS variables
40
+ * - Provide semantic menu container (<menu> or <div role="menu">)
41
+ * - Provide root cascade for sibling submenu tracking
42
+ * - No logic - just a styled wrapper
43
+ *
44
+ * Use standalone for inline menus, or as content in CoarOverlayService for context menus/flyouts.
45
+ *
46
+ * @example
47
+ * ```html
48
+ * <coar-menu>
49
+ * <coar-menu-item>Action 1</coar-menu-item>
50
+ * <coar-menu-item>Action 2</coar-menu-item>
51
+ * <coar-menu-divider></coar-menu-divider>
52
+ * <coar-menu-item>Action 3</coar-menu-item>
53
+ * </coar-menu>
54
+ * ```
55
+ */
56
+ declare class CoarMenuComponent {
57
+ private readonly overlayRef;
58
+ /**
59
+ * Controls whether the menu reserves and renders an icon column.
60
+ *
61
+ * Default is enabled to avoid layout shift for stateful icons (e.g. checkmarks).
62
+ * Set to false for text-only menus (icons will not render).
63
+ */
64
+ readonly showIconColumn: _angular_core.InputSignal<boolean>;
65
+ /**
66
+ * Check if this menu is rendered inside an overlay (flyout).
67
+ * Used to enable border visibility for menu items.
68
+ */
69
+ protected isInOverlay(): boolean;
70
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarMenuComponent, never>;
71
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarMenuComponent, "coar-menu", never, { "showIconColumn": { "alias": "showIconColumn"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof CoarMenuAimConfigDirective; inputs: { "aimEnabled": "aimEnabled"; "aimDebugEnabled": "aimDebugEnabled"; "aimSwitchDelayMs": "aimSwitchDelayMs"; "aimSampleMaxAgeMs": "aimSampleMaxAgeMs"; }; outputs: {}; }]>;
72
+ }
73
+
74
+ /**
75
+ * Event emitted when a menu item is clicked.
76
+ * Provides control over menu closing behavior.
77
+ */
78
+ interface CoarMenuItemClickEvent {
79
+ /** Call this to keep the menu open after clicking (prevents auto-close) */
80
+ keepMenuOpen(): void;
81
+ /** Original mouse event */
82
+ event: MouseEvent;
83
+ }
84
+ /**
85
+ * CoarMenuItem: Individual menu item with optional icon and submenu support.
86
+ *
87
+ * Responsibilities:
88
+ * - Render item text and optional icon
89
+ * - Handle click events
90
+ * - Support disabled state
91
+ * - Visual states: hover, active, focus
92
+ * - Trigger submenu (accordion or flyout via parent menu logic)
93
+ *
94
+ * Does NOT manage overlay directly - parent menu handles flyout logic.
95
+ *
96
+ * @example
97
+ * ```html
98
+ * <coar-menu-item (itemClick)="onSave()">Save</coar-menu-item>
99
+ * <coar-menu-item icon="copy">Copy</coar-menu-item>
100
+ * <coar-menu-item [disabled]="true">Unavailable</coar-menu-item>
101
+ *
102
+ * <!-- Prevent menu from closing on click: -->
103
+ * <coar-menu-item (itemClick)="toggle($event)">Toggle Setting</coar-menu-item>
104
+ *
105
+ * toggle(event: CoarMenuItemClickEvent) {
106
+ * event.keepMenuOpen(); // Keep menu open
107
+ * this.setting = !this.setting;
108
+ * }
109
+ * ```
110
+ */
111
+ declare class CoarMenuItemComponent {
112
+ private readonly parentOverlay;
113
+ /** Item text content */
114
+ readonly label: _angular_core.InputSignal<string | undefined>;
115
+ /** Optional icon identifier (rendered via CoarIconComponent) */
116
+ readonly icon: _angular_core.InputSignal<CoreIconName | undefined>;
117
+ /** Disabled state prevents interaction */
118
+ readonly disabled: _angular_core.InputSignal<boolean>;
119
+ /** Emitted when user clicks/selects the item. Menu closes by default unless preventDefault() is called. */
120
+ readonly itemClick: _angular_core.OutputEmitterRef<CoarMenuItemClickEvent>;
121
+ /** Emitted when user hovers over item (for flyout trigger) */
122
+ readonly itemHover: _angular_core.OutputEmitterRef<Event>;
123
+ onClick(event: MouseEvent): void;
124
+ onMouseEnter(event: MouseEvent): void;
125
+ onKeyboardActivate(): void;
126
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarMenuItemComponent, never>;
127
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarMenuItemComponent, "coar-menu-item", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; "itemHover": "itemHover"; }, never, ["*"], true, never>;
128
+ }
129
+
130
+ /**
131
+ * CoarMenuDivider: Visual separator between menu items.
132
+ *
133
+ * Simple horizontal line for grouping menu items.
134
+ *
135
+ * @example
136
+ * ```html
137
+ * <coar-menu>
138
+ * <coar-menu-item>Cut</coar-menu-item>
139
+ * <coar-menu-item>Copy</coar-menu-item>
140
+ * <coar-menu-divider></coar-menu-divider>
141
+ * <coar-menu-item>Paste</coar-menu-item>
142
+ * </coar-menu>
143
+ * ```
144
+ */
145
+ declare class CoarMenuDividerComponent {
146
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarMenuDividerComponent, never>;
147
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarMenuDividerComponent, "coar-menu-divider", never, {}, {}, never, never, true, never>;
148
+ }
149
+
150
+ /**
151
+ * CoarMenuHeading: Non-interactive section label for menu groups.
152
+ *
153
+ * Responsibilities:
154
+ * - Display section/group heading text
155
+ * - Provide visual separation between menu sections
156
+ * - Non-interactive (no hover, no click, not focusable)
157
+ *
158
+ * @example
159
+ * ```html
160
+ * <coar-menu>
161
+ * <coar-menu-heading>Foundations</coar-menu-heading>
162
+ * <coar-menu-item routerLink="/typography">Typography</coar-menu-item>
163
+ * <coar-menu-item routerLink="/colors">Colors</coar-menu-item>
164
+ *
165
+ * <coar-menu-heading>Form Controls</coar-menu-heading>
166
+ * <coar-menu-item routerLink="/text-input">Text Input</coar-menu-item>
167
+ * </coar-menu>
168
+ * ```
169
+ */
170
+ declare class CoarMenuHeadingComponent {
171
+ /** Optional explicit label text (alternative to content projection) */
172
+ readonly label: _angular_core.InputSignal<string | undefined>;
173
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarMenuHeadingComponent, never>;
174
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarMenuHeadingComponent, "coar-menu-heading", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
175
+ }
176
+
177
+ /**
178
+ * CoarSubmenuItem: Menu item that opens a submenu on hover.
179
+ *
180
+ * Responsibilities:
181
+ * - Render parent item with icon and label
182
+ * - Manage submenu overlay lifecycle
183
+ * - Support nested submenus (can contain other submenu-items)
184
+ *
185
+ * @example
186
+ * ```html
187
+ * <coar-submenu-item label="Share" icon="🔗">
188
+ * <ng-template>
189
+ * <coar-menu-item icon="✉️" (itemClick)="sendEmail()">Email</coar-menu-item>
190
+ * <coar-menu-item icon="🔗" (itemClick)="copyLink()">Copy Link</coar-menu-item>
191
+ * </ng-template>
192
+ * </coar-submenu-item>
193
+ *
194
+ * <!-- Optional: explicitly mark the template -->
195
+ * <coar-submenu-item label="Share" icon="🔗">
196
+ * <ng-template coarSubmenu>
197
+ * ...
198
+ * </ng-template>
199
+ * </coar-submenu-item>
200
+ *
201
+ * <!-- Also supported (legacy / external template): -->
202
+ * <coar-submenu-item label="Share" icon="🔗" [submenuTemplate]="shareMenu" />
203
+ * ```
204
+ */
205
+ declare class CoarSubmenuItemComponent {
206
+ private readonly overlayService;
207
+ private readonly destroyRef;
208
+ private readonly cdr;
209
+ private readonly cascade;
210
+ private readonly parentOverlay;
211
+ private readonly injector;
212
+ protected readonly submenuTemplateInjector: _angular_core.DestroyableInjector;
213
+ constructor();
214
+ /** Label text for the menu item */
215
+ readonly label: _angular_core.InputSignal<string>;
216
+ /** Optional icon identifier */
217
+ readonly icon: _angular_core.InputSignal<CoreIconName | undefined>;
218
+ /** Disabled state prevents interaction */
219
+ readonly disabled: _angular_core.InputSignal<boolean>;
220
+ /**
221
+ * Optional external submenu template.
222
+ *
223
+ * Prefer an inline `<ng-template>` child when possible.
224
+ */
225
+ readonly submenuTemplate: _angular_core.InputSignal<TemplateRef<unknown> | null>;
226
+ private readonly markedInlineTemplate?;
227
+ private readonly inlineTemplate?;
228
+ private overlaySubmenuTemplate;
229
+ private submenuRef;
230
+ isOpen: boolean;
231
+ protected submenuTemplateToRender(): TemplateRef<unknown>;
232
+ onMouseEnter(event: MouseEvent): void;
233
+ onClick(event: MouseEvent): void;
234
+ onKeyboardActivate(event: Event): void;
235
+ private openSubmenu;
236
+ private closeSubmenu;
237
+ 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>;
239
+ }
240
+
241
+ /**
242
+ * CoarSubExpand: Menu item that expands/collapses a submenu inline.
243
+ *
244
+ * Use this variant when you want nested options to stay visible (e.g. sidebar panels)
245
+ * while still reusing the same menu item types inside the submenu.
246
+ *
247
+ * @example
248
+ * ```html
249
+ * <coar-menu>
250
+ * <coar-sub-expand label="Filters" icon="settings" [(open)]="filtersOpen">
251
+ * <ng-template>
252
+ * <coar-menu>
253
+ * <coar-menu-item icon="plus">Add Filter</coar-menu-item>
254
+ * <coar-menu-item icon="trash">Clear</coar-menu-item>
255
+ * </coar-menu>
256
+ * </ng-template>
257
+ </coar-sub-expand>
258
+ * </coar-menu>
259
+ * ```
260
+ */
261
+ declare class CoarSubExpandComponent {
262
+ /** Label text for the menu item */
263
+ readonly label: _angular_core.InputSignal<string>;
264
+ /** Optional icon identifier */
265
+ readonly icon: _angular_core.InputSignal<CoreIconName | undefined>;
266
+ /** Disabled state prevents interaction */
267
+ readonly disabled: _angular_core.InputSignal<boolean>;
268
+ /** Expanded state (two-way bindable with [(open)]) */
269
+ readonly open: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
270
+ /** Emits when expanded state changes (for [(open)]) */
271
+ readonly openChange: _angular_core.OutputEmitterRef<boolean>;
272
+ private readonly openInternal;
273
+ protected readonly isOpen: _angular_core.Signal<boolean>;
274
+ /** Optional external submenu template. Prefer an inline `<ng-template>` child when possible. */
275
+ readonly submenuTemplate: _angular_core.InputSignal<TemplateRef<unknown> | null>;
276
+ private readonly markedInlineTemplate?;
277
+ private readonly inlineTemplate?;
278
+ protected submenuTemplateToRender(): TemplateRef<unknown>;
279
+ constructor();
280
+ toggle(event: Event): void;
281
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarSubExpandComponent, never>;
282
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CoarSubExpandComponent, "coar-sub-expand", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "submenuTemplate": { "alias": "submenuTemplate"; "required": false; "isSignal": true; }; }, { "openChange": "openChange"; }, ["markedInlineTemplate", "inlineTemplate"], never, true, never>;
283
+ }
284
+
285
+ /**
286
+ * Marks an inline submenu template for a `coar-submenu-item`.
287
+ *
288
+ * This is optional: if a submenu item contains exactly one direct child `<ng-template>`,
289
+ * that template will be used even without this directive.
290
+ */
291
+ declare class CoarSubmenuTemplateDirective {
292
+ readonly templateRef: TemplateRef<unknown>;
293
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CoarSubmenuTemplateDirective, never>;
294
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CoarSubmenuTemplateDirective, "ng-template[coarSubmenu]", never, {}, {}, never, never, true, never>;
295
+ }
296
+
297
+ export { COAR_MENU_AIM_CONFIG, CoarMenuAimConfigDirective, CoarMenuComponent, CoarMenuDividerComponent, CoarMenuHeadingComponent, CoarMenuItemComponent, CoarSubExpandComponent, CoarSubmenuItemComponent, CoarSubmenuTemplateDirective, DEFAULT_COAR_MENU_AIM_CONFIG };
298
+ export type { CoarMenuAimConfig, CoarMenuAimConfigProvider, CoarMenuItemClickEvent };