ngx-com 0.0.21 → 0.1.0
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.
- package/README.md +137 -33
- package/fesm2022/ngx-com-components-alert.mjs +21 -11
- package/fesm2022/ngx-com-components-alert.mjs.map +1 -1
- package/fesm2022/ngx-com-components-avatar.mjs +9 -7
- package/fesm2022/ngx-com-components-avatar.mjs.map +1 -1
- package/fesm2022/ngx-com-components-button.mjs +1 -1
- package/fesm2022/ngx-com-components-button.mjs.map +1 -1
- package/fesm2022/ngx-com-components-calendar.mjs +27 -3112
- package/fesm2022/ngx-com-components-calendar.mjs.map +1 -1
- package/fesm2022/ngx-com-components-card.mjs +8 -8
- package/fesm2022/ngx-com-components-card.mjs.map +1 -1
- package/fesm2022/ngx-com-components-carousel.mjs +16 -4
- package/fesm2022/ngx-com-components-carousel.mjs.map +1 -1
- package/fesm2022/ngx-com-components-checkbox.mjs +1 -1
- package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
- package/fesm2022/ngx-com-components-code-block.mjs +9 -9
- package/fesm2022/ngx-com-components-code-block.mjs.map +1 -1
- package/fesm2022/ngx-com-components-collapsible.mjs +15 -13
- package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -1
- package/fesm2022/ngx-com-components-confirm.mjs +4 -4
- package/fesm2022/ngx-com-components-confirm.mjs.map +1 -1
- package/fesm2022/ngx-com-components-datepicker.mjs +2334 -0
- package/fesm2022/ngx-com-components-datepicker.mjs.map +1 -0
- package/fesm2022/ngx-com-components-dialog.mjs +47 -45
- package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
- package/fesm2022/ngx-com-components-dropdown.mjs +446 -340
- package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
- package/fesm2022/ngx-com-components-empty-state.mjs +5 -3
- package/fesm2022/ngx-com-components-empty-state.mjs.map +1 -1
- package/fesm2022/ngx-com-components-form-field.mjs +11 -6
- package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
- package/fesm2022/ngx-com-components-icon-lucide.mjs +41 -0
- package/fesm2022/ngx-com-components-icon-lucide.mjs.map +1 -0
- package/fesm2022/ngx-com-components-icon.mjs +89 -61
- package/fesm2022/ngx-com-components-icon.mjs.map +1 -1
- package/fesm2022/ngx-com-components-item.mjs +14 -4
- package/fesm2022/ngx-com-components-item.mjs.map +1 -1
- package/fesm2022/ngx-com-components-menu.mjs +61 -69
- package/fesm2022/ngx-com-components-menu.mjs.map +1 -1
- package/fesm2022/ngx-com-components-native-control.mjs +170 -0
- package/fesm2022/ngx-com-components-native-control.mjs.map +1 -0
- package/fesm2022/ngx-com-components-paginator.mjs +11 -3
- package/fesm2022/ngx-com-components-paginator.mjs.map +1 -1
- package/fesm2022/ngx-com-components-popover.mjs +58 -33
- package/fesm2022/ngx-com-components-popover.mjs.map +1 -1
- package/fesm2022/ngx-com-components-radio.mjs +4 -4
- package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
- package/fesm2022/ngx-com-components-segmented-control.mjs +6 -4
- package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -1
- package/fesm2022/ngx-com-components-sort.mjs +63 -57
- package/fesm2022/ngx-com-components-sort.mjs.map +1 -1
- package/fesm2022/ngx-com-components-spinner.mjs +6 -6
- package/fesm2022/ngx-com-components-spinner.mjs.map +1 -1
- package/fesm2022/ngx-com-components-switch.mjs +18 -9
- package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
- package/fesm2022/ngx-com-components-table.mjs +23 -9
- package/fesm2022/ngx-com-components-table.mjs.map +1 -1
- package/fesm2022/ngx-com-components-tabs.mjs +81 -58
- package/fesm2022/ngx-com-components-tabs.mjs.map +1 -1
- package/fesm2022/ngx-com-components-timepicker.mjs +1048 -0
- package/fesm2022/ngx-com-components-timepicker.mjs.map +1 -0
- package/fesm2022/ngx-com-components-toast.mjs +18 -14
- package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
- package/fesm2022/ngx-com-components-tooltip.mjs +5 -5
- package/fesm2022/ngx-com-components-tooltip.mjs.map +1 -1
- package/fesm2022/ngx-com-components.mjs +0 -13
- package/fesm2022/ngx-com-components.mjs.map +1 -1
- package/fesm2022/ngx-com-tokens.mjs +0 -8
- package/fesm2022/ngx-com-tokens.mjs.map +1 -1
- package/fesm2022/ngx-com-utils.mjs +13 -1
- package/fesm2022/ngx-com-utils.mjs.map +1 -1
- package/fesm2022/ngx-com.mjs +1 -1
- package/fesm2022/ngx-com.mjs.map +1 -1
- package/package.json +51 -8
- package/styles/animations.css +38 -0
- package/styles/candy.css +121 -0
- package/styles/dark.css +159 -0
- package/styles/forest.css +117 -0
- package/styles/ocean.css +117 -0
- package/styles/themes.css +7 -0
- package/styles/tokens.css +277 -0
- package/styles/utilities.css +16 -0
- package/types/ngx-com-components-alert.d.ts +14 -4
- package/types/ngx-com-components-avatar.d.ts +2 -0
- package/types/ngx-com-components-calendar.d.ts +3 -747
- package/types/ngx-com-components-card.d.ts +2 -2
- package/types/ngx-com-components-carousel.d.ts +11 -1
- package/types/ngx-com-components-code-block.d.ts +4 -4
- package/types/ngx-com-components-collapsible.d.ts +10 -2
- package/types/ngx-com-components-confirm.d.ts +2 -2
- package/types/ngx-com-components-datepicker.d.ts +623 -0
- package/types/ngx-com-components-dialog.d.ts +5 -2
- package/types/ngx-com-components-dropdown.d.ts +22 -4
- package/types/ngx-com-components-empty-state.d.ts +2 -0
- package/types/ngx-com-components-form-field.d.ts +4 -1
- package/types/ngx-com-components-icon-lucide.d.ts +32 -0
- package/types/ngx-com-components-icon.d.ts +49 -35
- package/types/ngx-com-components-item.d.ts +12 -2
- package/types/ngx-com-components-menu.d.ts +38 -38
- package/types/ngx-com-components-native-control.d.ts +99 -0
- package/types/ngx-com-components-paginator.d.ts +2 -0
- package/types/ngx-com-components-popover.d.ts +19 -12
- package/types/ngx-com-components-segmented-control.d.ts +3 -1
- package/types/ngx-com-components-sort.d.ts +13 -10
- package/types/ngx-com-components-switch.d.ts +7 -2
- package/types/ngx-com-components-table.d.ts +16 -2
- package/types/ngx-com-components-tabs.d.ts +46 -34
- package/types/ngx-com-components-timepicker.d.ts +273 -0
- package/types/ngx-com-components-toast.d.ts +4 -2
- package/types/ngx-com-components-tooltip.d.ts +1 -1
- package/types/ngx-com-components.d.ts +6 -7
- package/types/ngx-com-tokens.d.ts +5 -3
- package/types/ngx-com-utils.d.ts +11 -1
- package/types/ngx-com.d.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-com-components-menu.mjs","sources":["../../../projects/com/components/menu/menu-tokens.ts","../../../projects/com/components/menu/menu.utils.ts","../../../projects/com/components/menu/menu-trigger.directive.ts","../../../projects/com/components/menu/menu.variants.ts","../../../projects/com/components/menu/menu.component.ts","../../../projects/com/components/menu/menu-item.directive.ts","../../../projects/com/components/menu/menu-item-checkbox.component.ts","../../../projects/com/components/menu/menu-group.directive.ts","../../../projects/com/components/menu/menu-item-radio.component.ts","../../../projects/com/components/menu/menu-label.directive.ts","../../../projects/com/components/menu/menu-divider.directive.ts","../../../projects/com/components/menu/menu-sub-indicator.component.ts","../../../projects/com/components/menu/menu-shortcut.directive.ts","../../../projects/com/components/menu/index.ts","../../../projects/com/components/menu/ngx-com-components-menu.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Interface for the root menu trigger, allowing items to close the entire menu tree.\n */\nexport interface RootMenuTrigger {\n /** Close the menu and all submenus. */\n close(): void;\n /** Whether to close the menu when an item is selected. */\n menuCloseOnSelect(): boolean;\n /** Called by MenuComponent to register itself when attached. */\n registerMenu?(menu: MenuRef): void;\n}\n\n/**\n * Interface for a parent menu, allowing items and submenus to coordinate.\n */\nexport interface MenuRef {\n /** Unique ID of the menu for ARIA. */\n readonly menuId: string;\n /** Size variant inherited by items. */\n readonly menuSize: () => 'sm' | 'md' | 'lg';\n /** Close this menu level. */\n close(): void;\n /** Focus the first item. */\n focusFirstItem(): void;\n /** Focus the last item. */\n focusLastItem(): void;\n}\n\n/**\n * Token to access the root menu trigger from anywhere in the menu tree.\n * Used by items to close the entire menu on selection.\n */\nexport const ROOT_MENU_TRIGGER: InjectionToken<RootMenuTrigger> = new InjectionToken<RootMenuTrigger>('ROOT_MENU_TRIGGER');\n\n/**\n * Token to access the nearest parent menu component.\n * Used by items and submenu triggers to coordinate with their parent.\n */\nexport const MENU_REF: InjectionToken<MenuRef> = new InjectionToken<MenuRef>('MENU_REF');\n","// Re-export from shared utilities\nexport { mergeClasses } from 'ngx-com/utils';\n\nlet menuIdCounter = 0;\n\n/**\n * Generate a unique ID for a menu instance.\n */\nexport function generateMenuId(): string {\n return `menu-${++menuIdCounter}`;\n}\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n output,\n Renderer2,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, ModelSignal, OutputEmitterRef, Signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { filter } from 'rxjs/operators';\nimport { buildPopoverPositions } from 'ngx-com/components/popover';\nimport { MENU_REF, ROOT_MENU_TRIGGER, type MenuRef, type RootMenuTrigger } from './menu-tokens';\nimport { generateMenuId } from './menu.utils';\nimport type { MenuAlignment, MenuPosition } from './menu.variants';\n\n/** Side for submenu positioning. */\nexport type MenuSide = 'left' | 'right';\n\n/**\n * Unified menu trigger directive — opens a menu in a CDK overlay.\n *\n * **Root context** (outside a menu): Opens on click, has backdrop.\n * **Submenu context** (inside a menu): Opens on hover/ArrowRight, no backdrop.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-lg`\n *\n * @example Root trigger\n * ```html\n * <button comButton [comMenuTrigger]=\"menu\">Options</button>\n * <ng-template #menu>\n * <com-menu>\n * <button comMenuItem>Edit</button>\n * <button comMenuItem>Delete</button>\n * </com-menu>\n * </ng-template>\n * ```\n *\n * @example Submenu trigger (inside a menu, combined with comMenuItem)\n * ```html\n * <button comMenuItem [comMenuTrigger]=\"shareMenu\" side=\"right\" align=\"start\">\n * Share\n * <com-menu-sub-indicator />\n * </button>\n * ```\n */\n@Directive({\n selector: '[comMenuTrigger]',\n exportAs: 'comMenuTrigger',\n host: {\n '[attr.aria-haspopup]': '\"menu\"',\n '[attr.aria-expanded]': 'menuOpen()',\n '[attr.aria-controls]': 'ariaControls()',\n '(click)': 'onClick($event)',\n '(keydown.arrowdown)': 'onArrowDown($event)',\n '(keydown.arrowup)': 'onArrowUp($event)',\n '(keydown.arrowright)': 'onArrowRight($event)',\n '(keydown.arrowleft)': 'onArrowLeft($event)',\n '(keydown.enter)': 'onEnter($event)',\n '(keydown.space)': 'onSpace($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n})\nexport class MenuTriggerDirective implements RootMenuTrigger {\n private readonly overlay = inject(Overlay);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly renderer = inject(Renderer2);\n\n // Context detection - if MENU_REF exists, we're inside a menu (submenu trigger)\n private readonly parentMenu = inject(MENU_REF, { optional: true });\n private readonly parentRootTrigger = inject(ROOT_MENU_TRIGGER, { optional: true });\n\n private overlayRef: OverlayRef | null = null;\n private attachedMenu: MenuRef | null = null;\n private readonly menuId: string = generateMenuId();\n\n // Submenu hover timers\n private openDelayTimer: ReturnType<typeof setTimeout> | null = null;\n private closeDelayTimer: ReturnType<typeof setTimeout> | null = null;\n private mouseInSubmenu = false;\n\n // Listener cleanup functions\n private submenuMouseEnterCleanup: (() => void) | null = null;\n private submenuMouseLeaveCleanup: (() => void) | null = null;\n\n // ─── Context ───\n\n /** Whether this trigger is inside a menu (submenu context). */\n readonly isSubmenu: Signal<boolean> = computed(() => !!this.parentMenu);\n\n // ─── Inputs ───\n\n /** Template containing `<com-menu>` with items. */\n readonly comMenuTrigger: InputSignal<TemplateRef<unknown>> = input.required<TemplateRef<unknown>>();\n\n /** Preferred position direction (root trigger only). */\n readonly menuPosition: InputSignal<MenuPosition> = input<MenuPosition>('below');\n\n /** Alignment along cross-axis (root trigger only). */\n readonly menuAlignment: InputSignal<MenuAlignment> = input<MenuAlignment>('start');\n\n /** Gap in px between trigger and menu. */\n readonly menuOffset: InputSignal<number> = input<number>(4);\n\n /** Prevents opening when true. */\n readonly menuDisabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n /** Two-way bindable open state. */\n readonly menuOpen: ModelSignal<boolean> = model<boolean>(false);\n\n /** Custom CSS class(es) on the overlay panel. */\n readonly menuPanelClass: InputSignal<string | string[]> = input<string | string[]>('');\n\n /** Close menu when an item is selected. */\n readonly menuCloseOnSelect: InputSignalWithTransform<boolean, unknown> = input(true, { transform: booleanAttribute });\n\n /** Side for submenu positioning (submenu context only). */\n readonly side: InputSignal<MenuSide> = input<MenuSide>('right');\n\n /** Alignment for submenu positioning (submenu context only). */\n readonly align: InputSignal<MenuAlignment> = input<MenuAlignment>('start');\n\n /** Hover delay before submenu opens in ms (submenu context only). */\n readonly subMenuOpenDelay: InputSignal<number> = input<number>(200);\n\n /** Hover delay before submenu closes in ms (submenu context only). */\n readonly subMenuCloseDelay: InputSignal<number> = input<number>(150);\n\n // ─── Outputs ───\n\n /** Emitted after menu opens. */\n readonly menuOpened: OutputEmitterRef<void> = output<void>();\n\n /** Emitted after menu closes. */\n readonly menuClosed: OutputEmitterRef<void> = output<void>();\n\n // ─── Computed ───\n\n protected readonly ariaControls: Signal<string | null> = computed(() =>\n this.menuOpen() ? this.menuId : null,\n );\n\n private readonly panelClassArray: Signal<string[]> = computed(() => {\n const panelClass = this.menuPanelClass();\n if (Array.isArray(panelClass)) return panelClass;\n return panelClass ? [panelClass] : [];\n });\n\n constructor() {\n this.destroyRef.onDestroy(() => this.disposeOverlay());\n }\n\n // ─── Public API ───\n\n /** Programmatically open the menu. */\n open(): void {\n if (!this.menuDisabled() && !this.overlayRef?.hasAttached()) {\n this.openMenu();\n this.menuOpen.set(true);\n }\n }\n\n /** Programmatically close the menu. */\n close(): void {\n if (this.isSubmenu()) {\n // For submenu, close this level\n this.closeSubmenu();\n } else {\n // For root, close entire menu tree\n this.closeMenu();\n }\n this.menuOpen.set(false);\n }\n\n /** Toggle the menu open/close state. */\n toggle(): void {\n if (this.menuOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /** Called by MenuComponent to register itself when attached. */\n registerMenu(menu: MenuRef): void {\n this.attachedMenu = menu;\n }\n\n // ─── Event Handlers ───\n\n protected onClick(event: Event): void {\n if (this.menuDisabled()) return;\n\n if (!this.isSubmenu()) {\n this.toggle();\n return;\n }\n\n // Submenu: prevent comMenuItem's click handler and open submenu\n event.preventDefault();\n event.stopPropagation();\n this.cancelOpenTimer();\n this.openSubmenuInternal();\n this.focusFirstItemDeferred();\n }\n\n protected onArrowDown(event: Event): void {\n if (this.isSubmenu() || this.menuOpen()) return;\n\n event.preventDefault();\n this.open();\n this.focusFirstItemDeferred();\n }\n\n protected onArrowUp(event: Event): void {\n if (this.isSubmenu() || this.menuOpen()) return;\n\n event.preventDefault();\n this.open();\n this.focusLastItemDeferred();\n }\n\n protected onArrowRight(event: Event): void {\n if (!this.isSubmenu() || this.side() !== 'right') return;\n\n event.preventDefault();\n event.stopPropagation();\n this.openSubmenuInternal();\n this.focusFirstItemDeferred();\n }\n\n protected onArrowLeft(event: Event): void {\n if (!this.isSubmenu()) return;\n\n if (this.side() === 'left') {\n event.preventDefault();\n event.stopPropagation();\n this.openSubmenuInternal();\n this.focusFirstItemDeferred();\n } else if (this.menuOpen()) {\n event.preventDefault();\n event.stopPropagation();\n this.closeSubmenu();\n }\n }\n\n protected onEnter(event: Event): void {\n if (this.menuDisabled()) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (this.isSubmenu()) {\n this.openSubmenuInternal();\n this.focusFirstItemDeferred();\n } else if (!this.menuOpen()) {\n this.open();\n this.focusFirstItemDeferred();\n }\n }\n\n protected onSpace(event: Event): void {\n this.onEnter(event);\n }\n\n protected onMouseEnter(): void {\n if (this.menuDisabled()) return;\n if (!this.isSubmenu()) return; // Hover only opens submenus\n\n this.cancelCloseTimer();\n\n this.openDelayTimer = setTimeout(() => {\n this.openSubmenuInternal();\n }, this.subMenuOpenDelay());\n }\n\n protected onMouseLeave(): void {\n if (!this.isSubmenu()) return;\n\n this.cancelOpenTimer();\n\n this.closeDelayTimer = setTimeout(() => {\n if (!this.mouseInSubmenu) {\n this.closeSubmenu();\n }\n }, this.subMenuCloseDelay());\n }\n\n private focusFirstItemDeferred(): void {\n setTimeout(() => this.attachedMenu?.focusFirstItem(), 0);\n }\n\n private focusLastItemDeferred(): void {\n setTimeout(() => this.attachedMenu?.focusLastItem(), 0);\n }\n\n // ─── Menu Management ───\n\n private openMenu(): void {\n if (this.menuDisabled()) return;\n\n this.createOverlay();\n this.attachContent();\n this.subscribeToCloseEvents();\n\n this.menuOpened.emit();\n }\n\n private closeMenu(): void {\n if (this.overlayRef?.hasAttached()) {\n this.overlayRef.detach();\n }\n this.attachedMenu = null;\n this.menuClosed.emit();\n this.elementRef.nativeElement.focus();\n }\n\n // ─── Submenu Management ───\n\n private openSubmenuInternal(): void {\n if (this.menuOpen() || this.menuDisabled()) return;\n\n this.createOverlay();\n this.attachContent();\n this.subscribeToSubmenuCloseEvents();\n this.menuOpen.set(true);\n this.menuOpened.emit();\n }\n\n private closeSubmenu(): void {\n if (!this.menuOpen()) return;\n\n this.cleanupSubmenuListeners();\n if (this.overlayRef?.hasAttached()) {\n this.overlayRef.detach();\n }\n this.menuOpen.set(false);\n this.attachedMenu = null;\n this.menuClosed.emit();\n }\n\n // ─── Overlay Management ───\n\n private createOverlay(): void {\n if (this.overlayRef) return;\n\n const positions = this.isSubmenu()\n ? buildPopoverPositions(this.side(), this.align(), 0)\n : buildPopoverPositions(this.menuPosition(), this.menuAlignment(), this.menuOffset());\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions(positions)\n .withFlexibleDimensions(false)\n .withPush(true)\n .withViewportMargin(8);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: !this.isSubmenu(),\n backdropClass: this.isSubmenu() ? '' : 'cdk-overlay-transparent-backdrop',\n panelClass: ['com-menu-panel', ...this.panelClassArray()],\n });\n }\n\n private attachContent(): void {\n if (!this.overlayRef) return;\n\n const template = this.comMenuTrigger();\n\n // For submenu, wrap the root trigger to delegate close to the actual root\n const rootTriggerValue: RootMenuTrigger = this.isSubmenu()\n ? {\n close: () => this.parentRootTrigger?.close(),\n menuCloseOnSelect: () => this.parentRootTrigger?.menuCloseOnSelect() ?? true,\n registerMenu: (menu: MenuRef) => {\n this.attachedMenu = menu;\n },\n }\n : this;\n\n const injector = Injector.create({\n parent: this.injector,\n providers: [{ provide: ROOT_MENU_TRIGGER, useValue: rootTriggerValue }],\n });\n\n const portal = new TemplatePortal(template, this.viewContainerRef, undefined, injector);\n this.overlayRef.attach(portal);\n\n // For submenu, track mouse in overlay using Renderer2\n if (this.isSubmenu()) {\n const overlayEl = this.overlayRef.overlayElement;\n this.submenuMouseEnterCleanup = this.renderer.listen(overlayEl, 'mouseenter', () => this.onSubmenuMouseEnter());\n this.submenuMouseLeaveCleanup = this.renderer.listen(overlayEl, 'mouseleave', () => this.onSubmenuMouseLeave());\n }\n }\n\n private subscribeToCloseEvents(): void {\n if (!this.overlayRef) return;\n\n this.overlayRef\n .backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.close());\n\n this.overlayRef\n .keydownEvents()\n .pipe(\n filter((event) => event.key === 'Escape'),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((event) => {\n event.preventDefault();\n this.close();\n });\n\n this.overlayRef\n .detachments()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.menuOpen.set(false);\n });\n }\n\n private subscribeToSubmenuCloseEvents(): void {\n if (!this.overlayRef) return;\n\n const closeKey = this.side() === 'right' ? 'ArrowLeft' : 'ArrowRight';\n\n this.overlayRef\n .keydownEvents()\n .pipe(\n filter((event) => event.key === 'Escape' || event.key === closeKey),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((event) => {\n event.preventDefault();\n event.stopPropagation();\n this.closeSubmenu();\n this.elementRef.nativeElement.focus();\n });\n\n this.overlayRef\n .detachments()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.menuOpen.set(false);\n });\n }\n\n // ─── Submenu Hover Tracking ───\n\n private onSubmenuMouseEnter(): void {\n this.mouseInSubmenu = true;\n this.cancelCloseTimer();\n }\n\n private onSubmenuMouseLeave(): void {\n this.mouseInSubmenu = false;\n\n this.closeDelayTimer = setTimeout(() => {\n if (!this.mouseInSubmenu) {\n this.closeSubmenu();\n }\n }, this.subMenuCloseDelay());\n }\n\n private cancelOpenTimer(): void {\n if (this.openDelayTimer) {\n clearTimeout(this.openDelayTimer);\n this.openDelayTimer = null;\n }\n }\n\n private cancelCloseTimer(): void {\n if (this.closeDelayTimer) {\n clearTimeout(this.closeDelayTimer);\n this.closeDelayTimer = null;\n }\n }\n\n // ─── Cleanup ───\n\n private disposeOverlay(): void {\n this.cancelOpenTimer();\n this.cancelCloseTimer();\n this.cleanupSubmenuListeners();\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.attachedMenu = null;\n }\n\n private cleanupSubmenuListeners(): void {\n this.submenuMouseEnterCleanup?.();\n this.submenuMouseEnterCleanup = null;\n this.submenuMouseLeaveCleanup?.();\n this.submenuMouseLeaveCleanup = null;\n }\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n// ─── Type Definitions ───\n\nexport type MenuSize = 'sm' | 'md' | 'lg';\nexport type MenuVariant = 'default' | 'compact';\nexport type MenuPosition = 'above' | 'below' | 'left' | 'right';\nexport type MenuAlignment = 'start' | 'center' | 'end';\n\n// ─── Menu Panel Variants ───\n\n/**\n * Menu panel styling variants.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-lg`, `--radius-popover`\n */\nexport const menuPanelVariants: ReturnType<\n typeof cva<{ size: Record<MenuSize, string>; variant: Record<MenuVariant, string> }>\n> = cva(\n [\n 'bg-popover text-popover-foreground',\n 'border border-border',\n 'rounded-popover shadow-lg',\n 'overflow-hidden',\n 'py-1',\n ],\n {\n variants: {\n size: {\n sm: 'min-w-32',\n md: 'min-w-48',\n lg: 'min-w-64',\n },\n variant: {\n default: '',\n compact: 'py-0.5',\n },\n },\n defaultVariants: {\n size: 'md',\n variant: 'default',\n },\n },\n);\n\nexport type MenuPanelVariants = VariantProps<typeof menuPanelVariants>;\n\n// ─── Menu Item Variants ───\n\ntype BooleanVariant = Record<'true' | 'false', string>;\n\n/**\n * Menu item styling variants (base for all item types).\n *\n * @tokens `--color-popover-foreground`, `--color-foreground`, `--color-muted`, `--color-warn`, `--color-warn-subtle`\n */\nexport const menuItemVariants: ReturnType<\n typeof cva<{\n size: Record<MenuSize, string>;\n focused: BooleanVariant;\n disabled: BooleanVariant;\n destructive: BooleanVariant;\n }>\n> = cva(\n [\n 'relative flex items-center w-full',\n 'text-sm text-popover-foreground',\n 'outline-none select-none',\n 'transition-colors duration-75',\n ],\n {\n variants: {\n size: {\n sm: 'px-2 py-1 gap-2',\n md: 'px-3 py-1.5 gap-2.5',\n lg: 'px-4 py-2 gap-3',\n },\n focused: {\n true: 'bg-muted text-foreground',\n false: '',\n },\n disabled: {\n true: 'bg-disabled text-disabled-foreground pointer-events-none',\n false: 'cursor-pointer',\n },\n destructive: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n { destructive: true, focused: true, class: 'bg-warn-subtle text-warn' },\n { destructive: true, focused: false, class: 'text-warn' },\n ],\n defaultVariants: {\n size: 'md',\n focused: false,\n disabled: false,\n destructive: false,\n },\n },\n);\n\nexport type MenuItemVariants = VariantProps<typeof menuItemVariants>;\n\n// ─── Menu Label Variants ───\n\n/**\n * Menu label (section header) styling variants.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const menuLabelVariants: ReturnType<typeof cva<{ size: Record<MenuSize, string> }>> = cva(\n 'text-muted-foreground font-medium select-none',\n {\n variants: {\n size: {\n sm: 'px-2 py-1 text-xs',\n md: 'px-3 py-1.5 text-xs',\n lg: 'px-4 py-2 text-sm',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nexport type MenuLabelVariants = VariantProps<typeof menuLabelVariants>;\n\n// ─── Check/Radio Indicator Variants ───\n\n/**\n * Check/radio indicator sizing variants.\n */\nexport const menuCheckIndicatorVariants: ReturnType<typeof cva<{ size: Record<MenuSize, string> }>> = cva(\n 'inline-flex items-center justify-center shrink-0',\n {\n variants: {\n size: {\n sm: 'w-3.5 h-3.5',\n md: 'w-4 h-4',\n lg: 'w-5 h-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nexport type MenuCheckIndicatorVariants = VariantProps<typeof menuCheckIndicatorVariants>;\n\n// ─── Keyboard Shortcut Hint Variants ───\n\n/**\n * Keyboard shortcut hint styling variants.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const menuShortcutVariants: ReturnType<typeof cva<{ size: Record<MenuSize, string> }>> = cva(\n 'ml-auto text-muted-foreground tracking-widest',\n {\n variants: {\n size: {\n sm: 'text-[10px]',\n md: 'text-xs',\n lg: 'text-xs',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nexport type MenuShortcutVariants = VariantProps<typeof menuShortcutVariants>;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n effect,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport type { InputSignal, Signal, WritableSignal } from '@angular/core';\nimport { FocusKeyManager, type FocusableOption } from '@angular/cdk/a11y';\nimport { MENU_REF, ROOT_MENU_TRIGGER, type MenuRef } from './menu-tokens';\nimport { menuPanelVariants, type MenuSize, type MenuVariant } from './menu.variants';\nimport { generateMenuId, mergeClasses } from './menu.utils';\n\n/**\n * Base class for focusable menu items.\n * All item directives must implement this interface for FocusKeyManager.\n */\nexport abstract class MenuItemBase implements FocusableOption {\n abstract focus(): void;\n abstract getLabel(): string;\n /** Whether the item is disabled. */\n abstract get disabled(): boolean;\n}\n\n/**\n * Menu panel component that renders inside an overlay.\n * Manages keyboard navigation across its items using CDK FocusKeyManager.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-lg`\n *\n * @example\n * ```html\n * <com-menu>\n * <button comMenuItem>Edit</button>\n * <button comMenuItem>Delete</button>\n * </com-menu>\n * ```\n */\n@Component({\n selector: 'com-menu',\n template: `\n <div\n [class]=\"panelClasses()\"\n role=\"menu\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\n [id]=\"menuId\"\n [attr.data-state]=\"animationState()\"\n (keydown)=\"onKeydown($event)\"\n >\n <ng-content />\n </div>\n `,\n styles: `\n :host {\n display: contents;\n }\n\n [data-state='open'] {\n animation: menu-in 150ms ease-out;\n }\n\n [data-state='closed'] {\n animation: menu-out 100ms ease-in forwards;\n }\n\n @keyframes menu-in {\n from {\n opacity: 0;\n transform: scale(0.96) translateY(4px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n @keyframes menu-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n [data-state='open'],\n [data-state='closed'] {\n animation: none;\n }\n }\n `,\n providers: [{ provide: MENU_REF, useExisting: forwardRef(() => MenuComponent) }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenuComponent implements MenuRef {\n private readonly rootTrigger = inject(ROOT_MENU_TRIGGER, { optional: true });\n\n private keyManager: FocusKeyManager<MenuItemBase> | null = null;\n\n // ─── Inputs ───\n\n /** Size variant for the menu panel. */\n readonly menuSize: InputSignal<MenuSize> = input<MenuSize>('md');\n\n /** Spacing density variant. */\n readonly menuVariant: InputSignal<MenuVariant> = input<MenuVariant>('default');\n\n /** Accessible label for the menu. */\n readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** ID of element labeling this menu. */\n readonly ariaLabelledBy: InputSignal<string | null> = input<string | null>(null);\n\n // ─── Internal State ───\n\n readonly menuId: string = generateMenuId();\n readonly animationState: WritableSignal<'open' | 'closed'> = signal<'open' | 'closed'>('open');\n\n /** Query all focusable items in the menu. */\n private readonly items: Signal<readonly MenuItemBase[]> = contentChildren(MenuItemBase);\n\n // ─── Computed ───\n\n protected readonly panelClasses: Signal<string> = computed(() =>\n mergeClasses(menuPanelVariants({ size: this.menuSize(), variant: this.menuVariant() })),\n );\n\n constructor() {\n this.rootTrigger?.registerMenu?.(this);\n\n effect(() => {\n const items = this.items();\n if (items.length > 0 && !this.keyManager) {\n this.keyManager = new FocusKeyManager(items as MenuItemBase[])\n .withVerticalOrientation()\n .withWrap()\n .withHomeAndEnd()\n .withTypeAhead(200);\n }\n });\n }\n\n // ─── Public API ───\n\n /** Focus the first non-disabled item. */\n focusFirstItem(): void {\n this.keyManager?.setFirstItemActive();\n }\n\n /** Focus the last non-disabled item. */\n focusLastItem(): void {\n this.keyManager?.setLastItemActive();\n }\n\n /** Close this menu level. */\n close(): void {\n this.rootTrigger?.close();\n }\n\n // ─── Event Handlers ───\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.close();\n return;\n }\n\n // ArrowRight/ArrowLeft are handled by submenu triggers\n if (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft') {\n this.keyManager?.onKeydown(event);\n }\n }\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport type { InputSignalWithTransform, OutputEmitterRef, Signal, WritableSignal } from '@angular/core';\nimport { MenuItemBase } from './menu.component';\nimport { MENU_REF, ROOT_MENU_TRIGGER } from './menu-tokens';\nimport { menuItemVariants, type MenuSize } from './menu.variants';\nimport { mergeClasses } from './menu.utils';\n\n/**\n * Menu item directive for actionable menu items.\n * Applied to buttons, anchors, or any element that should be selectable.\n *\n * @tokens `--color-popover-foreground`, `--color-foreground`, `--color-muted`, `--color-warn`, `--color-warn-subtle`\n *\n * @example\n * ```html\n * <button comMenuItem (menuItemSelect)=\"onEdit()\">Edit</button>\n * <button comMenuItem [menuItemDisabled]=\"true\">Disabled</button>\n * <button comMenuItem destructive>Delete</button>\n * ```\n */\n@Directive({\n selector: '[comMenuItem]',\n exportAs: 'comMenuItem',\n providers: [{ provide: MenuItemBase, useExisting: forwardRef(() => MenuItemDirective) }],\n host: {\n '[class]': 'itemClasses()',\n '[attr.role]': '\"menuitem\"',\n '[attr.tabindex]': '-1',\n '[attr.aria-disabled]': 'menuItemDisabled() || null',\n '[attr.disabled]': 'menuItemDisabled() || null',\n '(click)': 'onAction($event)',\n '(keydown.enter)': 'onAction($event)',\n '(keydown.space)': 'onAction($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n})\nexport class MenuItemDirective extends MenuItemBase {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly menu = inject(MENU_REF, { optional: true });\n private readonly rootTrigger = inject(ROOT_MENU_TRIGGER, { optional: true });\n\n // ─── Inputs ───\n\n /** Disables the item. */\n readonly menuItemDisabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n /** Marks item as destructive (delete, remove actions). */\n readonly destructive: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n // ─── Outputs ───\n\n /** Emitted when item is activated. */\n readonly menuItemSelect: OutputEmitterRef<void> = output<void>();\n\n // ─── Internal State ───\n\n private readonly isFocused: WritableSignal<boolean> = signal(false);\n\n // ─── Computed ───\n\n private readonly size: Signal<MenuSize> = computed(() => this.menu?.menuSize() ?? 'md');\n\n protected readonly itemClasses: Signal<string> = computed(() =>\n mergeClasses(\n menuItemVariants({\n size: this.size(),\n focused: this.isFocused(),\n disabled: this.menuItemDisabled(),\n destructive: this.destructive(),\n }),\n ),\n );\n\n // ─── FocusableOption Implementation ───\n\n get disabled(): boolean {\n return this.menuItemDisabled();\n }\n\n focus(): void {\n this.elementRef.nativeElement.focus();\n this.isFocused.set(true);\n }\n\n getLabel(): string {\n return this.elementRef.nativeElement.textContent?.trim() ?? '';\n }\n\n // ─── Event Handlers ───\n\n protected onAction(event: Event): void {\n if (this.menuItemDisabled()) return;\n\n event.preventDefault();\n this.menuItemSelect.emit();\n\n if (this.rootTrigger?.menuCloseOnSelect()) {\n this.rootTrigger.close();\n }\n }\n\n protected onMouseEnter(): void {\n if (this.menuItemDisabled()) return;\n this.focus();\n }\n\n protected onMouseLeave(): void {\n this.isFocused.set(false);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport type { InputSignalWithTransform, ModelSignal, Signal, WritableSignal } from '@angular/core';\nimport { MenuItemBase } from './menu.component';\nimport { MENU_REF } from './menu-tokens';\nimport { menuCheckIndicatorVariants, menuItemVariants, type MenuSize } from './menu.variants';\nimport { mergeClasses } from './menu.utils';\n\n/**\n * Checkbox menu item component with toggleable checked state.\n *\n * @tokens `--color-popover-foreground`, `--color-foreground`, `--color-muted`\n *\n * @example\n * ```html\n * <button comMenuItemCheckbox [(checked)]=\"showSidebar\">Sidebar</button>\n * ```\n */\n@Component({\n selector: '[comMenuItemCheckbox]',\n exportAs: 'comMenuItemCheckbox',\n template: `\n <span [class]=\"indicatorClasses()\">\n @if (checked()) {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"w-full h-full\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n }\n </span>\n <ng-content />\n `,\n providers: [{ provide: MenuItemBase, useExisting: forwardRef(() => MenuItemCheckboxComponent) }],\n host: {\n '[class]': 'itemClasses()',\n '[attr.role]': '\"menuitemcheckbox\"',\n '[attr.tabindex]': '-1',\n '[attr.aria-checked]': 'checked()',\n '[attr.aria-disabled]': 'menuItemDisabled() || null',\n '[attr.disabled]': 'menuItemDisabled() || null',\n '(click)': 'toggle($event)',\n '(keydown.enter)': 'toggle($event)',\n '(keydown.space)': 'toggle($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenuItemCheckboxComponent extends MenuItemBase {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly menu = inject(MENU_REF, { optional: true });\n\n // ─── Inputs ───\n\n /** Disables the item. */\n readonly menuItemDisabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n /** Two-way bindable checked state. */\n readonly checked: ModelSignal<boolean> = model<boolean>(false);\n\n // ─── Internal State ───\n\n private readonly isFocused: WritableSignal<boolean> = signal(false);\n\n // ─── Computed ───\n\n private readonly size: Signal<MenuSize> = computed(() => this.menu?.menuSize() ?? 'md');\n\n protected readonly itemClasses: Signal<string> = computed(() =>\n mergeClasses(\n menuItemVariants({\n size: this.size(),\n focused: this.isFocused(),\n disabled: this.menuItemDisabled(),\n }),\n ),\n );\n\n protected readonly indicatorClasses: Signal<string> = computed(() =>\n mergeClasses(menuCheckIndicatorVariants({ size: this.size() })),\n );\n\n // ─── FocusableOption Implementation ───\n\n get disabled(): boolean {\n return this.menuItemDisabled();\n }\n\n focus(): void {\n this.elementRef.nativeElement.focus();\n this.isFocused.set(true);\n }\n\n getLabel(): string {\n return this.elementRef.nativeElement.textContent?.trim() ?? '';\n }\n\n // ─── Event Handlers ───\n\n protected toggle(event: Event): void {\n if (this.menuItemDisabled()) return;\n\n event.preventDefault();\n this.checked.update((c) => !c);\n }\n\n protected onMouseEnter(): void {\n if (this.menuItemDisabled()) return;\n this.focus();\n }\n\n protected onMouseLeave(): void {\n this.isFocused.set(false);\n }\n}\n","import { Directive, forwardRef, input, model } from '@angular/core';\nimport type { InputSignal, ModelSignal } from '@angular/core';\n\n/**\n * Token for menu group to allow radio items to coordinate.\n */\nexport abstract class MenuGroupRef {\n abstract readonly groupValue: () => unknown;\n abstract setGroupValue(value: unknown): void;\n}\n\n/**\n * Menu group directive for organizing related items.\n * For radio items, ensures mutual exclusivity within the group.\n *\n * @example\n * ```html\n * <div comMenuGroup [(groupValue)]=\"sortField\">\n * <button comMenuItemRadio value=\"name\">Name</button>\n * <button comMenuItemRadio value=\"date\">Date</button>\n * </div>\n * ```\n *\n * @tokens None - uses only ARIA attributes\n */\n@Directive({\n selector: '[comMenuGroup]',\n exportAs: 'comMenuGroup',\n providers: [{ provide: MenuGroupRef, useExisting: forwardRef(() => MenuGroupDirective) }],\n host: {\n '[attr.role]': '\"group\"',\n '[attr.aria-label]': 'ariaLabel() || null',\n },\n})\nexport class MenuGroupDirective extends MenuGroupRef {\n /** Optional accessible label for the group. */\n readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** Two-way bindable value for radio groups. */\n readonly groupValue: ModelSignal<unknown> = model<unknown>(undefined);\n\n setGroupValue(value: unknown): void {\n this.groupValue.set(value);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal, WritableSignal } from '@angular/core';\nimport { MenuItemBase } from './menu.component';\nimport { MENU_REF, ROOT_MENU_TRIGGER } from './menu-tokens';\nimport { MenuGroupRef } from './menu-group.directive';\nimport { menuCheckIndicatorVariants, menuItemVariants, type MenuSize } from './menu.variants';\nimport { mergeClasses } from './menu.utils';\n\n/**\n * Radio menu item component for single-selection within a group.\n *\n * @tokens `--color-popover-foreground`, `--color-foreground`, `--color-muted`\n *\n * @example\n * ```html\n * <div comMenuGroup [(groupValue)]=\"sortField\">\n * <button comMenuItemRadio value=\"name\">Name</button>\n * <button comMenuItemRadio value=\"date\">Date</button>\n * </div>\n * ```\n */\n@Component({\n selector: '[comMenuItemRadio]',\n exportAs: 'comMenuItemRadio',\n template: `\n <span [class]=\"indicatorClasses()\">\n @if (isChecked()) {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n class=\"w-full h-full\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n }\n </span>\n <ng-content />\n `,\n providers: [{ provide: MenuItemBase, useExisting: forwardRef(() => MenuItemRadioComponent) }],\n host: {\n '[class]': 'itemClasses()',\n '[attr.role]': '\"menuitemradio\"',\n '[attr.tabindex]': '-1',\n '[attr.aria-checked]': 'isChecked()',\n '[attr.aria-disabled]': 'menuItemDisabled() || null',\n '[attr.disabled]': 'menuItemDisabled() || null',\n '(click)': 'select($event)',\n '(keydown.enter)': 'select($event)',\n '(keydown.space)': 'select($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenuItemRadioComponent extends MenuItemBase {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly menu = inject(MENU_REF, { optional: true });\n private readonly rootTrigger = inject(ROOT_MENU_TRIGGER, { optional: true });\n private readonly group = inject(MenuGroupRef, { optional: true });\n\n // ─── Inputs ───\n\n /** Disables the item. */\n readonly menuItemDisabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n /** The value this radio item represents. */\n readonly value: InputSignal<unknown> = input.required<unknown>();\n\n // ─── Internal State ───\n\n private readonly isFocused: WritableSignal<boolean> = signal(false);\n\n // ─── Computed ───\n\n private readonly size: Signal<MenuSize> = computed(() => this.menu?.menuSize() ?? 'md');\n\n /** Whether this radio item is currently selected. */\n readonly isChecked: Signal<boolean> = computed(() => this.group?.groupValue() === this.value());\n\n protected readonly itemClasses: Signal<string> = computed(() =>\n mergeClasses(\n menuItemVariants({\n size: this.size(),\n focused: this.isFocused(),\n disabled: this.menuItemDisabled(),\n }),\n ),\n );\n\n protected readonly indicatorClasses: Signal<string> = computed(() =>\n mergeClasses(menuCheckIndicatorVariants({ size: this.size() })),\n );\n\n // ─── FocusableOption Implementation ───\n\n get disabled(): boolean {\n return this.menuItemDisabled();\n }\n\n focus(): void {\n this.elementRef.nativeElement.focus();\n this.isFocused.set(true);\n }\n\n getLabel(): string {\n return this.elementRef.nativeElement.textContent?.trim() ?? '';\n }\n\n // ─── Event Handlers ───\n\n protected select(event: Event): void {\n if (this.menuItemDisabled()) return;\n\n event.preventDefault();\n this.group?.setGroupValue(this.value());\n\n if (this.rootTrigger?.menuCloseOnSelect()) {\n this.rootTrigger.close();\n }\n }\n\n protected onMouseEnter(): void {\n if (this.menuItemDisabled()) return;\n this.focus();\n }\n\n protected onMouseLeave(): void {\n this.isFocused.set(false);\n }\n}\n","import { computed, Directive, inject } from '@angular/core';\nimport type { Signal } from '@angular/core';\nimport { MENU_REF } from './menu-tokens';\nimport { menuLabelVariants, type MenuSize } from './menu.variants';\nimport { mergeClasses } from './menu.utils';\n\nlet labelIdCounter = 0;\n\n/**\n * Non-interactive section label/header inside a menu.\n *\n * @tokens `--color-muted-foreground`\n *\n * @example\n * ```html\n * <span comMenuLabel>Team</span>\n * <button comMenuItem>View Members</button>\n * ```\n */\n@Directive({\n selector: '[comMenuLabel]',\n exportAs: 'comMenuLabel',\n host: {\n '[class]': 'labelClasses()',\n '[attr.role]': '\"presentation\"',\n '[id]': 'labelId',\n },\n})\nexport class MenuLabelDirective {\n private readonly menu = inject(MENU_REF, { optional: true });\n\n /** Unique ID that can be referenced by aria-labelledby. */\n readonly labelId: string = `menu-label-${++labelIdCounter}`;\n\n private readonly size: Signal<MenuSize> = computed(() => this.menu?.menuSize() ?? 'md');\n\n protected readonly labelClasses: Signal<string> = computed(() =>\n mergeClasses(menuLabelVariants({ size: this.size() })),\n );\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Visual separator between menu sections.\n *\n * @tokens `--color-border`\n *\n * @example\n * ```html\n * <button comMenuItem>Edit</button>\n * <hr comMenuDivider />\n * <button comMenuItem>Delete</button>\n * ```\n */\n@Directive({\n selector: '[comMenuDivider]',\n exportAs: 'comMenuDivider',\n host: {\n class: 'block border-t border-border my-1',\n '[attr.role]': '\"separator\"',\n },\n})\nexport class MenuDividerDirective {}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * Submenu indicator component — displays a chevron icon indicating a submenu.\n * Place inside a menu item that has `[comMenuTrigger]` to indicate it opens a submenu.\n *\n * @tokens `--color-muted-foreground`\n *\n * @example\n * ```html\n * <button comMenuItem [comMenuTrigger]=\"shareMenu\">\n * Share\n * <com-menu-sub-indicator />\n * </button>\n * ```\n */\n@Component({\n selector: 'com-menu-sub-indicator',\n template: `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n `,\n host: {\n class: 'ml-auto inline-flex items-center justify-center w-4 h-4 text-muted-foreground',\n '[attr.aria-hidden]': 'true',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenuSubIndicatorComponent {}\n","import { computed, Directive, inject } from '@angular/core';\nimport type { Signal } from '@angular/core';\nimport { MENU_REF } from './menu-tokens';\nimport { menuShortcutVariants, type MenuSize } from './menu.variants';\nimport { mergeClasses } from './menu.utils';\n\n/**\n * Keyboard shortcut hint displayed in a menu item.\n *\n * @tokens `--color-muted-foreground`\n *\n * @example\n * ```html\n * <button comMenuItem>\n * Save\n * <span comMenuShortcut>⌘S</span>\n * </button>\n * ```\n */\n@Directive({\n selector: '[comMenuShortcut]',\n exportAs: 'comMenuShortcut',\n host: {\n '[class]': 'shortcutClasses()',\n },\n})\nexport class MenuShortcutDirective {\n private readonly menu = inject(MENU_REF, { optional: true });\n\n private readonly size: Signal<MenuSize> = computed(() => this.menu?.menuSize() ?? 'md');\n\n protected readonly shortcutClasses: Signal<string> = computed(() =>\n mergeClasses(menuShortcutVariants({ size: this.size() })),\n );\n}\n","// Public API for the menu component\n\n// Main components/directives\nexport { MenuTriggerDirective, type MenuSide } from './menu-trigger.directive';\nexport { MenuComponent, MenuItemBase } from './menu.component';\nexport { MenuItemDirective } from './menu-item.directive';\nexport { MenuItemCheckboxComponent } from './menu-item-checkbox.component';\nexport { MenuItemRadioComponent } from './menu-item-radio.component';\nexport { MenuGroupDirective, MenuGroupRef } from './menu-group.directive';\nexport { MenuLabelDirective } from './menu-label.directive';\nexport { MenuDividerDirective } from './menu-divider.directive';\nexport { MenuSubIndicatorComponent } from './menu-sub-indicator.component';\nexport { MenuShortcutDirective } from './menu-shortcut.directive';\n\n// Injection tokens and types\nexport { ROOT_MENU_TRIGGER, MENU_REF, type RootMenuTrigger, type MenuRef } from './menu-tokens';\n\n// Variants and types\nexport {\n menuPanelVariants,\n menuItemVariants,\n menuLabelVariants,\n menuCheckIndicatorVariants,\n menuShortcutVariants,\n type MenuSize,\n type MenuVariant,\n type MenuPosition,\n type MenuAlignment,\n type MenuPanelVariants,\n type MenuItemVariants,\n type MenuLabelVariants,\n type MenuCheckIndicatorVariants,\n type MenuShortcutVariants,\n} from './menu.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-com-components-menu.mjs","sources":["../../../projects/com/components/menu/menu-tokens.ts","../../../projects/com/components/menu/menu.utils.ts","../../../projects/com/components/menu/menu-trigger.directive.ts","../../../projects/com/components/menu/menu.variants.ts","../../../projects/com/components/menu/menu.component.ts","../../../projects/com/components/menu/menu-item.directive.ts","../../../projects/com/components/menu/menu-item-checkbox.component.ts","../../../projects/com/components/menu/menu-group.directive.ts","../../../projects/com/components/menu/menu-item-radio.component.ts","../../../projects/com/components/menu/menu-label.directive.ts","../../../projects/com/components/menu/menu-divider.directive.ts","../../../projects/com/components/menu/menu-sub-indicator.component.ts","../../../projects/com/components/menu/menu-shortcut.directive.ts","../../../projects/com/components/menu/index.ts","../../../projects/com/components/menu/ngx-com-components-menu.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Interface for the root menu trigger, allowing items to close the entire menu tree.\n */\nexport interface RootMenuTrigger {\n /** Close the menu and all submenus. */\n close(): void;\n /** Whether to close the menu when an item is selected. */\n menuCloseOnSelect(): boolean;\n /** Called by ComMenuComponent to register itself when attached. */\n registerMenu?(menu: MenuRef): void;\n}\n\n/**\n * Interface for a parent menu, allowing items and submenus to coordinate.\n */\nexport interface MenuRef {\n /** Unique ID of the menu for ARIA. */\n readonly menuId: string;\n /** Size variant inherited by items. */\n readonly menuSize: () => 'sm' | 'md' | 'lg';\n /** Close this menu level. */\n close(): void;\n /** Focus the first item. */\n focusFirstItem(): void;\n /** Focus the last item. */\n focusLastItem(): void;\n}\n\n/**\n * Token to access the root menu trigger from anywhere in the menu tree.\n * Used by items to close the entire menu on selection.\n */\nexport const ROOT_MENU_TRIGGER: InjectionToken<RootMenuTrigger> = new InjectionToken<RootMenuTrigger>('ROOT_MENU_TRIGGER');\n\n/**\n * Token to access the nearest parent menu component.\n * Used by items and submenu triggers to coordinate with their parent.\n */\nexport const MENU_REF: InjectionToken<MenuRef> = new InjectionToken<MenuRef>('MENU_REF');\n","// Re-export from shared utilities\nexport { mergeClasses } from 'ngx-com/utils';\n\nlet menuIdCounter = 0;\n\n/**\n * Generate a unique ID for a menu instance.\n */\nexport function generateMenuId(): string {\n return `menu-${++menuIdCounter}`;\n}\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n output,\n Renderer2,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, ModelSignal, OutputEmitterRef, Signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { filter } from 'rxjs/operators';\nimport { buildPopoverPositions } from 'ngx-com/components/popover';\nimport { MENU_REF, ROOT_MENU_TRIGGER, type MenuRef, type RootMenuTrigger } from './menu-tokens';\nimport { generateMenuId } from './menu.utils';\nimport type { MenuAlignment, MenuPosition } from './menu.variants';\n\n/** Side for submenu positioning. */\nexport type MenuSide = 'left' | 'right';\n\n/**\n * Unified menu trigger directive — opens a menu in a CDK overlay.\n *\n * **Root context** (outside a menu): Opens on click, has backdrop.\n * **Submenu context** (inside a menu): Opens on hover/ArrowRight, no backdrop.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-overlay`\n *\n * @example Root trigger\n * ```html\n * <button comButton [comMenuTrigger]=\"menu\">Options</button>\n * <ng-template #menu>\n * <com-menu>\n * <button comMenuItem>Edit</button>\n * <button comMenuItem>Delete</button>\n * </com-menu>\n * </ng-template>\n * ```\n *\n * @example Submenu trigger (inside a menu, combined with comMenuItem)\n * ```html\n * <button comMenuItem [comMenuTrigger]=\"shareMenu\" side=\"right\" align=\"start\">\n * Share\n * <com-menu-sub-indicator />\n * </button>\n * ```\n */\n@Directive({\n selector: '[comMenuTrigger]',\n exportAs: 'comMenuTrigger',\n host: {\n '[attr.aria-haspopup]': '\"menu\"',\n '[attr.aria-expanded]': 'menuOpen()',\n '[attr.aria-controls]': 'ariaControls()',\n '(click)': 'onClick($event)',\n '(keydown.arrowdown)': 'onArrowDown($event)',\n '(keydown.arrowup)': 'onArrowUp($event)',\n '(keydown.arrowright)': 'onArrowRight($event)',\n '(keydown.arrowleft)': 'onArrowLeft($event)',\n '(keydown.enter)': 'onEnter($event)',\n '(keydown.space)': 'onSpace($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n})\nexport class ComMenuTrigger implements RootMenuTrigger {\n private readonly overlay = inject(Overlay);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly renderer = inject(Renderer2);\n\n // Context detection - if MENU_REF exists, we're inside a menu (submenu trigger)\n private readonly parentMenu = inject(MENU_REF, { optional: true });\n private readonly parentRootTrigger = inject(ROOT_MENU_TRIGGER, { optional: true });\n\n private overlayRef: OverlayRef | null = null;\n private attachedMenu: MenuRef | null = null;\n private readonly menuId: string = generateMenuId();\n\n // Submenu hover timers\n private openDelayTimer: ReturnType<typeof setTimeout> | null = null;\n private closeDelayTimer: ReturnType<typeof setTimeout> | null = null;\n private mouseInSubmenu = false;\n\n // Listener cleanup functions\n private submenuMouseEnterCleanup: (() => void) | null = null;\n private submenuMouseLeaveCleanup: (() => void) | null = null;\n\n // ─── Context ───\n\n /** Whether this trigger is inside a menu (submenu context). */\n readonly isSubmenu: Signal<boolean> = computed(() => !!this.parentMenu);\n\n // ─── Inputs ───\n\n /** Template containing `<com-menu>` with items. */\n readonly comMenuTrigger: InputSignal<TemplateRef<unknown>> = input.required<TemplateRef<unknown>>();\n\n /** Preferred position direction (root trigger only). */\n readonly menuPosition: InputSignal<MenuPosition> = input<MenuPosition>('below');\n\n /** Alignment along cross-axis (root trigger only). */\n readonly menuAlignment: InputSignal<MenuAlignment> = input<MenuAlignment>('start');\n\n /** Gap in px between trigger and menu. */\n readonly menuOffset: InputSignal<number> = input<number>(4);\n\n /** Prevents opening when true. */\n readonly menuDisabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n /** Two-way bindable open state. */\n readonly menuOpen: ModelSignal<boolean> = model<boolean>(false);\n\n /** Custom CSS class(es) on the overlay panel. */\n readonly menuPanelClass: InputSignal<string | string[]> = input<string | string[]>('');\n\n /** Close menu when an item is selected. */\n readonly menuCloseOnSelect: InputSignalWithTransform<boolean, unknown> = input(true, { transform: booleanAttribute });\n\n /** Side for submenu positioning (submenu context only). */\n readonly side: InputSignal<MenuSide> = input<MenuSide>('right');\n\n /** Alignment for submenu positioning (submenu context only). */\n readonly align: InputSignal<MenuAlignment> = input<MenuAlignment>('start');\n\n /** Hover delay before submenu opens in ms (submenu context only). */\n readonly subMenuOpenDelay: InputSignal<number> = input<number>(200);\n\n /** Hover delay before submenu closes in ms (submenu context only). */\n readonly subMenuCloseDelay: InputSignal<number> = input<number>(150);\n\n // ─── Outputs ───\n\n /** Emitted after menu opens. */\n readonly menuOpened: OutputEmitterRef<void> = output<void>();\n\n /** Emitted after menu closes. */\n readonly menuClosed: OutputEmitterRef<void> = output<void>();\n\n // ─── Computed ───\n\n protected readonly ariaControls: Signal<string | null> = computed(() =>\n this.menuOpen() ? this.menuId : null,\n );\n\n private readonly panelClassArray: Signal<string[]> = computed(() => {\n const panelClass = this.menuPanelClass();\n if (Array.isArray(panelClass)) return panelClass;\n return panelClass ? [panelClass] : [];\n });\n\n constructor() {\n this.destroyRef.onDestroy(() => this.disposeOverlay());\n }\n\n // ─── Public API ───\n\n /** Programmatically open the menu. */\n open(): void {\n if (!this.menuDisabled() && !this.overlayRef?.hasAttached()) {\n this.openMenu();\n this.menuOpen.set(true);\n }\n }\n\n /** Programmatically close the menu. */\n close(): void {\n if (this.isSubmenu()) {\n // For submenu, close this level\n this.closeSubmenu();\n } else {\n // For root, close entire menu tree\n this.closeMenu();\n }\n this.menuOpen.set(false);\n }\n\n /** Toggle the menu open/close state. */\n toggle(): void {\n if (this.menuOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /** Called by ComMenuComponent to register itself when attached. */\n registerMenu(menu: MenuRef): void {\n this.attachedMenu = menu;\n }\n\n // ─── Event Handlers ───\n\n protected onClick(event: Event): void {\n if (this.menuDisabled()) return;\n\n if (!this.isSubmenu()) {\n this.toggle();\n return;\n }\n\n // Submenu: prevent comMenuItem's click handler and open submenu\n event.preventDefault();\n event.stopPropagation();\n this.cancelOpenTimer();\n this.openSubmenuInternal();\n this.focusFirstItemDeferred();\n }\n\n protected onArrowDown(event: Event): void {\n if (this.isSubmenu() || this.menuOpen()) return;\n\n event.preventDefault();\n this.open();\n this.focusFirstItemDeferred();\n }\n\n protected onArrowUp(event: Event): void {\n if (this.isSubmenu() || this.menuOpen()) return;\n\n event.preventDefault();\n this.open();\n this.focusLastItemDeferred();\n }\n\n protected onArrowRight(event: Event): void {\n if (!this.isSubmenu() || this.side() !== 'right') return;\n\n event.preventDefault();\n event.stopPropagation();\n this.openSubmenuInternal();\n this.focusFirstItemDeferred();\n }\n\n protected onArrowLeft(event: Event): void {\n if (!this.isSubmenu()) return;\n\n if (this.side() === 'left') {\n event.preventDefault();\n event.stopPropagation();\n this.openSubmenuInternal();\n this.focusFirstItemDeferred();\n } else if (this.menuOpen()) {\n event.preventDefault();\n event.stopPropagation();\n this.closeSubmenu();\n }\n }\n\n protected onEnter(event: Event): void {\n if (this.menuDisabled()) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (this.isSubmenu()) {\n this.openSubmenuInternal();\n this.focusFirstItemDeferred();\n } else if (!this.menuOpen()) {\n this.open();\n this.focusFirstItemDeferred();\n }\n }\n\n protected onSpace(event: Event): void {\n this.onEnter(event);\n }\n\n protected onMouseEnter(): void {\n if (this.menuDisabled()) return;\n if (!this.isSubmenu()) return; // Hover only opens submenus\n\n this.cancelCloseTimer();\n\n this.openDelayTimer = setTimeout(() => {\n this.openSubmenuInternal();\n }, this.subMenuOpenDelay());\n }\n\n protected onMouseLeave(): void {\n if (!this.isSubmenu()) return;\n\n this.cancelOpenTimer();\n\n this.closeDelayTimer = setTimeout(() => {\n if (!this.mouseInSubmenu) {\n this.closeSubmenu();\n }\n }, this.subMenuCloseDelay());\n }\n\n private focusFirstItemDeferred(): void {\n setTimeout(() => this.attachedMenu?.focusFirstItem(), 0);\n }\n\n private focusLastItemDeferred(): void {\n setTimeout(() => this.attachedMenu?.focusLastItem(), 0);\n }\n\n // ─── Menu Management ───\n\n private openMenu(): void {\n if (this.menuDisabled()) return;\n\n this.createOverlay();\n this.attachContent();\n this.subscribeToCloseEvents();\n\n this.menuOpened.emit();\n }\n\n private closeMenu(): void {\n if (this.overlayRef?.hasAttached()) {\n this.overlayRef.detach();\n }\n this.attachedMenu = null;\n this.menuClosed.emit();\n this.elementRef.nativeElement.focus();\n }\n\n // ─── Submenu Management ───\n\n private openSubmenuInternal(): void {\n if (this.menuOpen() || this.menuDisabled()) return;\n\n this.createOverlay();\n this.attachContent();\n this.subscribeToSubmenuCloseEvents();\n this.menuOpen.set(true);\n this.menuOpened.emit();\n }\n\n private closeSubmenu(): void {\n if (!this.menuOpen()) return;\n\n this.cleanupSubmenuListeners();\n if (this.overlayRef?.hasAttached()) {\n this.overlayRef.detach();\n }\n this.menuOpen.set(false);\n this.attachedMenu = null;\n this.menuClosed.emit();\n }\n\n // ─── Overlay Management ───\n\n private createOverlay(): void {\n if (this.overlayRef) return;\n\n const positions = this.isSubmenu()\n ? buildPopoverPositions(this.side(), this.align(), 0)\n : buildPopoverPositions(this.menuPosition(), this.menuAlignment(), this.menuOffset());\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions(positions)\n .withFlexibleDimensions(false)\n .withPush(true)\n .withViewportMargin(8);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: !this.isSubmenu(),\n backdropClass: this.isSubmenu() ? '' : 'cdk-overlay-transparent-backdrop',\n panelClass: ['com-menu-panel', ...this.panelClassArray()],\n });\n }\n\n private attachContent(): void {\n if (!this.overlayRef) return;\n\n const template = this.comMenuTrigger();\n\n // For submenu, wrap the root trigger to delegate close to the actual root\n const rootTriggerValue: RootMenuTrigger = this.isSubmenu()\n ? {\n close: () => this.parentRootTrigger?.close(),\n menuCloseOnSelect: () => this.parentRootTrigger?.menuCloseOnSelect() ?? true,\n registerMenu: (menu: MenuRef) => {\n this.attachedMenu = menu;\n },\n }\n : this;\n\n const injector = Injector.create({\n parent: this.injector,\n providers: [{ provide: ROOT_MENU_TRIGGER, useValue: rootTriggerValue }],\n });\n\n const portal = new TemplatePortal(template, this.viewContainerRef, undefined, injector);\n this.overlayRef.attach(portal);\n\n // For submenu, track mouse in overlay using Renderer2\n if (this.isSubmenu()) {\n const overlayEl = this.overlayRef.overlayElement;\n this.submenuMouseEnterCleanup = this.renderer.listen(overlayEl, 'mouseenter', () => this.onSubmenuMouseEnter());\n this.submenuMouseLeaveCleanup = this.renderer.listen(overlayEl, 'mouseleave', () => this.onSubmenuMouseLeave());\n }\n }\n\n private subscribeToCloseEvents(): void {\n if (!this.overlayRef) return;\n\n this.overlayRef\n .backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.close());\n\n this.overlayRef\n .keydownEvents()\n .pipe(\n filter((event) => event.key === 'Escape'),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((event) => {\n event.preventDefault();\n this.close();\n });\n\n }\n\n private subscribeToSubmenuCloseEvents(): void {\n if (!this.overlayRef) return;\n\n const closeKey = this.side() === 'right' ? 'ArrowLeft' : 'ArrowRight';\n\n this.overlayRef\n .keydownEvents()\n .pipe(\n filter((event) => event.key === 'Escape' || event.key === closeKey),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((event) => {\n event.preventDefault();\n event.stopPropagation();\n this.closeSubmenu();\n this.elementRef.nativeElement.focus();\n });\n\n }\n\n // ─── Submenu Hover Tracking ───\n\n private onSubmenuMouseEnter(): void {\n this.mouseInSubmenu = true;\n this.cancelCloseTimer();\n }\n\n private onSubmenuMouseLeave(): void {\n this.mouseInSubmenu = false;\n\n this.closeDelayTimer = setTimeout(() => {\n if (!this.mouseInSubmenu) {\n this.closeSubmenu();\n }\n }, this.subMenuCloseDelay());\n }\n\n private cancelOpenTimer(): void {\n if (this.openDelayTimer) {\n clearTimeout(this.openDelayTimer);\n this.openDelayTimer = null;\n }\n }\n\n private cancelCloseTimer(): void {\n if (this.closeDelayTimer) {\n clearTimeout(this.closeDelayTimer);\n this.closeDelayTimer = null;\n }\n }\n\n // ─── Cleanup ───\n\n private disposeOverlay(): void {\n this.cancelOpenTimer();\n this.cancelCloseTimer();\n this.cleanupSubmenuListeners();\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.attachedMenu = null;\n }\n\n private cleanupSubmenuListeners(): void {\n this.submenuMouseEnterCleanup?.();\n this.submenuMouseEnterCleanup = null;\n this.submenuMouseLeaveCleanup?.();\n this.submenuMouseLeaveCleanup = null;\n }\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n// ─── Type Definitions ───\n\nexport type MenuSize = 'sm' | 'md' | 'lg';\nexport type MenuVariant = 'default' | 'compact';\nexport type MenuPosition = 'above' | 'below' | 'left' | 'right';\nexport type MenuAlignment = 'start' | 'center' | 'end';\n\n// ─── Menu Panel Variants ───\n\n/**\n * Menu panel styling variants.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-overlay`, `--radius-popover`\n */\nexport const menuPanelVariants: ReturnType<\n typeof cva<{ size: Record<MenuSize, string>; variant: Record<MenuVariant, string> }>\n> = cva(\n [\n 'bg-popover text-popover-foreground',\n 'border border-border',\n 'rounded-popover shadow-overlay',\n 'overflow-hidden',\n 'py-1',\n ],\n {\n variants: {\n size: {\n sm: 'min-w-32',\n md: 'min-w-48',\n lg: 'min-w-64',\n },\n variant: {\n default: '',\n compact: 'py-0.5',\n },\n },\n defaultVariants: {\n size: 'md',\n variant: 'default',\n },\n },\n);\n\nexport type MenuPanelVariants = VariantProps<typeof menuPanelVariants>;\n\n// ─── Menu Item Variants ───\n\ntype BooleanVariant = Record<'true' | 'false', string>;\n\n/**\n * Menu item styling variants (base for all item types).\n *\n * @tokens `--color-popover-foreground`, `--color-foreground`, `--color-muted`, `--color-warn`, `--color-warn-subtle`\n */\nexport const menuItemVariants: ReturnType<\n typeof cva<{\n size: Record<MenuSize, string>;\n focused: BooleanVariant;\n disabled: BooleanVariant;\n destructive: BooleanVariant;\n }>\n> = cva(\n [\n 'relative flex items-center w-full',\n 'text-sm text-popover-foreground',\n 'outline-none select-none',\n 'transition-colors duration-fast',\n ],\n {\n variants: {\n size: {\n sm: 'px-2 py-1 gap-2',\n md: 'px-3 py-1.5 gap-2.5',\n lg: 'px-4 py-2 gap-3',\n },\n focused: {\n true: 'bg-muted text-foreground',\n false: '',\n },\n disabled: {\n true: 'bg-disabled text-disabled-foreground pointer-events-none',\n false: 'cursor-pointer',\n },\n destructive: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n { destructive: true, focused: true, class: 'bg-warn-subtle text-warn' },\n { destructive: true, focused: false, class: 'text-warn' },\n ],\n defaultVariants: {\n size: 'md',\n focused: false,\n disabled: false,\n destructive: false,\n },\n },\n);\n\nexport type MenuItemVariants = VariantProps<typeof menuItemVariants>;\n\n// ─── Menu Label Variants ───\n\n/**\n * Menu label (section header) styling variants.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const menuLabelVariants: ReturnType<typeof cva<{ size: Record<MenuSize, string> }>> = cva(\n 'text-muted-foreground font-medium select-none',\n {\n variants: {\n size: {\n sm: 'px-2 py-1 text-xs',\n md: 'px-3 py-1.5 text-xs',\n lg: 'px-4 py-2 text-sm',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nexport type MenuLabelVariants = VariantProps<typeof menuLabelVariants>;\n\n// ─── Check/Radio Indicator Variants ───\n\n/**\n * Check/radio indicator sizing variants.\n */\nexport const menuCheckIndicatorVariants: ReturnType<typeof cva<{ size: Record<MenuSize, string> }>> = cva(\n 'inline-flex items-center justify-center shrink-0',\n {\n variants: {\n size: {\n sm: 'w-3.5 h-3.5',\n md: 'w-4 h-4',\n lg: 'w-5 h-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nexport type MenuCheckIndicatorVariants = VariantProps<typeof menuCheckIndicatorVariants>;\n\n// ─── Keyboard Shortcut Hint Variants ───\n\n/**\n * Keyboard shortcut hint styling variants.\n *\n * @tokens `--color-muted-foreground`\n */\nexport const menuShortcutVariants: ReturnType<typeof cva<{ size: Record<MenuSize, string> }>> = cva(\n 'ml-auto text-muted-foreground tracking-widest',\n {\n variants: {\n size: {\n sm: 'text-[10px]',\n md: 'text-xs',\n lg: 'text-xs',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nexport type MenuShortcutVariants = VariantProps<typeof menuShortcutVariants>;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n effect,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport type { InputSignal, Signal, WritableSignal } from '@angular/core';\nimport { FocusKeyManager, type FocusableOption } from '@angular/cdk/a11y';\nimport { MENU_REF, ROOT_MENU_TRIGGER, type MenuRef } from './menu-tokens';\nimport { menuPanelVariants, type MenuSize, type MenuVariant } from './menu.variants';\nimport { generateMenuId, mergeClasses } from './menu.utils';\n\n/**\n * Base class for focusable menu items.\n * All item directives must implement this interface for FocusKeyManager.\n */\nexport abstract class ComMenuItemBase implements FocusableOption {\n abstract focus(): void;\n abstract getLabel(): string;\n /** Whether the item is disabled. */\n abstract get disabled(): boolean;\n}\n\n/**\n * Menu panel component that renders inside an overlay.\n * Manages keyboard navigation across its items using CDK FocusKeyManager.\n *\n * @tokens `--color-popover`, `--color-popover-foreground`, `--color-border`, `--shadow-overlay`\n *\n * @example\n * ```html\n * <com-menu>\n * <button comMenuItem>Edit</button>\n * <button comMenuItem>Delete</button>\n * </com-menu>\n * ```\n */\n@Component({\n selector: 'com-menu',\n template: `\n <div\n [class]=\"panelClasses()\"\n role=\"menu\"\n tabindex=\"-1\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\n [id]=\"menuId\"\n [attr.data-state]=\"animationState()\"\n (keydown)=\"onKeydown($event)\"\n >\n <ng-content />\n </div>\n `,\n styles: `\n :host {\n display: contents;\n }\n\n [data-state='open'] {\n animation: menu-in 150ms ease-out;\n }\n\n [data-state='closed'] {\n animation: menu-out 100ms ease-in forwards;\n }\n\n @keyframes menu-in {\n from {\n opacity: 0;\n transform: scale(0.96) translateY(4px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n @keyframes menu-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n [data-state='open'],\n [data-state='closed'] {\n animation: none;\n }\n }\n `,\n providers: [{ provide: MENU_REF, useExisting: forwardRef(() => ComMenuComponent) }],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComMenuComponent implements MenuRef {\n private readonly rootTrigger = inject(ROOT_MENU_TRIGGER, { optional: true });\n\n private keyManager: FocusKeyManager<ComMenuItemBase> | null = null;\n\n // ─── Inputs ───\n\n /** Size variant for the menu panel. */\n readonly menuSize: InputSignal<MenuSize> = input<MenuSize>('md');\n\n /** Spacing density variant. */\n readonly menuVariant: InputSignal<MenuVariant> = input<MenuVariant>('default');\n\n /** Accessible label for the menu. */\n readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** ID of element labeling this menu. */\n readonly ariaLabelledBy: InputSignal<string | null> = input<string | null>(null);\n\n // ─── Internal State ───\n\n readonly menuId: string = generateMenuId();\n readonly animationState: WritableSignal<'open' | 'closed'> = signal<'open' | 'closed'>('open');\n\n /** Query all focusable items in the menu. */\n private readonly items: Signal<readonly ComMenuItemBase[]> = contentChildren<ComMenuItemBase>(ComMenuItemBase);\n\n // ─── Computed ───\n\n protected readonly panelClasses: Signal<string> = computed(() =>\n mergeClasses(menuPanelVariants({ size: this.menuSize(), variant: this.menuVariant() })),\n );\n\n constructor() {\n this.rootTrigger?.registerMenu?.(this);\n\n effect(() => {\n const items = this.items();\n if (items.length > 0 && !this.keyManager) {\n this.keyManager = new FocusKeyManager(items as ComMenuItemBase[])\n .withVerticalOrientation()\n .withWrap()\n .withHomeAndEnd()\n .withTypeAhead(200);\n }\n });\n }\n\n // ─── Public API ───\n\n /** Focus the first non-disabled item. */\n focusFirstItem(): void {\n this.keyManager?.setFirstItemActive();\n }\n\n /** Focus the last non-disabled item. */\n focusLastItem(): void {\n this.keyManager?.setLastItemActive();\n }\n\n /** Close this menu level. */\n close(): void {\n this.rootTrigger?.close();\n }\n\n // ─── Event Handlers ───\n\n protected onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.close();\n return;\n }\n\n // ArrowRight/ArrowLeft are handled by submenu triggers\n if (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft') {\n this.keyManager?.onKeydown(event);\n }\n }\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n ElementRef,\n forwardRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport type { InputSignalWithTransform, OutputEmitterRef, Signal, WritableSignal } from '@angular/core';\nimport { ComMenuItemBase } from './menu.component';\nimport { MENU_REF, ROOT_MENU_TRIGGER } from './menu-tokens';\nimport { menuItemVariants, type MenuSize } from './menu.variants';\nimport { mergeClasses } from './menu.utils';\n\n/**\n * Menu item directive for actionable menu items.\n * Applied to buttons, anchors, or any element that should be selectable.\n *\n * @tokens `--color-popover-foreground`, `--color-foreground`, `--color-muted`, `--color-warn`, `--color-warn-subtle`\n *\n * @example\n * ```html\n * <button comMenuItem (menuItemSelect)=\"onEdit()\">Edit</button>\n * <button comMenuItem [menuItemDisabled]=\"true\">Disabled</button>\n * <button comMenuItem destructive>Delete</button>\n * ```\n */\n@Directive({\n selector: '[comMenuItem]',\n exportAs: 'comMenuItem',\n providers: [{ provide: ComMenuItemBase, useExisting: forwardRef(() => ComMenuItem) }],\n host: {\n '[class]': 'itemClasses()',\n '[attr.role]': '\"menuitem\"',\n '[attr.tabindex]': '-1',\n '[attr.aria-disabled]': 'menuItemDisabled() || null',\n '[attr.disabled]': 'menuItemDisabled() || null',\n '(click)': 'onAction($event)',\n '(keydown.enter)': 'onAction($event)',\n '(keydown.space)': 'onAction($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n})\nexport class ComMenuItem extends ComMenuItemBase {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly menu = inject(MENU_REF, { optional: true });\n private readonly rootTrigger = inject(ROOT_MENU_TRIGGER, { optional: true });\n\n // ─── Inputs ───\n\n /** Disables the item. */\n readonly menuItemDisabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n /** Marks item as destructive (delete, remove actions). */\n readonly destructive: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n // ─── Outputs ───\n\n /** Emitted when item is activated. */\n readonly menuItemSelect: OutputEmitterRef<void> = output<void>();\n\n // ─── Internal State ───\n\n private readonly isFocused: WritableSignal<boolean> = signal(false);\n\n // ─── Computed ───\n\n private readonly size: Signal<MenuSize> = computed(() => this.menu?.menuSize() ?? 'md');\n\n protected readonly itemClasses: Signal<string> = computed(() =>\n mergeClasses(\n menuItemVariants({\n size: this.size(),\n focused: this.isFocused(),\n disabled: this.menuItemDisabled(),\n destructive: this.destructive(),\n }),\n ),\n );\n\n // ─── FocusableOption Implementation ───\n\n get disabled(): boolean {\n return this.menuItemDisabled();\n }\n\n focus(): void {\n this.elementRef.nativeElement.focus();\n this.isFocused.set(true);\n }\n\n getLabel(): string {\n return this.elementRef.nativeElement.textContent?.trim() ?? '';\n }\n\n // ─── Event Handlers ───\n\n protected onAction(event: Event): void {\n if (this.menuItemDisabled()) return;\n\n event.preventDefault();\n this.menuItemSelect.emit();\n\n if (this.rootTrigger?.menuCloseOnSelect()) {\n this.rootTrigger.close();\n }\n }\n\n protected onMouseEnter(): void {\n if (this.menuItemDisabled()) return;\n this.focus();\n }\n\n protected onMouseLeave(): void {\n this.isFocused.set(false);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport type { InputSignalWithTransform, ModelSignal, Signal, WritableSignal } from '@angular/core';\nimport { ComMenuItemBase } from './menu.component';\nimport { MENU_REF } from './menu-tokens';\nimport { menuCheckIndicatorVariants, menuItemVariants, type MenuSize } from './menu.variants';\nimport { mergeClasses } from './menu.utils';\n\n/**\n * Checkbox menu item component with toggleable checked state.\n *\n * @tokens `--color-popover-foreground`, `--color-foreground`, `--color-muted`\n *\n * @example\n * ```html\n * <button comMenuItemCheckbox [(checked)]=\"showSidebar\">Sidebar</button>\n * ```\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector -- attribute selector used on <button> host elements\n selector: '[comMenuItemCheckbox]',\n exportAs: 'comMenuItemCheckbox',\n template: `\n <span [class]=\"indicatorClasses()\">\n @if (checked()) {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"w-full h-full\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n }\n </span>\n <ng-content />\n `,\n providers: [{ provide: ComMenuItemBase, useExisting: forwardRef(() => ComMenuItemCheckbox) }],\n host: {\n '[class]': 'itemClasses()',\n '[attr.role]': '\"menuitemcheckbox\"',\n '[attr.tabindex]': '-1',\n '[attr.aria-checked]': 'checked()',\n '[attr.aria-disabled]': 'menuItemDisabled() || null',\n '[attr.disabled]': 'menuItemDisabled() || null',\n '(click)': 'toggle($event)',\n '(keydown.enter)': 'toggle($event)',\n '(keydown.space)': 'toggle($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComMenuItemCheckbox extends ComMenuItemBase {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly menu = inject(MENU_REF, { optional: true });\n\n // ─── Inputs ───\n\n /** Disables the item. */\n readonly menuItemDisabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n /** Two-way bindable checked state. */\n readonly checked: ModelSignal<boolean> = model<boolean>(false);\n\n // ─── Internal State ───\n\n private readonly isFocused: WritableSignal<boolean> = signal(false);\n\n // ─── Computed ───\n\n private readonly size: Signal<MenuSize> = computed(() => this.menu?.menuSize() ?? 'md');\n\n protected readonly itemClasses: Signal<string> = computed(() =>\n mergeClasses(\n menuItemVariants({\n size: this.size(),\n focused: this.isFocused(),\n disabled: this.menuItemDisabled(),\n }),\n ),\n );\n\n protected readonly indicatorClasses: Signal<string> = computed(() =>\n mergeClasses(menuCheckIndicatorVariants({ size: this.size() })),\n );\n\n // ─── FocusableOption Implementation ───\n\n get disabled(): boolean {\n return this.menuItemDisabled();\n }\n\n focus(): void {\n this.elementRef.nativeElement.focus();\n this.isFocused.set(true);\n }\n\n getLabel(): string {\n return this.elementRef.nativeElement.textContent?.trim() ?? '';\n }\n\n // ─── Event Handlers ───\n\n protected toggle(event: Event): void {\n if (this.menuItemDisabled()) return;\n\n event.preventDefault();\n this.checked.update((c) => !c);\n }\n\n protected onMouseEnter(): void {\n if (this.menuItemDisabled()) return;\n this.focus();\n }\n\n protected onMouseLeave(): void {\n this.isFocused.set(false);\n }\n}\n","import { Directive, forwardRef, input, model } from '@angular/core';\nimport type { InputSignal, ModelSignal } from '@angular/core';\n\n/**\n * Token for menu group to allow radio items to coordinate.\n */\nexport abstract class ComMenuGroupRef {\n abstract readonly groupValue: () => unknown;\n abstract setGroupValue(value: unknown): void;\n}\n\n/**\n * Menu group directive for organizing related items.\n * For radio items, ensures mutual exclusivity within the group.\n *\n * @example\n * ```html\n * <div comMenuGroup [(groupValue)]=\"sortField\">\n * <button comMenuItemRadio value=\"name\">Name</button>\n * <button comMenuItemRadio value=\"date\">Date</button>\n * </div>\n * ```\n *\n * @tokens None - uses only ARIA attributes\n */\n@Directive({\n selector: '[comMenuGroup]',\n exportAs: 'comMenuGroup',\n providers: [{ provide: ComMenuGroupRef, useExisting: forwardRef(() => ComMenuGroup) }],\n host: {\n '[attr.role]': '\"group\"',\n '[attr.aria-label]': 'ariaLabel() || null',\n },\n})\nexport class ComMenuGroup extends ComMenuGroupRef {\n /** Optional accessible label for the group. */\n readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** Two-way bindable value for radio groups. */\n readonly groupValue: ModelSignal<unknown> = model<unknown>(undefined);\n\n setGroupValue(value: unknown): void {\n this.groupValue.set(value);\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal, WritableSignal } from '@angular/core';\nimport { ComMenuItemBase } from './menu.component';\nimport { MENU_REF, ROOT_MENU_TRIGGER } from './menu-tokens';\nimport { ComMenuGroupRef } from './menu-group.directive';\nimport { menuCheckIndicatorVariants, menuItemVariants, type MenuSize } from './menu.variants';\nimport { mergeClasses } from './menu.utils';\n\n/**\n * Radio menu item component for single-selection within a group.\n *\n * @tokens `--color-popover-foreground`, `--color-foreground`, `--color-muted`\n *\n * @example\n * ```html\n * <div comMenuGroup [(groupValue)]=\"sortField\">\n * <button comMenuItemRadio value=\"name\">Name</button>\n * <button comMenuItemRadio value=\"date\">Date</button>\n * </div>\n * ```\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector -- attribute selector used on <button> host elements\n selector: '[comMenuItemRadio]',\n exportAs: 'comMenuItemRadio',\n template: `\n <span [class]=\"indicatorClasses()\">\n @if (isChecked()) {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n class=\"w-full h-full\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n }\n </span>\n <ng-content />\n `,\n providers: [{ provide: ComMenuItemBase, useExisting: forwardRef(() => ComMenuItemRadio) }],\n host: {\n '[class]': 'itemClasses()',\n '[attr.role]': '\"menuitemradio\"',\n '[attr.tabindex]': '-1',\n '[attr.aria-checked]': 'isChecked()',\n '[attr.aria-disabled]': 'menuItemDisabled() || null',\n '[attr.disabled]': 'menuItemDisabled() || null',\n '(click)': 'select($event)',\n '(keydown.enter)': 'select($event)',\n '(keydown.space)': 'select($event)',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComMenuItemRadio extends ComMenuItemBase {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly menu = inject(MENU_REF, { optional: true });\n private readonly rootTrigger = inject(ROOT_MENU_TRIGGER, { optional: true });\n private readonly group = inject(ComMenuGroupRef, { optional: true });\n\n // ─── Inputs ───\n\n /** Disables the item. */\n readonly menuItemDisabled: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n /** The value this radio item represents. */\n readonly value: InputSignal<unknown> = input.required<unknown>();\n\n // ─── Internal State ───\n\n private readonly isFocused: WritableSignal<boolean> = signal(false);\n\n // ─── Computed ───\n\n private readonly size: Signal<MenuSize> = computed(() => this.menu?.menuSize() ?? 'md');\n\n /** Whether this radio item is currently selected. */\n readonly isChecked: Signal<boolean> = computed(() => this.group?.groupValue() === this.value());\n\n protected readonly itemClasses: Signal<string> = computed(() =>\n mergeClasses(\n menuItemVariants({\n size: this.size(),\n focused: this.isFocused(),\n disabled: this.menuItemDisabled(),\n }),\n ),\n );\n\n protected readonly indicatorClasses: Signal<string> = computed(() =>\n mergeClasses(menuCheckIndicatorVariants({ size: this.size() })),\n );\n\n // ─── FocusableOption Implementation ───\n\n get disabled(): boolean {\n return this.menuItemDisabled();\n }\n\n focus(): void {\n this.elementRef.nativeElement.focus();\n this.isFocused.set(true);\n }\n\n getLabel(): string {\n return this.elementRef.nativeElement.textContent?.trim() ?? '';\n }\n\n // ─── Event Handlers ───\n\n protected select(event: Event): void {\n if (this.menuItemDisabled()) return;\n\n event.preventDefault();\n this.group?.setGroupValue(this.value());\n\n if (this.rootTrigger?.menuCloseOnSelect()) {\n this.rootTrigger.close();\n }\n }\n\n protected onMouseEnter(): void {\n if (this.menuItemDisabled()) return;\n this.focus();\n }\n\n protected onMouseLeave(): void {\n this.isFocused.set(false);\n }\n}\n","import { computed, Directive, inject } from '@angular/core';\nimport type { Signal } from '@angular/core';\nimport { MENU_REF } from './menu-tokens';\nimport { menuLabelVariants, type MenuSize } from './menu.variants';\nimport { mergeClasses } from './menu.utils';\n\nlet labelIdCounter = 0;\n\n/**\n * Non-interactive section label/header inside a menu.\n *\n * @tokens `--color-muted-foreground`\n *\n * @example\n * ```html\n * <span comMenuLabel>Team</span>\n * <button comMenuItem>View Members</button>\n * ```\n */\n@Directive({\n selector: '[comMenuLabel]',\n exportAs: 'comMenuLabel',\n host: {\n '[class]': 'labelClasses()',\n '[attr.role]': '\"presentation\"',\n '[id]': 'labelId',\n },\n})\nexport class ComMenuLabel {\n private readonly menu = inject(MENU_REF, { optional: true });\n\n /** Unique ID that can be referenced by aria-labelledby. */\n readonly labelId: string = `menu-label-${++labelIdCounter}`;\n\n private readonly size: Signal<MenuSize> = computed(() => this.menu?.menuSize() ?? 'md');\n\n protected readonly labelClasses: Signal<string> = computed(() =>\n mergeClasses(menuLabelVariants({ size: this.size() })),\n );\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Visual separator between menu sections.\n *\n * @tokens `--color-border`\n *\n * @example\n * ```html\n * <button comMenuItem>Edit</button>\n * <hr comMenuDivider />\n * <button comMenuItem>Delete</button>\n * ```\n */\n@Directive({\n selector: '[comMenuDivider]',\n exportAs: 'comMenuDivider',\n host: {\n class: 'block border-t border-border my-1',\n '[attr.role]': '\"separator\"',\n },\n})\nexport class ComMenuDivider {}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * Submenu indicator component — displays a chevron icon indicating a submenu.\n * Place inside a menu item that has `[comMenuTrigger]` to indicate it opens a submenu.\n *\n * @tokens `--color-muted-foreground`\n *\n * @example\n * ```html\n * <button comMenuItem [comMenuTrigger]=\"shareMenu\">\n * Share\n * <com-menu-sub-indicator />\n * </button>\n * ```\n */\n@Component({\n selector: 'com-menu-sub-indicator',\n template: `\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n `,\n host: {\n class: 'ml-auto inline-flex items-center justify-center w-4 h-4 text-muted-foreground',\n '[attr.aria-hidden]': 'true',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ComMenuSubIndicator {}\n","import { computed, Directive, inject } from '@angular/core';\nimport type { Signal } from '@angular/core';\nimport { MENU_REF } from './menu-tokens';\nimport { menuShortcutVariants, type MenuSize } from './menu.variants';\nimport { mergeClasses } from './menu.utils';\n\n/**\n * Keyboard shortcut hint displayed in a menu item.\n *\n * @tokens `--color-muted-foreground`\n *\n * @example\n * ```html\n * <button comMenuItem>\n * Save\n * <span comMenuShortcut>⌘S</span>\n * </button>\n * ```\n */\n@Directive({\n selector: '[comMenuShortcut]',\n exportAs: 'comMenuShortcut',\n host: {\n '[class]': 'shortcutClasses()',\n },\n})\nexport class ComMenuShortcut {\n private readonly menu = inject(MENU_REF, { optional: true });\n\n private readonly size: Signal<MenuSize> = computed(() => this.menu?.menuSize() ?? 'md');\n\n protected readonly shortcutClasses: Signal<string> = computed(() =>\n mergeClasses(menuShortcutVariants({ size: this.size() })),\n );\n}\n","// Public API for the menu component\n\n// Main components/directives\nexport { ComMenuTrigger, type MenuSide } from './menu-trigger.directive';\nexport { ComMenuComponent, ComMenuItemBase } from './menu.component';\nexport { ComMenuItem } from './menu-item.directive';\nexport { ComMenuItemCheckbox } from './menu-item-checkbox.component';\nexport { ComMenuItemRadio } from './menu-item-radio.component';\nexport { ComMenuGroup, ComMenuGroupRef } from './menu-group.directive';\nexport { ComMenuLabel } from './menu-label.directive';\nexport { ComMenuDivider } from './menu-divider.directive';\nexport { ComMenuSubIndicator } from './menu-sub-indicator.component';\nexport { ComMenuShortcut } from './menu-shortcut.directive';\n\n// Injection tokens and types\nexport { ROOT_MENU_TRIGGER, MENU_REF, type RootMenuTrigger, type MenuRef } from './menu-tokens';\n\n// Variants and types\nexport {\n menuPanelVariants,\n menuItemVariants,\n menuLabelVariants,\n menuCheckIndicatorVariants,\n menuShortcutVariants,\n type MenuSize,\n type MenuVariant,\n type MenuPosition,\n type MenuAlignment,\n type MenuPanelVariants,\n type MenuItemVariants,\n type MenuLabelVariants,\n type MenuCheckIndicatorVariants,\n type MenuShortcutVariants,\n} from './menu.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, input, booleanAttribute, signal, computed, Directive } from '@angular/core';
|
|
3
|
+
import { NgForm, FormGroupDirective, NgControl } from '@angular/forms';
|
|
4
|
+
import { ErrorStateMatcher } from 'ngx-com/components/form-field';
|
|
5
|
+
import { mergeClasses } from 'ngx-com/utils';
|
|
6
|
+
import { cva } from 'class-variance-authority';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* CVA variants for the native control directive.
|
|
10
|
+
*
|
|
11
|
+
* @tokens `--color-input-border`, `--color-input-background`, `--color-input-foreground`,
|
|
12
|
+
* `--color-input-placeholder`, `--color-disabled`, `--color-disabled-foreground`,
|
|
13
|
+
* `--color-ring`, `--color-warn`, `--color-muted`, `--color-border`,
|
|
14
|
+
* `--radius-input`
|
|
15
|
+
*/
|
|
16
|
+
const nativeControlVariants = cva([
|
|
17
|
+
'com-native-control',
|
|
18
|
+
'w-full',
|
|
19
|
+
'text-input-foreground',
|
|
20
|
+
'placeholder:text-input-placeholder',
|
|
21
|
+
'rounded-input',
|
|
22
|
+
'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',
|
|
23
|
+
'disabled:bg-disabled disabled:text-disabled-foreground disabled:border-disabled disabled:cursor-not-allowed',
|
|
24
|
+
'read-only:bg-muted read-only:cursor-default',
|
|
25
|
+
'aria-[invalid=true]:border-warn aria-[invalid=true]:ring-1 aria-[invalid=true]:ring-warn',
|
|
26
|
+
'file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-input-foreground',
|
|
27
|
+
'transition-colors',
|
|
28
|
+
], {
|
|
29
|
+
variants: {
|
|
30
|
+
variant: {
|
|
31
|
+
outline: [
|
|
32
|
+
'border border-input-border bg-input-background',
|
|
33
|
+
'hover:border-border',
|
|
34
|
+
],
|
|
35
|
+
filled: [
|
|
36
|
+
'border border-transparent bg-muted',
|
|
37
|
+
'hover:bg-muted-hover',
|
|
38
|
+
'focus-visible:border-input-border focus-visible:bg-input-background',
|
|
39
|
+
],
|
|
40
|
+
ghost: [
|
|
41
|
+
'border border-transparent bg-transparent',
|
|
42
|
+
'hover:bg-muted',
|
|
43
|
+
'focus-visible:border-input-border focus-visible:bg-input-background',
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
size: {
|
|
47
|
+
sm: 'h-8 px-2.5 text-sm',
|
|
48
|
+
default: 'h-10 px-3 text-sm',
|
|
49
|
+
lg: 'h-12 px-4 text-base',
|
|
50
|
+
},
|
|
51
|
+
error: {
|
|
52
|
+
true: 'border-warn ring-1 ring-warn focus-visible:outline-warn',
|
|
53
|
+
false: '',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
defaultVariants: {
|
|
57
|
+
variant: 'outline',
|
|
58
|
+
size: 'default',
|
|
59
|
+
error: false,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Standalone styling directive for native `<input>`, `<select>`, and `<textarea>` elements.
|
|
65
|
+
*
|
|
66
|
+
* Applies consistent borders, background, text color, focus outline, disabled state,
|
|
67
|
+
* error state, and size scaling via CVA. Integrates with both Reactive Forms (via NgControl)
|
|
68
|
+
* and Signal Forms (via `invalid`/`touched` inputs set by `[formField]`).
|
|
69
|
+
*
|
|
70
|
+
* For full form integration (label, hint, error), use `com-form-field` + `comInput`.
|
|
71
|
+
*
|
|
72
|
+
* @tokens `--color-input-border`, `--color-input-background`, `--color-input-foreground`,
|
|
73
|
+
* `--color-input-placeholder`, `--color-disabled`, `--color-disabled-foreground`,
|
|
74
|
+
* `--color-ring`, `--color-warn`, `--color-muted`, `--color-border`,
|
|
75
|
+
* `--radius-input`
|
|
76
|
+
*
|
|
77
|
+
* @example Basic usage
|
|
78
|
+
* ```html
|
|
79
|
+
* <input comNativeControl placeholder="Enter your name" />
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @example Variants
|
|
83
|
+
* ```html
|
|
84
|
+
* <input comNativeControl variant="outline" placeholder="Outline (default)" />
|
|
85
|
+
* <input comNativeControl variant="filled" placeholder="Filled" />
|
|
86
|
+
* <input comNativeControl variant="ghost" placeholder="Ghost" />
|
|
87
|
+
* ```
|
|
88
|
+
*
|
|
89
|
+
* @example Reactive Forms
|
|
90
|
+
* ```html
|
|
91
|
+
* <input comNativeControl [formControl]="nameCtrl" />
|
|
92
|
+
* ```
|
|
93
|
+
*
|
|
94
|
+
* @example Signal Forms
|
|
95
|
+
* ```html
|
|
96
|
+
* <input comNativeControl [formField]="myForm.name" />
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
class ComNativeControl {
|
|
100
|
+
defaultErrorStateMatcher = inject(ErrorStateMatcher);
|
|
101
|
+
parentForm = inject(NgForm, { optional: true });
|
|
102
|
+
parentFormGroup = inject(FormGroupDirective, { optional: true });
|
|
103
|
+
/** NgControl bound to this element (if using reactive forms). */
|
|
104
|
+
ngControl = inject(NgControl, { optional: true, self: true });
|
|
105
|
+
/** Whether the form system is Signal Forms (no NgControl present). */
|
|
106
|
+
isSignalForms = !this.ngControl;
|
|
107
|
+
// ── Inputs ──
|
|
108
|
+
/** Visual variant — outline (bordered), filled (bg fill), or ghost (transparent) */
|
|
109
|
+
variant = input('outline', ...(ngDevMode ? [{ debugName: "variant" }] : []));
|
|
110
|
+
/** Control size — affects height, padding, and font size */
|
|
111
|
+
size = input('default', ...(ngDevMode ? [{ debugName: "size" }] : []));
|
|
112
|
+
/** Consumer CSS classes — merged with variant classes via mergeClasses() */
|
|
113
|
+
userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : {}), alias: 'class' });
|
|
114
|
+
/** Custom error state matcher (overrides the default). */
|
|
115
|
+
errorStateMatcher = input(...(ngDevMode ? [undefined, { debugName: "errorStateMatcher" }] : []));
|
|
116
|
+
// ── Signal Forms inputs — set automatically by [formField] ──
|
|
117
|
+
sfInvalid = input(false, { ...(ngDevMode ? { debugName: "sfInvalid" } : {}), alias: 'invalid',
|
|
118
|
+
transform: booleanAttribute });
|
|
119
|
+
sfTouched = input(false, { ...(ngDevMode ? { debugName: "sfTouched" } : {}), alias: 'touched',
|
|
120
|
+
transform: booleanAttribute });
|
|
121
|
+
// ── Error state ──
|
|
122
|
+
/**
|
|
123
|
+
* Reactive Forms error state — imperatively updated in DoCheck because
|
|
124
|
+
* NgControl properties (touched, invalid) are not signals.
|
|
125
|
+
*/
|
|
126
|
+
_reactiveErrorState = signal(false, ...(ngDevMode ? [{ debugName: "_reactiveErrorState" }] : []));
|
|
127
|
+
/** Whether the control is in an error state. */
|
|
128
|
+
errorState = computed(() => {
|
|
129
|
+
if (this.isSignalForms) {
|
|
130
|
+
return this.sfInvalid() && this.sfTouched();
|
|
131
|
+
}
|
|
132
|
+
return this._reactiveErrorState();
|
|
133
|
+
}, ...(ngDevMode ? [{ debugName: "errorState" }] : []));
|
|
134
|
+
/** @internal Computed host class from CVA + consumer overrides */
|
|
135
|
+
computedClass = computed(() => mergeClasses(nativeControlVariants({
|
|
136
|
+
variant: this.variant(),
|
|
137
|
+
size: this.size(),
|
|
138
|
+
error: this.errorState(),
|
|
139
|
+
}), this.userClass()), ...(ngDevMode ? [{ debugName: "computedClass" }] : []));
|
|
140
|
+
ngDoCheck() {
|
|
141
|
+
if (this.ngControl) {
|
|
142
|
+
const matcher = this.errorStateMatcher() ?? this.defaultErrorStateMatcher;
|
|
143
|
+
const form = this.parentFormGroup ?? this.parentForm;
|
|
144
|
+
this._reactiveErrorState.set(matcher.isErrorState(this.ngControl.control ?? null, form));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComNativeControl, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
148
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.0", type: ComNativeControl, isStandalone: true, selector: "input[comNativeControl], select[comNativeControl], textarea[comNativeControl]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null }, sfInvalid: { classPropertyName: "sfInvalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, sfTouched: { classPropertyName: "sfTouched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "computedClass()", "attr.aria-invalid": "errorState() || null" } }, exportAs: ["comNativeControl"], ngImport: i0 });
|
|
149
|
+
}
|
|
150
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComNativeControl, decorators: [{
|
|
151
|
+
type: Directive,
|
|
152
|
+
args: [{
|
|
153
|
+
selector: 'input[comNativeControl], select[comNativeControl], textarea[comNativeControl]',
|
|
154
|
+
exportAs: 'comNativeControl',
|
|
155
|
+
host: {
|
|
156
|
+
'[class]': 'computedClass()',
|
|
157
|
+
'[attr.aria-invalid]': 'errorState() || null',
|
|
158
|
+
},
|
|
159
|
+
}]
|
|
160
|
+
}], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], sfInvalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], sfTouched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }] } });
|
|
161
|
+
|
|
162
|
+
// Public API for the native-control directive
|
|
163
|
+
// Main directive
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Generated bundle index. Do not edit.
|
|
167
|
+
*/
|
|
168
|
+
|
|
169
|
+
export { ComNativeControl, nativeControlVariants };
|
|
170
|
+
//# sourceMappingURL=ngx-com-components-native-control.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-com-components-native-control.mjs","sources":["../../../projects/com/components/native-control/native-control.variants.ts","../../../projects/com/components/native-control/native-control.directive.ts","../../../projects/com/components/native-control/index.ts","../../../projects/com/components/native-control/ngx-com-components-native-control.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * Size type for native control.\n */\nexport type NativeControlSize = 'sm' | 'default' | 'lg';\n\n/**\n * Visual variant for native control.\n */\nexport type NativeControlVariant = 'outline' | 'filled' | 'ghost';\n\n/**\n * CVA variants for the native control directive.\n *\n * @tokens `--color-input-border`, `--color-input-background`, `--color-input-foreground`,\n * `--color-input-placeholder`, `--color-disabled`, `--color-disabled-foreground`,\n * `--color-ring`, `--color-warn`, `--color-muted`, `--color-border`,\n * `--radius-input`\n */\nexport const nativeControlVariants: (props?: {\n variant?: NativeControlVariant;\n size?: NativeControlSize;\n error?: boolean;\n}) => string = cva(\n [\n 'com-native-control',\n 'w-full',\n 'text-input-foreground',\n 'placeholder:text-input-placeholder',\n 'rounded-input',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'disabled:bg-disabled disabled:text-disabled-foreground disabled:border-disabled disabled:cursor-not-allowed',\n 'read-only:bg-muted read-only:cursor-default',\n 'aria-[invalid=true]:border-warn aria-[invalid=true]:ring-1 aria-[invalid=true]:ring-warn',\n 'file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-input-foreground',\n 'transition-colors',\n ],\n {\n variants: {\n variant: {\n outline: [\n 'border border-input-border bg-input-background',\n 'hover:border-border',\n ],\n filled: [\n 'border border-transparent bg-muted',\n 'hover:bg-muted-hover',\n 'focus-visible:border-input-border focus-visible:bg-input-background',\n ],\n ghost: [\n 'border border-transparent bg-transparent',\n 'hover:bg-muted',\n 'focus-visible:border-input-border focus-visible:bg-input-background',\n ],\n },\n size: {\n sm: 'h-8 px-2.5 text-sm',\n default: 'h-10 px-3 text-sm',\n lg: 'h-12 px-4 text-base',\n },\n error: {\n true: 'border-warn ring-1 ring-warn focus-visible:outline-warn',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'outline',\n size: 'default',\n error: false,\n },\n }\n);\n\nexport type NativeControlVariants = VariantProps<typeof nativeControlVariants>;\n","import {\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport type { DoCheck, InputSignal, InputSignalWithTransform, Signal, WritableSignal } from '@angular/core';\nimport { FormGroupDirective, NgControl, NgForm } from '@angular/forms';\nimport { ErrorStateMatcher } from 'ngx-com/components/form-field';\nimport { mergeClasses } from './native-control.utils';\nimport { nativeControlVariants } from './native-control.variants';\nimport type { NativeControlSize, NativeControlVariant } from './native-control.variants';\n\n/**\n * Standalone styling directive for native `<input>`, `<select>`, and `<textarea>` elements.\n *\n * Applies consistent borders, background, text color, focus outline, disabled state,\n * error state, and size scaling via CVA. Integrates with both Reactive Forms (via NgControl)\n * and Signal Forms (via `invalid`/`touched` inputs set by `[formField]`).\n *\n * For full form integration (label, hint, error), use `com-form-field` + `comInput`.\n *\n * @tokens `--color-input-border`, `--color-input-background`, `--color-input-foreground`,\n * `--color-input-placeholder`, `--color-disabled`, `--color-disabled-foreground`,\n * `--color-ring`, `--color-warn`, `--color-muted`, `--color-border`,\n * `--radius-input`\n *\n * @example Basic usage\n * ```html\n * <input comNativeControl placeholder=\"Enter your name\" />\n * ```\n *\n * @example Variants\n * ```html\n * <input comNativeControl variant=\"outline\" placeholder=\"Outline (default)\" />\n * <input comNativeControl variant=\"filled\" placeholder=\"Filled\" />\n * <input comNativeControl variant=\"ghost\" placeholder=\"Ghost\" />\n * ```\n *\n * @example Reactive Forms\n * ```html\n * <input comNativeControl [formControl]=\"nameCtrl\" />\n * ```\n *\n * @example Signal Forms\n * ```html\n * <input comNativeControl [formField]=\"myForm.name\" />\n * ```\n */\n@Directive({\n selector: 'input[comNativeControl], select[comNativeControl], textarea[comNativeControl]',\n exportAs: 'comNativeControl',\n host: {\n '[class]': 'computedClass()',\n '[attr.aria-invalid]': 'errorState() || null',\n },\n})\nexport class ComNativeControl implements DoCheck {\n private readonly defaultErrorStateMatcher = inject(ErrorStateMatcher);\n private readonly parentForm = inject(NgForm, { optional: true });\n private readonly parentFormGroup = inject(FormGroupDirective, { optional: true });\n\n /** NgControl bound to this element (if using reactive forms). */\n readonly ngControl: NgControl | null = inject(NgControl, { optional: true, self: true });\n\n /** Whether the form system is Signal Forms (no NgControl present). */\n private readonly isSignalForms: boolean = !this.ngControl;\n\n // ── Inputs ──\n\n /** Visual variant — outline (bordered), filled (bg fill), or ghost (transparent) */\n readonly variant: InputSignal<NativeControlVariant> = input<NativeControlVariant>('outline');\n\n /** Control size — affects height, padding, and font size */\n readonly size: InputSignal<NativeControlSize> = input<NativeControlSize>('default');\n\n /** Consumer CSS classes — merged with variant classes via mergeClasses() */\n readonly userClass: InputSignal<string> = input<string>('', { alias: 'class' });\n\n /** Custom error state matcher (overrides the default). */\n readonly errorStateMatcher: InputSignal<ErrorStateMatcher | undefined> = input<ErrorStateMatcher>();\n\n // ── Signal Forms inputs — set automatically by [formField] ──\n\n readonly sfInvalid: InputSignalWithTransform<boolean, unknown> = input(false, {\n alias: 'invalid',\n transform: booleanAttribute,\n });\n readonly sfTouched: InputSignalWithTransform<boolean, unknown> = input(false, {\n alias: 'touched',\n transform: booleanAttribute,\n });\n\n // ── Error state ──\n\n /**\n * Reactive Forms error state — imperatively updated in DoCheck because\n * NgControl properties (touched, invalid) are not signals.\n */\n private readonly _reactiveErrorState: WritableSignal<boolean> = signal(false);\n\n /** Whether the control is in an error state. */\n readonly errorState: Signal<boolean> = computed(() => {\n if (this.isSignalForms) {\n return this.sfInvalid() && this.sfTouched();\n }\n return this._reactiveErrorState();\n });\n\n /** @internal Computed host class from CVA + consumer overrides */\n protected readonly computedClass: Signal<string> = computed(() =>\n mergeClasses(\n nativeControlVariants({\n variant: this.variant(),\n size: this.size(),\n error: this.errorState(),\n }),\n this.userClass()\n )\n );\n\n ngDoCheck(): void {\n if (this.ngControl) {\n const matcher = this.errorStateMatcher() ?? this.defaultErrorStateMatcher;\n const form = this.parentFormGroup ?? this.parentForm;\n this._reactiveErrorState.set(\n matcher.isErrorState(this.ngControl.control ?? null, form)\n );\n }\n }\n}\n","// Public API for the native-control directive\n\n// Main directive\nexport { ComNativeControl } from './native-control.directive';\n\n// Variants (for advanced customization)\nexport { nativeControlVariants } from './native-control.variants';\n\nexport type {\n NativeControlVariant,\n NativeControlSize,\n NativeControlVariants,\n} from './native-control.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|