@raqm/ui 0.2.0 → 0.2.1
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/CHANGELOG.md +7 -0
- package/fesm2022/raqm-ui-dropdown-menu.mjs.map +1 -1
- package/fesm2022/raqm-ui-hover-card.mjs.map +1 -1
- package/fesm2022/raqm-ui-menubar.mjs.map +1 -1
- package/fesm2022/raqm-ui-tooltip.mjs.map +1 -1
- package/package.json +1 -1
- package/types/raqm-ui-rolldown-runtime-C25Le4-w.d.ts +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,13 @@ releases may include breaking changes.
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.2.1] - 2026-11-13
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Republish with the patched Angular build tooling and refreshed transitive
|
|
15
|
+
dependencies. No runtime, component API or stylesheet changes.
|
|
16
|
+
|
|
10
17
|
## [0.2.0] - 2026-11-13
|
|
11
18
|
|
|
12
19
|
### Changed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raqm-ui-dropdown-menu.mjs","names":[],"sources":["../../../projects/ui/dropdown-menu/menu-overlay.ts","../../../projects/ui/dropdown-menu/dropdown-menu.directive.ts","../../../projects/ui/dropdown-menu/dropdown-menu-trigger.directive.ts","../../../projects/ui/dropdown-menu/dropdown-menu-item.directive.ts","../../../projects/ui/dropdown-menu/dropdown-menu-checkbox-item.directive.ts","../../../projects/ui/dropdown-menu/dropdown-menu-radio-context.ts","../../../projects/ui/dropdown-menu/dropdown-menu-radio.directive.ts","../../../projects/ui/dropdown-menu/public-api.ts"],"sourcesContent":["import { DestroyRef, Directive, ElementRef, forwardRef, inject } from '@angular/core';\r\nimport { Direction, Directionality } from '@angular/cdk/bidi';\r\nimport {\r\n CdkContextMenuTrigger,\r\n CdkMenuTrigger,\r\n CdkMenuTriggerBase,\r\n MENU_STACK,\r\n MENU_TRIGGER,\r\n MenuStack,\r\n PARENT_OR_NEW_MENU_STACK_PROVIDER,\r\n} from '@angular/cdk/menu';\r\nimport {\r\n ConnectedPosition,\r\n FlexibleConnectedPositionStrategy,\r\n OverlayRef,\r\n} from '@angular/cdk/overlay';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { registerOverlayOwnership } from '@raqm/ui/overlay-internal';\r\n\r\n/** @internal Computed CSS direction, including plain ancestors without CDK Dir. */\r\n@Directive({\r\n providers: [{ provide: Directionality, useExisting: forwardRef(() => RaqmMenuDirection) }],\r\n})\r\nexport class RaqmMenuDirection extends Directionality {\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n private observer: MutationObserver | null = null;\r\n private disposed = false;\r\n\r\n override get value(): Direction {\r\n const view = this.element.ownerDocument.defaultView;\r\n return view\r\n ? view.getComputedStyle(this.element).direction === 'rtl'\r\n ? 'rtl'\r\n : 'ltr'\r\n : super.value;\r\n }\r\n\r\n constructor() {\r\n super();\r\n queueMicrotask(() => {\r\n if (this.disposed) return;\r\n const view = this.element.ownerDocument.defaultView;\r\n if (!view) return;\r\n const sync = (): void => {\r\n const next = this.value;\r\n if (next !== this.valueSignal()) {\r\n this.valueSignal.set(next);\r\n this.change.emit(next);\r\n }\r\n };\r\n this.observer = new view.MutationObserver(sync);\r\n for (let node: HTMLElement | null = this.element; node; node = node.parentElement) {\r\n this.observer.observe(node, {\r\n attributes: true,\r\n attributeFilter: ['dir', 'class', 'style'],\r\n });\r\n }\r\n sync();\r\n });\r\n }\r\n\r\n override ngOnDestroy(): void {\r\n this.disposed = true;\r\n this.observer?.disconnect();\r\n super.ngOnDestroy();\r\n }\r\n}\r\n\r\n/** @internal Bridge only the documented protected overlay extension point. */\r\n@Directive({\r\n providers: [\r\n { provide: CdkMenuTrigger, useExisting: forwardRef(() => RaqmMenuTriggerBase) },\r\n { provide: MENU_TRIGGER, useExisting: forwardRef(() => RaqmMenuTriggerBase) },\r\n PARENT_OR_NEW_MENU_STACK_PROVIDER,\r\n ],\r\n})\r\nexport class RaqmMenuTriggerBase extends CdkMenuTrigger {\r\n get menuOverlay(): OverlayRef | null {\r\n return this.overlayRef;\r\n }\r\n}\r\n\r\n@Directive({\r\n providers: [\r\n { provide: CdkContextMenuTrigger, useExisting: forwardRef(() => RaqmContextMenuTriggerBase) },\r\n { provide: MENU_TRIGGER, useExisting: forwardRef(() => RaqmContextMenuTriggerBase) },\r\n { provide: MENU_STACK, useClass: MenuStack },\r\n ],\r\n})\r\nexport class RaqmContextMenuTriggerBase extends CdkContextMenuTrigger {\r\n readonly geometryChanged = new Subject<void>();\r\n get menuOverlay(): OverlayRef | null {\r\n return this.overlayRef;\r\n }\r\n menuAnchorPoint: RaqmMenuAnchorPoint | null = null;\r\n override open(coordinates: { x: number; y: number }): void {\r\n this.menuAnchorPoint = coordinates;\r\n super.open(coordinates);\r\n this.geometryChanged.next();\r\n }\r\n override ngOnDestroy(): void {\r\n this.geometryChanged.complete();\r\n super.ngOnDestroy();\r\n }\r\n}\r\n\r\n/** @internal Pointer anchor coordinates used only by the shipped overlay bridge. */\r\nexport interface RaqmMenuAnchorPoint {\r\n readonly x: number;\r\n readonly y: number;\r\n}\r\n/** @internal Bridge options for shipped menu wrappers, not consumer configuration. */\r\nexport interface RaqmMenuOverlaySyncOptions {\r\n readonly matchAnchorWidth: boolean;\r\n readonly anchorPoint?: () => RaqmMenuAnchorPoint | null;\r\n /** Recompute family defaults only; preserve explicit consumer positions. */\r\n readonly positions?: () => ConnectedPosition[];\r\n}\r\n\r\n/** @internal Synchronizes the exact trigger overlay through public OverlayRef APIs. */\r\nexport class RaqmMenuOverlaySync {\r\n private generation = 0;\r\n private disposed = false;\r\n private frame = 0;\r\n private overlay: OverlayRef | null = null;\r\n private releaseOwnership: (() => void) | undefined;\r\n private resizeObserver: ResizeObserver | null = null;\r\n private connection: ConnectedPosition | undefined;\r\n private readonly subscriptions = new Subscription();\r\n private readonly schedule = (): void => {\r\n const view = this.anchor.ownerDocument.defaultView;\r\n if (!view || !this.overlay || this.frame || this.disposed) return;\r\n this.frame = view.requestAnimationFrame(() => {\r\n this.frame = 0;\r\n this.measure();\r\n });\r\n };\r\n\r\n constructor(\r\n private readonly trigger: CdkMenuTriggerBase & { readonly menuOverlay: OverlayRef | null },\r\n private readonly anchor: HTMLElement,\r\n destroyRef: DestroyRef,\r\n private readonly directionality: Directionality,\r\n private readonly options: RaqmMenuOverlaySyncOptions,\r\n ) {\r\n this.subscriptions.add(\r\n trigger.opened.subscribe(() => {\r\n const generation = ++this.generation;\r\n queueMicrotask(() => {\r\n if (this.disposed || generation !== this.generation || !trigger.isOpen()) return;\r\n this.detach();\r\n this.overlay = trigger.menuOverlay;\r\n if (!this.overlay) return;\r\n this.releaseOwnership = registerOverlayOwnership(this.anchor, this.overlay);\r\n this.observe();\r\n this.measure();\r\n });\r\n }),\r\n );\r\n this.subscriptions.add(\r\n trigger.closed.subscribe(() => {\r\n ++this.generation;\r\n this.detach();\r\n }),\r\n );\r\n this.subscriptions.add(directionality.change.subscribe(this.schedule));\r\n if (trigger instanceof RaqmContextMenuTriggerBase) {\r\n this.subscriptions.add(trigger.geometryChanged.subscribe(this.schedule));\r\n }\r\n destroyRef.onDestroy(() => {\r\n this.disposed = true;\r\n ++this.generation;\r\n this.detach();\r\n this.subscriptions.unsubscribe();\r\n });\r\n }\r\n\r\n refresh(): void {\r\n this.schedule();\r\n }\r\n\r\n private measure(): void {\r\n const overlay = this.overlay;\r\n if (this.disposed || !overlay?.hasAttached()) return;\r\n const strategy = overlay.getConfig().positionStrategy;\r\n if (!(strategy instanceof FlexibleConnectedPositionStrategy)) return;\r\n const pane = overlay.overlayElement;\r\n const height = this.anchor.ownerDocument.documentElement.clientHeight;\r\n overlay.setDirection(this.directionality.value);\r\n const positions = this.options.positions?.() ?? strategy.positions;\r\n strategy.withPositions(positions.map((position) => ({ ...position })));\r\n if (this.options.matchAnchorWidth) {\r\n pane.style.setProperty(\r\n '--raqm-menu-anchor-width',\r\n `${this.anchor.getBoundingClientRect().width}px`,\r\n );\r\n pane.setAttribute('data-raqm-anchor-width', '');\r\n }\r\n pane.style.setProperty('--raqm-menu-available-height', `${Math.max(0, height - 10)}px`);\r\n strategy\r\n .withViewportMargin(5)\r\n .withFlexibleDimensions(false)\r\n .withLockedPosition(false)\r\n .withPush(true);\r\n const selection = strategy.positionChanges.subscribe((event) => {\r\n this.connection = event.connectionPair;\r\n });\r\n overlay.updatePosition();\r\n selection.unsubscribe();\r\n if (!this.connection) return;\r\n const pair = this.connection;\r\n const point = this.options.anchorPoint?.();\r\n const rect = this.anchor.getBoundingClientRect();\r\n const origin = point\r\n ? point.y\r\n : pair.originY === 'top'\r\n ? rect.top\r\n : pair.originY === 'bottom'\r\n ? rect.bottom\r\n : rect.top + rect.height / 2;\r\n const edge = Math.max(5, Math.min(height - 5, origin + (pair.offsetY ?? 0)));\r\n const available =\r\n pair.overlayY === 'bottom'\r\n ? edge - 5\r\n : pair.overlayY === 'center'\r\n ? 2 * Math.min(edge - 5, height - 5 - edge)\r\n : height - 5 - edge;\r\n pane.style.setProperty(\r\n '--raqm-menu-available-height',\r\n `${Math.max(0, Math.min(height - 10, available))}px`,\r\n );\r\n strategy.reapplyLastPosition();\r\n }\r\n\r\n private observe(): void {\r\n const view = this.anchor.ownerDocument.defaultView;\r\n view?.addEventListener('resize', this.schedule, { passive: true });\r\n view?.document.addEventListener('scroll', this.schedule, { capture: true, passive: true });\r\n if (view && typeof view.ResizeObserver !== 'undefined' && this.overlay) {\r\n this.resizeObserver = new view.ResizeObserver(this.schedule);\r\n this.resizeObserver.observe(this.overlay.overlayElement);\r\n this.resizeObserver.observe(this.anchor);\r\n }\r\n }\r\n\r\n private detach(): void {\r\n this.releaseOwnership?.();\r\n this.releaseOwnership = undefined;\r\n const view = this.anchor.ownerDocument.defaultView;\r\n view?.removeEventListener('resize', this.schedule);\r\n view?.document.removeEventListener('scroll', this.schedule, { capture: true });\r\n if (this.frame) view?.cancelAnimationFrame(this.frame);\r\n this.frame = 0;\r\n this.resizeObserver?.disconnect();\r\n this.resizeObserver = null;\r\n this.overlay = null;\r\n this.connection = undefined;\r\n }\r\n}\r\n","import { Directive, booleanAttribute, input } from '@angular/core';\r\n\r\nimport { CdkMenu } from '@angular/cdk/menu';\r\nimport { RaqmMenuDirection } from './menu-overlay';\r\n\r\n@Directive({\r\n selector: '[raqm-menu]',\r\n // The CDK supplies role, focus, keyboard and typeahead; the wrapper adds the class.\r\n hostDirectives: [RaqmMenuDirection, { directive: CdkMenu }],\r\n // Detached from the trigger's DOM scope, the panel publishes its own live direction.\r\n host: {\r\n class: 'raqm-menu',\r\n },\r\n})\r\nexport class RaqmMenuDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-menu-group]',\r\n host: {\r\n class: 'raqm-menu-group',\r\n // A group inside a `role=\"menu\"` is a real ARIA group; the name is the app's.\r\n role: 'group',\r\n },\r\n})\r\nexport class RaqmMenuGroupDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-menu-label]',\r\n host: {\r\n class: 'raqm-menu-label',\r\n // Presence-only inset hook (the `data-raqm-inset` attribute exists or not).\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n },\r\n})\r\nexport class RaqmMenuLabelDirective {\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n}\r\n\r\n/**\r\n * Attribute directive marking a non-focusable decorative 1px rule between menu regions.\r\n *\r\n * @remarks\r\n * Carries `role=\"separator\"`/`aria-orientation` and is never a roving-tabindex item.\r\n */\r\n@Directive({\r\n selector: '[raqm-menu-separator]',\r\n host: {\r\n class: 'raqm-menu-separator',\r\n // A real (non-focusable) ARIA separator in the horizontal orientation.\r\n role: 'separator',\r\n 'aria-orientation': 'horizontal',\r\n },\r\n})\r\nexport class RaqmMenuSeparatorDirective {}\r\n\r\n/**\r\n * Attribute directive styling a passive keyboard-hint span inside a menu row.\r\n *\r\n * @remarks\r\n * Display-only: no accelerator registration, global key listener or command service.\r\n */\r\n@Directive({\r\n selector: '[raqm-menu-shortcut]',\r\n host: {\r\n class: 'raqm-menu-shortcut',\r\n },\r\n})\r\nexport class RaqmMenuShortcutDirective {}\r\n","import { DestroyRef, Directive, ElementRef, InjectionToken, OnInit, inject } from '@angular/core';\r\n\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { CDK_MENU } from '@angular/cdk/menu';\r\nimport { ConnectedPosition } from '@angular/cdk/overlay';\r\n\r\nimport { RaqmMenuDirection, RaqmMenuOverlaySync, RaqmMenuTriggerBase } from './menu-overlay';\r\n\r\nconst ROOT_MENU_SIDE_OFFSET = 4;\r\n\r\n// Opens below the trigger's inline start and flips above when there is no room. The\r\n// CDK resolves logical `start` against the nearest direction, so RTL needs no override;\r\n// `offsetY` is physical and its sign follows the flipped side.\r\nconst ROOT_MENU_POSITIONS: ConnectedPosition[] = [\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: ROOT_MENU_SIDE_OFFSET,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n offsetY: -ROOT_MENU_SIDE_OFFSET,\r\n },\r\n];\r\n\r\n// The submenu is nudged 3px up along its vertical alignment axis. The offset is\r\n// vertical, so its sign is direction-independent (unlike a horizontal align nudge).\r\nconst SUBMENU_ALIGN_OFFSET = -3;\r\n\r\n// Opens at the trigger's inline end, top-aligned with the 3px nudge, and flips to the\r\n// inline start when there is no room. Logical `end`/`start` resolve against the nearest\r\n// direction, so a submenu always opens away from the text direction.\r\nconst SUBMENU_POSITIONS: ConnectedPosition[] = [\r\n {\r\n originX: 'end',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: SUBMENU_ALIGN_OFFSET,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'end',\r\n overlayY: 'top',\r\n offsetY: SUBMENU_ALIGN_OFFSET,\r\n },\r\n];\r\n\r\nexport const RAQM_MENU_SUBMENU_POSITIONS = new InjectionToken<ConnectedPosition[]>(\r\n 'RAQM_MENU_SUBMENU_POSITIONS',\r\n);\r\n\r\n@Directive({\r\n selector: 'button[raqm-menu-trigger-for], a[raqm-menu-trigger-for]',\r\n // The CDK owns the trigger engine; the wrapper renames the surface and adds the class.\r\n hostDirectives: [\r\n RaqmMenuDirection,\r\n {\r\n directive: RaqmMenuTriggerBase,\r\n inputs: ['cdkMenuTriggerFor: raqm-menu-trigger-for', 'cdkMenuPosition: positions'],\r\n outputs: ['cdkMenuOpened: opened', 'cdkMenuClosed: closed'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menu-trigger',\r\n // Presence-only hook marking a trigger inside a menu panel; the chevron rules use it.\r\n '[attr.data-raqm-submenu]': 'submenu ? \"\" : null',\r\n },\r\n})\r\nexport class RaqmMenuTriggerDirective implements OnInit {\r\n private readonly trigger = inject(RaqmMenuTriggerBase);\r\n\r\n // Present only for a submenu trigger (a root trigger sits outside any panel).\r\n private readonly parentMenu = inject(CDK_MENU, { optional: true });\r\n\r\n readonly submenu = this.parentMenu !== null;\r\n\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n private readonly directionality = inject(Directionality);\r\n\r\n // A family-owned submenu default (e.g. Context Menu's +4) injected from an ancestor.\r\n private readonly submenuPositionsDefault =\r\n inject(RAQM_MENU_SUBMENU_POSITIONS, { optional: true }) ?? SUBMENU_POSITIONS;\r\n\r\n // Only a root Dropdown panel matches the trigger width; submenus keep `w-auto`.\r\n private readonly overlaySync = new RaqmMenuOverlaySync(\r\n this.trigger,\r\n this.element.nativeElement,\r\n inject(DestroyRef),\r\n this.directionality,\r\n { matchAnchorWidth: !this.submenu },\r\n );\r\n\r\n /**\r\n * Installs the default placement when the application did not supply `positions`.\r\n *\r\n * @remarks\r\n * Runs in `ngOnInit` so host-directive inputs are already applied; a non-null\r\n * `menuPosition` is left untouched, so an application's list always wins.\r\n */\r\n ngOnInit(): void {\r\n if (this.trigger.menuPosition == null) {\r\n this.trigger.menuPosition = this.submenu ? this.submenuPositionsDefault : ROOT_MENU_POSITIONS;\r\n }\r\n }\r\n}\r\n","import {\r\n Directive,\r\n DestroyRef,\r\n ElementRef,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\n\r\nimport { CdkMenuItem } from '@angular/cdk/menu';\r\n\r\n// Legacy Space key code: the CDK's own item engine switches on `keyCode` too.\r\nconst SPACE_KEY_CODE = 32;\r\n\r\n@Directive({\r\n selector: 'button[raqm-menu-item], a[raqm-menu-item]',\r\n hostDirectives: [\r\n {\r\n directive: CdkMenuItem,\r\n inputs: ['cdkMenuItemDisabled: disabled'],\r\n outputs: ['cdkMenuItemTriggered: triggered'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menu-item',\r\n // Exposes the active row appearance to the shipped styles, with no DOM mutation.\r\n '[attr.data-raqm-variant]': 'activeAppearance()',\r\n // Presence-only inset hook (the `data-raqm-inset` attribute exists or not).\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n // Focus-follows-pointer on a real pointer entry (see `onPointerEnter`).\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n },\r\n})\r\nexport class RaqmMenuItemDirective {\r\n // Used only to install the anchor-only capture-phase guards.\r\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\r\n\r\n // Scoped teardown, so a destroyed row never leaks listeners on a recycled node.\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n // Moves real DOM focus on pointer entry (the shipped `:focus` rule paints it).\r\n private readonly item = inject(CdkMenuItem);\r\n\r\n // Bare/absent is `default`; `destructive` is the only other treatment.\r\n readonly appearance = input<'default' | 'destructive' | ''>('', { alias: 'raqm-menu-item' });\r\n\r\n // The value marker or the default row treatment.\r\n protected readonly activeAppearance = computed(() => this.appearance() || 'default');\r\n\r\n // Indents the row to line up with indicator-bearing rows.\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n\r\n // Capture-phase guard for a disabled anchor: `preventDefault` blocks the native and\r\n // router destination, `stopImmediatePropagation` later same-element listeners.\r\n private readonly guardDisabledAnchor = (event: Event): void => {\r\n if (!this.item.disabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n };\r\n\r\n // Capture-phase Space activation for an anchor row: Space is not native anchor\r\n // activation, so stop the CDK keydown path and page default, then dispatch exactly one\r\n // `click()`; Enter stays native and a repeat never re-activates.\r\n private readonly activateAnchorWithSpace = (event: KeyboardEvent): void => {\r\n if (\r\n event.keyCode !== SPACE_KEY_CODE ||\r\n event.altKey ||\r\n event.ctrlKey ||\r\n event.metaKey ||\r\n event.shiftKey\r\n ) {\r\n return;\r\n }\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n if (event.repeat || this.item.disabled) {\r\n return;\r\n }\r\n this.elementRef.nativeElement.click();\r\n };\r\n\r\n // Anchors only: the CDK covers `<button>` hosts; capture phase runs before the CDK's,\r\n // the router's and the app's same-element listeners.\r\n constructor() {\r\n const element = this.elementRef.nativeElement;\r\n if (element.nodeName !== 'A') {\r\n return;\r\n }\r\n element.addEventListener('click', this.guardDisabledAnchor, true);\r\n element.addEventListener('auxclick', this.guardDisabledAnchor, true);\r\n element.addEventListener('keydown', this.activateAnchorWithSpace, true);\r\n this.destroyRef.onDestroy(() => {\r\n element.removeEventListener('click', this.guardDisabledAnchor, true);\r\n element.removeEventListener('auxclick', this.guardDisabledAnchor, true);\r\n element.removeEventListener('keydown', this.activateAnchorWithSpace, true);\r\n });\r\n }\r\n\r\n // Hover highlight: an enabled, non-touch pointer entry goes through the public\r\n // `CdkMenuItem.focus()`, reusing the single `:focus` rule instead of adding a second\r\n // paint. It never activates the row.\r\n protected onPointerEnter(event: Event): void {\r\n if (!(event instanceof PointerEvent) || event.pointerType === 'touch' || this.item.disabled) {\r\n return;\r\n }\r\n this.item.focus();\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n OnDestroy,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n} from '@angular/core';\r\n\r\nimport { CdkMenuItem, CdkMenuItemCheckbox, CdkMenuItemSelectable } from '@angular/cdk/menu';\r\n\r\n@Directive({\r\n providers: [\r\n // The same alias chain the CDK declares on its own subclasses, retargeted here.\r\n { provide: CdkMenuItemSelectable, useExisting: RaqmMenuCheckboxItemBase },\r\n { provide: CdkMenuItem, useExisting: RaqmMenuCheckboxItemBase },\r\n ],\r\n})\r\nexport class RaqmMenuCheckboxItemBase extends CdkMenuItemCheckbox {\r\n // Caller-supplied options are preserved; the CDK still emits and toggles.\r\n override trigger(options?: { keepOpen: boolean }): void {\r\n super.trigger({ ...options, keepOpen: true });\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: 'button[raqm-menu-checkbox-item]',\r\n // The CDK owns the checkbox engine; the internal base adds keep-open.\r\n hostDirectives: [\r\n {\r\n directive: RaqmMenuCheckboxItemBase,\r\n inputs: ['cdkMenuItemDisabled: disabled'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menu-checkbox-item',\r\n // Presence-only inset hook (the `data-raqm-inset` attribute exists or not).\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n // Focus-follows-pointer, identical to `RaqmMenuItemDirective`.\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n },\r\n})\r\nexport class RaqmMenuCheckboxItemDirective implements OnDestroy {\r\n // Reads the event-time checked value when `triggered` fires.\r\n private readonly checkbox = inject(RaqmMenuCheckboxItemBase);\r\n\r\n // Receives the committed state directly, so the model write paints before the CDK's\r\n // own binding re-runs.\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n /** Indents the row to line up with indicator-bearing rows. */\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * The public two-way checked model.\r\n *\r\n * @remarks\r\n * Bound-only: the CDK's `checked` attribute transform is not exposed. The model is the\r\n * single state channel.\r\n */\r\n readonly checked = model(false);\r\n\r\n // Typed structurally (no rxjs import), matching the Select component's pattern.\r\n private readonly triggerSubscription: { unsubscribe(): void };\r\n\r\n constructor() {\r\n // Push application writes into the CDK row and paint `aria-checked` in the same pass;\r\n // the CDK's plain-field `checked` would otherwise leave the attribute one pass stale.\r\n effect(() => {\r\n const checked = this.checked();\r\n this.checkbox.checked = checked;\r\n this.element.nativeElement.setAttribute('aria-checked', String(checked));\r\n });\r\n\r\n // Negating the event-time `checked` keeps the write aligned with the CDK's own toggle.\r\n this.triggerSubscription = this.checkbox.triggered.subscribe(() => {\r\n this.checked.set(!this.checkbox.checked);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.triggerSubscription.unsubscribe();\r\n }\r\n\r\n // An enabled, non-touch entry focuses the row through `CdkMenuItem.focus()`, which\r\n // never toggles.\r\n protected onPointerEnter(event: Event): void {\r\n if (\r\n !(event instanceof PointerEvent) ||\r\n event.pointerType === 'touch' ||\r\n this.checkbox.disabled\r\n ) {\r\n return;\r\n }\r\n this.checkbox.focus();\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface RaqmMenuRadioGroupContext {\r\n isSelected(value: string): boolean;\r\n /** Commits one user selection using the group's two-way model. */\r\n select(value: string): void;\r\n /** Registers an item value and rejects duplicate claims in development. */\r\n register(value: string): void;\r\n /** Releases a previously registered item value. */\r\n unregister(value: string): void;\r\n}\r\n\r\nexport const RAQM_MENU_RADIO_GROUP = new InjectionToken<RaqmMenuRadioGroupContext>(\r\n 'raqm-menu-radio-group',\r\n);\r\n","import {\r\n Directive,\r\n OnDestroy,\r\n OnChanges,\r\n OnInit,\r\n SimpleChanges,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n isDevMode,\r\n model,\r\n} from '@angular/core';\r\n\r\nimport {\r\n CdkMenuGroup,\r\n CdkMenuItem,\r\n CdkMenuItemRadio,\r\n CdkMenuItemSelectable,\r\n} from '@angular/cdk/menu';\r\n\r\nimport { RAQM_MENU_RADIO_GROUP, RaqmMenuRadioGroupContext } from './dropdown-menu-radio-context';\r\n\r\n@Directive({\r\n providers: [\r\n { provide: CdkMenuItemSelectable, useExisting: RaqmMenuRadioItemBase },\r\n { provide: CdkMenuItem, useExisting: RaqmMenuRadioItemBase },\r\n ],\r\n})\r\nexport class RaqmMenuRadioItemBase extends CdkMenuItemRadio {\r\n /** Keeps the menu open while retaining the CDK's standard activation path. */\r\n override trigger(options?: { keepOpen: boolean }): void {\r\n super.trigger({ ...options, keepOpen: true });\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: '[raqm-menu-radio-group]',\r\n hostDirectives: [{ directive: CdkMenuGroup }],\r\n providers: [{ provide: RAQM_MENU_RADIO_GROUP, useExisting: RaqmMenuRadioGroupDirective }],\r\n})\r\nexport class RaqmMenuRadioGroupDirective implements RaqmMenuRadioGroupContext {\r\n /** Selected item value, or null when the group has no current selection. */\r\n readonly value = model<string | null>(null);\r\n\r\n /** Tracks live item claims so duplicate values are rejected within this group. */\r\n private readonly registrations = new Map<string, number>();\r\n\r\n /** Checks the model without normalizing unknown externally supplied values. */\r\n isSelected(value: string): boolean {\r\n return this.value() === value;\r\n }\r\n\r\n /** Commits a user selection; model signals suppress unchanged-value emissions. */\r\n select(value: string): void {\r\n this.value.set(value);\r\n }\r\n\r\n /** Adds a value claim and reports duplicate/nonempty violations clearly in development. */\r\n register(value: string): void {\r\n if (!value && isDevMode()) {\r\n throw new Error('Raqm menu radio item: a non-empty `value` is required.');\r\n }\r\n const count = this.registrations.get(value) ?? 0;\r\n if (count > 0 && isDevMode()) {\r\n throw new Error(\r\n `Raqm menu radio group: duplicate radio item value \"${value}\". ` +\r\n 'Each radio item inside one group needs a unique non-empty value.',\r\n );\r\n }\r\n this.registrations.set(value, count + 1);\r\n }\r\n\r\n /** Removes a value claim and permits later reuse when the last item is destroyed. */\r\n unregister(value: string): void {\r\n const count = this.registrations.get(value) ?? 0;\r\n if (count <= 1) {\r\n this.registrations.delete(value);\r\n } else {\r\n this.registrations.set(value, count - 1);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Menu radio item deriving its checked state from the enclosing group's value.\r\n * CDK owns ARIA, keyboard navigation, dispatch and disabled activation behavior.\r\n */\r\n@Directive({\r\n selector: 'button[raqm-menu-radio-item]',\r\n hostDirectives: [\r\n {\r\n directive: RaqmMenuRadioItemBase,\r\n inputs: ['cdkMenuItemDisabled: disabled'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menu-radio-item',\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n },\r\n})\r\nexport class RaqmMenuRadioItemDirective implements OnInit, OnChanges, OnDestroy {\r\n private readonly radio = inject(RaqmMenuRadioItemBase);\r\n\r\n private readonly group: RaqmMenuRadioGroupContext;\r\n\r\n readonly value = input.required<string>();\r\n\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n\r\n /** CDK triggered subscription, used to make exactly one model commit per activation. */\r\n private readonly triggerSubscription: { unsubscribe(): void };\r\n\r\n /** Registered value retained so input changes and teardown release the correct claim. */\r\n private registeredValue: string | null = null;\r\n\r\n constructor() {\r\n const group = inject(RAQM_MENU_RADIO_GROUP, { optional: true });\r\n if (!group) {\r\n throw new Error('Raqm menu radio item: an enclosing [raqm-menu-radio-group] is required.');\r\n }\r\n this.group = group;\r\n\r\n effect(() => {\r\n this.radio.checked = this.group.isSelected(this.value());\r\n });\r\n\r\n this.triggerSubscription = this.radio.triggered.subscribe(() => {\r\n if (!this.radio.disabled) {\r\n this.group.select(this.value());\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.updateRegistration(this.value());\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['value'] && this.registeredValue !== null) {\r\n this.updateRegistration(this.value());\r\n }\r\n }\r\n\r\n /** Swaps the registered claim only after the proposed value passes group validation. */\r\n private updateRegistration(value: string): void {\r\n if (value === this.registeredValue) {\r\n return;\r\n }\r\n this.group.register(value);\r\n const previousValue = this.registeredValue;\r\n this.registeredValue = value;\r\n if (previousValue !== null) {\r\n this.group.unregister(previousValue);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.registeredValue !== null) {\r\n this.group.unregister(this.registeredValue);\r\n }\r\n this.triggerSubscription.unsubscribe();\r\n }\r\n\r\n protected onPointerEnter(event: Event): void {\r\n if (!(event instanceof PointerEvent) || event.pointerType === 'touch' || this.radio.disabled) {\r\n return;\r\n }\r\n this.radio.focus();\r\n }\r\n}\r\n","import {\r\n RaqmMenuDirective,\r\n RaqmMenuGroupDirective,\r\n RaqmMenuLabelDirective,\r\n RaqmMenuSeparatorDirective,\r\n RaqmMenuShortcutDirective,\r\n} from './dropdown-menu.directive';\r\nimport {\r\n RaqmMenuTriggerDirective,\r\n RAQM_MENU_SUBMENU_POSITIONS,\r\n} from './dropdown-menu-trigger.directive';\r\nimport {\r\n RaqmMenuOverlaySync,\r\n RaqmMenuDirection,\r\n RaqmMenuTriggerBase,\r\n RaqmContextMenuTriggerBase,\r\n} from './menu-overlay';\r\nimport type { RaqmMenuAnchorPoint, RaqmMenuOverlaySyncOptions } from './menu-overlay';\r\nimport { RaqmMenuItemDirective } from './dropdown-menu-item.directive';\r\nimport {\r\n RaqmMenuCheckboxItemBase,\r\n RaqmMenuCheckboxItemDirective,\r\n} from './dropdown-menu-checkbox-item.directive';\r\nimport {\r\n RaqmMenuRadioGroupDirective,\r\n RaqmMenuRadioItemBase,\r\n RaqmMenuRadioItemDirective,\r\n} from './dropdown-menu-radio.directive';\r\n\r\nexport {\r\n RaqmMenuDirective,\r\n RaqmMenuGroupDirective,\r\n RaqmMenuLabelDirective,\r\n RaqmMenuSeparatorDirective,\r\n RaqmMenuShortcutDirective,\r\n};\r\nexport { RaqmMenuTriggerDirective, RAQM_MENU_SUBMENU_POSITIONS };\r\n// INTERNAL — shared across entrypoints; not supported application-facing API.\r\n// NG3001 also requires exported host-directive bases/direction to be visible here.\r\nexport { RaqmMenuOverlaySync, RaqmMenuDirection, RaqmMenuTriggerBase, RaqmContextMenuTriggerBase };\r\nexport type { RaqmMenuAnchorPoint, RaqmMenuOverlaySyncOptions };\r\nexport { RaqmMenuItemDirective };\r\nexport { RaqmMenuCheckboxItemDirective };\r\nexport { RaqmMenuRadioGroupDirective, RaqmMenuRadioItemDirective };\r\n// INTERNAL — do not remove and do not treat as supported API. NG3001 requires classes\r\n// named in exported `hostDirectives` to be exported, so both keep-open bases ship here.\r\nexport { RaqmMenuCheckboxItemBase };\r\nexport { RaqmMenuRadioItemBase };\r\n\r\nexport const RaqmDropdownMenu = [\r\n RaqmMenuDirective,\r\n RaqmMenuTriggerDirective,\r\n RaqmMenuItemDirective,\r\n RaqmMenuCheckboxItemDirective,\r\n RaqmMenuRadioGroupDirective,\r\n RaqmMenuRadioItemDirective,\r\n RaqmMenuGroupDirective,\r\n RaqmMenuLabelDirective,\r\n RaqmMenuSeparatorDirective,\r\n RaqmMenuShortcutDirective,\r\n] as const;\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raqm-ui-dropdown-menu.mjs","names":["i1.RaqmMenuDirection","i1.RaqmMenuDirection","i1.RaqmMenuTriggerBase","i1","i1"],"sources":["../../../projects/ui/dropdown-menu/menu-overlay.ts","../../../projects/ui/dropdown-menu/dropdown-menu.directive.ts","../../../projects/ui/dropdown-menu/dropdown-menu-trigger.directive.ts","../../../projects/ui/dropdown-menu/dropdown-menu-item.directive.ts","../../../projects/ui/dropdown-menu/dropdown-menu-checkbox-item.directive.ts","../../../projects/ui/dropdown-menu/dropdown-menu-radio-context.ts","../../../projects/ui/dropdown-menu/dropdown-menu-radio.directive.ts","../../../projects/ui/dropdown-menu/public-api.ts"],"sourcesContent":["import { DestroyRef, Directive, ElementRef, forwardRef, inject } from '@angular/core';\r\nimport { Direction, Directionality } from '@angular/cdk/bidi';\r\nimport {\r\n CdkContextMenuTrigger,\r\n CdkMenuTrigger,\r\n CdkMenuTriggerBase,\r\n MENU_STACK,\r\n MENU_TRIGGER,\r\n MenuStack,\r\n PARENT_OR_NEW_MENU_STACK_PROVIDER,\r\n} from '@angular/cdk/menu';\r\nimport {\r\n ConnectedPosition,\r\n FlexibleConnectedPositionStrategy,\r\n OverlayRef,\r\n} from '@angular/cdk/overlay';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport { registerOverlayOwnership } from '@raqm/ui/overlay-internal';\r\n\r\n/** @internal Computed CSS direction, including plain ancestors without CDK Dir. */\r\n@Directive({\r\n providers: [{ provide: Directionality, useExisting: forwardRef(() => RaqmMenuDirection) }],\r\n})\r\nexport class RaqmMenuDirection extends Directionality {\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n private observer: MutationObserver | null = null;\r\n private disposed = false;\r\n\r\n override get value(): Direction {\r\n const view = this.element.ownerDocument.defaultView;\r\n return view\r\n ? view.getComputedStyle(this.element).direction === 'rtl'\r\n ? 'rtl'\r\n : 'ltr'\r\n : super.value;\r\n }\r\n\r\n constructor() {\r\n super();\r\n queueMicrotask(() => {\r\n if (this.disposed) return;\r\n const view = this.element.ownerDocument.defaultView;\r\n if (!view) return;\r\n const sync = (): void => {\r\n const next = this.value;\r\n if (next !== this.valueSignal()) {\r\n this.valueSignal.set(next);\r\n this.change.emit(next);\r\n }\r\n };\r\n this.observer = new view.MutationObserver(sync);\r\n for (let node: HTMLElement | null = this.element; node; node = node.parentElement) {\r\n this.observer.observe(node, {\r\n attributes: true,\r\n attributeFilter: ['dir', 'class', 'style'],\r\n });\r\n }\r\n sync();\r\n });\r\n }\r\n\r\n override ngOnDestroy(): void {\r\n this.disposed = true;\r\n this.observer?.disconnect();\r\n super.ngOnDestroy();\r\n }\r\n}\r\n\r\n/** @internal Bridge only the documented protected overlay extension point. */\r\n@Directive({\r\n providers: [\r\n { provide: CdkMenuTrigger, useExisting: forwardRef(() => RaqmMenuTriggerBase) },\r\n { provide: MENU_TRIGGER, useExisting: forwardRef(() => RaqmMenuTriggerBase) },\r\n PARENT_OR_NEW_MENU_STACK_PROVIDER,\r\n ],\r\n})\r\nexport class RaqmMenuTriggerBase extends CdkMenuTrigger {\r\n get menuOverlay(): OverlayRef | null {\r\n return this.overlayRef;\r\n }\r\n}\r\n\r\n@Directive({\r\n providers: [\r\n { provide: CdkContextMenuTrigger, useExisting: forwardRef(() => RaqmContextMenuTriggerBase) },\r\n { provide: MENU_TRIGGER, useExisting: forwardRef(() => RaqmContextMenuTriggerBase) },\r\n { provide: MENU_STACK, useClass: MenuStack },\r\n ],\r\n})\r\nexport class RaqmContextMenuTriggerBase extends CdkContextMenuTrigger {\r\n readonly geometryChanged = new Subject<void>();\r\n get menuOverlay(): OverlayRef | null {\r\n return this.overlayRef;\r\n }\r\n menuAnchorPoint: RaqmMenuAnchorPoint | null = null;\r\n override open(coordinates: { x: number; y: number }): void {\r\n this.menuAnchorPoint = coordinates;\r\n super.open(coordinates);\r\n this.geometryChanged.next();\r\n }\r\n override ngOnDestroy(): void {\r\n this.geometryChanged.complete();\r\n super.ngOnDestroy();\r\n }\r\n}\r\n\r\n/** @internal Pointer anchor coordinates used only by the shipped overlay bridge. */\r\nexport interface RaqmMenuAnchorPoint {\r\n readonly x: number;\r\n readonly y: number;\r\n}\r\n/** @internal Bridge options for shipped menu wrappers, not consumer configuration. */\r\nexport interface RaqmMenuOverlaySyncOptions {\r\n readonly matchAnchorWidth: boolean;\r\n readonly anchorPoint?: () => RaqmMenuAnchorPoint | null;\r\n /** Recompute family defaults only; preserve explicit consumer positions. */\r\n readonly positions?: () => ConnectedPosition[];\r\n}\r\n\r\n/** @internal Synchronizes the exact trigger overlay through public OverlayRef APIs. */\r\nexport class RaqmMenuOverlaySync {\r\n private generation = 0;\r\n private disposed = false;\r\n private frame = 0;\r\n private overlay: OverlayRef | null = null;\r\n private releaseOwnership: (() => void) | undefined;\r\n private resizeObserver: ResizeObserver | null = null;\r\n private connection: ConnectedPosition | undefined;\r\n private readonly subscriptions = new Subscription();\r\n private readonly schedule = (): void => {\r\n const view = this.anchor.ownerDocument.defaultView;\r\n if (!view || !this.overlay || this.frame || this.disposed) return;\r\n this.frame = view.requestAnimationFrame(() => {\r\n this.frame = 0;\r\n this.measure();\r\n });\r\n };\r\n\r\n constructor(\r\n private readonly trigger: CdkMenuTriggerBase & { readonly menuOverlay: OverlayRef | null },\r\n private readonly anchor: HTMLElement,\r\n destroyRef: DestroyRef,\r\n private readonly directionality: Directionality,\r\n private readonly options: RaqmMenuOverlaySyncOptions,\r\n ) {\r\n this.subscriptions.add(\r\n trigger.opened.subscribe(() => {\r\n const generation = ++this.generation;\r\n queueMicrotask(() => {\r\n if (this.disposed || generation !== this.generation || !trigger.isOpen()) return;\r\n this.detach();\r\n this.overlay = trigger.menuOverlay;\r\n if (!this.overlay) return;\r\n this.releaseOwnership = registerOverlayOwnership(this.anchor, this.overlay);\r\n this.observe();\r\n this.measure();\r\n });\r\n }),\r\n );\r\n this.subscriptions.add(\r\n trigger.closed.subscribe(() => {\r\n ++this.generation;\r\n this.detach();\r\n }),\r\n );\r\n this.subscriptions.add(directionality.change.subscribe(this.schedule));\r\n if (trigger instanceof RaqmContextMenuTriggerBase) {\r\n this.subscriptions.add(trigger.geometryChanged.subscribe(this.schedule));\r\n }\r\n destroyRef.onDestroy(() => {\r\n this.disposed = true;\r\n ++this.generation;\r\n this.detach();\r\n this.subscriptions.unsubscribe();\r\n });\r\n }\r\n\r\n refresh(): void {\r\n this.schedule();\r\n }\r\n\r\n private measure(): void {\r\n const overlay = this.overlay;\r\n if (this.disposed || !overlay?.hasAttached()) return;\r\n const strategy = overlay.getConfig().positionStrategy;\r\n if (!(strategy instanceof FlexibleConnectedPositionStrategy)) return;\r\n const pane = overlay.overlayElement;\r\n const height = this.anchor.ownerDocument.documentElement.clientHeight;\r\n overlay.setDirection(this.directionality.value);\r\n const positions = this.options.positions?.() ?? strategy.positions;\r\n strategy.withPositions(positions.map((position) => ({ ...position })));\r\n if (this.options.matchAnchorWidth) {\r\n pane.style.setProperty(\r\n '--raqm-menu-anchor-width',\r\n `${this.anchor.getBoundingClientRect().width}px`,\r\n );\r\n pane.setAttribute('data-raqm-anchor-width', '');\r\n }\r\n pane.style.setProperty('--raqm-menu-available-height', `${Math.max(0, height - 10)}px`);\r\n strategy\r\n .withViewportMargin(5)\r\n .withFlexibleDimensions(false)\r\n .withLockedPosition(false)\r\n .withPush(true);\r\n const selection = strategy.positionChanges.subscribe((event) => {\r\n this.connection = event.connectionPair;\r\n });\r\n overlay.updatePosition();\r\n selection.unsubscribe();\r\n if (!this.connection) return;\r\n const pair = this.connection;\r\n const point = this.options.anchorPoint?.();\r\n const rect = this.anchor.getBoundingClientRect();\r\n const origin = point\r\n ? point.y\r\n : pair.originY === 'top'\r\n ? rect.top\r\n : pair.originY === 'bottom'\r\n ? rect.bottom\r\n : rect.top + rect.height / 2;\r\n const edge = Math.max(5, Math.min(height - 5, origin + (pair.offsetY ?? 0)));\r\n const available =\r\n pair.overlayY === 'bottom'\r\n ? edge - 5\r\n : pair.overlayY === 'center'\r\n ? 2 * Math.min(edge - 5, height - 5 - edge)\r\n : height - 5 - edge;\r\n pane.style.setProperty(\r\n '--raqm-menu-available-height',\r\n `${Math.max(0, Math.min(height - 10, available))}px`,\r\n );\r\n strategy.reapplyLastPosition();\r\n }\r\n\r\n private observe(): void {\r\n const view = this.anchor.ownerDocument.defaultView;\r\n view?.addEventListener('resize', this.schedule, { passive: true });\r\n view?.document.addEventListener('scroll', this.schedule, { capture: true, passive: true });\r\n if (view && typeof view.ResizeObserver !== 'undefined' && this.overlay) {\r\n this.resizeObserver = new view.ResizeObserver(this.schedule);\r\n this.resizeObserver.observe(this.overlay.overlayElement);\r\n this.resizeObserver.observe(this.anchor);\r\n }\r\n }\r\n\r\n private detach(): void {\r\n this.releaseOwnership?.();\r\n this.releaseOwnership = undefined;\r\n const view = this.anchor.ownerDocument.defaultView;\r\n view?.removeEventListener('resize', this.schedule);\r\n view?.document.removeEventListener('scroll', this.schedule, { capture: true });\r\n if (this.frame) view?.cancelAnimationFrame(this.frame);\r\n this.frame = 0;\r\n this.resizeObserver?.disconnect();\r\n this.resizeObserver = null;\r\n this.overlay = null;\r\n this.connection = undefined;\r\n }\r\n}\r\n","import { Directive, booleanAttribute, input } from '@angular/core';\r\n\r\nimport { CdkMenu } from '@angular/cdk/menu';\r\nimport { RaqmMenuDirection } from './menu-overlay';\r\n\r\n@Directive({\r\n selector: '[raqm-menu]',\r\n // The CDK supplies role, focus, keyboard and typeahead; the wrapper adds the class.\r\n hostDirectives: [RaqmMenuDirection, { directive: CdkMenu }],\r\n // Detached from the trigger's DOM scope, the panel publishes its own live direction.\r\n host: {\r\n class: 'raqm-menu',\r\n },\r\n})\r\nexport class RaqmMenuDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-menu-group]',\r\n host: {\r\n class: 'raqm-menu-group',\r\n // A group inside a `role=\"menu\"` is a real ARIA group; the name is the app's.\r\n role: 'group',\r\n },\r\n})\r\nexport class RaqmMenuGroupDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-menu-label]',\r\n host: {\r\n class: 'raqm-menu-label',\r\n // Presence-only inset hook (the `data-raqm-inset` attribute exists or not).\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n },\r\n})\r\nexport class RaqmMenuLabelDirective {\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n}\r\n\r\n/**\r\n * Attribute directive marking a non-focusable decorative 1px rule between menu regions.\r\n *\r\n * @remarks\r\n * Carries `role=\"separator\"`/`aria-orientation` and is never a roving-tabindex item.\r\n */\r\n@Directive({\r\n selector: '[raqm-menu-separator]',\r\n host: {\r\n class: 'raqm-menu-separator',\r\n // A real (non-focusable) ARIA separator in the horizontal orientation.\r\n role: 'separator',\r\n 'aria-orientation': 'horizontal',\r\n },\r\n})\r\nexport class RaqmMenuSeparatorDirective {}\r\n\r\n/**\r\n * Attribute directive styling a passive keyboard-hint span inside a menu row.\r\n *\r\n * @remarks\r\n * Display-only: no accelerator registration, global key listener or command service.\r\n */\r\n@Directive({\r\n selector: '[raqm-menu-shortcut]',\r\n host: {\r\n class: 'raqm-menu-shortcut',\r\n },\r\n})\r\nexport class RaqmMenuShortcutDirective {}\r\n","import { DestroyRef, Directive, ElementRef, InjectionToken, OnInit, inject } from '@angular/core';\r\n\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { CDK_MENU } from '@angular/cdk/menu';\r\nimport { ConnectedPosition } from '@angular/cdk/overlay';\r\n\r\nimport { RaqmMenuDirection, RaqmMenuOverlaySync, RaqmMenuTriggerBase } from './menu-overlay';\r\n\r\nconst ROOT_MENU_SIDE_OFFSET = 4;\r\n\r\n// Opens below the trigger's inline start and flips above when there is no room. The\r\n// CDK resolves logical `start` against the nearest direction, so RTL needs no override;\r\n// `offsetY` is physical and its sign follows the flipped side.\r\nconst ROOT_MENU_POSITIONS: ConnectedPosition[] = [\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: ROOT_MENU_SIDE_OFFSET,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n offsetY: -ROOT_MENU_SIDE_OFFSET,\r\n },\r\n];\r\n\r\n// The submenu is nudged 3px up along its vertical alignment axis. The offset is\r\n// vertical, so its sign is direction-independent (unlike a horizontal align nudge).\r\nconst SUBMENU_ALIGN_OFFSET = -3;\r\n\r\n// Opens at the trigger's inline end, top-aligned with the 3px nudge, and flips to the\r\n// inline start when there is no room. Logical `end`/`start` resolve against the nearest\r\n// direction, so a submenu always opens away from the text direction.\r\nconst SUBMENU_POSITIONS: ConnectedPosition[] = [\r\n {\r\n originX: 'end',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: SUBMENU_ALIGN_OFFSET,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'end',\r\n overlayY: 'top',\r\n offsetY: SUBMENU_ALIGN_OFFSET,\r\n },\r\n];\r\n\r\nexport const RAQM_MENU_SUBMENU_POSITIONS = new InjectionToken<ConnectedPosition[]>(\r\n 'RAQM_MENU_SUBMENU_POSITIONS',\r\n);\r\n\r\n@Directive({\r\n selector: 'button[raqm-menu-trigger-for], a[raqm-menu-trigger-for]',\r\n // The CDK owns the trigger engine; the wrapper renames the surface and adds the class.\r\n hostDirectives: [\r\n RaqmMenuDirection,\r\n {\r\n directive: RaqmMenuTriggerBase,\r\n inputs: ['cdkMenuTriggerFor: raqm-menu-trigger-for', 'cdkMenuPosition: positions'],\r\n outputs: ['cdkMenuOpened: opened', 'cdkMenuClosed: closed'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menu-trigger',\r\n // Presence-only hook marking a trigger inside a menu panel; the chevron rules use it.\r\n '[attr.data-raqm-submenu]': 'submenu ? \"\" : null',\r\n },\r\n})\r\nexport class RaqmMenuTriggerDirective implements OnInit {\r\n private readonly trigger = inject(RaqmMenuTriggerBase);\r\n\r\n // Present only for a submenu trigger (a root trigger sits outside any panel).\r\n private readonly parentMenu = inject(CDK_MENU, { optional: true });\r\n\r\n readonly submenu = this.parentMenu !== null;\r\n\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n private readonly directionality = inject(Directionality);\r\n\r\n // A family-owned submenu default (e.g. Context Menu's +4) injected from an ancestor.\r\n private readonly submenuPositionsDefault =\r\n inject(RAQM_MENU_SUBMENU_POSITIONS, { optional: true }) ?? SUBMENU_POSITIONS;\r\n\r\n // Only a root Dropdown panel matches the trigger width; submenus keep `w-auto`.\r\n private readonly overlaySync = new RaqmMenuOverlaySync(\r\n this.trigger,\r\n this.element.nativeElement,\r\n inject(DestroyRef),\r\n this.directionality,\r\n { matchAnchorWidth: !this.submenu },\r\n );\r\n\r\n /**\r\n * Installs the default placement when the application did not supply `positions`.\r\n *\r\n * @remarks\r\n * Runs in `ngOnInit` so host-directive inputs are already applied; a non-null\r\n * `menuPosition` is left untouched, so an application's list always wins.\r\n */\r\n ngOnInit(): void {\r\n if (this.trigger.menuPosition == null) {\r\n this.trigger.menuPosition = this.submenu ? this.submenuPositionsDefault : ROOT_MENU_POSITIONS;\r\n }\r\n }\r\n}\r\n","import {\r\n Directive,\r\n DestroyRef,\r\n ElementRef,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\n\r\nimport { CdkMenuItem } from '@angular/cdk/menu';\r\n\r\n// Legacy Space key code: the CDK's own item engine switches on `keyCode` too.\r\nconst SPACE_KEY_CODE = 32;\r\n\r\n@Directive({\r\n selector: 'button[raqm-menu-item], a[raqm-menu-item]',\r\n hostDirectives: [\r\n {\r\n directive: CdkMenuItem,\r\n inputs: ['cdkMenuItemDisabled: disabled'],\r\n outputs: ['cdkMenuItemTriggered: triggered'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menu-item',\r\n // Exposes the active row appearance to the shipped styles, with no DOM mutation.\r\n '[attr.data-raqm-variant]': 'activeAppearance()',\r\n // Presence-only inset hook (the `data-raqm-inset` attribute exists or not).\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n // Focus-follows-pointer on a real pointer entry (see `onPointerEnter`).\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n },\r\n})\r\nexport class RaqmMenuItemDirective {\r\n // Used only to install the anchor-only capture-phase guards.\r\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\r\n\r\n // Scoped teardown, so a destroyed row never leaks listeners on a recycled node.\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n // Moves real DOM focus on pointer entry (the shipped `:focus` rule paints it).\r\n private readonly item = inject(CdkMenuItem);\r\n\r\n // Bare/absent is `default`; `destructive` is the only other treatment.\r\n readonly appearance = input<'default' | 'destructive' | ''>('', { alias: 'raqm-menu-item' });\r\n\r\n // The value marker or the default row treatment.\r\n protected readonly activeAppearance = computed(() => this.appearance() || 'default');\r\n\r\n // Indents the row to line up with indicator-bearing rows.\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n\r\n // Capture-phase guard for a disabled anchor: `preventDefault` blocks the native and\r\n // router destination, `stopImmediatePropagation` later same-element listeners.\r\n private readonly guardDisabledAnchor = (event: Event): void => {\r\n if (!this.item.disabled) {\r\n return;\r\n }\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n };\r\n\r\n // Capture-phase Space activation for an anchor row: Space is not native anchor\r\n // activation, so stop the CDK keydown path and page default, then dispatch exactly one\r\n // `click()`; Enter stays native and a repeat never re-activates.\r\n private readonly activateAnchorWithSpace = (event: KeyboardEvent): void => {\r\n if (\r\n event.keyCode !== SPACE_KEY_CODE ||\r\n event.altKey ||\r\n event.ctrlKey ||\r\n event.metaKey ||\r\n event.shiftKey\r\n ) {\r\n return;\r\n }\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n if (event.repeat || this.item.disabled) {\r\n return;\r\n }\r\n this.elementRef.nativeElement.click();\r\n };\r\n\r\n // Anchors only: the CDK covers `<button>` hosts; capture phase runs before the CDK's,\r\n // the router's and the app's same-element listeners.\r\n constructor() {\r\n const element = this.elementRef.nativeElement;\r\n if (element.nodeName !== 'A') {\r\n return;\r\n }\r\n element.addEventListener('click', this.guardDisabledAnchor, true);\r\n element.addEventListener('auxclick', this.guardDisabledAnchor, true);\r\n element.addEventListener('keydown', this.activateAnchorWithSpace, true);\r\n this.destroyRef.onDestroy(() => {\r\n element.removeEventListener('click', this.guardDisabledAnchor, true);\r\n element.removeEventListener('auxclick', this.guardDisabledAnchor, true);\r\n element.removeEventListener('keydown', this.activateAnchorWithSpace, true);\r\n });\r\n }\r\n\r\n // Hover highlight: an enabled, non-touch pointer entry goes through the public\r\n // `CdkMenuItem.focus()`, reusing the single `:focus` rule instead of adding a second\r\n // paint. It never activates the row.\r\n protected onPointerEnter(event: Event): void {\r\n if (!(event instanceof PointerEvent) || event.pointerType === 'touch' || this.item.disabled) {\r\n return;\r\n }\r\n this.item.focus();\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n OnDestroy,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n} from '@angular/core';\r\n\r\nimport { CdkMenuItem, CdkMenuItemCheckbox, CdkMenuItemSelectable } from '@angular/cdk/menu';\r\n\r\n@Directive({\r\n providers: [\r\n // The same alias chain the CDK declares on its own subclasses, retargeted here.\r\n { provide: CdkMenuItemSelectable, useExisting: RaqmMenuCheckboxItemBase },\r\n { provide: CdkMenuItem, useExisting: RaqmMenuCheckboxItemBase },\r\n ],\r\n})\r\nexport class RaqmMenuCheckboxItemBase extends CdkMenuItemCheckbox {\r\n // Caller-supplied options are preserved; the CDK still emits and toggles.\r\n override trigger(options?: { keepOpen: boolean }): void {\r\n super.trigger({ ...options, keepOpen: true });\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: 'button[raqm-menu-checkbox-item]',\r\n // The CDK owns the checkbox engine; the internal base adds keep-open.\r\n hostDirectives: [\r\n {\r\n directive: RaqmMenuCheckboxItemBase,\r\n inputs: ['cdkMenuItemDisabled: disabled'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menu-checkbox-item',\r\n // Presence-only inset hook (the `data-raqm-inset` attribute exists or not).\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n // Focus-follows-pointer, identical to `RaqmMenuItemDirective`.\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n },\r\n})\r\nexport class RaqmMenuCheckboxItemDirective implements OnDestroy {\r\n // Reads the event-time checked value when `triggered` fires.\r\n private readonly checkbox = inject(RaqmMenuCheckboxItemBase);\r\n\r\n // Receives the committed state directly, so the model write paints before the CDK's\r\n // own binding re-runs.\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n /** Indents the row to line up with indicator-bearing rows. */\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * The public two-way checked model.\r\n *\r\n * @remarks\r\n * Bound-only: the CDK's `checked` attribute transform is not exposed. The model is the\r\n * single state channel.\r\n */\r\n readonly checked = model(false);\r\n\r\n // Typed structurally (no rxjs import), matching the Select component's pattern.\r\n private readonly triggerSubscription: { unsubscribe(): void };\r\n\r\n constructor() {\r\n // Push application writes into the CDK row and paint `aria-checked` in the same pass;\r\n // the CDK's plain-field `checked` would otherwise leave the attribute one pass stale.\r\n effect(() => {\r\n const checked = this.checked();\r\n this.checkbox.checked = checked;\r\n this.element.nativeElement.setAttribute('aria-checked', String(checked));\r\n });\r\n\r\n // Negating the event-time `checked` keeps the write aligned with the CDK's own toggle.\r\n this.triggerSubscription = this.checkbox.triggered.subscribe(() => {\r\n this.checked.set(!this.checkbox.checked);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.triggerSubscription.unsubscribe();\r\n }\r\n\r\n // An enabled, non-touch entry focuses the row through `CdkMenuItem.focus()`, which\r\n // never toggles.\r\n protected onPointerEnter(event: Event): void {\r\n if (\r\n !(event instanceof PointerEvent) ||\r\n event.pointerType === 'touch' ||\r\n this.checkbox.disabled\r\n ) {\r\n return;\r\n }\r\n this.checkbox.focus();\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface RaqmMenuRadioGroupContext {\r\n isSelected(value: string): boolean;\r\n /** Commits one user selection using the group's two-way model. */\r\n select(value: string): void;\r\n /** Registers an item value and rejects duplicate claims in development. */\r\n register(value: string): void;\r\n /** Releases a previously registered item value. */\r\n unregister(value: string): void;\r\n}\r\n\r\nexport const RAQM_MENU_RADIO_GROUP = new InjectionToken<RaqmMenuRadioGroupContext>(\r\n 'raqm-menu-radio-group',\r\n);\r\n","import {\r\n Directive,\r\n OnDestroy,\r\n OnChanges,\r\n OnInit,\r\n SimpleChanges,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n isDevMode,\r\n model,\r\n} from '@angular/core';\r\n\r\nimport {\r\n CdkMenuGroup,\r\n CdkMenuItem,\r\n CdkMenuItemRadio,\r\n CdkMenuItemSelectable,\r\n} from '@angular/cdk/menu';\r\n\r\nimport { RAQM_MENU_RADIO_GROUP, RaqmMenuRadioGroupContext } from './dropdown-menu-radio-context';\r\n\r\n@Directive({\r\n providers: [\r\n { provide: CdkMenuItemSelectable, useExisting: RaqmMenuRadioItemBase },\r\n { provide: CdkMenuItem, useExisting: RaqmMenuRadioItemBase },\r\n ],\r\n})\r\nexport class RaqmMenuRadioItemBase extends CdkMenuItemRadio {\r\n /** Keeps the menu open while retaining the CDK's standard activation path. */\r\n override trigger(options?: { keepOpen: boolean }): void {\r\n super.trigger({ ...options, keepOpen: true });\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: '[raqm-menu-radio-group]',\r\n hostDirectives: [{ directive: CdkMenuGroup }],\r\n providers: [{ provide: RAQM_MENU_RADIO_GROUP, useExisting: RaqmMenuRadioGroupDirective }],\r\n})\r\nexport class RaqmMenuRadioGroupDirective implements RaqmMenuRadioGroupContext {\r\n /** Selected item value, or null when the group has no current selection. */\r\n readonly value = model<string | null>(null);\r\n\r\n /** Tracks live item claims so duplicate values are rejected within this group. */\r\n private readonly registrations = new Map<string, number>();\r\n\r\n /** Checks the model without normalizing unknown externally supplied values. */\r\n isSelected(value: string): boolean {\r\n return this.value() === value;\r\n }\r\n\r\n /** Commits a user selection; model signals suppress unchanged-value emissions. */\r\n select(value: string): void {\r\n this.value.set(value);\r\n }\r\n\r\n /** Adds a value claim and reports duplicate/nonempty violations clearly in development. */\r\n register(value: string): void {\r\n if (!value && isDevMode()) {\r\n throw new Error('Raqm menu radio item: a non-empty `value` is required.');\r\n }\r\n const count = this.registrations.get(value) ?? 0;\r\n if (count > 0 && isDevMode()) {\r\n throw new Error(\r\n `Raqm menu radio group: duplicate radio item value \"${value}\". ` +\r\n 'Each radio item inside one group needs a unique non-empty value.',\r\n );\r\n }\r\n this.registrations.set(value, count + 1);\r\n }\r\n\r\n /** Removes a value claim and permits later reuse when the last item is destroyed. */\r\n unregister(value: string): void {\r\n const count = this.registrations.get(value) ?? 0;\r\n if (count <= 1) {\r\n this.registrations.delete(value);\r\n } else {\r\n this.registrations.set(value, count - 1);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Menu radio item deriving its checked state from the enclosing group's value.\r\n * CDK owns ARIA, keyboard navigation, dispatch and disabled activation behavior.\r\n */\r\n@Directive({\r\n selector: 'button[raqm-menu-radio-item]',\r\n hostDirectives: [\r\n {\r\n directive: RaqmMenuRadioItemBase,\r\n inputs: ['cdkMenuItemDisabled: disabled'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menu-radio-item',\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n },\r\n})\r\nexport class RaqmMenuRadioItemDirective implements OnInit, OnChanges, OnDestroy {\r\n private readonly radio = inject(RaqmMenuRadioItemBase);\r\n\r\n private readonly group: RaqmMenuRadioGroupContext;\r\n\r\n readonly value = input.required<string>();\r\n\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n\r\n /** CDK triggered subscription, used to make exactly one model commit per activation. */\r\n private readonly triggerSubscription: { unsubscribe(): void };\r\n\r\n /** Registered value retained so input changes and teardown release the correct claim. */\r\n private registeredValue: string | null = null;\r\n\r\n constructor() {\r\n const group = inject(RAQM_MENU_RADIO_GROUP, { optional: true });\r\n if (!group) {\r\n throw new Error('Raqm menu radio item: an enclosing [raqm-menu-radio-group] is required.');\r\n }\r\n this.group = group;\r\n\r\n effect(() => {\r\n this.radio.checked = this.group.isSelected(this.value());\r\n });\r\n\r\n this.triggerSubscription = this.radio.triggered.subscribe(() => {\r\n if (!this.radio.disabled) {\r\n this.group.select(this.value());\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.updateRegistration(this.value());\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['value'] && this.registeredValue !== null) {\r\n this.updateRegistration(this.value());\r\n }\r\n }\r\n\r\n /** Swaps the registered claim only after the proposed value passes group validation. */\r\n private updateRegistration(value: string): void {\r\n if (value === this.registeredValue) {\r\n return;\r\n }\r\n this.group.register(value);\r\n const previousValue = this.registeredValue;\r\n this.registeredValue = value;\r\n if (previousValue !== null) {\r\n this.group.unregister(previousValue);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.registeredValue !== null) {\r\n this.group.unregister(this.registeredValue);\r\n }\r\n this.triggerSubscription.unsubscribe();\r\n }\r\n\r\n protected onPointerEnter(event: Event): void {\r\n if (!(event instanceof PointerEvent) || event.pointerType === 'touch' || this.radio.disabled) {\r\n return;\r\n }\r\n this.radio.focus();\r\n }\r\n}\r\n","import {\r\n RaqmMenuDirective,\r\n RaqmMenuGroupDirective,\r\n RaqmMenuLabelDirective,\r\n RaqmMenuSeparatorDirective,\r\n RaqmMenuShortcutDirective,\r\n} from './dropdown-menu.directive';\r\nimport {\r\n RaqmMenuTriggerDirective,\r\n RAQM_MENU_SUBMENU_POSITIONS,\r\n} from './dropdown-menu-trigger.directive';\r\nimport {\r\n RaqmMenuOverlaySync,\r\n RaqmMenuDirection,\r\n RaqmMenuTriggerBase,\r\n RaqmContextMenuTriggerBase,\r\n} from './menu-overlay';\r\nimport type { RaqmMenuAnchorPoint, RaqmMenuOverlaySyncOptions } from './menu-overlay';\r\nimport { RaqmMenuItemDirective } from './dropdown-menu-item.directive';\r\nimport {\r\n RaqmMenuCheckboxItemBase,\r\n RaqmMenuCheckboxItemDirective,\r\n} from './dropdown-menu-checkbox-item.directive';\r\nimport {\r\n RaqmMenuRadioGroupDirective,\r\n RaqmMenuRadioItemBase,\r\n RaqmMenuRadioItemDirective,\r\n} from './dropdown-menu-radio.directive';\r\n\r\nexport {\r\n RaqmMenuDirective,\r\n RaqmMenuGroupDirective,\r\n RaqmMenuLabelDirective,\r\n RaqmMenuSeparatorDirective,\r\n RaqmMenuShortcutDirective,\r\n};\r\nexport { RaqmMenuTriggerDirective, RAQM_MENU_SUBMENU_POSITIONS };\r\n// INTERNAL — shared across entrypoints; not supported application-facing API.\r\n// NG3001 also requires exported host-directive bases/direction to be visible here.\r\nexport { RaqmMenuOverlaySync, RaqmMenuDirection, RaqmMenuTriggerBase, RaqmContextMenuTriggerBase };\r\nexport type { RaqmMenuAnchorPoint, RaqmMenuOverlaySyncOptions };\r\nexport { RaqmMenuItemDirective };\r\nexport { RaqmMenuCheckboxItemDirective };\r\nexport { RaqmMenuRadioGroupDirective, RaqmMenuRadioItemDirective };\r\n// INTERNAL — do not remove and do not treat as supported API. NG3001 requires classes\r\n// named in exported `hostDirectives` to be exported, so both keep-open bases ship here.\r\nexport { RaqmMenuCheckboxItemBase };\r\nexport { RaqmMenuRadioItemBase };\r\n\r\nexport const RaqmDropdownMenu = [\r\n RaqmMenuDirective,\r\n RaqmMenuTriggerDirective,\r\n RaqmMenuItemDirective,\r\n RaqmMenuCheckboxItemDirective,\r\n RaqmMenuRadioGroupDirective,\r\n RaqmMenuRadioItemDirective,\r\n RaqmMenuGroupDirective,\r\n RaqmMenuLabelDirective,\r\n RaqmMenuSeparatorDirective,\r\n RaqmMenuShortcutDirective,\r\n] as const;\r\n"],"mappings":";;;;;;;;AAuBA,IAAa,oBAAb,MAAa,0BAA0B,eAAc;CAClC,UAAU,OAAgC,UAAU,CAAC,CAAC;CAC/D,WAAoC;CACpC,WAAW;CAEnB,IAAa,QAAK;EAChB,MAAM,OAAO,KAAK,QAAQ,cAAc;EACxC,OAAO,OACH,KAAK,iBAAiB,KAAK,OAAO,CAAC,CAAC,cAAc,QAChD,QACA,QACF,MAAM;CACZ;CAEA,cAAA;EACE,MAAK;EACL,qBAAoB;GAClB,IAAI,KAAK,UAAU;GACnB,MAAM,OAAO,KAAK,QAAQ,cAAc;GACxC,IAAI,CAAC,MAAM;GACX,MAAM,aAAkB;IACtB,MAAM,OAAO,KAAK;IAClB,IAAI,SAAS,KAAK,YAAW,GAAI;KAC/B,KAAK,YAAY,IAAI,IAAI;KACzB,KAAK,OAAO,KAAK,IAAI;IACvB;GACF;GACA,KAAK,WAAW,IAAI,KAAK,iBAAiB,IAAI;GAC9C,KAAK,IAAI,OAA2B,KAAK,SAAS,MAAM,OAAO,KAAK,eAClE,KAAK,SAAS,QAAQ,MAAM;IAC1B,YAAY;IACZ,iBAAiB;KAAC;KAAO;KAAS;IAAO;GAC1C,CAAA;GAEH,KAAI;EACN,CAAC;CACH;CAES,cAAW;EAClB,KAAK,WAAW;EAChB,KAAK,UAAU,WAAU;EACzB,MAAM,YAAW;CACnB;CA1CW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,WAFjB,CAAC;GAAE,SAAS;GAAgB,aAAa,iBAAiB,iBAAiB;EAAC,CAAE;EAAC,iBAAA;EAAA,UAAA;CAAA,CAAA;;AAE/E,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAH7B,MAAA;EAAU,MAAA,CAAA,EACT,WAAW,CAAC;GAAE,SAAS;GAAgB,aAAa,iBAAgB,iBAAkB;EAAC,CAAE,EAC1F,CAAA;;;;AAsDD,IAAa,sBAAb,MAAa,4BAA4B,eAAc;CACrD,IAAI,cAAW;EACb,OAAO,KAAK;CACd;CAHW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAmB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAnB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAmB,cAAA;EAAA,WANnB;GACT;IAAE,SAAS;IAAgB,aAAa,iBAAiB,mBAAmB;GAAC;GAC7E;IAAE,SAAS;IAAc,aAAa,iBAAiB,mBAAmB;GAAC;GAC3E;EACD;EAAA,iBAAA;EAAA,UAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAmB,YAAA,CAAA;EAP/B,MAAA;EAAU,MAAA,CAAA,EACT,WAAW;GACT;IAAE,SAAS;IAAgB,aAAa,iBAAgB,mBAAoB;GAAC;GAC7E;IAAE,SAAS;IAAc,aAAa,iBAAgB,mBAAoB;GAAC;GAC3E;EACD,EACF,CAAA;;;AAcD,IAAa,6BAAb,MAAa,mCAAmC,sBAAqB;CAC1D,kBAAkB,IAAI,QAAO;CACtC,IAAI,cAAW;EACb,OAAO,KAAK;CACd;CACA,kBAA8C;CACrC,KAAK,aAAqC;EACjD,KAAK,kBAAkB;EACvB,MAAM,KAAK,WAAW;EACtB,KAAK,gBAAgB,KAAI;CAC3B;CACS,cAAW;EAClB,KAAK,gBAAgB,SAAQ;EAC7B,MAAM,YAAW;CACnB;CAdW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAA0B,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAA1B,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAA0B,cAAA;EAAA,WAN1B;GACT;IAAE,SAAS;IAAuB,aAAa,iBAAiB,0BAA0B;GAAC;GAC3F;IAAE,SAAS;IAAc,aAAa,iBAAiB,0BAA0B;GAAC;GAClF;IAAE,SAAS;IAAY,UAAU;GAAS;EAC3C;EAAA,iBAAA;EAAA,UAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA0B,YAAA,CAAA;EAPtC,MAAA;EAAU,MAAA,CAAA,EACT,WAAW;GACT;IAAE,SAAS;IAAuB,aAAa,iBAAgB,0BAA2B;GAAC;GAC3F;IAAE,SAAS;IAAc,aAAa,iBAAgB,0BAA2B;GAAC;GAClF;IAAE,SAAS;IAAY,UAAU;GAAS;EAC3C,EACF,CAAA;;;AAgCD,IAAa,sBAAb,MAAgC;CAmBX;CACA;CAEA;CACA;CAtBX,aAAa;CACb,WAAW;CACX,QAAQ;CACR,UAA6B;CAC7B;CACA,iBAAwC;CACxC;CACS,gBAAgB,IAAI,aAAY;CAChC,iBAAsB;EACrC,MAAM,OAAO,KAAK,OAAO,cAAc;EACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,WAAW,KAAK,SAAS,KAAK,UAAU;EAC3D,KAAK,QAAQ,KAAK,4BAA2B;GAC3C,KAAK,QAAQ;GACb,KAAK,QAAO;EACd,CAAC;CACH;CAEA,YACmB,SACA,QACjB,YACiB,gBACA,SAAmC;EAJnC,KAAA,UAAA;EACA,KAAA,SAAA;EAEA,KAAA,iBAAA;EACA,KAAA,UAAA;EAEjB,KAAK,cAAc,IACjB,QAAQ,OAAO,gBAAe;GAC5B,MAAM,aAAa,EAAE,KAAK;GAC1B,qBAAoB;IAClB,IAAI,KAAK,YAAY,eAAe,KAAK,cAAc,CAAC,QAAQ,OAAM,GAAI;IAC1E,KAAK,OAAM;IACX,KAAK,UAAU,QAAQ;IACvB,IAAI,CAAC,KAAK,SAAS;IACnB,KAAK,mBAAmB,yBAAyB,KAAK,QAAQ,KAAK,OAAO;IAC1E,KAAK,QAAO;IACZ,KAAK,QAAO;GACd,CAAC;EACH,CAAC,CAAC;EAEJ,KAAK,cAAc,IACjB,QAAQ,OAAO,gBAAe;GAC5B,EAAE,KAAK;GACP,KAAK,OAAM;EACb,CAAC,CAAC;EAEJ,KAAK,cAAc,IAAI,eAAe,OAAO,UAAU,KAAK,QAAQ,CAAC;EACrE,IAAI,mBAAmB,4BACrB,KAAK,cAAc,IAAI,QAAQ,gBAAgB,UAAU,KAAK,QAAQ,CAAC;EAEzE,WAAW,gBAAe;GACxB,KAAK,WAAW;GAChB,EAAE,KAAK;GACP,KAAK,OAAM;GACX,KAAK,cAAc,YAAW;EAChC,CAAC;CACH;CAEA,UAAO;EACL,KAAK,SAAQ;CACf;CAEQ,UAAO;EACb,MAAM,UAAU,KAAK;EACrB,IAAI,KAAK,YAAY,CAAC,SAAS,YAAW,GAAI;EAC9C,MAAM,WAAW,QAAQ,UAAS,CAAE,CAAC;EACrC,IAAI,EAAE,oBAAoB,oCAAoC;EAC9D,MAAM,OAAO,QAAQ;EACrB,MAAM,SAAS,KAAK,OAAO,cAAc,gBAAgB;EACzD,QAAQ,aAAa,KAAK,eAAe,KAAK;EAC9C,MAAM,YAAY,KAAK,QAAQ,YAAW,KAAM,SAAS;EACzD,SAAS,cAAc,UAAU,KAAK,cAAc,EAAE,GAAG,SAAQ,EAAG,CAAC;EACrE,IAAI,KAAK,QAAQ,kBAAkB;GACjC,KAAK,MAAM,YACT,4BACA,GAAG,KAAK,OAAO,sBAAqB,CAAE,CAAC,MAAK,GAAI;GAElD,KAAK,aAAa,0BAA0B,EAAE;EAChD;EACA,KAAK,MAAM,YAAY,gCAAgC,GAAG,KAAK,IAAI,GAAG,SAAS,EAAE,EAAC,GAAI;EACtF,SACG,mBAAmB,CAAC,CAAC,CACrB,uBAAuB,KAAK,CAAC,CAC7B,mBAAmB,KAAK,CAAC,CACzB,SAAS,IAAI;EAChB,MAAM,YAAY,SAAS,gBAAgB,WAAW,UAAS;GAC7D,KAAK,aAAa,MAAM;EAC1B,CAAC;EACD,QAAQ,eAAc;EACtB,UAAU,YAAW;EACrB,IAAI,CAAC,KAAK,YAAY;EACtB,MAAM,OAAO,KAAK;EAClB,MAAM,QAAQ,KAAK,QAAQ,cAAa;EACxC,MAAM,OAAO,KAAK,OAAO,sBAAqB;EAC9C,MAAM,SAAS,QACX,MAAM,IACN,KAAK,YAAY,QACf,KAAK,MACL,KAAK,YAAY,WACf,KAAK,SACL,KAAK,MAAM,KAAK,SAAS;EACjC,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,GAAG,UAAU,KAAK,WAAW,EAAE,CAAC;EAC3E,MAAM,YACJ,KAAK,aAAa,WACd,OAAO,IACP,KAAK,aAAa,WAChB,IAAI,KAAK,IAAI,OAAO,GAAG,SAAS,IAAI,IAAI,IACxC,SAAS,IAAI;EACrB,KAAK,MAAM,YACT,gCACA,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,IAAI,SAAS,CAAC,EAAC,GAAI;EAEtD,SAAS,oBAAmB;CAC9B;CAEQ,UAAO;EACb,MAAM,OAAO,KAAK,OAAO,cAAc;EACvC,MAAM,iBAAiB,UAAU,KAAK,UAAU,EAAE,SAAS,KAAI,CAAE;EACjE,MAAM,SAAS,iBAAiB,UAAU,KAAK,UAAU;GAAE,SAAS;GAAM,SAAS;EAAI,CAAE;EACzF,IAAI,QAAQ,OAAO,KAAK,mBAAmB,eAAe,KAAK,SAAS;GACtE,KAAK,iBAAiB,IAAI,KAAK,eAAe,KAAK,QAAQ;GAC3D,KAAK,eAAe,QAAQ,KAAK,QAAQ,cAAc;GACvD,KAAK,eAAe,QAAQ,KAAK,MAAM;EACzC;CACF;CAEQ,SAAM;EACZ,KAAK,mBAAkB;EACvB,KAAK,mBAAmB;EACxB,MAAM,OAAO,KAAK,OAAO,cAAc;EACvC,MAAM,oBAAoB,UAAU,KAAK,QAAQ;EACjD,MAAM,SAAS,oBAAoB,UAAU,KAAK,UAAU,EAAE,SAAS,KAAI,CAAE;EAC7E,IAAI,KAAK,OAAO,MAAM,qBAAqB,KAAK,KAAK;EACrD,KAAK,QAAQ;EACb,KAAK,gBAAgB,WAAU;EAC/B,KAAK,iBAAiB;EACtB,KAAK,UAAU;EACf,KAAK,aAAa;CACpB;AACD;ACpPD,IAAa,oBAAb,MAAa,kBAAiB;CAAjB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,MAAA,EAAA,gBAAA,YAAA;EAAA,gBAAA,CAAA,EAAA,WAAAA,kBAAA,GAAA,EAAA,WAAA,GAAA,QAAA,CAAA;EAAA,UAAA;CAAA,CAAA;;AAAjB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAT7B,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GAEV,gBAAgB,CAAC,mBAAmB,EAAE,WAAW,QAAO,CAAE;GAE1D,MAAM,EACJ,OAAO,YACR;EACF,CAAA;;;AAWD,IAAa,yBAAb,MAAa,uBAAsB;CAAtB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAsB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAtB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAsB,cAAA;EAAA,UAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,QAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;CAAA,CAAA;;AAAtB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EARlC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,MAAM;IACJ,OAAO;IAEP,MAAM;GACP;EACF,CAAA;;;AAWD,IAAa,yBAAb,MAAa,uBAAsB;CACxB,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CADhD,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAsB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAtB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAsB,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,OAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,wBAAA,wBAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;CAAA,CAAA;;AAAtB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAsB,YAAA,CAAA;EARlC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,MAAM;IACJ,OAAO;IAEP,0BAA0B;GAC3B;EACF,CAAA;;;;;;;;;;;AAoBD,IAAa,6BAAb,MAAa,2BAA0B;CAA1B,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAA0B,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAA1B,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAA0B,cAAA;EAAA,UAAA;EAAA,MAAA;GAAA,YAAA;IAAA,QAAA;IAAA,oBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;CAAA,CAAA;;AAA1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA0B,YAAA,CAAA;EATtC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,MAAM;IACJ,OAAO;IAEP,MAAM;IACN,oBAAoB;GACrB;EACF,CAAA;;;AAeD,IAAa,4BAAb,MAAa,0BAAyB;CAAzB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAyB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAzB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAyB,cAAA;EAAA,UAAA;EAAA,MAAA,EAAA,gBAAA,qBAAA;EAAA,UAAA;CAAA,CAAA;;AAAzB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAyB,YAAA,CAAA;EANrC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,MAAM,EACJ,OAAO,qBACR;EACF,CAAA;;;ACrDD,MAAM,sBAA2C,CAC/C;CACE,SAAS;CACT,SAAS;CACT,UAAU;CACV,UAAU;CACV,SAAS;AACV,GACD;CACE,SAAS;CACT,SAAS;CACT,UAAU;CACV,UAAU;CACV,SAAS;AACV,CACF;AAID,MAAM,uBAAuB;AAK7B,MAAM,oBAAyC,CAC7C;CACE,SAAS;CACT,SAAS;CACT,UAAU;CACV,UAAU;CACV,SAAS;AACV,GACD;CACE,SAAS;CACT,SAAS;CACT,UAAU;CACV,UAAU;CACV,SAAS;AACV,CACF;AAED,MAAa,8BAA8B,IAAI,eAC7C,6BAA6B;AAoB/B,IAAa,2BAAb,MAAa,yBAAwB;CAClB,UAAU,OAAO,mBAAmB;CAGpC,aAAa,OAAO,UAAU,EAAE,UAAU,KAAI,CAAE;CAExD,UAAU,KAAK,eAAe;CAEtB,UAAU,OAAgC,UAAU;CAEpD,iBAAiB,OAAO,cAAc;CAGtC,0BACf,OAAO,6BAA6B,EAAE,UAAU,KAAI,CAAE,KAAK;CAG5C,cAAc,IAAI,oBACjC,KAAK,SACL,KAAK,QAAQ,eACb,OAAO,UAAU,GACjB,KAAK,gBACL,EAAE,kBAAkB,CAAC,KAAK,QAAO,CAAE;CAUrC,WAAQ;EACN,IAAI,KAAK,QAAQ,gBAAgB,MAC/B,KAAK,QAAQ,eAAe,KAAK,UAAU,KAAK,0BAA0B;CAE9E;CApCW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAwB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAxB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAwB,cAAA;EAAA,UAAA;EAAA,MAAA;GAAA,YAAA,EAAA,0BAAA,wBAAA;GAAA,gBAAA;EAAA;EAAA,gBAAA,CAAA,EAAA,WAAAC,kBAAA,GAAA;GAAA,WAAAC;GAAA,QAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;EAAA,UAAA;CAAA,CAAA;;AAAxB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAwB,YAAA,CAAA;EAjBpC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GAEV,gBAAgB,CACd,mBACA;IACE,WAAW;IACX,QAAQ,CAAC,4CAA4C,4BAA4B;IACjF,SAAS,CAAC,yBAAyB,uBAAuB;GAC3D,CACF;GACD,MAAM;IACJ,OAAO;IAEP,4BAA4B;GAC7B;EACF,CAAA;;;AC7DD,MAAM,iBAAiB;AAqBvB,IAAa,wBAAb,MAAa,sBAAqB;CAEf,aAAsC,OAAO,UAAU;CAGvD,aAAa,OAAO,UAAU;CAG9B,OAAO,OAAO,WAAW;CAGjC,aAAa,MAAsC,IAAE;EAAA,GAAA,YAAA,EAAA,WAAA,aAAA,+BAAA,CAAA;EAAI,OAAO;CAAgB,CAAA;CAGtE,mBAAmB,eAAe,KAAK,WAAU,KAAM,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAG3E,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAI1C,uBAAuB,UAAsB;EAC5D,IAAI,CAAC,KAAK,KAAK,UACb;EAEF,MAAM,eAAc;EACpB,MAAM,yBAAwB;CAChC;CAKiB,2BAA2B,UAA8B;EACxE,IACE,MAAM,YAAY,kBAClB,MAAM,UACN,MAAM,WACN,MAAM,WACN,MAAM,UAEN;EAEF,MAAM,eAAc;EACpB,MAAM,yBAAwB;EAC9B,IAAI,MAAM,UAAU,KAAK,KAAK,UAC5B;EAEF,KAAK,WAAW,cAAc,MAAK;CACrC;CAIA,cAAA;EACE,MAAM,UAAU,KAAK,WAAW;EAChC,IAAI,QAAQ,aAAa,KACvB;EAEF,QAAQ,iBAAiB,SAAS,KAAK,qBAAqB,IAAI;EAChE,QAAQ,iBAAiB,YAAY,KAAK,qBAAqB,IAAI;EACnE,QAAQ,iBAAiB,WAAW,KAAK,yBAAyB,IAAI;EACtE,KAAK,WAAW,gBAAe;GAC7B,QAAQ,oBAAoB,SAAS,KAAK,qBAAqB,IAAI;GACnE,QAAQ,oBAAoB,YAAY,KAAK,qBAAqB,IAAI;GACtE,QAAQ,oBAAoB,WAAW,KAAK,yBAAyB,IAAI;EAC3E,CAAC;CACH;CAKU,eAAe,OAAY;EACnC,IAAI,EAAE,iBAAiB,iBAAiB,MAAM,gBAAgB,WAAW,KAAK,KAAK,UACjF;EAEF,KAAK,KAAK,MAAK;CACjB;CA3EW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,WAAA,EAAA,gBAAA,yBAAA;GAAA,YAAA;IAAA,0BAAA;IAAA,wBAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,gBAAA,CAAA;GAAA,WAAAC,GAAA;GAAA,QAAA,CAAA,uBAAA,UAAA;GAAA,SAAA,CAAA,wBAAA,WAAA;EAAA,CAAA;EAAA,UAAA;CAAA,CAAA;;AAArB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EAnBjC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,gBAAgB,CACd;IACE,WAAW;IACX,QAAQ,CAAC,+BAA+B;IACxC,SAAS,CAAC,iCAAiC;GAC5C,CACF;GACD,MAAM;IACJ,OAAO;IAEP,4BAA4B;IAE5B,0BAA0B;IAE1B,kBAAkB;GACnB;EACF,CAAA;;;;;;;;;;;;;;;;;;;;;;ACbD,IAAa,2BAAb,MAAa,iCAAiC,oBAAmB;CAEtD,QAAQ,SAA+B;EAC9C,MAAM,QAAQ;GAAE,GAAG;GAAS,UAAU;EAAI,CAAE;CAC9C;CAJW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAwB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAxB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAwB,cAAA;EAAA,WANxB,CAET;GAAE,SAAS;GAAuB,aAAa;EAAwB,GACvE;GAAE,SAAS;GAAa,aAAa;EAAwB,CAC9D;EAAA,iBAAA;EAAA,UAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAwB,YAAA,CAAA;EAPpC,MAAA;EAAU,MAAA,CAAA,EACT,WAAW,CAET;GAAE,SAAS;GAAuB,aAAW;EAA0B,GACvE;GAAE,SAAS;GAAa,aAAW;EAA0B,CAC9D,EACF,CAAA;;;AAyBD,IAAa,gCAAb,MAAa,8BAA6B;CAEvB,WAAW,OAAO,wBAAwB;CAI1C,UAAU,OAAgC,UAAU;CAG5D,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CASlD,UAAU,MAAM,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAGd;CAEjB,cAAA;EAGE,aAAY;GACV,MAAM,UAAU,KAAK,QAAO;GAC5B,KAAK,SAAS,UAAU;GACxB,KAAK,QAAQ,cAAc,aAAa,gBAAgB,OAAO,OAAO,CAAC;EACzE,CAAC;EAGD,KAAK,sBAAsB,KAAK,SAAS,UAAU,gBAAe;GAChE,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS,OAAO;EACzC,CAAC;CACH;CAEA,cAAW;EACT,KAAK,oBAAoB,YAAW;CACtC;CAIU,eAAe,OAAY;EACnC,IACE,EAAE,iBAAiB,iBACnB,MAAM,gBAAgB,WACtB,KAAK,SAAS,UAEd;EAEF,KAAK,SAAS,MAAK;CACrB;CArDW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAA6B,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAA7B,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAA6B,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,SAAA,EAAA,SAAA,gBAAA;EAAA,MAAA;GAAA,WAAA,EAAA,gBAAA,yBAAA;GAAA,YAAA,EAAA,wBAAA,wBAAA;GAAA,gBAAA;EAAA;EAAA,gBAAA,CAAA;GAAA,WAxB7B;GAAwB,QAAA,CAAA,uBAAA,UAAA;EAAA,CAAA;EAAA,UAAA;CAAA,CAAA;;AAwBxB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA6B,YAAA,CAAA;EAjBzC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GAEV,gBAAgB,CACd;IACE,WAAW;IACX,QAAQ,CAAC,+BAA+B;GACzC,CACF;GACD,MAAM;IACJ,OAAO;IAEP,0BAA0B;IAE1B,kBAAkB;GACnB;EACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;AC/BD,MAAa,wBAAwB,IAAI,eACvC,uBAAuB;ACgBzB,IAAa,wBAAb,MAAa,8BAA8B,iBAAgB;CAEhD,QAAQ,SAA+B;EAC9C,MAAM,QAAQ;GAAE,GAAG;GAAS,UAAU;EAAI,CAAE;CAC9C;CAJW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAqB,cAAA;EAAA,WALrB,CACT;GAAE,SAAS;GAAuB,aAAa;EAAqB,GACpE;GAAE,SAAS;GAAa,aAAa;EAAqB,CAC3D;EAAA,iBAAA;EAAA,UAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA;EANjC,MAAA;EAAU,MAAA,CAAA,EACT,WAAW,CACT;GAAE,SAAS;GAAuB,aAAW;EAAuB,GACpE;GAAE,SAAS;GAAa,aAAW;EAAuB,CAC3D,EACF,CAAA;;;AAaD,IAAa,8BAAb,MAAa,4BAA2B;CAE7B,QAAQ,MAAqB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAG1B,gCAAgB,IAAI,IAAG;CAGxC,WAAW,OAAa;EACtB,OAAO,KAAK,MAAK,MAAO;CAC1B;CAGA,OAAO,OAAa;EAClB,KAAK,MAAM,IAAI,KAAK;CACtB;CAGA,SAAS,OAAa;EACpB,IAAI,CAAC,SAAS,UAAS,GACrB,MAAM,IAAI,MAAM,wDAAwD;EAE1E,MAAM,QAAQ,KAAK,cAAc,IAAI,KAAK,KAAK;EAC/C,IAAI,QAAQ,KAAK,UAAS,GACxB,MAAM,IAAI,MACR,sDAAsD,MAAK,oEACS;EAGxE,KAAK,cAAc,IAAI,OAAO,QAAQ,CAAC;CACzC;CAGA,WAAW,OAAa;EACtB,MAAM,QAAQ,KAAK,cAAc,IAAI,KAAK,KAAK;EAC/C,IAAI,SAAS,GACX,KAAK,cAAc,OAAO,KAAK;OAE/B,KAAK,cAAc,IAAI,OAAO,QAAQ,CAAC;CAE3C;CAxCW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAA2B,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAA3B,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAA2B,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,OAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,SAAA,EAAA,OAAA,cAAA;EAAA,WAF3B,CAAC;GAAE,SAAS;GAAuB,aAAa;EAA2B,CAAE;EAAC,gBAAA,CAAA,EAAA,WAAAC,GAAA,aAAA,CAAA;EAAA,UAAA;CAAA,CAAA;;AAE9E,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA2B,YAAA,CAAA;EALvC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,gBAAgB,CAAC,EAAE,WAAW,aAAY,CAAE;GAC5C,WAAW,CAAC;IAAE,SAAS;IAAuB,aAAW;GAA6B,CAAE;EACzF,CAAA;;;;;;;;;;;;;;AA8DD,IAAa,6BAAb,MAAa,2BAA0B;CACpB,QAAQ,OAAO,qBAAqB;CAEpC;CAER,QAAQ,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEhC,QAAQ,MAAM,OAAK;EAAA,GAAA,YAAA,EAAA,WAAA,QAAA,+BAAA,CAAA;EAAI,WAAW;CAAgB,CAAA;CAG1C;CAGT,kBAAiC;CAEzC,cAAA;EACE,MAAM,QAAQ,OAAO,uBAAuB,EAAE,UAAU,KAAI,CAAE;EAC9D,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,yEAAyE;EAE3F,KAAK,QAAQ;EAEb,aAAY;GACV,KAAK,MAAM,UAAU,KAAK,MAAM,WAAW,KAAK,MAAK,CAAE;EACzD,CAAC;EAED,KAAK,sBAAsB,KAAK,MAAM,UAAU,gBAAe;GAC7D,IAAI,CAAC,KAAK,MAAM,UACd,KAAK,MAAM,OAAO,KAAK,MAAK,CAAE;EAElC,CAAC;CACH;CAEA,WAAQ;EACN,KAAK,mBAAmB,KAAK,MAAK,CAAE;CACtC;CAEA,YAAY,SAAsB;EAChC,IAAI,QAAQ,YAAY,KAAK,oBAAoB,MAC/C,KAAK,mBAAmB,KAAK,MAAK,CAAE;CAExC;CAGQ,mBAAmB,OAAa;EACtC,IAAI,UAAU,KAAK,iBACjB;EAEF,KAAK,MAAM,SAAS,KAAK;EACzB,MAAM,gBAAgB,KAAK;EAC3B,KAAK,kBAAkB;EACvB,IAAI,kBAAkB,MACpB,KAAK,MAAM,WAAW,aAAa;CAEvC;CAEA,cAAW;EACT,IAAI,KAAK,oBAAoB,MAC3B,KAAK,MAAM,WAAW,KAAK,eAAe;EAE5C,KAAK,oBAAoB,YAAW;CACtC;CAEU,eAAe,OAAY;EACnC,IAAI,EAAE,iBAAiB,iBAAiB,MAAM,gBAAgB,WAAW,KAAK,MAAM,UAClF;EAEF,KAAK,MAAM,MAAK;CAClB;CApEW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAA0B,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAA1B,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAA0B,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,WAAA,EAAA,gBAAA,yBAAA;GAAA,YAAA,EAAA,wBAAA,wBAAA;GAAA,gBAAA;EAAA;EAAA,eAAA;EAAA,gBAAA,CAAA;GAAA,WAzE1B;GAAqB,QAAA,CAAA,uBAAA,UAAA;EAAA,CAAA;EAAA,UAAA;CAAA,CAAA;;AAyErB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAA0B,YAAA,CAAA;EAdtC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,gBAAgB,CACd;IACE,WAAW;IACX,QAAQ,CAAC,+BAA+B;GACzC,CACF;GACD,MAAM;IACJ,OAAO;IACP,0BAA0B;IAC1B,kBAAkB;GACnB;EACF,CAAA;;;;;;;;;;;;;;;;;;;;;;ACpDD,MAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raqm-ui-hover-card.mjs","names":[],"sources":["../../../projects/ui/hover-card/hover-card-effects.ts","../../../projects/ui/hover-card/hover-card-model.ts","../../../projects/ui/hover-card/hover-card-intent.ts","../../../projects/ui/hover-card/hover-card-keyboard.ts","../../../projects/ui/hover-card/hover-card-overlay.ts","../../../projects/ui/hover-card/hover-card-position.ts","../../../projects/ui/hover-card/hover-card-view-state.ts","../../../projects/ui/hover-card/hover-card.ts","../../../projects/ui/hover-card/hover-card.html","../../../projects/ui/hover-card/hover-card.directive.ts","../../../projects/ui/hover-card/public-api.ts"],"sourcesContent":["// Hover card effects: the single reaction to the derived open state and its placement\r\n// inputs, registered from the component constructor.\r\n\r\nimport { TemplateRef, effect, untracked } from '@angular/core';\r\n\r\nimport type { RaqmHoverCardTriggerDirective } from './hover-card.directive';\r\nimport { RaqmHoverCardAlign, RaqmHoverCardRequestedSide } from './hover-card-model';\r\n\r\nexport interface RaqmHoverCardEffectsHost {\r\n open(): boolean;\r\n trigger(): RaqmHoverCardTriggerDirective | null;\r\n content(): unknown;\r\n panel(): TemplateRef<unknown> | undefined;\r\n side(): RaqmHoverCardRequestedSide;\r\n align(): RaqmHoverCardAlign;\r\n sideOffset(): number;\r\n alignOffset(): number;\r\n attach(): void;\r\n positionPane(): void;\r\n detach(): void;\r\n}\r\n\r\nexport function connectHoverCardEffects(host: RaqmHoverCardEffectsHost): void {\r\n effect(() => {\r\n const ready =\r\n host.open() &&\r\n host.trigger() !== null &&\r\n host.content() !== null &&\r\n host.panel() !== undefined;\r\n host.side();\r\n host.align();\r\n host.sideOffset();\r\n host.alignOffset();\r\n untracked(() => {\r\n if (ready) {\r\n host.attach();\r\n host.positionPane();\r\n } else host.detach();\r\n });\r\n });\r\n}\r\n","// Hover card model: the input value types, the defaults, the focus selector and the\r\n// transition timings every hover-card file reads.\r\n\r\n/** A physical side; logical inputs resolve to one of these before positioning. */\r\nexport type RaqmHoverCardSide = 'top' | 'bottom' | 'left' | 'right';\r\n\r\n/** A side as authored on the input; the two logical sides resolve against the live direction. */\r\nexport type RaqmHoverCardRequestedSide = RaqmHoverCardSide | 'inline-start' | 'inline-end';\r\n\r\n/** The popup alignment along the trigger's cross axis. */\r\nexport type RaqmHoverCardAlign = 'start' | 'center' | 'end';\r\n\r\nexport interface RaqmHoverCardPoint {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport const DEFAULT_SIDE: RaqmHoverCardRequestedSide = 'bottom';\r\nexport const DEFAULT_ALIGN: RaqmHoverCardAlign = 'center';\r\nexport const DEFAULT_SIDE_OFFSET: number = 4;\r\nexport const DEFAULT_ALIGN_OFFSET: number = 4;\r\n\r\n/** Fallback when the trigger supplies no close delay. */\r\nexport const DEFAULT_CLOSE_DELAY = 300;\r\n\r\n/** Content exit duration: equals `--raqm-duration-fast` (100ms) used by the exit transition. */\r\nexport const EXIT_ANIMATION_MS = 100;\r\n\r\n/** Candidates for the focus scans; the CDK `InteractivityChecker` decides actual tabbability. */\r\nexport const TABBABLE_SELECTOR =\r\n 'a[href], button, input, select, textarea, [tabindex], [contenteditable=\"true\"]';\r\n","// Hover card intent: the delayed open, the delayed close, the Escape listener and the\r\n// geometric transit corridor that protects slow or diagonal pointer movement.\r\n\r\nimport type { RaqmHoverCardTriggerDirective } from './hover-card.directive';\r\nimport { DEFAULT_CLOSE_DELAY, RaqmHoverCardPoint, RaqmHoverCardSide } from './hover-card-model';\r\nimport type { RaqmHoverCardOverlay } from './hover-card-overlay';\r\n\r\nexport interface RaqmHoverCardIntentHost {\r\n document: Document;\r\n open(): boolean;\r\n setOpen(value: boolean): void;\r\n destroyed(): boolean;\r\n trigger(): RaqmHoverCardTriggerDirective | null;\r\n overlay(): RaqmHoverCardOverlay;\r\n side(): RaqmHoverCardSide;\r\n detach(): void;\r\n}\r\n\r\nexport class RaqmHoverCardIntent {\r\n private openTimer?: ReturnType<typeof setTimeout>;\r\n private closeTimer?: ReturnType<typeof setTimeout>;\r\n private transit?: (event: PointerEvent) => void;\r\n private focusOwned = false;\r\n\r\n constructor(private readonly host: RaqmHoverCardIntentHost) {}\r\n\r\n requestOpen(fromFocus = false): void {\r\n if (fromFocus) this.focusOwned = true;\r\n this.cancelClose();\r\n this.clearTransit();\r\n const trigger = this.host.trigger();\r\n if (\r\n !trigger ||\r\n trigger.element.matches(':disabled') ||\r\n this.host.open() ||\r\n this.openTimer !== undefined\r\n )\r\n return;\r\n this.listenEscape();\r\n this.openTimer = setTimeout(() => {\r\n this.openTimer = undefined;\r\n if (!this.host.destroyed() && !trigger.element.matches(':disabled')) this.host.setOpen(true);\r\n }, trigger.delay());\r\n }\r\n\r\n /** Closes without restoring, stealing or trapping focus. */\r\n close(): void {\r\n this.focusOwned = false;\r\n this.cancelOpen();\r\n this.cancelClose();\r\n this.clearTransit();\r\n this.unlistenEscape();\r\n this.host.setOpen(false);\r\n this.host.detach();\r\n }\r\n\r\n focusOut(event: FocusEvent): void {\r\n const next = event.relatedTarget as Node | null;\r\n if (\r\n next &&\r\n (this.host.trigger()?.element.contains(next) || this.host.overlay().element?.contains(next))\r\n )\r\n return;\r\n this.close();\r\n }\r\n\r\n pointerEnter(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n this.cancelClose();\r\n this.clearTransit();\r\n }\r\n }\r\n\r\n contentFocus(): void {\r\n this.cancelClose();\r\n this.clearTransit();\r\n }\r\n\r\n /** A geometric corridor protects slow/diagonal transit, not just a short timeout. */\r\n pointerLeave(event: PointerEvent): void {\r\n if (event.pointerType !== 'mouse') return;\r\n if (this.focusOwned || this.host.overlay().element?.contains(this.host.document.activeElement))\r\n return;\r\n this.cancelOpen();\r\n this.clearTransit();\r\n const trigger = this.host.trigger()?.element;\r\n const surface = this.host.overlay().surface();\r\n if (!trigger || !surface) {\r\n this.unlistenEscape();\r\n return;\r\n }\r\n const fromContent = surface.contains(event.target as Node);\r\n const destination = fromContent ? trigger : surface;\r\n if (event.relatedTarget instanceof Node && destination.contains(event.relatedTarget)) return;\r\n const start = { x: event.clientX, y: event.clientY };\r\n this.scheduleClose();\r\n this.transit = (move) => {\r\n const a = trigger.getBoundingClientRect();\r\n const b = surface.getBoundingClientRect();\r\n const inside = (r: DOMRect) =>\r\n move.clientX >= r.left &&\r\n move.clientX <= r.right &&\r\n move.clientY >= r.top &&\r\n move.clientY <= r.bottom;\r\n if (inside(a) || inside(b)) {\r\n this.cancelClose();\r\n this.clearTransit();\r\n return;\r\n }\r\n const target = destination.getBoundingClientRect();\r\n const side = this.host.side();\r\n const vertical = side === 'top' || side === 'bottom';\r\n const edge = vertical\r\n ? fromContent\r\n ? side === 'bottom'\r\n ? target.bottom\r\n : target.top\r\n : side === 'bottom'\r\n ? target.top\r\n : target.bottom\r\n : fromContent\r\n ? side === 'right'\r\n ? target.right\r\n : target.left\r\n : side === 'right'\r\n ? target.left\r\n : target.right;\r\n const p = vertical ? { x: target.left - 1, y: edge } : { x: edge, y: target.top - 1 };\r\n const q = vertical ? { x: target.right + 1, y: edge } : { x: edge, y: target.bottom + 1 };\r\n const cross = (u: RaqmHoverCardPoint, v: RaqmHoverCardPoint, w: RaqmHoverCardPoint) =>\r\n (u.x - w.x) * (v.y - w.y) - (v.x - w.x) * (u.y - w.y);\r\n const point = { x: move.clientX, y: move.clientY };\r\n const signs = [cross(point, start, p), cross(point, p, q), cross(point, q, start)];\r\n const inTriangle = !(signs.some((n) => n < -1) && signs.some((n) => n > 1));\r\n const inTrough = vertical\r\n ? move.clientX >= Math.max(a.left, b.left) &&\r\n move.clientX <= Math.min(a.right, b.right) &&\r\n move.clientY >= Math.min(a.bottom, b.bottom) &&\r\n move.clientY <= Math.max(a.top, b.top)\r\n : move.clientY >= Math.max(a.top, b.top) &&\r\n move.clientY <= Math.min(a.bottom, b.bottom) &&\r\n move.clientX >= Math.min(a.right, b.right) &&\r\n move.clientX <= Math.max(a.left, b.left);\r\n if (inTriangle || inTrough) this.cancelClose();\r\n else {\r\n this.scheduleClose();\r\n this.clearTransit();\r\n }\r\n };\r\n this.host.document.addEventListener('pointermove', this.transit);\r\n }\r\n\r\n listenEscape(): void {\r\n this.host.document.addEventListener('keydown', this.escape);\r\n }\r\n\r\n unlistenEscape(): void {\r\n this.host.document.removeEventListener('keydown', this.escape);\r\n }\r\n\r\n /** Stops every pending intent without touching the model or the pane. */\r\n release(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n this.clearTransit();\r\n this.unlistenEscape();\r\n }\r\n\r\n private scheduleClose(): void {\r\n if (this.closeTimer !== undefined) return;\r\n this.closeTimer = setTimeout(() => {\r\n this.closeTimer = undefined;\r\n this.close();\r\n }, this.host.trigger()?.closeDelay() ?? DEFAULT_CLOSE_DELAY);\r\n }\r\n private cancelOpen(): void {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = undefined;\r\n }\r\n private cancelClose(): void {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = undefined;\r\n }\r\n private clearTransit(): void {\r\n if (this.transit) this.host.document.removeEventListener('pointermove', this.transit);\r\n this.transit = undefined;\r\n }\r\n private readonly escape = (event: KeyboardEvent): void => {\r\n if (event.key === 'Escape') {\r\n if (this.host.overlay().ref) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.close();\r\n }\r\n };\r\n}\r\n","// Hover card focus and keyboard: the trigger's forward Tab hand-off, the panel's Tab cycle\r\n// and the tabbable scan both rely on.\r\n\r\nimport { InteractivityChecker } from '@angular/cdk/a11y';\r\nimport type { OverlayRef } from '@angular/cdk/overlay';\r\n\r\nimport type { RaqmHoverCardTriggerDirective } from './hover-card.directive';\r\nimport { TABBABLE_SELECTOR } from './hover-card-model';\r\n\r\nexport interface RaqmHoverCardKeyboardHost {\r\n document: Document;\r\n trigger(): RaqmHoverCardTriggerDirective | null;\r\n overlayRef(): OverlayRef | undefined;\r\n}\r\n\r\nexport class RaqmHoverCardKeyboard {\r\n constructor(\r\n private readonly checker: InteractivityChecker,\r\n private readonly host: RaqmHoverCardKeyboardHost,\r\n ) {}\r\n\r\n onTriggerKeydown(event: KeyboardEvent): void {\r\n const ref = this.host.overlayRef();\r\n if (event.key !== 'Tab' || event.shiftKey || !ref) return;\r\n const first = this.tabbables(ref.overlayElement)[0];\r\n if (first) {\r\n event.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n\r\n onPanelKeydown(event: KeyboardEvent): void {\r\n const ref = this.host.overlayRef();\r\n if (event.key !== 'Tab' || !ref) return;\r\n const items = this.tabbables(ref.overlayElement);\r\n const active = this.host.document.activeElement;\r\n if (event.shiftKey && active === items[0]) {\r\n event.preventDefault();\r\n this.host.trigger()?.element.focus();\r\n } else if (!event.shiftKey && active === items.at(-1)) {\r\n const trigger = this.host.trigger()?.element;\r\n const all = this.tabbables(this.host.document.body).filter(\r\n (item) => !ref.overlayElement.contains(item),\r\n );\r\n const next = trigger ? all[all.indexOf(trigger) + 1] : undefined;\r\n if (next) {\r\n event.preventDefault();\r\n next.focus();\r\n }\r\n }\r\n }\r\n\r\n private tabbables(root: HTMLElement): HTMLElement[] {\r\n return Array.from(root.querySelectorAll<HTMLElement>(TABBABLE_SELECTOR)).filter((item) =>\r\n this.checker.isTabbable(item),\r\n );\r\n }\r\n}\r\n","// Hover card pane lifecycle: creation, reveal, the exit animation, teardown and the\r\n// subscriptions that keep an open card anchored.\r\n\r\nimport {\r\n AfterRenderRef,\r\n Injector,\r\n TemplateRef,\r\n ViewContainerRef,\r\n afterNextRender,\r\n} from '@angular/core';\r\n\r\nimport { FlexibleConnectedPositionStrategy, Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { registerOverlayOwnership } from '@raqm/ui/overlay-internal';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport type { RaqmHoverCardTriggerDirective } from './hover-card.directive';\r\nimport { EXIT_ANIMATION_MS } from './hover-card-model';\r\nimport { RaqmHoverCardPosition } from './hover-card-position';\r\nimport { RaqmHoverCardState } from './hover-card-view-state';\r\n\r\nexport interface RaqmHoverCardOverlayHost {\r\n /** The card root; its computed direction and document drive the pane. */\r\n root: HTMLElement;\r\n document: Document;\r\n container: ViewContainerRef;\r\n injector: Injector;\r\n trigger(): RaqmHoverCardTriggerDirective | null;\r\n panel(): TemplateRef<unknown> | undefined;\r\n close(): void;\r\n listenEscape(): void;\r\n /** Cancels the open/close timers and the transit listener, then drops the Escape listener. */\r\n releaseIntent(): void;\r\n}\r\n\r\nexport class RaqmHoverCardOverlay {\r\n private overlayRef?: OverlayRef;\r\n private strategy?: FlexibleConnectedPositionStrategy;\r\n private subscriptions = new Subscription();\r\n private render?: AfterRenderRef;\r\n private observer?: ResizeObserver;\r\n private exitTimer?: ReturnType<typeof setTimeout>;\r\n private exiting?: OverlayRef;\r\n\r\n constructor(\r\n private readonly overlay: Overlay,\r\n private readonly state: RaqmHoverCardState,\r\n private readonly position: RaqmHoverCardPosition,\r\n private readonly host: RaqmHoverCardOverlayHost,\r\n ) {}\r\n\r\n get element(): HTMLElement | undefined {\r\n return this.overlayRef?.overlayElement;\r\n }\r\n\r\n get ref(): OverlayRef | undefined {\r\n return this.overlayRef;\r\n }\r\n\r\n attach(): void {\r\n if (this.overlayRef || this.state.destroyed) return;\r\n const trigger = this.host.trigger();\r\n const panel = this.host.panel();\r\n if (!trigger || !panel) return;\r\n clearTimeout(this.exitTimer);\r\n this.exiting?.dispose();\r\n this.exiting = undefined;\r\n this.state.direction.set(this.computedDirection());\r\n this.strategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo(trigger.element)\r\n .withFlexibleDimensions(false)\r\n .withPush(true)\r\n .withViewportMargin(5)\r\n .withTransformOriginOn('.raqm-hover-card-content')\r\n .withPositions(this.position.positions());\r\n const ref = this.overlay.create({\r\n positionStrategy: this.strategy,\r\n hasBackdrop: false,\r\n direction: this.state.direction(),\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n disposeOnNavigation: true,\r\n });\r\n registerOverlayOwnership(trigger.element, ref);\r\n this.overlayRef = ref;\r\n this.subscriptions = new Subscription();\r\n this.subscriptions.add(\r\n this.strategy.positionChanges.subscribe((change) => {\r\n const side = this.position.sideFor(change.connectionPair);\r\n this.state.resolvedSide.set(side);\r\n }),\r\n );\r\n this.subscriptions.add(\r\n ref.outsidePointerEvents().subscribe((event) => {\r\n if (!trigger.element.contains(event.target as Node)) this.host.close();\r\n }),\r\n );\r\n this.subscriptions.add(ref.detachments().subscribe(() => this.host.close()));\r\n this.host.listenEscape();\r\n ref.attach(new TemplatePortal(panel, this.host.container));\r\n ref.overlayElement.style.visibility = 'hidden';\r\n this.render = afterNextRender(\r\n () => {\r\n this.render = undefined;\r\n if (this.overlayRef !== ref) return;\r\n this.positionPane();\r\n ref.overlayElement.style.visibility = '';\r\n this.surface()?.classList.add('raqm-hover-card-content--entering');\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.observer = new ResizeObserver(() => this.positionPane());\r\n this.observer.observe(trigger.element);\r\n const surface = this.surface();\r\n if (surface) this.observer.observe(surface);\r\n }\r\n },\r\n { injector: this.host.injector },\r\n );\r\n }\r\n\r\n /** Re-resolves direction and re-applies the candidate list before every placement pass. */\r\n positionPane(): void {\r\n const direction = this.computedDirection();\r\n this.state.direction.set(direction);\r\n this.overlayRef?.setDirection(direction);\r\n this.strategy?.withPositions(this.position.positions());\r\n this.overlayRef?.updatePosition();\r\n }\r\n\r\n surface(): HTMLElement | null {\r\n return this.overlayRef?.overlayElement.querySelector('.raqm-hover-card-content') ?? null;\r\n }\r\n\r\n detach(): void {\r\n this.host.releaseIntent();\r\n this.render?.destroy();\r\n this.render = undefined;\r\n this.observer?.disconnect();\r\n this.observer = undefined;\r\n this.subscriptions.unsubscribe();\r\n const ref = this.overlayRef;\r\n this.overlayRef = undefined;\r\n this.strategy = undefined;\r\n if (!ref) return;\r\n ref.overlayElement.setAttribute('inert', '');\r\n ref.overlayElement.setAttribute('aria-hidden', 'true');\r\n const surface = ref.overlayElement.querySelector('.raqm-hover-card-content');\r\n surface?.classList.remove('raqm-hover-card-content--entering');\r\n surface?.classList.add('raqm-hover-card-content--closing');\r\n if (\r\n this.state.destroyed ||\r\n this.host.document.defaultView?.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n )\r\n ref.dispose();\r\n else {\r\n this.exiting = ref;\r\n this.exitTimer = setTimeout(() => {\r\n ref.dispose();\r\n this.exiting = undefined;\r\n this.exitTimer = undefined;\r\n }, EXIT_ANIMATION_MS);\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.state.destroyed = true;\r\n this.detach();\r\n clearTimeout(this.exitTimer);\r\n this.exiting?.dispose();\r\n this.exiting = undefined;\r\n }\r\n\r\n private computedDirection(): 'ltr' | 'rtl' {\r\n return getComputedStyle(this.host.root).direction === 'rtl' ? 'rtl' : 'ltr';\r\n }\r\n}\r\n","// Hover card placement: the logical sides resolve against the live direction, and the chosen\r\n// candidate is reported back so the transit corridor knows which edge is shared.\r\n\r\nimport type { ConnectedPosition } from '@angular/cdk/overlay';\r\n\r\nimport {\r\n RaqmHoverCardAlign,\r\n RaqmHoverCardRequestedSide,\r\n RaqmHoverCardSide,\r\n} from './hover-card-model';\r\n\r\nexport interface RaqmHoverCardPositionHost {\r\n side(): RaqmHoverCardRequestedSide;\r\n align(): RaqmHoverCardAlign;\r\n sideOffset(): number;\r\n alignOffset(): number;\r\n direction(): 'ltr' | 'rtl';\r\n}\r\n\r\nexport class RaqmHoverCardPosition {\r\n // Candidate order and the matching sides; `positionChanges` reports by candidate identity.\r\n private positionSides: RaqmHoverCardSide[] = [];\r\n private currentPositions: ConnectedPosition[] = [];\r\n\r\n constructor(private readonly host: RaqmHoverCardPositionHost) {}\r\n\r\n /** The real side of a realized candidate pair, for the surface's `data-raqm-side`. */\r\n sideFor(pair: ConnectedPosition): RaqmHoverCardSide {\r\n return this.positionSides[this.currentPositions.indexOf(pair)] ?? 'bottom';\r\n }\r\n\r\n positions(): ConnectedPosition[] {\r\n const rtl = this.host.direction() === 'rtl';\r\n const requested = this.host.side();\r\n const side: RaqmHoverCardSide =\r\n requested === 'inline-start'\r\n ? rtl\r\n ? 'right'\r\n : 'left'\r\n : requested === 'inline-end'\r\n ? rtl\r\n ? 'left'\r\n : 'right'\r\n : requested;\r\n const opposite: Record<RaqmHoverCardSide, RaqmHoverCardSide> = {\r\n top: 'bottom',\r\n bottom: 'top',\r\n left: 'right',\r\n right: 'left',\r\n };\r\n this.positionSides = [side, opposite[side]];\r\n this.currentPositions = this.positionSides.map((value) => {\r\n const align = this.host.align();\r\n const rawMain = this.host.sideOffset();\r\n const rawCross = this.host.alignOffset();\r\n const main = Number.isFinite(rawMain) ? rawMain : 4;\r\n const cross = (Number.isFinite(rawCross) ? rawCross : 4) * (align === 'end' ? -1 : 1);\r\n if (value === 'top' || value === 'bottom')\r\n return {\r\n originX: align,\r\n overlayX: align,\r\n originY: value,\r\n overlayY: value === 'top' ? 'bottom' : 'top',\r\n offsetY: value === 'top' ? -main : main,\r\n offsetX: cross * (rtl ? -1 : 1),\r\n };\r\n const y = align === 'start' ? 'top' : align === 'end' ? 'bottom' : 'center';\r\n const end = value === 'right';\r\n return {\r\n originX: end !== rtl ? 'end' : 'start',\r\n overlayX: end !== rtl ? 'start' : 'end',\r\n originY: y,\r\n overlayY: y,\r\n offsetX: end ? main : -main,\r\n offsetY: cross,\r\n };\r\n });\r\n return this.currentPositions;\r\n }\r\n}\r\n","// Hover card state: the signals the template reads and the lifecycle flags shared by the\r\n// overlay, the intent timers and the placement pass.\r\n\r\nimport { signal } from '@angular/core';\r\n\r\nimport { RaqmHoverCardSide } from './hover-card-model';\r\n\r\nexport class RaqmHoverCardState {\r\n /** The live computed direction; re-read at attach and before every placement pass. */\r\n readonly direction = signal<'ltr' | 'rtl'>('ltr');\r\n\r\n /** The side of the realized candidate, so the surface can style the shared edge. */\r\n readonly resolvedSide = signal<RaqmHoverCardSide>('bottom');\r\n\r\n /** Set on destroy so a pending open timer never reopens a destroyed card. */\r\n destroyed = false;\r\n}\r\n","import { DOCUMENT, NgTemplateOutlet } from '@angular/common';\r\nimport { InteractivityChecker } from '@angular/cdk/a11y';\r\nimport { Overlay } from '@angular/cdk/overlay';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Injector,\r\n OnDestroy,\r\n TemplateRef,\r\n ViewContainerRef,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n numberAttribute,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { connectHoverCardEffects } from './hover-card-effects';\r\nimport { RaqmHoverCardIntent } from './hover-card-intent';\r\nimport { RaqmHoverCardKeyboard } from './hover-card-keyboard';\r\nimport {\r\n DEFAULT_ALIGN,\r\n DEFAULT_ALIGN_OFFSET,\r\n DEFAULT_SIDE,\r\n DEFAULT_SIDE_OFFSET,\r\n RaqmHoverCardAlign,\r\n RaqmHoverCardRequestedSide,\r\n} from './hover-card-model';\r\nimport { RaqmHoverCardOverlay } from './hover-card-overlay';\r\nimport { RaqmHoverCardPosition } from './hover-card-position';\r\nimport { RaqmHoverCardState } from './hover-card-view-state';\r\nimport type {\r\n RaqmHoverCardContentDirective,\r\n RaqmHoverCardTriggerDirective,\r\n} from './hover-card.directive';\r\n\r\n/** Nonmodal preview root: delayed intent, native activation and no focus theft. */\r\n@Component({\r\n selector: 'raqm-hover-card',\r\n imports: [NgTemplateOutlet],\r\n templateUrl: './hover-card.html',\r\n styleUrl: './hover-card.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RaqmHoverCardComponent implements OnDestroy {\r\n private readonly overlay = inject(Overlay);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly container = inject(ViewContainerRef);\r\n private readonly injector = inject(Injector);\r\n private readonly checker = inject(InteractivityChecker);\r\n private readonly panel = viewChild<TemplateRef<unknown>>('panel');\r\n readonly openValue = model<boolean | undefined>(undefined, { alias: 'open' });\r\n readonly defaultOpen = input(false, { transform: booleanAttribute });\r\n\r\n /** The preferred popup side; logical sides resolve against the live direction. */\r\n readonly side = input<RaqmHoverCardRequestedSide>(DEFAULT_SIDE);\r\n\r\n /** The popup alignment along the trigger's cross axis. */\r\n readonly align = input<RaqmHoverCardAlign>(DEFAULT_ALIGN);\r\n\r\n /** The distance in pixels between the trigger and the card. */\r\n readonly sideOffset = input(DEFAULT_SIDE_OFFSET, { transform: numberAttribute });\r\n\r\n /** The distance in pixels along the alignment axis. */\r\n readonly alignOffset = input(DEFAULT_ALIGN_OFFSET, { transform: numberAttribute });\r\n\r\n readonly open = computed(() => this.openValue() ?? this.defaultOpen());\r\n private readonly trigger = signal<RaqmHoverCardTriggerDirective | null>(null);\r\n protected readonly content = signal<RaqmHoverCardContentDirective | null>(null);\r\n private readonly state = new RaqmHoverCardState();\r\n protected readonly direction = this.state.direction;\r\n protected readonly resolvedSide = this.state.resolvedSide;\r\n\r\n private readonly positionController = new RaqmHoverCardPosition({\r\n side: () => this.side(),\r\n align: () => this.align(),\r\n sideOffset: () => this.sideOffset(),\r\n alignOffset: () => this.alignOffset(),\r\n direction: () => this.state.direction(),\r\n });\r\n\r\n private readonly layer = new RaqmHoverCardOverlay(\r\n this.overlay,\r\n this.state,\r\n this.positionController,\r\n {\r\n root: this.host.nativeElement,\r\n document: this.document,\r\n container: this.container,\r\n injector: this.injector,\r\n trigger: () => this.trigger(),\r\n panel: () => this.panel(),\r\n close: () => this.close(),\r\n listenEscape: () => this.intent.listenEscape(),\r\n releaseIntent: () => this.intent.release(),\r\n },\r\n );\r\n\r\n private readonly keyboard = new RaqmHoverCardKeyboard(this.checker, {\r\n document: this.document,\r\n trigger: () => this.trigger(),\r\n overlayRef: () => this.layer.ref,\r\n });\r\n\r\n private readonly intent = new RaqmHoverCardIntent({\r\n document: this.document,\r\n open: () => this.open(),\r\n setOpen: (value) => this.openValue.set(value),\r\n destroyed: () => this.state.destroyed,\r\n trigger: () => this.trigger(),\r\n overlay: () => this.layer,\r\n side: () => this.state.resolvedSide(),\r\n detach: () => this.layer.detach(),\r\n });\r\n\r\n constructor() {\r\n connectHoverCardEffects({\r\n open: () => this.open(),\r\n trigger: () => this.trigger(),\r\n content: () => this.content(),\r\n panel: () => this.panel(),\r\n side: () => this.side(),\r\n align: () => this.align(),\r\n sideOffset: () => this.sideOffset(),\r\n alignOffset: () => this.alignOffset(),\r\n attach: () => this.layer.attach(),\r\n positionPane: () => this.layer.positionPane(),\r\n detach: () => this.layer.detach(),\r\n });\r\n }\r\n\r\n registerTrigger(trigger: RaqmHoverCardTriggerDirective): void {\r\n if (this.trigger()) throw new Error('Only one Hover Card trigger is supported per root.');\r\n this.trigger.set(trigger);\r\n }\r\n unregisterTrigger(trigger: RaqmHoverCardTriggerDirective): void {\r\n if (this.trigger() === trigger) {\r\n this.close();\r\n this.trigger.set(null);\r\n }\r\n }\r\n registerContent(content: RaqmHoverCardContentDirective): void {\r\n if (this.content())\r\n throw new Error('Only one Hover Card content template is supported per root.');\r\n this.content.set(content);\r\n }\r\n unregisterContent(content: RaqmHoverCardContentDirective): void {\r\n if (this.content() === content) {\r\n this.close();\r\n this.content.set(null);\r\n }\r\n }\r\n\r\n requestOpen(fromFocus = false): void {\r\n this.intent.requestOpen(fromFocus);\r\n }\r\n\r\n /** Closes without restoring, stealing or trapping focus. */\r\n close(): void {\r\n this.intent.close();\r\n }\r\n\r\n focusOut(event: FocusEvent): void {\r\n this.intent.focusOut(event);\r\n }\r\n\r\n triggerKeydown(event: KeyboardEvent): void {\r\n this.keyboard.onTriggerKeydown(event);\r\n }\r\n\r\n protected panelKeydown(event: KeyboardEvent): void {\r\n this.keyboard.onPanelKeydown(event);\r\n }\r\n\r\n protected pointerEnter(event: PointerEvent): void {\r\n this.intent.pointerEnter(event);\r\n }\r\n\r\n protected contentFocus(): void {\r\n this.intent.contentFocus();\r\n }\r\n\r\n /** A geometric corridor protects slow/diagonal transit, not just a short timeout. */\r\n pointerLeave(event: PointerEvent): void {\r\n this.intent.pointerLeave(event);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.layer.destroy();\r\n }\r\n}\r\n","<ng-content />\r\n<ng-template #panel>\r\n <div\r\n class=\"raqm-hover-card-content\"\r\n tabindex=\"-1\"\r\n [dir]=\"direction()\"\r\n [attr.data-raqm-side]=\"resolvedSide()\"\r\n (pointerenter)=\"pointerEnter($event)\"\r\n (pointerleave)=\"pointerLeave($event)\"\r\n (focusout)=\"focusOut($event)\"\r\n (focusin)=\"contentFocus()\"\r\n (keydown)=\"panelKeydown($event)\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"content()?.template ?? null\" />\r\n </div>\r\n</ng-template>\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n TemplateRef,\r\n inject,\r\n input,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { RaqmHoverCardComponent } from './hover-card';\r\n\r\nfunction delay(fallback: number): (value: unknown) => number {\r\n return (value) => {\r\n const parsed = numberAttribute(value, fallback);\r\n return Number.isFinite(parsed) ? Math.max(0, parsed) : fallback;\r\n };\r\n}\r\n\r\n/** A native link or button; hover/focus intent never replaces native activation. */\r\n@Directive({\r\n selector: 'a[raqm-hover-card-trigger], button[raqm-hover-card-trigger]',\r\n host: {\r\n '(pointerenter)': 'enter($event)',\r\n '(pointerleave)': 'leave($event)',\r\n '(focus)': 'focus()',\r\n '(blur)': 'blur($event)',\r\n '(keydown)': 'keydown($event)',\r\n },\r\n})\r\nexport class RaqmHoverCardTriggerDirective {\r\n readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n protected readonly card = inject(RaqmHoverCardComponent);\r\n readonly delay = input(600, { transform: delay(600) });\r\n readonly closeDelay = input(300, { transform: delay(300) });\r\n\r\n constructor() {\r\n if (this.element instanceof HTMLButtonElement && !this.element.hasAttribute('type')) {\r\n this.element.setAttribute('type', 'button');\r\n }\r\n this.card.registerTrigger(this);\r\n inject(DestroyRef).onDestroy(() => this.card.unregisterTrigger(this));\r\n }\r\n\r\n protected enter(event: Event): void {\r\n const pointer = event as PointerEvent;\r\n if (pointer.pointerType === 'mouse') this.card.requestOpen();\r\n }\r\n\r\n protected leave(event: Event): void {\r\n const pointer = event as PointerEvent;\r\n if (pointer.pointerType === 'mouse') this.card.pointerLeave(pointer);\r\n }\r\n\r\n protected blur(event: Event): void {\r\n this.card.focusOut(event as FocusEvent);\r\n }\r\n protected keydown(event: Event): void {\r\n this.card.triggerKeydown(event as KeyboardEvent);\r\n }\r\n\r\n protected focus(): void {\r\n if (this.element.matches(':focus-visible')) this.card.requestOpen(true);\r\n }\r\n}\r\n\r\n/** The portalled content template; the root owns placement. */\r\n@Directive({ selector: 'ng-template[raqm-hover-card-content]' })\r\nexport class RaqmHoverCardContentDirective {\r\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n private readonly card = inject(RaqmHoverCardComponent);\r\n\r\n constructor() {\r\n this.card.registerContent(this);\r\n inject(DestroyRef).onDestroy(() => this.card.unregisterContent(this));\r\n }\r\n}\r\n","import { RaqmHoverCardComponent } from './hover-card';\r\nimport {\r\n RaqmHoverCardTriggerDirective,\r\n RaqmHoverCardContentDirective,\r\n} from './hover-card.directive';\r\n\r\nexport { RaqmHoverCardComponent, RaqmHoverCardTriggerDirective, RaqmHoverCardContentDirective };\r\nexport const RaqmHoverCard = [\r\n RaqmHoverCardComponent,\r\n RaqmHoverCardTriggerDirective,\r\n RaqmHoverCardContentDirective,\r\n] as const;\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raqm-ui-hover-card.mjs","names":["pointer"],"sources":["../../../projects/ui/hover-card/hover-card-effects.ts","../../../projects/ui/hover-card/hover-card-model.ts","../../../projects/ui/hover-card/hover-card-intent.ts","../../../projects/ui/hover-card/hover-card-keyboard.ts","../../../projects/ui/hover-card/hover-card-overlay.ts","../../../projects/ui/hover-card/hover-card-position.ts","../../../projects/ui/hover-card/hover-card-view-state.ts","../../../projects/ui/hover-card/hover-card.ts","../../../projects/ui/hover-card/hover-card.html","../../../projects/ui/hover-card/hover-card.directive.ts","../../../projects/ui/hover-card/public-api.ts"],"sourcesContent":["// Hover card effects: the single reaction to the derived open state and its placement\r\n// inputs, registered from the component constructor.\r\n\r\nimport { TemplateRef, effect, untracked } from '@angular/core';\r\n\r\nimport type { RaqmHoverCardTriggerDirective } from './hover-card.directive';\r\nimport { RaqmHoverCardAlign, RaqmHoverCardRequestedSide } from './hover-card-model';\r\n\r\nexport interface RaqmHoverCardEffectsHost {\r\n open(): boolean;\r\n trigger(): RaqmHoverCardTriggerDirective | null;\r\n content(): unknown;\r\n panel(): TemplateRef<unknown> | undefined;\r\n side(): RaqmHoverCardRequestedSide;\r\n align(): RaqmHoverCardAlign;\r\n sideOffset(): number;\r\n alignOffset(): number;\r\n attach(): void;\r\n positionPane(): void;\r\n detach(): void;\r\n}\r\n\r\nexport function connectHoverCardEffects(host: RaqmHoverCardEffectsHost): void {\r\n effect(() => {\r\n const ready =\r\n host.open() &&\r\n host.trigger() !== null &&\r\n host.content() !== null &&\r\n host.panel() !== undefined;\r\n host.side();\r\n host.align();\r\n host.sideOffset();\r\n host.alignOffset();\r\n untracked(() => {\r\n if (ready) {\r\n host.attach();\r\n host.positionPane();\r\n } else host.detach();\r\n });\r\n });\r\n}\r\n","// Hover card model: the input value types, the defaults, the focus selector and the\r\n// transition timings every hover-card file reads.\r\n\r\n/** A physical side; logical inputs resolve to one of these before positioning. */\r\nexport type RaqmHoverCardSide = 'top' | 'bottom' | 'left' | 'right';\r\n\r\n/** A side as authored on the input; the two logical sides resolve against the live direction. */\r\nexport type RaqmHoverCardRequestedSide = RaqmHoverCardSide | 'inline-start' | 'inline-end';\r\n\r\n/** The popup alignment along the trigger's cross axis. */\r\nexport type RaqmHoverCardAlign = 'start' | 'center' | 'end';\r\n\r\nexport interface RaqmHoverCardPoint {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport const DEFAULT_SIDE: RaqmHoverCardRequestedSide = 'bottom';\r\nexport const DEFAULT_ALIGN: RaqmHoverCardAlign = 'center';\r\nexport const DEFAULT_SIDE_OFFSET: number = 4;\r\nexport const DEFAULT_ALIGN_OFFSET: number = 4;\r\n\r\n/** Fallback when the trigger supplies no close delay. */\r\nexport const DEFAULT_CLOSE_DELAY = 300;\r\n\r\n/** Content exit duration: equals `--raqm-duration-fast` (100ms) used by the exit transition. */\r\nexport const EXIT_ANIMATION_MS = 100;\r\n\r\n/** Candidates for the focus scans; the CDK `InteractivityChecker` decides actual tabbability. */\r\nexport const TABBABLE_SELECTOR =\r\n 'a[href], button, input, select, textarea, [tabindex], [contenteditable=\"true\"]';\r\n","// Hover card intent: the delayed open, the delayed close, the Escape listener and the\r\n// geometric transit corridor that protects slow or diagonal pointer movement.\r\n\r\nimport type { RaqmHoverCardTriggerDirective } from './hover-card.directive';\r\nimport { DEFAULT_CLOSE_DELAY, RaqmHoverCardPoint, RaqmHoverCardSide } from './hover-card-model';\r\nimport type { RaqmHoverCardOverlay } from './hover-card-overlay';\r\n\r\nexport interface RaqmHoverCardIntentHost {\r\n document: Document;\r\n open(): boolean;\r\n setOpen(value: boolean): void;\r\n destroyed(): boolean;\r\n trigger(): RaqmHoverCardTriggerDirective | null;\r\n overlay(): RaqmHoverCardOverlay;\r\n side(): RaqmHoverCardSide;\r\n detach(): void;\r\n}\r\n\r\nexport class RaqmHoverCardIntent {\r\n private openTimer?: ReturnType<typeof setTimeout>;\r\n private closeTimer?: ReturnType<typeof setTimeout>;\r\n private transit?: (event: PointerEvent) => void;\r\n private focusOwned = false;\r\n\r\n constructor(private readonly host: RaqmHoverCardIntentHost) {}\r\n\r\n requestOpen(fromFocus = false): void {\r\n if (fromFocus) this.focusOwned = true;\r\n this.cancelClose();\r\n this.clearTransit();\r\n const trigger = this.host.trigger();\r\n if (\r\n !trigger ||\r\n trigger.element.matches(':disabled') ||\r\n this.host.open() ||\r\n this.openTimer !== undefined\r\n )\r\n return;\r\n this.listenEscape();\r\n this.openTimer = setTimeout(() => {\r\n this.openTimer = undefined;\r\n if (!this.host.destroyed() && !trigger.element.matches(':disabled')) this.host.setOpen(true);\r\n }, trigger.delay());\r\n }\r\n\r\n /** Closes without restoring, stealing or trapping focus. */\r\n close(): void {\r\n this.focusOwned = false;\r\n this.cancelOpen();\r\n this.cancelClose();\r\n this.clearTransit();\r\n this.unlistenEscape();\r\n this.host.setOpen(false);\r\n this.host.detach();\r\n }\r\n\r\n focusOut(event: FocusEvent): void {\r\n const next = event.relatedTarget as Node | null;\r\n if (\r\n next &&\r\n (this.host.trigger()?.element.contains(next) || this.host.overlay().element?.contains(next))\r\n )\r\n return;\r\n this.close();\r\n }\r\n\r\n pointerEnter(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n this.cancelClose();\r\n this.clearTransit();\r\n }\r\n }\r\n\r\n contentFocus(): void {\r\n this.cancelClose();\r\n this.clearTransit();\r\n }\r\n\r\n /** A geometric corridor protects slow/diagonal transit, not just a short timeout. */\r\n pointerLeave(event: PointerEvent): void {\r\n if (event.pointerType !== 'mouse') return;\r\n if (this.focusOwned || this.host.overlay().element?.contains(this.host.document.activeElement))\r\n return;\r\n this.cancelOpen();\r\n this.clearTransit();\r\n const trigger = this.host.trigger()?.element;\r\n const surface = this.host.overlay().surface();\r\n if (!trigger || !surface) {\r\n this.unlistenEscape();\r\n return;\r\n }\r\n const fromContent = surface.contains(event.target as Node);\r\n const destination = fromContent ? trigger : surface;\r\n if (event.relatedTarget instanceof Node && destination.contains(event.relatedTarget)) return;\r\n const start = { x: event.clientX, y: event.clientY };\r\n this.scheduleClose();\r\n this.transit = (move) => {\r\n const a = trigger.getBoundingClientRect();\r\n const b = surface.getBoundingClientRect();\r\n const inside = (r: DOMRect) =>\r\n move.clientX >= r.left &&\r\n move.clientX <= r.right &&\r\n move.clientY >= r.top &&\r\n move.clientY <= r.bottom;\r\n if (inside(a) || inside(b)) {\r\n this.cancelClose();\r\n this.clearTransit();\r\n return;\r\n }\r\n const target = destination.getBoundingClientRect();\r\n const side = this.host.side();\r\n const vertical = side === 'top' || side === 'bottom';\r\n const edge = vertical\r\n ? fromContent\r\n ? side === 'bottom'\r\n ? target.bottom\r\n : target.top\r\n : side === 'bottom'\r\n ? target.top\r\n : target.bottom\r\n : fromContent\r\n ? side === 'right'\r\n ? target.right\r\n : target.left\r\n : side === 'right'\r\n ? target.left\r\n : target.right;\r\n const p = vertical ? { x: target.left - 1, y: edge } : { x: edge, y: target.top - 1 };\r\n const q = vertical ? { x: target.right + 1, y: edge } : { x: edge, y: target.bottom + 1 };\r\n const cross = (u: RaqmHoverCardPoint, v: RaqmHoverCardPoint, w: RaqmHoverCardPoint) =>\r\n (u.x - w.x) * (v.y - w.y) - (v.x - w.x) * (u.y - w.y);\r\n const point = { x: move.clientX, y: move.clientY };\r\n const signs = [cross(point, start, p), cross(point, p, q), cross(point, q, start)];\r\n const inTriangle = !(signs.some((n) => n < -1) && signs.some((n) => n > 1));\r\n const inTrough = vertical\r\n ? move.clientX >= Math.max(a.left, b.left) &&\r\n move.clientX <= Math.min(a.right, b.right) &&\r\n move.clientY >= Math.min(a.bottom, b.bottom) &&\r\n move.clientY <= Math.max(a.top, b.top)\r\n : move.clientY >= Math.max(a.top, b.top) &&\r\n move.clientY <= Math.min(a.bottom, b.bottom) &&\r\n move.clientX >= Math.min(a.right, b.right) &&\r\n move.clientX <= Math.max(a.left, b.left);\r\n if (inTriangle || inTrough) this.cancelClose();\r\n else {\r\n this.scheduleClose();\r\n this.clearTransit();\r\n }\r\n };\r\n this.host.document.addEventListener('pointermove', this.transit);\r\n }\r\n\r\n listenEscape(): void {\r\n this.host.document.addEventListener('keydown', this.escape);\r\n }\r\n\r\n unlistenEscape(): void {\r\n this.host.document.removeEventListener('keydown', this.escape);\r\n }\r\n\r\n /** Stops every pending intent without touching the model or the pane. */\r\n release(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n this.clearTransit();\r\n this.unlistenEscape();\r\n }\r\n\r\n private scheduleClose(): void {\r\n if (this.closeTimer !== undefined) return;\r\n this.closeTimer = setTimeout(() => {\r\n this.closeTimer = undefined;\r\n this.close();\r\n }, this.host.trigger()?.closeDelay() ?? DEFAULT_CLOSE_DELAY);\r\n }\r\n private cancelOpen(): void {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = undefined;\r\n }\r\n private cancelClose(): void {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = undefined;\r\n }\r\n private clearTransit(): void {\r\n if (this.transit) this.host.document.removeEventListener('pointermove', this.transit);\r\n this.transit = undefined;\r\n }\r\n private readonly escape = (event: KeyboardEvent): void => {\r\n if (event.key === 'Escape') {\r\n if (this.host.overlay().ref) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.close();\r\n }\r\n };\r\n}\r\n","// Hover card focus and keyboard: the trigger's forward Tab hand-off, the panel's Tab cycle\r\n// and the tabbable scan both rely on.\r\n\r\nimport { InteractivityChecker } from '@angular/cdk/a11y';\r\nimport type { OverlayRef } from '@angular/cdk/overlay';\r\n\r\nimport type { RaqmHoverCardTriggerDirective } from './hover-card.directive';\r\nimport { TABBABLE_SELECTOR } from './hover-card-model';\r\n\r\nexport interface RaqmHoverCardKeyboardHost {\r\n document: Document;\r\n trigger(): RaqmHoverCardTriggerDirective | null;\r\n overlayRef(): OverlayRef | undefined;\r\n}\r\n\r\nexport class RaqmHoverCardKeyboard {\r\n constructor(\r\n private readonly checker: InteractivityChecker,\r\n private readonly host: RaqmHoverCardKeyboardHost,\r\n ) {}\r\n\r\n onTriggerKeydown(event: KeyboardEvent): void {\r\n const ref = this.host.overlayRef();\r\n if (event.key !== 'Tab' || event.shiftKey || !ref) return;\r\n const first = this.tabbables(ref.overlayElement)[0];\r\n if (first) {\r\n event.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n\r\n onPanelKeydown(event: KeyboardEvent): void {\r\n const ref = this.host.overlayRef();\r\n if (event.key !== 'Tab' || !ref) return;\r\n const items = this.tabbables(ref.overlayElement);\r\n const active = this.host.document.activeElement;\r\n if (event.shiftKey && active === items[0]) {\r\n event.preventDefault();\r\n this.host.trigger()?.element.focus();\r\n } else if (!event.shiftKey && active === items.at(-1)) {\r\n const trigger = this.host.trigger()?.element;\r\n const all = this.tabbables(this.host.document.body).filter(\r\n (item) => !ref.overlayElement.contains(item),\r\n );\r\n const next = trigger ? all[all.indexOf(trigger) + 1] : undefined;\r\n if (next) {\r\n event.preventDefault();\r\n next.focus();\r\n }\r\n }\r\n }\r\n\r\n private tabbables(root: HTMLElement): HTMLElement[] {\r\n return Array.from(root.querySelectorAll<HTMLElement>(TABBABLE_SELECTOR)).filter((item) =>\r\n this.checker.isTabbable(item),\r\n );\r\n }\r\n}\r\n","// Hover card pane lifecycle: creation, reveal, the exit animation, teardown and the\r\n// subscriptions that keep an open card anchored.\r\n\r\nimport {\r\n AfterRenderRef,\r\n Injector,\r\n TemplateRef,\r\n ViewContainerRef,\r\n afterNextRender,\r\n} from '@angular/core';\r\n\r\nimport { FlexibleConnectedPositionStrategy, Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { registerOverlayOwnership } from '@raqm/ui/overlay-internal';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport type { RaqmHoverCardTriggerDirective } from './hover-card.directive';\r\nimport { EXIT_ANIMATION_MS } from './hover-card-model';\r\nimport { RaqmHoverCardPosition } from './hover-card-position';\r\nimport { RaqmHoverCardState } from './hover-card-view-state';\r\n\r\nexport interface RaqmHoverCardOverlayHost {\r\n /** The card root; its computed direction and document drive the pane. */\r\n root: HTMLElement;\r\n document: Document;\r\n container: ViewContainerRef;\r\n injector: Injector;\r\n trigger(): RaqmHoverCardTriggerDirective | null;\r\n panel(): TemplateRef<unknown> | undefined;\r\n close(): void;\r\n listenEscape(): void;\r\n /** Cancels the open/close timers and the transit listener, then drops the Escape listener. */\r\n releaseIntent(): void;\r\n}\r\n\r\nexport class RaqmHoverCardOverlay {\r\n private overlayRef?: OverlayRef;\r\n private strategy?: FlexibleConnectedPositionStrategy;\r\n private subscriptions = new Subscription();\r\n private render?: AfterRenderRef;\r\n private observer?: ResizeObserver;\r\n private exitTimer?: ReturnType<typeof setTimeout>;\r\n private exiting?: OverlayRef;\r\n\r\n constructor(\r\n private readonly overlay: Overlay,\r\n private readonly state: RaqmHoverCardState,\r\n private readonly position: RaqmHoverCardPosition,\r\n private readonly host: RaqmHoverCardOverlayHost,\r\n ) {}\r\n\r\n get element(): HTMLElement | undefined {\r\n return this.overlayRef?.overlayElement;\r\n }\r\n\r\n get ref(): OverlayRef | undefined {\r\n return this.overlayRef;\r\n }\r\n\r\n attach(): void {\r\n if (this.overlayRef || this.state.destroyed) return;\r\n const trigger = this.host.trigger();\r\n const panel = this.host.panel();\r\n if (!trigger || !panel) return;\r\n clearTimeout(this.exitTimer);\r\n this.exiting?.dispose();\r\n this.exiting = undefined;\r\n this.state.direction.set(this.computedDirection());\r\n this.strategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo(trigger.element)\r\n .withFlexibleDimensions(false)\r\n .withPush(true)\r\n .withViewportMargin(5)\r\n .withTransformOriginOn('.raqm-hover-card-content')\r\n .withPositions(this.position.positions());\r\n const ref = this.overlay.create({\r\n positionStrategy: this.strategy,\r\n hasBackdrop: false,\r\n direction: this.state.direction(),\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n disposeOnNavigation: true,\r\n });\r\n registerOverlayOwnership(trigger.element, ref);\r\n this.overlayRef = ref;\r\n this.subscriptions = new Subscription();\r\n this.subscriptions.add(\r\n this.strategy.positionChanges.subscribe((change) => {\r\n const side = this.position.sideFor(change.connectionPair);\r\n this.state.resolvedSide.set(side);\r\n }),\r\n );\r\n this.subscriptions.add(\r\n ref.outsidePointerEvents().subscribe((event) => {\r\n if (!trigger.element.contains(event.target as Node)) this.host.close();\r\n }),\r\n );\r\n this.subscriptions.add(ref.detachments().subscribe(() => this.host.close()));\r\n this.host.listenEscape();\r\n ref.attach(new TemplatePortal(panel, this.host.container));\r\n ref.overlayElement.style.visibility = 'hidden';\r\n this.render = afterNextRender(\r\n () => {\r\n this.render = undefined;\r\n if (this.overlayRef !== ref) return;\r\n this.positionPane();\r\n ref.overlayElement.style.visibility = '';\r\n this.surface()?.classList.add('raqm-hover-card-content--entering');\r\n if (typeof ResizeObserver !== 'undefined') {\r\n this.observer = new ResizeObserver(() => this.positionPane());\r\n this.observer.observe(trigger.element);\r\n const surface = this.surface();\r\n if (surface) this.observer.observe(surface);\r\n }\r\n },\r\n { injector: this.host.injector },\r\n );\r\n }\r\n\r\n /** Re-resolves direction and re-applies the candidate list before every placement pass. */\r\n positionPane(): void {\r\n const direction = this.computedDirection();\r\n this.state.direction.set(direction);\r\n this.overlayRef?.setDirection(direction);\r\n this.strategy?.withPositions(this.position.positions());\r\n this.overlayRef?.updatePosition();\r\n }\r\n\r\n surface(): HTMLElement | null {\r\n return this.overlayRef?.overlayElement.querySelector('.raqm-hover-card-content') ?? null;\r\n }\r\n\r\n detach(): void {\r\n this.host.releaseIntent();\r\n this.render?.destroy();\r\n this.render = undefined;\r\n this.observer?.disconnect();\r\n this.observer = undefined;\r\n this.subscriptions.unsubscribe();\r\n const ref = this.overlayRef;\r\n this.overlayRef = undefined;\r\n this.strategy = undefined;\r\n if (!ref) return;\r\n ref.overlayElement.setAttribute('inert', '');\r\n ref.overlayElement.setAttribute('aria-hidden', 'true');\r\n const surface = ref.overlayElement.querySelector('.raqm-hover-card-content');\r\n surface?.classList.remove('raqm-hover-card-content--entering');\r\n surface?.classList.add('raqm-hover-card-content--closing');\r\n if (\r\n this.state.destroyed ||\r\n this.host.document.defaultView?.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n )\r\n ref.dispose();\r\n else {\r\n this.exiting = ref;\r\n this.exitTimer = setTimeout(() => {\r\n ref.dispose();\r\n this.exiting = undefined;\r\n this.exitTimer = undefined;\r\n }, EXIT_ANIMATION_MS);\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.state.destroyed = true;\r\n this.detach();\r\n clearTimeout(this.exitTimer);\r\n this.exiting?.dispose();\r\n this.exiting = undefined;\r\n }\r\n\r\n private computedDirection(): 'ltr' | 'rtl' {\r\n return getComputedStyle(this.host.root).direction === 'rtl' ? 'rtl' : 'ltr';\r\n }\r\n}\r\n","// Hover card placement: the logical sides resolve against the live direction, and the chosen\r\n// candidate is reported back so the transit corridor knows which edge is shared.\r\n\r\nimport type { ConnectedPosition } from '@angular/cdk/overlay';\r\n\r\nimport {\r\n RaqmHoverCardAlign,\r\n RaqmHoverCardRequestedSide,\r\n RaqmHoverCardSide,\r\n} from './hover-card-model';\r\n\r\nexport interface RaqmHoverCardPositionHost {\r\n side(): RaqmHoverCardRequestedSide;\r\n align(): RaqmHoverCardAlign;\r\n sideOffset(): number;\r\n alignOffset(): number;\r\n direction(): 'ltr' | 'rtl';\r\n}\r\n\r\nexport class RaqmHoverCardPosition {\r\n // Candidate order and the matching sides; `positionChanges` reports by candidate identity.\r\n private positionSides: RaqmHoverCardSide[] = [];\r\n private currentPositions: ConnectedPosition[] = [];\r\n\r\n constructor(private readonly host: RaqmHoverCardPositionHost) {}\r\n\r\n /** The real side of a realized candidate pair, for the surface's `data-raqm-side`. */\r\n sideFor(pair: ConnectedPosition): RaqmHoverCardSide {\r\n return this.positionSides[this.currentPositions.indexOf(pair)] ?? 'bottom';\r\n }\r\n\r\n positions(): ConnectedPosition[] {\r\n const rtl = this.host.direction() === 'rtl';\r\n const requested = this.host.side();\r\n const side: RaqmHoverCardSide =\r\n requested === 'inline-start'\r\n ? rtl\r\n ? 'right'\r\n : 'left'\r\n : requested === 'inline-end'\r\n ? rtl\r\n ? 'left'\r\n : 'right'\r\n : requested;\r\n const opposite: Record<RaqmHoverCardSide, RaqmHoverCardSide> = {\r\n top: 'bottom',\r\n bottom: 'top',\r\n left: 'right',\r\n right: 'left',\r\n };\r\n this.positionSides = [side, opposite[side]];\r\n this.currentPositions = this.positionSides.map((value) => {\r\n const align = this.host.align();\r\n const rawMain = this.host.sideOffset();\r\n const rawCross = this.host.alignOffset();\r\n const main = Number.isFinite(rawMain) ? rawMain : 4;\r\n const cross = (Number.isFinite(rawCross) ? rawCross : 4) * (align === 'end' ? -1 : 1);\r\n if (value === 'top' || value === 'bottom')\r\n return {\r\n originX: align,\r\n overlayX: align,\r\n originY: value,\r\n overlayY: value === 'top' ? 'bottom' : 'top',\r\n offsetY: value === 'top' ? -main : main,\r\n offsetX: cross * (rtl ? -1 : 1),\r\n };\r\n const y = align === 'start' ? 'top' : align === 'end' ? 'bottom' : 'center';\r\n const end = value === 'right';\r\n return {\r\n originX: end !== rtl ? 'end' : 'start',\r\n overlayX: end !== rtl ? 'start' : 'end',\r\n originY: y,\r\n overlayY: y,\r\n offsetX: end ? main : -main,\r\n offsetY: cross,\r\n };\r\n });\r\n return this.currentPositions;\r\n }\r\n}\r\n","// Hover card state: the signals the template reads and the lifecycle flags shared by the\r\n// overlay, the intent timers and the placement pass.\r\n\r\nimport { signal } from '@angular/core';\r\n\r\nimport { RaqmHoverCardSide } from './hover-card-model';\r\n\r\nexport class RaqmHoverCardState {\r\n /** The live computed direction; re-read at attach and before every placement pass. */\r\n readonly direction = signal<'ltr' | 'rtl'>('ltr');\r\n\r\n /** The side of the realized candidate, so the surface can style the shared edge. */\r\n readonly resolvedSide = signal<RaqmHoverCardSide>('bottom');\r\n\r\n /** Set on destroy so a pending open timer never reopens a destroyed card. */\r\n destroyed = false;\r\n}\r\n","import { DOCUMENT, NgTemplateOutlet } from '@angular/common';\r\nimport { InteractivityChecker } from '@angular/cdk/a11y';\r\nimport { Overlay } from '@angular/cdk/overlay';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Injector,\r\n OnDestroy,\r\n TemplateRef,\r\n ViewContainerRef,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n model,\r\n numberAttribute,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { connectHoverCardEffects } from './hover-card-effects';\r\nimport { RaqmHoverCardIntent } from './hover-card-intent';\r\nimport { RaqmHoverCardKeyboard } from './hover-card-keyboard';\r\nimport {\r\n DEFAULT_ALIGN,\r\n DEFAULT_ALIGN_OFFSET,\r\n DEFAULT_SIDE,\r\n DEFAULT_SIDE_OFFSET,\r\n RaqmHoverCardAlign,\r\n RaqmHoverCardRequestedSide,\r\n} from './hover-card-model';\r\nimport { RaqmHoverCardOverlay } from './hover-card-overlay';\r\nimport { RaqmHoverCardPosition } from './hover-card-position';\r\nimport { RaqmHoverCardState } from './hover-card-view-state';\r\nimport type {\r\n RaqmHoverCardContentDirective,\r\n RaqmHoverCardTriggerDirective,\r\n} from './hover-card.directive';\r\n\r\n/** Nonmodal preview root: delayed intent, native activation and no focus theft. */\r\n@Component({\r\n selector: 'raqm-hover-card',\r\n imports: [NgTemplateOutlet],\r\n templateUrl: './hover-card.html',\r\n styleUrl: './hover-card.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RaqmHoverCardComponent implements OnDestroy {\r\n private readonly overlay = inject(Overlay);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly container = inject(ViewContainerRef);\r\n private readonly injector = inject(Injector);\r\n private readonly checker = inject(InteractivityChecker);\r\n private readonly panel = viewChild<TemplateRef<unknown>>('panel');\r\n readonly openValue = model<boolean | undefined>(undefined, { alias: 'open' });\r\n readonly defaultOpen = input(false, { transform: booleanAttribute });\r\n\r\n /** The preferred popup side; logical sides resolve against the live direction. */\r\n readonly side = input<RaqmHoverCardRequestedSide>(DEFAULT_SIDE);\r\n\r\n /** The popup alignment along the trigger's cross axis. */\r\n readonly align = input<RaqmHoverCardAlign>(DEFAULT_ALIGN);\r\n\r\n /** The distance in pixels between the trigger and the card. */\r\n readonly sideOffset = input(DEFAULT_SIDE_OFFSET, { transform: numberAttribute });\r\n\r\n /** The distance in pixels along the alignment axis. */\r\n readonly alignOffset = input(DEFAULT_ALIGN_OFFSET, { transform: numberAttribute });\r\n\r\n readonly open = computed(() => this.openValue() ?? this.defaultOpen());\r\n private readonly trigger = signal<RaqmHoverCardTriggerDirective | null>(null);\r\n protected readonly content = signal<RaqmHoverCardContentDirective | null>(null);\r\n private readonly state = new RaqmHoverCardState();\r\n protected readonly direction = this.state.direction;\r\n protected readonly resolvedSide = this.state.resolvedSide;\r\n\r\n private readonly positionController = new RaqmHoverCardPosition({\r\n side: () => this.side(),\r\n align: () => this.align(),\r\n sideOffset: () => this.sideOffset(),\r\n alignOffset: () => this.alignOffset(),\r\n direction: () => this.state.direction(),\r\n });\r\n\r\n private readonly layer = new RaqmHoverCardOverlay(\r\n this.overlay,\r\n this.state,\r\n this.positionController,\r\n {\r\n root: this.host.nativeElement,\r\n document: this.document,\r\n container: this.container,\r\n injector: this.injector,\r\n trigger: () => this.trigger(),\r\n panel: () => this.panel(),\r\n close: () => this.close(),\r\n listenEscape: () => this.intent.listenEscape(),\r\n releaseIntent: () => this.intent.release(),\r\n },\r\n );\r\n\r\n private readonly keyboard = new RaqmHoverCardKeyboard(this.checker, {\r\n document: this.document,\r\n trigger: () => this.trigger(),\r\n overlayRef: () => this.layer.ref,\r\n });\r\n\r\n private readonly intent = new RaqmHoverCardIntent({\r\n document: this.document,\r\n open: () => this.open(),\r\n setOpen: (value) => this.openValue.set(value),\r\n destroyed: () => this.state.destroyed,\r\n trigger: () => this.trigger(),\r\n overlay: () => this.layer,\r\n side: () => this.state.resolvedSide(),\r\n detach: () => this.layer.detach(),\r\n });\r\n\r\n constructor() {\r\n connectHoverCardEffects({\r\n open: () => this.open(),\r\n trigger: () => this.trigger(),\r\n content: () => this.content(),\r\n panel: () => this.panel(),\r\n side: () => this.side(),\r\n align: () => this.align(),\r\n sideOffset: () => this.sideOffset(),\r\n alignOffset: () => this.alignOffset(),\r\n attach: () => this.layer.attach(),\r\n positionPane: () => this.layer.positionPane(),\r\n detach: () => this.layer.detach(),\r\n });\r\n }\r\n\r\n registerTrigger(trigger: RaqmHoverCardTriggerDirective): void {\r\n if (this.trigger()) throw new Error('Only one Hover Card trigger is supported per root.');\r\n this.trigger.set(trigger);\r\n }\r\n unregisterTrigger(trigger: RaqmHoverCardTriggerDirective): void {\r\n if (this.trigger() === trigger) {\r\n this.close();\r\n this.trigger.set(null);\r\n }\r\n }\r\n registerContent(content: RaqmHoverCardContentDirective): void {\r\n if (this.content())\r\n throw new Error('Only one Hover Card content template is supported per root.');\r\n this.content.set(content);\r\n }\r\n unregisterContent(content: RaqmHoverCardContentDirective): void {\r\n if (this.content() === content) {\r\n this.close();\r\n this.content.set(null);\r\n }\r\n }\r\n\r\n requestOpen(fromFocus = false): void {\r\n this.intent.requestOpen(fromFocus);\r\n }\r\n\r\n /** Closes without restoring, stealing or trapping focus. */\r\n close(): void {\r\n this.intent.close();\r\n }\r\n\r\n focusOut(event: FocusEvent): void {\r\n this.intent.focusOut(event);\r\n }\r\n\r\n triggerKeydown(event: KeyboardEvent): void {\r\n this.keyboard.onTriggerKeydown(event);\r\n }\r\n\r\n protected panelKeydown(event: KeyboardEvent): void {\r\n this.keyboard.onPanelKeydown(event);\r\n }\r\n\r\n protected pointerEnter(event: PointerEvent): void {\r\n this.intent.pointerEnter(event);\r\n }\r\n\r\n protected contentFocus(): void {\r\n this.intent.contentFocus();\r\n }\r\n\r\n /** A geometric corridor protects slow/diagonal transit, not just a short timeout. */\r\n pointerLeave(event: PointerEvent): void {\r\n this.intent.pointerLeave(event);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.layer.destroy();\r\n }\r\n}\r\n","<ng-content />\r\n<ng-template #panel>\r\n <div\r\n class=\"raqm-hover-card-content\"\r\n tabindex=\"-1\"\r\n [dir]=\"direction()\"\r\n [attr.data-raqm-side]=\"resolvedSide()\"\r\n (pointerenter)=\"pointerEnter($event)\"\r\n (pointerleave)=\"pointerLeave($event)\"\r\n (focusout)=\"focusOut($event)\"\r\n (focusin)=\"contentFocus()\"\r\n (keydown)=\"panelKeydown($event)\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"content()?.template ?? null\" />\r\n </div>\r\n</ng-template>\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n TemplateRef,\r\n inject,\r\n input,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { RaqmHoverCardComponent } from './hover-card';\r\n\r\nfunction delay(fallback: number): (value: unknown) => number {\r\n return (value) => {\r\n const parsed = numberAttribute(value, fallback);\r\n return Number.isFinite(parsed) ? Math.max(0, parsed) : fallback;\r\n };\r\n}\r\n\r\n/** A native link or button; hover/focus intent never replaces native activation. */\r\n@Directive({\r\n selector: 'a[raqm-hover-card-trigger], button[raqm-hover-card-trigger]',\r\n host: {\r\n '(pointerenter)': 'enter($event)',\r\n '(pointerleave)': 'leave($event)',\r\n '(focus)': 'focus()',\r\n '(blur)': 'blur($event)',\r\n '(keydown)': 'keydown($event)',\r\n },\r\n})\r\nexport class RaqmHoverCardTriggerDirective {\r\n readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n protected readonly card = inject(RaqmHoverCardComponent);\r\n readonly delay = input(600, { transform: delay(600) });\r\n readonly closeDelay = input(300, { transform: delay(300) });\r\n\r\n constructor() {\r\n if (this.element instanceof HTMLButtonElement && !this.element.hasAttribute('type')) {\r\n this.element.setAttribute('type', 'button');\r\n }\r\n this.card.registerTrigger(this);\r\n inject(DestroyRef).onDestroy(() => this.card.unregisterTrigger(this));\r\n }\r\n\r\n protected enter(event: Event): void {\r\n const pointer = event as PointerEvent;\r\n if (pointer.pointerType === 'mouse') this.card.requestOpen();\r\n }\r\n\r\n protected leave(event: Event): void {\r\n const pointer = event as PointerEvent;\r\n if (pointer.pointerType === 'mouse') this.card.pointerLeave(pointer);\r\n }\r\n\r\n protected blur(event: Event): void {\r\n this.card.focusOut(event as FocusEvent);\r\n }\r\n protected keydown(event: Event): void {\r\n this.card.triggerKeydown(event as KeyboardEvent);\r\n }\r\n\r\n protected focus(): void {\r\n if (this.element.matches(':focus-visible')) this.card.requestOpen(true);\r\n }\r\n}\r\n\r\n/** The portalled content template; the root owns placement. */\r\n@Directive({ selector: 'ng-template[raqm-hover-card-content]' })\r\nexport class RaqmHoverCardContentDirective {\r\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n private readonly card = inject(RaqmHoverCardComponent);\r\n\r\n constructor() {\r\n this.card.registerContent(this);\r\n inject(DestroyRef).onDestroy(() => this.card.unregisterContent(this));\r\n }\r\n}\r\n","import { RaqmHoverCardComponent } from './hover-card';\r\nimport {\r\n RaqmHoverCardTriggerDirective,\r\n RaqmHoverCardContentDirective,\r\n} from './hover-card.directive';\r\n\r\nexport { RaqmHoverCardComponent, RaqmHoverCardTriggerDirective, RaqmHoverCardContentDirective };\r\nexport const RaqmHoverCard = [\r\n RaqmHoverCardComponent,\r\n RaqmHoverCardTriggerDirective,\r\n RaqmHoverCardContentDirective,\r\n] as const;\r\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raqm-ui-menubar.mjs","names":[],"sources":["../../../projects/ui/menubar/menubar.directive.ts","../../../projects/ui/menubar/menubar-trigger.directive.ts","../../../projects/ui/menubar/menubar-item.directive.ts","../../../projects/ui/menubar/menubar-context.ts","../../../projects/ui/menubar/menubar-radio.directive.ts","../../../projects/ui/menubar/public-api.ts"],"sourcesContent":["import { Directive, booleanAttribute, input } from '@angular/core';\r\n\r\nimport { CdkMenuBar } from '@angular/cdk/menu';\r\n\r\nimport { RaqmMenuDirective, RaqmMenuDirection } from '@raqm/ui/dropdown-menu';\r\n\r\n@Directive({\r\n selector: '[raqm-menubar]',\r\n // The CDK owns role, orientation, stack, focus and keyboard; this adds only the class.\r\n hostDirectives: [RaqmMenuDirection, { directive: CdkMenuBar }],\r\n host: {\r\n class: 'raqm-menubar',\r\n },\r\n})\r\nexport class RaqmMenubarDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-menubar-content]',\r\n hostDirectives: [{ directive: RaqmMenuDirective }],\r\n host: {\r\n class: 'raqm-menubar-content',\r\n },\r\n})\r\nexport class RaqmMenubarContentDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-menubar-label]',\r\n host: {\r\n class: 'raqm-menubar-label',\r\n // Presence-only inset hook (the `data-raqm-inset` attribute exists or not).\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n },\r\n})\r\nexport class RaqmMenubarLabelDirective {\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n}\r\n","import { DestroyRef, Directive, ElementRef, OnInit, inject } from '@angular/core';\r\n\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { CdkMenuItem } from '@angular/cdk/menu';\r\nimport { ConnectedPosition } from '@angular/cdk/overlay';\r\n\r\nimport {\r\n RaqmMenuOverlaySync,\r\n RaqmMenuDirection,\r\n RaqmMenuTriggerBase,\r\n} from '@raqm/ui/dropdown-menu';\r\n\r\nconst MENUBAR_SIDE_OFFSET = 8;\r\nconst MENUBAR_ALIGN_OFFSET = 4;\r\n\r\n@Directive({\r\n selector: 'button[raqm-menubar-trigger-for]',\r\n // `CdkMenuItem` supplies bar-item role/keyboard/focus; `CdkMenuTrigger` the overlay engine.\r\n hostDirectives: [\r\n RaqmMenuDirection,\r\n {\r\n directive: CdkMenuItem,\r\n inputs: ['cdkMenuItemDisabled: disabled'],\r\n },\r\n {\r\n directive: RaqmMenuTriggerBase,\r\n inputs: ['cdkMenuTriggerFor: raqm-menubar-trigger-for', 'cdkMenuPosition: positions'],\r\n outputs: ['cdkMenuOpened: opened', 'cdkMenuClosed: closed'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menubar-trigger',\r\n },\r\n})\r\nexport class RaqmMenubarTriggerDirective implements OnInit {\r\n // Used only to install the default placement when the app supplies no `positions`.\r\n private readonly trigger = inject(RaqmMenuTriggerBase);\r\n\r\n private readonly direction = inject(Directionality);\r\n\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n // Identity tracks library defaults without replacing consumer positions.\r\n private defaultPositions: ConnectedPosition[] | null = null;\r\n\r\n private readonly overlaySync = new RaqmMenuOverlaySync(\r\n this.trigger,\r\n this.element.nativeElement,\r\n inject(DestroyRef),\r\n this.direction,\r\n {\r\n matchAnchorWidth: true,\r\n positions: () => {\r\n if (this.trigger.menuPosition !== this.defaultPositions) return this.trigger.menuPosition;\r\n this.defaultPositions = this.defaultRootPositions();\r\n this.trigger.menuPosition = this.defaultPositions;\r\n return this.defaultPositions;\r\n },\r\n },\r\n );\r\n\r\n ngOnInit(): void {\r\n if (this.trigger.menuPosition == null) {\r\n this.defaultPositions = this.defaultRootPositions();\r\n this.trigger.menuPosition = this.defaultPositions;\r\n }\r\n }\r\n\r\n private defaultRootPositions(): ConnectedPosition[] {\r\n const alignOffset =\r\n this.direction?.value === 'rtl' ? MENUBAR_ALIGN_OFFSET : -MENUBAR_ALIGN_OFFSET;\r\n return [\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetX: alignOffset,\r\n offsetY: MENUBAR_SIDE_OFFSET,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n offsetX: alignOffset,\r\n offsetY: -MENUBAR_SIDE_OFFSET,\r\n },\r\n ];\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\n\r\nimport { RaqmMenuCheckboxItemDirective, RaqmMenuItemDirective } from '@raqm/ui/dropdown-menu';\r\n\r\n@Directive({\r\n selector: 'button[raqm-menubar-item]',\r\n // Re-exposes the Dropdown row's declared inputs; the rest are inherited transitively.\r\n hostDirectives: [\r\n {\r\n directive: RaqmMenuItemDirective,\r\n inputs: ['inset', 'raqm-menu-item: raqm-menubar-item'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menubar-item',\r\n },\r\n})\r\nexport class RaqmMenubarItemDirective {}\r\n\r\n@Directive({\r\n selector: 'button[raqm-menubar-checkbox-item]',\r\n // The Dropdown checkbox row already composes the keep-open base and one CDK checkbox.\r\n hostDirectives: [\r\n {\r\n directive: RaqmMenuCheckboxItemDirective,\r\n inputs: ['inset', 'checked'],\r\n outputs: ['checkedChange'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menubar-checkbox-item',\r\n },\r\n})\r\nexport class RaqmMenubarCheckboxItemDirective {}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Private radio-group contract shared with the item children; never re-exported.\r\n *\r\n * @remarks\r\n * The group owns the single `model` value: items read it through `isSelected` and\r\n * commit once through `select`. `register`/`unregister` only catch duplicate values.\r\n */\r\nexport interface RaqmMenubarRadioGroupContext {\r\n isSelected(value: string): boolean;\r\n // A reselect is a no-op, so it never clears the model or emits.\r\n select(value: string): void;\r\n register(value: string): void;\r\n unregister(value: string): void;\r\n}\r\n\r\nexport const RAQM_MENUBAR_RADIO_GROUP = new InjectionToken<RaqmMenubarRadioGroupContext>(\r\n 'raqm-menubar-radio-group',\r\n);\r\n","import {\r\n Directive,\r\n OnDestroy,\r\n OnInit,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n isDevMode,\r\n model,\r\n} from '@angular/core';\r\n\r\nimport { CdkMenuGroup, CdkMenuItemRadio } from '@angular/cdk/menu';\r\n\r\nimport { RAQM_MENUBAR_RADIO_GROUP, RaqmMenubarRadioGroupContext } from './menubar-context';\r\n\r\n@Directive({\r\n selector: '[raqm-menubar-radio-group]',\r\n // The CDK group scopes exclusive selection to this node with its own dispatcher.\r\n hostDirectives: [{ directive: CdkMenuGroup }],\r\n // The private context the radio items inject; one instance per group element.\r\n providers: [\r\n {\r\n provide: RAQM_MENUBAR_RADIO_GROUP,\r\n useExisting: RaqmMenubarRadioGroupDirective,\r\n },\r\n ],\r\n})\r\nexport class RaqmMenubarRadioGroupDirective implements RaqmMenubarRadioGroupContext {\r\n readonly value = model<string | null>(null);\r\n\r\n // Counts live item children per value, so a duplicate fails clearly in dev.\r\n private readonly registrations = new Map<string, number>();\r\n\r\n // Whether `value` is the committed selection; an unknown value matches nothing.\r\n isSelected(value: string): boolean {\r\n return this.value() === value;\r\n }\r\n\r\n select(value: string): void {\r\n this.value.set(value);\r\n }\r\n\r\n // A second claim for one value in dev fails: two radio items may not share it.\r\n register(value: string): void {\r\n const count = this.registrations.get(value) ?? 0;\r\n if (count > 0 && isDevMode()) {\r\n throw new Error(\r\n `Raqm menubar radio group: duplicate radio item value \"${value}\". ` +\r\n 'Each radio item inside one group needs a unique non-empty value.',\r\n );\r\n }\r\n this.registrations.set(value, count + 1);\r\n }\r\n\r\n // Deleting at zero lets a later item reuse a value once its predecessor is gone.\r\n unregister(value: string): void {\r\n const count = this.registrations.get(value) ?? 0;\r\n if (count <= 1) {\r\n this.registrations.delete(value);\r\n } else {\r\n this.registrations.set(value, count - 1);\r\n }\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: 'button[raqm-menubar-radio-item]',\r\n // The CDK owns role, `aria-checked`, focus, keyboard and exclusive dispatch.\r\n hostDirectives: [\r\n {\r\n directive: CdkMenuItemRadio,\r\n inputs: ['cdkMenuItemDisabled: disabled'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menubar-radio-item',\r\n // Presence-only inset hook (the `data-raqm-inset` attribute exists or not).\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n // Focus-follows-pointer, identical to the Dropdown rows (see `onPointerEnter`).\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n },\r\n})\r\nexport class RaqmMenubarRadioItemDirective implements OnInit, OnDestroy {\r\n // The single activation source: its `triggered` is observed, its `checked` derived.\r\n private readonly radio = inject(CdkMenuItemRadio);\r\n\r\n // A lone radio (no group) keeps the CDK's own exclusive-dispatch behaviour.\r\n private readonly group = inject(RAQM_MENUBAR_RADIO_GROUP, { optional: true });\r\n\r\n readonly value = input.required<string>();\r\n\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n\r\n // Typed structurally (no rxjs import), matching the Dropdown checkbox pattern.\r\n private readonly triggerSubscription: { unsubscribe(): void };\r\n\r\n constructor() {\r\n // Derives `checked` from the group model, so an unknown group value matches no row.\r\n effect(() => {\r\n if (this.group) {\r\n this.radio.checked = this.group.isSelected(this.value());\r\n }\r\n });\r\n\r\n // One activation path: `triggered` is the only source of the model commit.\r\n this.triggerSubscription = this.radio.triggered.subscribe(() => {\r\n if (this.group && !this.radio.disabled) {\r\n this.group.select(this.value());\r\n }\r\n });\r\n }\r\n\r\n // Registers the value once inputs are bound; a missing or duplicate value fails in dev.\r\n ngOnInit(): void {\r\n const value = this.value();\r\n if (!value && isDevMode()) {\r\n throw new Error('Raqm menubar radio item: a non-empty `value` is required.');\r\n }\r\n this.group?.register(value);\r\n }\r\n\r\n // Releases the value registration and subscription so no menu outlives the directive.\r\n ngOnDestroy(): void {\r\n this.group?.unregister(this.value());\r\n this.triggerSubscription.unsubscribe();\r\n }\r\n\r\n // Hover highlight as in the Dropdown rows: an enabled, non-touch entry focuses the\r\n // row through the public `CdkMenuItem.focus()`, which never activates it.\r\n protected onPointerEnter(event: Event): void {\r\n if (!(event instanceof PointerEvent) || event.pointerType === 'touch' || this.radio.disabled) {\r\n return;\r\n }\r\n this.radio.focus();\r\n }\r\n}\r\n","// Public API for `@raqm/ui/menubar`; the root entry point re-exports these symbols.\r\nimport {\r\n RaqmMenuGroupDirective,\r\n RaqmMenuLabelDirective,\r\n RaqmMenuSeparatorDirective,\r\n RaqmMenuShortcutDirective,\r\n} from '@raqm/ui/dropdown-menu';\r\n\r\nimport {\r\n RaqmMenubarContentDirective,\r\n RaqmMenubarDirective,\r\n RaqmMenubarLabelDirective,\r\n} from './menubar.directive';\r\nimport { RaqmMenubarTriggerDirective } from './menubar-trigger.directive';\r\nimport {\r\n RaqmMenubarCheckboxItemDirective,\r\n RaqmMenubarItemDirective,\r\n} from './menubar-item.directive';\r\nimport {\r\n RaqmMenubarRadioGroupDirective,\r\n RaqmMenubarRadioItemDirective,\r\n} from './menubar-radio.directive';\r\n\r\nexport { RaqmMenubarDirective, RaqmMenubarContentDirective, RaqmMenubarLabelDirective };\r\nexport { RaqmMenubarTriggerDirective };\r\nexport { RaqmMenubarItemDirective, RaqmMenubarCheckboxItemDirective };\r\nexport { RaqmMenubarRadioGroupDirective, RaqmMenubarRadioItemDirective };\r\n\r\nexport const RaqmMenubar = [\r\n RaqmMenubarDirective,\r\n RaqmMenubarTriggerDirective,\r\n RaqmMenubarContentDirective,\r\n RaqmMenubarLabelDirective,\r\n RaqmMenubarItemDirective,\r\n RaqmMenubarCheckboxItemDirective,\r\n RaqmMenubarRadioGroupDirective,\r\n RaqmMenubarRadioItemDirective,\r\n RaqmMenuGroupDirective,\r\n RaqmMenuLabelDirective,\r\n RaqmMenuSeparatorDirective,\r\n RaqmMenuShortcutDirective,\r\n] as const;\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raqm-ui-menubar.mjs","names":["i1"],"sources":["../../../projects/ui/menubar/menubar.directive.ts","../../../projects/ui/menubar/menubar-trigger.directive.ts","../../../projects/ui/menubar/menubar-item.directive.ts","../../../projects/ui/menubar/menubar-context.ts","../../../projects/ui/menubar/menubar-radio.directive.ts","../../../projects/ui/menubar/public-api.ts"],"sourcesContent":["import { Directive, booleanAttribute, input } from '@angular/core';\r\n\r\nimport { CdkMenuBar } from '@angular/cdk/menu';\r\n\r\nimport { RaqmMenuDirective, RaqmMenuDirection } from '@raqm/ui/dropdown-menu';\r\n\r\n@Directive({\r\n selector: '[raqm-menubar]',\r\n // The CDK owns role, orientation, stack, focus and keyboard; this adds only the class.\r\n hostDirectives: [RaqmMenuDirection, { directive: CdkMenuBar }],\r\n host: {\r\n class: 'raqm-menubar',\r\n },\r\n})\r\nexport class RaqmMenubarDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-menubar-content]',\r\n hostDirectives: [{ directive: RaqmMenuDirective }],\r\n host: {\r\n class: 'raqm-menubar-content',\r\n },\r\n})\r\nexport class RaqmMenubarContentDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-menubar-label]',\r\n host: {\r\n class: 'raqm-menubar-label',\r\n // Presence-only inset hook (the `data-raqm-inset` attribute exists or not).\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n },\r\n})\r\nexport class RaqmMenubarLabelDirective {\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n}\r\n","import { DestroyRef, Directive, ElementRef, OnInit, inject } from '@angular/core';\r\n\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { CdkMenuItem } from '@angular/cdk/menu';\r\nimport { ConnectedPosition } from '@angular/cdk/overlay';\r\n\r\nimport {\r\n RaqmMenuOverlaySync,\r\n RaqmMenuDirection,\r\n RaqmMenuTriggerBase,\r\n} from '@raqm/ui/dropdown-menu';\r\n\r\nconst MENUBAR_SIDE_OFFSET = 8;\r\nconst MENUBAR_ALIGN_OFFSET = 4;\r\n\r\n@Directive({\r\n selector: 'button[raqm-menubar-trigger-for]',\r\n // `CdkMenuItem` supplies bar-item role/keyboard/focus; `CdkMenuTrigger` the overlay engine.\r\n hostDirectives: [\r\n RaqmMenuDirection,\r\n {\r\n directive: CdkMenuItem,\r\n inputs: ['cdkMenuItemDisabled: disabled'],\r\n },\r\n {\r\n directive: RaqmMenuTriggerBase,\r\n inputs: ['cdkMenuTriggerFor: raqm-menubar-trigger-for', 'cdkMenuPosition: positions'],\r\n outputs: ['cdkMenuOpened: opened', 'cdkMenuClosed: closed'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menubar-trigger',\r\n },\r\n})\r\nexport class RaqmMenubarTriggerDirective implements OnInit {\r\n // Used only to install the default placement when the app supplies no `positions`.\r\n private readonly trigger = inject(RaqmMenuTriggerBase);\r\n\r\n private readonly direction = inject(Directionality);\r\n\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n // Identity tracks library defaults without replacing consumer positions.\r\n private defaultPositions: ConnectedPosition[] | null = null;\r\n\r\n private readonly overlaySync = new RaqmMenuOverlaySync(\r\n this.trigger,\r\n this.element.nativeElement,\r\n inject(DestroyRef),\r\n this.direction,\r\n {\r\n matchAnchorWidth: true,\r\n positions: () => {\r\n if (this.trigger.menuPosition !== this.defaultPositions) return this.trigger.menuPosition;\r\n this.defaultPositions = this.defaultRootPositions();\r\n this.trigger.menuPosition = this.defaultPositions;\r\n return this.defaultPositions;\r\n },\r\n },\r\n );\r\n\r\n ngOnInit(): void {\r\n if (this.trigger.menuPosition == null) {\r\n this.defaultPositions = this.defaultRootPositions();\r\n this.trigger.menuPosition = this.defaultPositions;\r\n }\r\n }\r\n\r\n private defaultRootPositions(): ConnectedPosition[] {\r\n const alignOffset =\r\n this.direction?.value === 'rtl' ? MENUBAR_ALIGN_OFFSET : -MENUBAR_ALIGN_OFFSET;\r\n return [\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetX: alignOffset,\r\n offsetY: MENUBAR_SIDE_OFFSET,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n offsetX: alignOffset,\r\n offsetY: -MENUBAR_SIDE_OFFSET,\r\n },\r\n ];\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\n\r\nimport { RaqmMenuCheckboxItemDirective, RaqmMenuItemDirective } from '@raqm/ui/dropdown-menu';\r\n\r\n@Directive({\r\n selector: 'button[raqm-menubar-item]',\r\n // Re-exposes the Dropdown row's declared inputs; the rest are inherited transitively.\r\n hostDirectives: [\r\n {\r\n directive: RaqmMenuItemDirective,\r\n inputs: ['inset', 'raqm-menu-item: raqm-menubar-item'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menubar-item',\r\n },\r\n})\r\nexport class RaqmMenubarItemDirective {}\r\n\r\n@Directive({\r\n selector: 'button[raqm-menubar-checkbox-item]',\r\n // The Dropdown checkbox row already composes the keep-open base and one CDK checkbox.\r\n hostDirectives: [\r\n {\r\n directive: RaqmMenuCheckboxItemDirective,\r\n inputs: ['inset', 'checked'],\r\n outputs: ['checkedChange'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menubar-checkbox-item',\r\n },\r\n})\r\nexport class RaqmMenubarCheckboxItemDirective {}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Private radio-group contract shared with the item children; never re-exported.\r\n *\r\n * @remarks\r\n * The group owns the single `model` value: items read it through `isSelected` and\r\n * commit once through `select`. `register`/`unregister` only catch duplicate values.\r\n */\r\nexport interface RaqmMenubarRadioGroupContext {\r\n isSelected(value: string): boolean;\r\n // A reselect is a no-op, so it never clears the model or emits.\r\n select(value: string): void;\r\n register(value: string): void;\r\n unregister(value: string): void;\r\n}\r\n\r\nexport const RAQM_MENUBAR_RADIO_GROUP = new InjectionToken<RaqmMenubarRadioGroupContext>(\r\n 'raqm-menubar-radio-group',\r\n);\r\n","import {\r\n Directive,\r\n OnDestroy,\r\n OnInit,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n isDevMode,\r\n model,\r\n} from '@angular/core';\r\n\r\nimport { CdkMenuGroup, CdkMenuItemRadio } from '@angular/cdk/menu';\r\n\r\nimport { RAQM_MENUBAR_RADIO_GROUP, RaqmMenubarRadioGroupContext } from './menubar-context';\r\n\r\n@Directive({\r\n selector: '[raqm-menubar-radio-group]',\r\n // The CDK group scopes exclusive selection to this node with its own dispatcher.\r\n hostDirectives: [{ directive: CdkMenuGroup }],\r\n // The private context the radio items inject; one instance per group element.\r\n providers: [\r\n {\r\n provide: RAQM_MENUBAR_RADIO_GROUP,\r\n useExisting: RaqmMenubarRadioGroupDirective,\r\n },\r\n ],\r\n})\r\nexport class RaqmMenubarRadioGroupDirective implements RaqmMenubarRadioGroupContext {\r\n readonly value = model<string | null>(null);\r\n\r\n // Counts live item children per value, so a duplicate fails clearly in dev.\r\n private readonly registrations = new Map<string, number>();\r\n\r\n // Whether `value` is the committed selection; an unknown value matches nothing.\r\n isSelected(value: string): boolean {\r\n return this.value() === value;\r\n }\r\n\r\n select(value: string): void {\r\n this.value.set(value);\r\n }\r\n\r\n // A second claim for one value in dev fails: two radio items may not share it.\r\n register(value: string): void {\r\n const count = this.registrations.get(value) ?? 0;\r\n if (count > 0 && isDevMode()) {\r\n throw new Error(\r\n `Raqm menubar radio group: duplicate radio item value \"${value}\". ` +\r\n 'Each radio item inside one group needs a unique non-empty value.',\r\n );\r\n }\r\n this.registrations.set(value, count + 1);\r\n }\r\n\r\n // Deleting at zero lets a later item reuse a value once its predecessor is gone.\r\n unregister(value: string): void {\r\n const count = this.registrations.get(value) ?? 0;\r\n if (count <= 1) {\r\n this.registrations.delete(value);\r\n } else {\r\n this.registrations.set(value, count - 1);\r\n }\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: 'button[raqm-menubar-radio-item]',\r\n // The CDK owns role, `aria-checked`, focus, keyboard and exclusive dispatch.\r\n hostDirectives: [\r\n {\r\n directive: CdkMenuItemRadio,\r\n inputs: ['cdkMenuItemDisabled: disabled'],\r\n },\r\n ],\r\n host: {\r\n class: 'raqm-menubar-radio-item',\r\n // Presence-only inset hook (the `data-raqm-inset` attribute exists or not).\r\n '[attr.data-raqm-inset]': 'inset() ? \"\" : null',\r\n // Focus-follows-pointer, identical to the Dropdown rows (see `onPointerEnter`).\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n },\r\n})\r\nexport class RaqmMenubarRadioItemDirective implements OnInit, OnDestroy {\r\n // The single activation source: its `triggered` is observed, its `checked` derived.\r\n private readonly radio = inject(CdkMenuItemRadio);\r\n\r\n // A lone radio (no group) keeps the CDK's own exclusive-dispatch behaviour.\r\n private readonly group = inject(RAQM_MENUBAR_RADIO_GROUP, { optional: true });\r\n\r\n readonly value = input.required<string>();\r\n\r\n readonly inset = input(false, { transform: booleanAttribute });\r\n\r\n // Typed structurally (no rxjs import), matching the Dropdown checkbox pattern.\r\n private readonly triggerSubscription: { unsubscribe(): void };\r\n\r\n constructor() {\r\n // Derives `checked` from the group model, so an unknown group value matches no row.\r\n effect(() => {\r\n if (this.group) {\r\n this.radio.checked = this.group.isSelected(this.value());\r\n }\r\n });\r\n\r\n // One activation path: `triggered` is the only source of the model commit.\r\n this.triggerSubscription = this.radio.triggered.subscribe(() => {\r\n if (this.group && !this.radio.disabled) {\r\n this.group.select(this.value());\r\n }\r\n });\r\n }\r\n\r\n // Registers the value once inputs are bound; a missing or duplicate value fails in dev.\r\n ngOnInit(): void {\r\n const value = this.value();\r\n if (!value && isDevMode()) {\r\n throw new Error('Raqm menubar radio item: a non-empty `value` is required.');\r\n }\r\n this.group?.register(value);\r\n }\r\n\r\n // Releases the value registration and subscription so no menu outlives the directive.\r\n ngOnDestroy(): void {\r\n this.group?.unregister(this.value());\r\n this.triggerSubscription.unsubscribe();\r\n }\r\n\r\n // Hover highlight as in the Dropdown rows: an enabled, non-touch entry focuses the\r\n // row through the public `CdkMenuItem.focus()`, which never activates it.\r\n protected onPointerEnter(event: Event): void {\r\n if (!(event instanceof PointerEvent) || event.pointerType === 'touch' || this.radio.disabled) {\r\n return;\r\n }\r\n this.radio.focus();\r\n }\r\n}\r\n","// Public API for `@raqm/ui/menubar`; the root entry point re-exports these symbols.\r\nimport {\r\n RaqmMenuGroupDirective,\r\n RaqmMenuLabelDirective,\r\n RaqmMenuSeparatorDirective,\r\n RaqmMenuShortcutDirective,\r\n} from '@raqm/ui/dropdown-menu';\r\n\r\nimport {\r\n RaqmMenubarContentDirective,\r\n RaqmMenubarDirective,\r\n RaqmMenubarLabelDirective,\r\n} from './menubar.directive';\r\nimport { RaqmMenubarTriggerDirective } from './menubar-trigger.directive';\r\nimport {\r\n RaqmMenubarCheckboxItemDirective,\r\n RaqmMenubarItemDirective,\r\n} from './menubar-item.directive';\r\nimport {\r\n RaqmMenubarRadioGroupDirective,\r\n RaqmMenubarRadioItemDirective,\r\n} from './menubar-radio.directive';\r\n\r\nexport { RaqmMenubarDirective, RaqmMenubarContentDirective, RaqmMenubarLabelDirective };\r\nexport { RaqmMenubarTriggerDirective };\r\nexport { RaqmMenubarItemDirective, RaqmMenubarCheckboxItemDirective };\r\nexport { RaqmMenubarRadioGroupDirective, RaqmMenubarRadioItemDirective };\r\n\r\nexport const RaqmMenubar = [\r\n RaqmMenubarDirective,\r\n RaqmMenubarTriggerDirective,\r\n RaqmMenubarContentDirective,\r\n RaqmMenubarLabelDirective,\r\n RaqmMenubarItemDirective,\r\n RaqmMenubarCheckboxItemDirective,\r\n RaqmMenubarRadioGroupDirective,\r\n RaqmMenubarRadioItemDirective,\r\n RaqmMenuGroupDirective,\r\n RaqmMenuLabelDirective,\r\n RaqmMenuSeparatorDirective,\r\n RaqmMenuShortcutDirective,\r\n] as const;\r\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raqm-ui-tooltip.mjs","names":[],"sources":["../../../projects/ui/tooltip/tooltip-context.ts","../../../projects/ui/tooltip/tooltip-lifecycle.ts","../../../projects/ui/tooltip/tooltip-model.ts","../../../projects/ui/tooltip/tooltip-pane.ts","../../../projects/ui/tooltip/tooltip-position.ts","../../../projects/ui/tooltip/tooltip-slot.ts","../../../projects/ui/tooltip/tooltip-timers.ts","../../../projects/ui/tooltip/tooltip.ts","../../../projects/ui/tooltip/tooltip.html","../../../projects/ui/tooltip/tooltip.directive.ts","../../../projects/ui/tooltip/public-api.ts"],"sourcesContent":["import { InjectionToken, Signal, TemplateRef } from '@angular/core';\r\n\r\nexport interface RaqmTooltipTriggerRef {\r\n /** The native button or passive span the root anchors the tooltip to. */\r\n readonly element: HTMLElement;\r\n /** Live native disabled state, read by the root's open policy at event time. */\r\n readonly disabled: boolean;\r\n}\r\n\r\n/** The interaction that requested the tooltip open. */\r\nexport type RaqmTooltipOpenReason = 'mouse' | 'focus';\r\n\r\n/** The interaction that requested the tooltip close. */\r\nexport type RaqmTooltipCloseReason = 'mouse' | 'focus' | 'press' | 'escape';\r\n\r\nexport interface RaqmTooltipContext {\r\n /** Whether the tooltip is currently shown (enabled and attached). */\r\n readonly open: Signal<boolean>;\r\n /** The live content id while shown (the trigger's `aria-describedby` token), or `null`. */\r\n readonly tooltipId: Signal<string | null>;\r\n /** Registers the single trigger; called once per root. */\r\n registerTrigger(ref: RaqmTooltipTriggerRef): void;\r\n /** Unregisters the trigger on destroy; never changes open state. */\r\n unregisterTrigger(ref: RaqmTooltipTriggerRef): void;\r\n /** Registers the single content template; called once per root. */\r\n registerContent(template: TemplateRef<unknown>): void;\r\n /** Unregisters the content template on destroy. */\r\n unregisterContent(template: TemplateRef<unknown>): void;\r\n /** Requests opening from a hover or keyboard-focus interaction. */\r\n requestOpen(ref: RaqmTooltipTriggerRef, reason: RaqmTooltipOpenReason): void;\r\n /** Requests closing from a hover, blur, press or Escape interaction. */\r\n requestClose(ref: RaqmTooltipTriggerRef, reason: RaqmTooltipCloseReason): void;\r\n /** Cancels a pending hover-gap close when the pointer enters the content. */\r\n cancelHoverClose(): void;\r\n /** Schedules a bounded hover-gap close when the pointer leaves the content. */\r\n scheduleHoverClose(): void;\r\n}\r\n\r\n/** One open tooltip registered with a provider, so the provider keeps a single active one. */\r\nexport interface RaqmTooltipActive {\r\n /** Immediately closes this tooltip without an exit animation (peer opened). */\r\n closeForPeer(): void;\r\n}\r\n\r\nexport interface RaqmTooltipProviderContext {\r\n /** The hover-open delay in milliseconds applied to descendant tooltips. */\r\n readonly delay: Signal<number>;\r\n /** Registers a newly open tooltip and closes the previous active one. */\r\n registerActive(active: RaqmTooltipActive): void;\r\n /** Clears the active registration when a tooltip closes or is destroyed. */\r\n clearActive(active: RaqmTooltipActive): void;\r\n}\r\n\r\n/** Injection token for the parent Tooltip root; injected optionally, so a misplaced child reports rather than crashes. */\r\nexport const RAQM_TOOLTIP = new InjectionToken<RaqmTooltipContext>('RaqmTooltip');\r\n\r\n/** Injection token for the nearest Tooltip provider; without one a root uses a 0ms delay and has no sibling scope. */\r\nexport const RAQM_TOOLTIP_PROVIDER = new InjectionToken<RaqmTooltipProviderContext>(\r\n 'RaqmTooltipProvider',\r\n);\r\n","// Tooltip lifecycle: the open/close policy, provider claim and the pane hand-off.\r\n\r\nimport { TemplateRef } from '@angular/core';\r\n\r\nimport { OverlayRef } from '@angular/cdk/overlay';\r\n\r\nimport {\r\n RaqmTooltipActive,\r\n RaqmTooltipOpenReason,\r\n RaqmTooltipProviderContext,\r\n RaqmTooltipTriggerRef,\r\n} from './tooltip-context';\r\nimport { RaqmTooltipPane } from './tooltip-pane';\r\nimport { RaqmTooltipPosition } from './tooltip-position';\r\nimport { RaqmTooltipSlot } from './tooltip-slot';\r\nimport { RaqmTooltipTimers } from './tooltip-timers';\r\n\r\nexport interface RaqmTooltipLifecycleHost {\r\n readonly pane: RaqmTooltipPane;\r\n readonly position: RaqmTooltipPosition;\r\n readonly slot: RaqmTooltipSlot;\r\n readonly timers: RaqmTooltipTimers;\r\n /** Nearest provider (shared delay + single-active scope). */\r\n readonly provider: RaqmTooltipProviderContext | null;\r\n disabled(): boolean;\r\n destroyed(): boolean;\r\n /** The hover delay from the nearest provider, or 0 without one. */\r\n delay(): number;\r\n /** The panel template; an open has nothing to attach without it. */\r\n panel(): TemplateRef<unknown> | undefined;\r\n}\r\n\r\nexport class RaqmTooltipLifecycle implements RaqmTooltipActive {\r\n // Set while an open is requested, so a late trigger/content registration retries.\r\n private openRequested = false;\r\n\r\n private openReason: RaqmTooltipOpenReason = 'mouse';\r\n\r\n // Whether focus may open the tooltip; set by a press/Escape close and cleared on blur.\r\n private suppressFocusOpen = false;\r\n\r\n private providerRegistered = false;\r\n\r\n constructor(private readonly host: RaqmTooltipLifecycleHost) {}\r\n\r\n /** The interaction that requested the current open; hover closes are skipped for focus. */\r\n currentReason(): RaqmTooltipOpenReason {\r\n return this.openReason;\r\n }\r\n\r\n requestOpen(ref: RaqmTooltipTriggerRef, reason: RaqmTooltipOpenReason): void {\r\n if (ref !== this.host.slot.trigger()) {\r\n return;\r\n }\r\n // A live native disabled button never opens; a passive span around one stays allowed.\r\n if (this.host.disabled() || ref.disabled) {\r\n return;\r\n }\r\n if (reason === 'focus' && this.suppressFocusOpen) {\r\n return;\r\n }\r\n if (this.host.pane.open() || this.host.pane.hasPane) {\r\n // A re-entry cancels a pending hover close; only focus upgrades ownership.\r\n this.host.timers.cancelHoverClose();\r\n if (reason === 'focus') {\r\n this.openReason = 'focus';\r\n }\r\n return;\r\n }\r\n if (!this.host.slot.canOpen()) {\r\n this.openRequested = true;\r\n this.openReason = reason;\r\n return;\r\n }\r\n this.openRequested = true;\r\n this.openReason = reason;\r\n this.host.timers.cancelOpen();\r\n if (reason === 'focus') {\r\n this.host.timers.cancelHoverClose();\r\n this.beginOpen('focus');\r\n return;\r\n }\r\n const delay = this.host.delay();\r\n if (delay > 0) {\r\n this.host.timers.armOpen(delay);\r\n return;\r\n }\r\n this.beginOpen('mouse');\r\n }\r\n\r\n requestClose(ref: RaqmTooltipTriggerRef, reason: 'mouse' | 'focus' | 'press' | 'escape'): void {\r\n if (ref !== this.host.slot.trigger()) {\r\n return;\r\n }\r\n this.openRequested = false;\r\n this.host.timers.cancelOpen();\r\n if (reason === 'focus') {\r\n this.suppressFocusOpen = false;\r\n this.host.timers.cancelHoverClose();\r\n if (this.host.pane.open() || this.host.pane.hasPane) {\r\n this.beginClose(false);\r\n }\r\n return;\r\n }\r\n if (reason === 'mouse') {\r\n if (!this.host.pane.open()) {\r\n return;\r\n }\r\n if (this.openReason === 'focus' && this.host.slot.isTriggerFocused()) {\r\n return;\r\n }\r\n this.host.timers.scheduleHoverClose();\r\n return;\r\n }\r\n // Press/Escape suppresses the focus event that may follow, even with no surface yet.\r\n this.suppressFocusOpen = true;\r\n this.host.timers.cancelHoverClose();\r\n if (!this.host.pane.open()) {\r\n return;\r\n }\r\n this.beginClose(false);\r\n }\r\n\r\n // A disabled root drops any pending request and closes immediately; a peer take-over does the same.\r\n closeNow(): void {\r\n this.openRequested = false;\r\n this.host.timers.cancelOpen();\r\n this.host.timers.cancelHoverClose();\r\n if (this.host.pane.open() || this.host.pane.hasPane) {\r\n this.beginClose(true);\r\n }\r\n }\r\n\r\n closeForPeer(): void {\r\n this.closeNow();\r\n }\r\n\r\n /** Registers this tooltip as the scope's active one, before the overlay exists. */\r\n claimActive(): void {\r\n this.host.provider?.registerActive(this);\r\n this.providerRegistered = true;\r\n }\r\n\r\n // Retries a requested open if it was waiting for a late trigger/template.\r\n retryRequestedOpen(): void {\r\n if (!this.openRequested || this.host.destroyed() || this.host.pane.hasPane) {\r\n return;\r\n }\r\n if (!this.host.slot.canOpen()) {\r\n return;\r\n }\r\n this.beginOpen(this.openReason);\r\n }\r\n\r\n // Re-checks the open policy once the provider's hover delay has elapsed.\r\n onOpenElapsed(): void {\r\n const trigger = this.host.slot.trigger();\r\n if (this.openRequested && !this.host.destroyed() && trigger !== null) {\r\n if (trigger.disabled) {\r\n this.openRequested = false;\r\n return;\r\n }\r\n this.beginOpen('mouse');\r\n }\r\n }\r\n\r\n // The CDK detached the pane, so its subscriptions and the active claim go with it.\r\n handleDetached(overlayRef: OverlayRef): void {\r\n if (!this.host.pane.owns(overlayRef)) {\r\n return;\r\n }\r\n this.host.pane.releaseOwnership();\r\n this.openRequested = false;\r\n this.host.pane.open.set(false);\r\n this.host.pane.tooltipId.set(null);\r\n this.host.pane.closing.set(false);\r\n this.host.position.clear();\r\n this.host.timers.cancelOpen();\r\n this.host.timers.cancelHoverClose();\r\n this.clearProviderRegistration();\r\n this.host.pane.releaseSubscriptions();\r\n }\r\n\r\n /** Tears down every timer, subscription and pane the destroy pass still owns. */\r\n destroy(): void {\r\n this.openRequested = false;\r\n this.host.timers.cancelOpen();\r\n this.host.timers.cancelHoverClose();\r\n this.host.pane.releaseSubscriptions();\r\n const { pending, overlay } = this.host.pane.takeForDestroy();\r\n this.clearProviderRegistration();\r\n pending?.dispose();\r\n overlay?.dispose();\r\n }\r\n\r\n // Creates the one overlay for a fresh open; content is revealed after the next render.\r\n private beginOpen(reason: RaqmTooltipOpenReason): void {\r\n const trigger = this.host.slot.trigger();\r\n const content = this.host.slot.content();\r\n const panel = this.host.panel();\r\n if (\r\n this.host.destroyed() ||\r\n this.host.disabled() ||\r\n trigger === null ||\r\n trigger.disabled ||\r\n content === null ||\r\n panel === undefined ||\r\n this.host.pane.hasPane\r\n ) {\r\n return;\r\n }\r\n this.openRequested = true;\r\n this.openReason = reason;\r\n this.host.timers.removePendingEscape();\r\n this.host.pane.flushPendingDispose();\r\n this.host.timers.cancelHoverClose();\r\n this.host.pane.openLayer(trigger, panel);\r\n }\r\n\r\n // Tears down now when requested or under reduced motion, else after the exit transition.\r\n beginClose(immediate: boolean): void {\r\n this.openRequested = false;\r\n this.host.pane.open.set(false);\r\n this.host.pane.tooltipId.set(null);\r\n this.host.timers.cancelOpen();\r\n this.host.timers.cancelHoverClose();\r\n this.clearProviderRegistration();\r\n this.host.pane.disposePane(immediate);\r\n }\r\n\r\n private clearProviderRegistration(): void {\r\n if (this.providerRegistered) {\r\n this.host.provider?.clearActive(this);\r\n this.providerRegistered = false;\r\n }\r\n }\r\n}\r\n","// Tooltip model: accepted input values, defaults, durations and the root id mint.\r\n\r\nimport { numberAttribute } from '@angular/core';\r\n\r\nexport type RaqmTooltipSide = 'top' | 'bottom' | 'left' | 'right' | 'inline-start' | 'inline-end';\r\n\r\nexport type RaqmTooltipAlign = 'start' | 'center' | 'end';\r\n\r\n// A side after logical resolution; positions, arrow placement and motion all use it.\r\nexport type RaqmTooltipPhysicalSide = 'top' | 'bottom' | 'left' | 'right';\r\n\r\n// The accepted input values; anything else falls back to the default.\r\nconst SIDES: readonly RaqmTooltipSide[] = [\r\n 'top',\r\n 'bottom',\r\n 'left',\r\n 'right',\r\n 'inline-start',\r\n 'inline-end',\r\n];\r\nconst ALIGNS: readonly RaqmTooltipAlign[] = ['start', 'center', 'end'];\r\n\r\nexport const DEFAULT_SIDE: RaqmTooltipSide = 'top';\r\nexport const DEFAULT_ALIGN: RaqmTooltipAlign = 'center';\r\nexport const DEFAULT_SIDE_OFFSET = 4;\r\nexport const DEFAULT_ALIGN_OFFSET = 0;\r\n\r\n// 5px is the positioner's collision padding; the CDK gets the same margin.\r\nexport const VIEWPORT_MARGIN = 5;\r\n\r\nexport const EXIT_ANIMATION_MS = 150;\r\n\r\n// Grace for a pointer crossing the 4px trigger/content gap; not an animation duration.\r\nexport const HOVER_GAP_MS = 100;\r\n\r\n// The overlay pane class; the visual surface lives on `.raqm-tooltip-content`.\r\nexport const PANE_CLASS = 'raqm-tooltip-overlay-pane';\r\n\r\n// The library-owned classes this component toggles directly on the overlay nodes.\r\nexport const CONTENT_CLASS = 'raqm-tooltip-content';\r\nexport const CONTENT_ENTERING_CLASS = 'raqm-tooltip-content--entering';\r\nexport const CONTENT_CLOSING_CLASS = 'raqm-tooltip-content--closing';\r\n\r\nlet nextTooltipId = 0;\r\n\r\n// Minted once per root and exposed only while the content exists.\r\nexport function nextTooltipRootId(): string {\r\n return `raqm-tooltip-${++nextTooltipId}`;\r\n}\r\n\r\nexport function prefersReducedMotion(): boolean {\r\n return typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n}\r\n\r\nexport function toSide(value: unknown): RaqmTooltipSide {\r\n return SIDES.includes(value as RaqmTooltipSide) ? (value as RaqmTooltipSide) : DEFAULT_SIDE;\r\n}\r\n\r\nexport function toAlign(value: unknown): RaqmTooltipAlign {\r\n return ALIGNS.includes(value as RaqmTooltipAlign) ? (value as RaqmTooltipAlign) : DEFAULT_ALIGN;\r\n}\r\n\r\nexport function toDir(value: unknown): 'ltr' | 'rtl' | undefined {\r\n return value === 'ltr' || value === 'rtl' ? value : undefined;\r\n}\r\n\r\nexport function toOffset(fallback: number): (value: unknown) => number {\r\n return (value: unknown): number => {\r\n const parsed = numberAttribute(value, fallback);\r\n return Number.isFinite(parsed) ? parsed : fallback;\r\n };\r\n}\r\n","// Tooltip pane: overlay creation, pane subscriptions, the exit transition and disposal.\r\n\r\nimport {\r\n Injector,\r\n TemplateRef,\r\n ViewContainerRef,\r\n WritableSignal,\r\n afterNextRender,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { ScrollDispatcher, ViewportRuler } from '@angular/cdk/scrolling';\r\n\r\nimport { registerOverlayOwnership } from '@raqm/ui/overlay-internal';\r\n\r\nimport { RaqmTooltipTriggerRef } from './tooltip-context';\r\nimport {\r\n CONTENT_CLASS,\r\n CONTENT_CLOSING_CLASS,\r\n CONTENT_ENTERING_CLASS,\r\n EXIT_ANIMATION_MS,\r\n PANE_CLASS,\r\n nextTooltipRootId,\r\n prefersReducedMotion,\r\n} from './tooltip-model';\r\nimport { RaqmTooltipPosition } from './tooltip-position';\r\n\r\nexport interface RaqmTooltipPaneHost {\r\n /** Injection context for the after-render placement pass. */\r\n readonly injector: Injector;\r\n /** Registers this tooltip as the scope's active one, before the overlay exists. */\r\n claimActive(): void;\r\n /** A primary press outside the pane asks the caller to close. */\r\n onOutsidePress(trigger: RaqmTooltipTriggerRef): void;\r\n /** Escape while the pane is visible asks the caller to close. */\r\n onEscape(trigger: RaqmTooltipTriggerRef): void;\r\n /** The CDK detached the pane, so the caller syncs its own state. */\r\n onDetached(overlayRef: OverlayRef): void;\r\n}\r\n\r\nexport class RaqmTooltipPane {\r\n readonly open: WritableSignal<boolean> = signal(false);\r\n readonly tooltipId: WritableSignal<string | null> = signal(null);\r\n readonly closing: WritableSignal<boolean> = signal(false);\r\n\r\n // Minted once per root and exposed only while the content exists.\r\n private readonly rootId = nextTooltipRootId();\r\n\r\n private overlayRef: OverlayRef | undefined;\r\n\r\n // Bumped per open and on destroy, so a queued after-render pass cannot reveal a dead pane.\r\n private generation = 0;\r\n\r\n private exitTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n private pendingDisposeOverlay: OverlayRef | undefined;\r\n\r\n // The overlay subscriptions, all torn down on every close/detach/destroy path.\r\n private detachSubscription: { unsubscribe(): void } | undefined;\r\n private outsideSubscription: { unsubscribe(): void } | undefined;\r\n private viewportSubscription: { unsubscribe(): void } | undefined;\r\n private scrollSubscription: { unsubscribe(): void } | undefined;\r\n\r\n private escapeListener: ((event: KeyboardEvent) => void) | undefined;\r\n\r\n constructor(\r\n private readonly overlay: Overlay,\r\n private readonly viewportRuler: ViewportRuler,\r\n private readonly scrollDispatcher: ScrollDispatcher,\r\n private readonly document: Document,\r\n private readonly viewContainerRef: ViewContainerRef,\r\n private readonly position: RaqmTooltipPosition,\r\n private readonly host: RaqmTooltipPaneHost,\r\n ) {}\r\n\r\n get hasPane(): boolean {\r\n return this.overlayRef !== undefined;\r\n }\r\n\r\n get ref(): OverlayRef | undefined {\r\n return this.overlayRef;\r\n }\r\n\r\n owns(overlayRef: OverlayRef): boolean {\r\n return this.overlayRef === overlayRef;\r\n }\r\n\r\n /** Creates and attaches the one overlay for a fresh open. */\r\n openLayer(trigger: RaqmTooltipTriggerRef, panel: TemplateRef<unknown>): void {\r\n const generation = ++this.generation;\r\n const preferred = this.position.beginPlacement();\r\n\r\n // Register before the overlay exists, so two surfaces are never visible at once.\r\n this.host.claimActive();\r\n\r\n const strategy = this.position.buildStrategy(trigger.element, preferred);\r\n const config: OverlayConfig = {\r\n positionStrategy: strategy,\r\n // Descriptive and nonmodal: no backdrop, scroll lock, focus trap or role.\r\n hasBackdrop: false,\r\n scrollStrategy: this.overlay.scrollStrategies.noop(),\r\n panelClass: [PANE_CLASS],\r\n disposeOnNavigation: true,\r\n direction: this.position.direction,\r\n };\r\n const overlayRef = this.overlay.create(config);\r\n registerOverlayOwnership(trigger.element, overlayRef);\r\n this.overlayRef = overlayRef;\r\n this.position.watchSide(strategy, overlayRef);\r\n // A primary press anywhere outside the content dismisses the tooltip.\r\n this.outsideSubscription = overlayRef.outsidePointerEvents().subscribe((event) => {\r\n if (event.button === 0) {\r\n this.host.onOutsidePress(trigger);\r\n }\r\n });\r\n this.detachSubscription = overlayRef\r\n .detachments()\r\n .subscribe(() => this.host.onDetached(overlayRef));\r\n // The position collapses burst notifications into one placement pass per frame.\r\n this.viewportSubscription = this.viewportRuler\r\n .change(0)\r\n .subscribe(() => this.position.scheduleReposition());\r\n this.scrollSubscription = this.scrollDispatcher\r\n .ancestorScrolled(trigger.element, 0)\r\n .subscribe(() => this.position.scheduleReposition());\r\n // Escape while a hover-opened tooltip is visible (focus elsewhere) still dismisses it.\r\n this.escapeListener = (event: KeyboardEvent) => {\r\n if (event.key !== 'Escape' || !this.open()) {\r\n return;\r\n }\r\n this.host.onEscape(trigger);\r\n };\r\n this.document.addEventListener('keydown', this.escapeListener);\r\n\r\n overlayRef.attach(new TemplatePortal(panel, this.viewContainerRef));\r\n // Hidden until the after-render placement pass, so it never paints at the CDK origin.\r\n overlayRef.overlayElement.style.visibility = 'hidden';\r\n overlayRef.overlayElement.style.pointerEvents = 'none';\r\n this.open.set(true);\r\n this.tooltipId.set(this.rootId);\r\n this.position.attachResizeObserver(trigger.element, overlayRef);\r\n\r\n afterNextRender(\r\n () => {\r\n if (generation !== this.generation || this.overlayRef !== overlayRef) {\r\n return;\r\n }\r\n this.position.reposition();\r\n this.reveal(overlayRef);\r\n },\r\n { injector: this.host.injector },\r\n );\r\n }\r\n\r\n /** Repositions the live pane; a closed tooltip is a no-op. */\r\n reposition(): void {\r\n this.position.reposition();\r\n }\r\n\r\n /** Drops the pane reference and its strategy; the element is the caller's to dispose. */\r\n releaseOwnership(): void {\r\n this.overlayRef = undefined;\r\n this.position.discard();\r\n }\r\n\r\n /** Blocks a queued after-render reveal for a pane that is going away. */\r\n invalidate(): void {\r\n this.generation += 1;\r\n }\r\n\r\n // Tears down now when requested or under reduced motion, else after the exit transition.\r\n disposePane(immediate: boolean): void {\r\n const overlayRef = this.overlayRef;\r\n this.overlayRef = undefined;\r\n this.position.reset();\r\n this.releaseSubscriptions();\r\n if (!overlayRef) {\r\n this.closing.set(false);\r\n return;\r\n }\r\n // Inert and aria-hidden before disposal: not clickable or announced while it fades.\r\n overlayRef.overlayElement.setAttribute('inert', '');\r\n overlayRef.overlayElement.setAttribute('aria-hidden', 'true');\r\n if (immediate || prefersReducedMotion()) {\r\n this.closing.set(false);\r\n overlayRef.dispose();\r\n return;\r\n }\r\n const surface = overlayRef.overlayElement.querySelector<HTMLElement>(`.${CONTENT_CLASS}`);\r\n surface?.classList.remove(CONTENT_ENTERING_CLASS);\r\n surface?.classList.add(CONTENT_CLOSING_CLASS);\r\n this.closing.set(true);\r\n this.pendingDisposeOverlay = overlayRef;\r\n this.exitTimer = setTimeout(() => {\r\n this.exitTimer = undefined;\r\n this.pendingDisposeOverlay = undefined;\r\n this.closing.set(false);\r\n overlayRef.dispose();\r\n }, EXIT_ANIMATION_MS);\r\n }\r\n\r\n flushPendingDispose(): void {\r\n if (this.exitTimer !== undefined) {\r\n clearTimeout(this.exitTimer);\r\n this.exitTimer = undefined;\r\n }\r\n this.closing.set(false);\r\n const pending = this.pendingDisposeOverlay;\r\n this.pendingDisposeOverlay = undefined;\r\n pending?.dispose();\r\n }\r\n\r\n private reveal(overlayRef: OverlayRef): void {\r\n const surface = overlayRef.overlayElement.querySelector<HTMLElement>(`.${CONTENT_CLASS}`);\r\n if (!surface || this.overlayRef !== overlayRef) {\r\n return;\r\n }\r\n surface.classList.remove(CONTENT_CLOSING_CLASS);\r\n surface.classList.add(CONTENT_ENTERING_CLASS);\r\n overlayRef.overlayElement.style.pointerEvents = '';\r\n overlayRef.overlayElement.style.visibility = '';\r\n }\r\n\r\n /** Clears the exit timer and hands over the panes a destroy pass still has to dispose. */\r\n takeForDestroy(): { pending: OverlayRef | undefined; overlay: OverlayRef | undefined } {\r\n if (this.exitTimer !== undefined) {\r\n clearTimeout(this.exitTimer);\r\n this.exitTimer = undefined;\r\n }\r\n const pending = this.pendingDisposeOverlay;\r\n this.pendingDisposeOverlay = undefined;\r\n const overlayRef = this.overlayRef;\r\n this.overlayRef = undefined;\r\n this.position.discard();\r\n this.closing.set(false);\r\n this.open.set(false);\r\n this.tooltipId.set(null);\r\n return { pending, overlay: overlayRef };\r\n }\r\n\r\n // Safe to call repeatedly; never disposes an overlay itself.\r\n releaseSubscriptions(): void {\r\n this.position.releaseSide();\r\n this.detachSubscription?.unsubscribe();\r\n this.detachSubscription = undefined;\r\n this.outsideSubscription?.unsubscribe();\r\n this.outsideSubscription = undefined;\r\n this.viewportSubscription?.unsubscribe();\r\n this.viewportSubscription = undefined;\r\n this.scrollSubscription?.unsubscribe();\r\n this.scrollSubscription = undefined;\r\n this.position.releaseResizeObserver();\r\n if (this.escapeListener !== undefined) {\r\n this.document.removeEventListener('keydown', this.escapeListener);\r\n this.escapeListener = undefined;\r\n }\r\n }\r\n}\r\n","// Tooltip positioning: direction, physical sides, the CDK strategy, the arrow and resize.\r\n\r\nimport { signal } from '@angular/core';\r\n\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport {\r\n ConnectedPosition,\r\n FlexibleConnectedPositionStrategy,\r\n Overlay,\r\n OverlayRef,\r\n} from '@angular/cdk/overlay';\r\n\r\nimport {\r\n CONTENT_CLASS,\r\n RaqmTooltipAlign,\r\n RaqmTooltipPhysicalSide,\r\n RaqmTooltipSide,\r\n VIEWPORT_MARGIN,\r\n} from './tooltip-model';\r\n\r\nexport interface RaqmTooltipPositionHost {\r\n /** The root element; its computed direction is read before the CDK Bidi value. */\r\n readonly element: HTMLElement;\r\n /** Optional Bidi service; the computed direction wins so a CSS-only `dir` ancestor works. */\r\n readonly directionality: Directionality | null;\r\n side(): RaqmTooltipSide;\r\n align(): RaqmTooltipAlign;\r\n sideOffset(): number;\r\n alignOffset(): number;\r\n dir(): 'ltr' | 'rtl' | undefined;\r\n /** The trigger element the pane is anchored to. */\r\n anchor(): HTMLElement | null;\r\n /** The live pane, while one exists. */\r\n pane(): OverlayRef | undefined;\r\n}\r\n\r\n// The surface's layout box in viewport coordinates; a transform on it (the enter/exit\r\n// scale) is excluded, since it would skew the measured arrow centre.\r\nfunction layoutBox(element: HTMLElement): {\r\n left: number;\r\n top: number;\r\n width: number;\r\n height: number;\r\n} {\r\n const parent = element.offsetParent as HTMLElement | null;\r\n if (!parent) {\r\n const rect = element.getBoundingClientRect();\r\n return { left: rect.left, top: rect.top, width: rect.width, height: rect.height };\r\n }\r\n const parentRect = parent.getBoundingClientRect();\r\n return {\r\n left: parentRect.left + parent.clientLeft + element.offsetLeft,\r\n top: parentRect.top + parent.clientTop + element.offsetTop,\r\n width: element.offsetWidth,\r\n height: element.offsetHeight,\r\n };\r\n}\r\n\r\nexport class RaqmTooltipPosition {\r\n readonly panelDir = signal<'ltr' | 'rtl'>('ltr');\r\n readonly resolvedSide = signal<RaqmTooltipPhysicalSide>('top');\r\n\r\n private positionStrategy: FlexibleConnectedPositionStrategy | undefined;\r\n\r\n private currentPositions: ConnectedPosition[] = [];\r\n private currentSides: RaqmTooltipPhysicalSide[] = [];\r\n\r\n private currentAppliedSide: RaqmTooltipPhysicalSide = 'top';\r\n\r\n private currentDir: 'ltr' | 'rtl' = 'ltr';\r\n\r\n // Torn down on every close/detach/destroy path.\r\n private sideSubscription: { unsubscribe(): void } | undefined;\r\n\r\n private resizeObserver: ResizeObserver | undefined;\r\n\r\n private frame = 0;\r\n private frameView: Window | undefined;\r\n\r\n constructor(\r\n private readonly overlay: Overlay,\r\n private readonly host: RaqmTooltipPositionHost,\r\n ) {}\r\n\r\n /** The direction the open pane was placed with. */\r\n get direction(): 'ltr' | 'rtl' {\r\n return this.currentDir;\r\n }\r\n\r\n /** Resolves direction and the preferred side; both seed the arrow and motion state. */\r\n beginPlacement(): RaqmTooltipPhysicalSide {\r\n const dir = this.readResolvedDir();\r\n this.currentDir = dir;\r\n this.panelDir.set(dir);\r\n const preferred = this.resolvePhysicalSide(this.host.side());\r\n this.currentAppliedSide = preferred;\r\n this.resolvedSide.set(preferred);\r\n return preferred;\r\n }\r\n\r\n // Seeded with the preferred and opposite side, so attach always has a position.\r\n buildStrategy(\r\n origin: HTMLElement,\r\n preferred: RaqmTooltipPhysicalSide,\r\n ): FlexibleConnectedPositionStrategy {\r\n const strategy = this.overlay.position().flexibleConnectedTo(origin);\r\n strategy\r\n .withFlexibleDimensions(false)\r\n .withGrowAfterOpen(false)\r\n .withPush(true)\r\n .withViewportMargin(VIEWPORT_MARGIN);\r\n this.setPositions(strategy, [preferred, this.oppositeSide(preferred)]);\r\n this.positionStrategy = strategy;\r\n return strategy;\r\n }\r\n\r\n reposition(): void {\r\n this.cancelScheduledReposition();\r\n const overlayRef = this.host.pane();\r\n const strategy = this.positionStrategy;\r\n if (!overlayRef || !strategy) {\r\n return;\r\n }\r\n const dir = this.readResolvedDir();\r\n if (dir !== this.currentDir) {\r\n this.currentDir = dir;\r\n this.panelDir.set(dir);\r\n overlayRef.setDirection(dir);\r\n }\r\n const preferred = this.resolvePhysicalSide(this.host.side());\r\n this.setPositions(strategy, [preferred, this.oppositeSide(preferred)]);\r\n overlayRef.updatePosition();\r\n this.positionArrow(this.currentAppliedSide);\r\n }\r\n\r\n // Scroll and resize notifications can burst within one frame; one pass leaves the same\r\n // final placement and arrow as the last event would.\r\n scheduleReposition(): void {\r\n if (!this.host.pane() || !this.positionStrategy || this.frame) {\r\n return;\r\n }\r\n const view = this.host.element.ownerDocument.defaultView;\r\n if (!view || typeof view.requestAnimationFrame !== 'function') {\r\n this.reposition();\r\n return;\r\n }\r\n this.frameView = view;\r\n this.frame = view.requestAnimationFrame(() => {\r\n this.frame = 0;\r\n this.frameView = undefined;\r\n this.reposition();\r\n });\r\n }\r\n\r\n // Arrow and enter motion follow a collision flip rather than the preferred side.\r\n watchSide(strategy: FlexibleConnectedPositionStrategy, overlayRef: OverlayRef): void {\r\n this.sideSubscription = strategy.positionChanges.subscribe((change) => {\r\n const index = this.currentPositions.indexOf(change.connectionPair);\r\n const side = this.currentSides[index] ?? this.currentSides[0] ?? this.resolvedSide();\r\n this.currentAppliedSide = side;\r\n this.resolvedSide.set(side);\r\n const surface = overlayRef.overlayElement.querySelector<HTMLElement>(`.${CONTENT_CLASS}`);\r\n surface?.setAttribute('data-raqm-side', side);\r\n this.positionArrow(side, surface ?? undefined);\r\n });\r\n }\r\n\r\n // Keeps the index -> side map in step, so a collision fallback maps back.\r\n private setPositions(\r\n strategy: FlexibleConnectedPositionStrategy,\r\n sides: readonly RaqmTooltipPhysicalSide[],\r\n ): void {\r\n this.currentSides = [...sides];\r\n this.currentPositions = sides.map((side) => this.buildPositionFor(side));\r\n strategy.withPositions(this.currentPositions);\r\n }\r\n\r\n // The single position for one physical side; offsets are signed outward from the\r\n // trigger, with logical start/end resolved for horizontal sides.\r\n private buildPositionFor(side: RaqmTooltipPhysicalSide): ConnectedPosition {\r\n const align = this.host.align();\r\n const x = align;\r\n const y = this.toVerticalAlign(align);\r\n const mainOffset = this.signedSideOffset(side);\r\n switch (side) {\r\n case 'bottom':\r\n return {\r\n originX: x,\r\n originY: 'bottom',\r\n overlayX: x,\r\n overlayY: 'top',\r\n offsetX: this.host.alignOffset(),\r\n offsetY: mainOffset,\r\n };\r\n case 'left':\r\n return this.horizontalPosition('left', y, mainOffset);\r\n case 'right':\r\n return this.horizontalPosition('right', y, mainOffset);\r\n case 'top':\r\n default:\r\n return {\r\n originX: x,\r\n originY: 'top',\r\n overlayX: x,\r\n overlayY: 'bottom',\r\n offsetX: this.host.alignOffset(),\r\n offsetY: mainOffset,\r\n };\r\n }\r\n }\r\n\r\n // Direction-aware on the inline axis; the alignment offset applies vertically.\r\n private horizontalPosition(\r\n side: 'left' | 'right',\r\n alignY: 'top' | 'center' | 'bottom',\r\n offsetX: number,\r\n ): ConnectedPosition {\r\n const rtl = this.currentDir === 'rtl';\r\n const originX = side === 'right' ? (rtl ? 'start' : 'end') : rtl ? 'end' : 'start';\r\n const overlayX = side === 'right' ? (rtl ? 'end' : 'start') : rtl ? 'start' : 'end';\r\n return {\r\n originX,\r\n originY: alignY,\r\n overlayX,\r\n overlayY: alignY,\r\n offsetX,\r\n offsetY: this.host.alignOffset(),\r\n };\r\n }\r\n\r\n private signedSideOffset(side: RaqmTooltipPhysicalSide): number {\r\n return side === 'bottom' || side === 'right' ? this.host.sideOffset() : -this.host.sideOffset();\r\n }\r\n\r\n private toVerticalAlign(align: RaqmTooltipAlign): 'top' | 'center' | 'bottom' {\r\n return align === 'start' ? 'top' : align === 'end' ? 'bottom' : 'center';\r\n }\r\n\r\n // Physical sides pass through; logical sides resolve against the live direction.\r\n private resolvePhysicalSide(side: RaqmTooltipSide): RaqmTooltipPhysicalSide {\r\n switch (side) {\r\n case 'inline-start':\r\n return this.currentDir === 'rtl' ? 'right' : 'left';\r\n case 'inline-end':\r\n return this.currentDir === 'rtl' ? 'left' : 'right';\r\n default:\r\n return side;\r\n }\r\n }\r\n\r\n // The opposite physical side, used as the collision fallback.\r\n private oppositeSide(side: RaqmTooltipPhysicalSide): RaqmTooltipPhysicalSide {\r\n switch (side) {\r\n case 'top':\r\n return 'bottom';\r\n case 'bottom':\r\n return 'top';\r\n case 'left':\r\n return 'right';\r\n default:\r\n return 'left';\r\n }\r\n }\r\n\r\n // Centers the arrow on the trigger, clamped inside the rounded corners via a CSS var.\r\n private positionArrow(side: RaqmTooltipPhysicalSide, surface?: HTMLElement): void {\r\n const content =\r\n surface ?? this.host.pane()?.overlayElement.querySelector<HTMLElement>(`.${CONTENT_CLASS}`);\r\n const trigger = this.host.anchor();\r\n if (!content || !trigger) {\r\n return;\r\n }\r\n // The enter/exit animation scales the surface, so its layout box is measured.\r\n const contentRect = layoutBox(content);\r\n const triggerRect = trigger.getBoundingClientRect();\r\n const vertical = side === 'top' || side === 'bottom';\r\n const size = vertical ? contentRect.width : contentRect.height;\r\n const center = vertical\r\n ? triggerRect.left + triggerRect.width / 2 - contentRect.left\r\n : triggerRect.top + triggerRect.height / 2 - contentRect.top;\r\n if (size <= 0) {\r\n return;\r\n }\r\n const edge = Math.min(12, size / 2);\r\n const offset = Math.max(edge, Math.min(center, size - edge));\r\n content.style.setProperty('--raqm-tooltip-arrow-offset', `${offset}px`);\r\n }\r\n\r\n // Explicit input first, then the computed direction, then the CDK Bidi value.\r\n private readResolvedDir(): 'ltr' | 'rtl' {\r\n const explicit = this.host.dir();\r\n if (explicit === 'ltr' || explicit === 'rtl') {\r\n return explicit;\r\n }\r\n const computedStyle = getComputedStyle(this.host.element).direction;\r\n if (computedStyle === 'rtl') {\r\n return 'rtl';\r\n }\r\n if (computedStyle === 'ltr') {\r\n return 'ltr';\r\n }\r\n return this.host.directionality?.value ?? 'ltr';\r\n }\r\n\r\n // Observes trigger/content size changes while open; one bounded reposition each.\r\n attachResizeObserver(trigger: HTMLElement, overlayRef: OverlayRef): void {\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n this.resizeObserver?.disconnect();\r\n const observer = new ResizeObserver(() => {\r\n if (this.host.pane() === overlayRef) {\r\n this.scheduleReposition();\r\n }\r\n });\r\n this.resizeObserver = observer;\r\n observer.observe(trigger);\r\n const surface = overlayRef.overlayElement.querySelector<HTMLElement>(`.${CONTENT_CLASS}`);\r\n if (surface) {\r\n observer.observe(surface);\r\n }\r\n }\r\n\r\n releaseSide(): void {\r\n this.sideSubscription?.unsubscribe();\r\n this.sideSubscription = undefined;\r\n }\r\n\r\n releaseResizeObserver(): void {\r\n if (this.resizeObserver !== undefined) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n }\r\n\r\n // A closed pane drops the strategy and the position/arrow map together.\r\n reset(): void {\r\n this.cancelScheduledReposition();\r\n this.positionStrategy = undefined;\r\n this.currentPositions = [];\r\n this.currentSides = [];\r\n }\r\n\r\n // A detached or destroyed pane drops the strategy; the map is cleared separately.\r\n discard(): void {\r\n this.cancelScheduledReposition();\r\n this.positionStrategy = undefined;\r\n }\r\n\r\n clear(): void {\r\n this.currentPositions = [];\r\n this.currentSides = [];\r\n }\r\n\r\n private cancelScheduledReposition(): void {\r\n if (!this.frame) {\r\n return;\r\n }\r\n this.frameView?.cancelAnimationFrame(this.frame);\r\n this.frame = 0;\r\n this.frameView = undefined;\r\n }\r\n}\r\n","// Tooltip slots: the single trigger and the single content template, with their guards.\r\n\r\nimport { TemplateRef, computed, isDevMode, signal } from '@angular/core';\r\n\r\nimport { RaqmTooltipTriggerRef } from './tooltip-context';\r\n\r\nexport interface RaqmTooltipSlotHost {\r\n /** The panel template; without it an open has nothing to attach. */\r\n panel(): TemplateRef<unknown> | undefined;\r\n /** A registration changed, so a pending open may now be possible. */\r\n onChanged(): void;\r\n /** A registered slot went away; an open tooltip is closed rather than orphaned. */\r\n onLost(): void;\r\n}\r\n\r\nexport class RaqmTooltipSlot {\r\n private readonly triggerRef = signal<RaqmTooltipTriggerRef | null>(null);\r\n\r\n /** Template-facing: the consumer content, or `null` before it registers. */\r\n readonly contentTemplate = signal<TemplateRef<unknown> | null>(null);\r\n\r\n /** Whether every slot an open needs is registered. */\r\n readonly canOpen = computed(\r\n () =>\r\n this.triggerRef() !== null &&\r\n this.contentTemplate() !== null &&\r\n this.host.panel() !== undefined,\r\n );\r\n\r\n constructor(\r\n private readonly document: Document,\r\n private readonly host: RaqmTooltipSlotHost,\r\n ) {}\r\n\r\n trigger(): RaqmTooltipTriggerRef | null {\r\n return this.triggerRef();\r\n }\r\n\r\n content(): TemplateRef<unknown> | null {\r\n return this.contentTemplate();\r\n }\r\n\r\n registerTrigger(ref: RaqmTooltipTriggerRef): void {\r\n const current = this.triggerRef();\r\n if (current !== null && current !== ref) {\r\n if (isDevMode()) {\r\n console.error(\r\n '[raqm-tooltip] Only one `[raqm-tooltip-trigger]` is supported per <raqm-tooltip>; the extra trigger is ignored.',\r\n );\r\n }\r\n return;\r\n }\r\n this.triggerRef.set(ref);\r\n this.host.onChanged();\r\n }\r\n\r\n /** Unregisters the trigger; an open tooltip is closed rather than orphaned. */\r\n unregisterTrigger(ref: RaqmTooltipTriggerRef): void {\r\n if (this.triggerRef() !== ref) {\r\n return;\r\n }\r\n this.triggerRef.set(null);\r\n this.host.onLost();\r\n }\r\n\r\n registerContent(template: TemplateRef<unknown>): void {\r\n const current = this.contentTemplate();\r\n if (current !== null && current !== template) {\r\n if (isDevMode()) {\r\n console.error(\r\n '[raqm-tooltip] Only one `ng-template[raqm-tooltip-content]` is supported per <raqm-tooltip>; the extra template is ignored.',\r\n );\r\n }\r\n return;\r\n }\r\n this.contentTemplate.set(template);\r\n this.host.onChanged();\r\n }\r\n\r\n /** Unregisters the content template; an open tooltip is closed rather than orphaned. */\r\n unregisterContent(template: TemplateRef<unknown>): void {\r\n if (this.contentTemplate() !== template) {\r\n return;\r\n }\r\n this.contentTemplate.set(null);\r\n this.host.onLost();\r\n }\r\n\r\n isTriggerFocused(): boolean {\r\n const trigger = this.triggerRef();\r\n return trigger !== null && this.document.activeElement === trigger.element;\r\n }\r\n}\r\n","// Tooltip timers: the provider hover-open delay, the hover gap and the pending-open Escape.\r\n\r\nimport { RaqmTooltipOpenReason, RaqmTooltipTriggerRef } from './tooltip-context';\r\nimport { HOVER_GAP_MS } from './tooltip-model';\r\n\r\nexport interface RaqmTooltipTimersHost {\r\n open(): boolean;\r\n openReason(): RaqmTooltipOpenReason;\r\n destroyed(): boolean;\r\n trigger(): RaqmTooltipTriggerRef | null;\r\n /** The hover delay elapsed; the caller re-checks its open policy. */\r\n onOpenElapsed(): void;\r\n /** The hover gap elapsed for a still-open tooltip; the caller closes it. */\r\n onHoverElapsed(): void;\r\n /** Escape during a pending delay, or while the pane is visible. */\r\n onEscape(trigger: RaqmTooltipTriggerRef): void;\r\n}\r\n\r\nexport class RaqmTooltipTimers {\r\n private openTimer: ReturnType<typeof setTimeout> | undefined;\r\n private hoverCloseTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n // Armed only while a delayed hover open is pending; dismissible without trigger focus.\r\n private pendingEscapeListener: ((event: KeyboardEvent) => void) | undefined;\r\n\r\n constructor(\r\n private readonly document: Document,\r\n private readonly host: RaqmTooltipTimersHost,\r\n ) {}\r\n\r\n /** Arms the one pending hover-open delay, and its pending-open Escape listener. */\r\n armOpen(delay: number): void {\r\n this.openTimer = setTimeout(() => {\r\n this.openTimer = undefined;\r\n this.removePendingEscape();\r\n this.host.onOpenElapsed();\r\n }, delay);\r\n // Escape can dismiss the pending hover interaction before any overlay exists.\r\n this.armPendingEscape();\r\n }\r\n\r\n /** Cancels the one pending hover-open delay and its pending Escape listener. */\r\n cancelOpen(): void {\r\n if (this.openTimer !== undefined) {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = undefined;\r\n }\r\n this.removePendingEscape();\r\n }\r\n\r\n cancelHoverClose(): void {\r\n if (this.hoverCloseTimer !== undefined) {\r\n clearTimeout(this.hoverCloseTimer);\r\n this.hoverCloseTimer = undefined;\r\n }\r\n }\r\n\r\n scheduleHoverClose(): void {\r\n if (\r\n !this.host.open() ||\r\n this.host.openReason() === 'focus' ||\r\n this.hoverCloseTimer !== undefined\r\n ) {\r\n return;\r\n }\r\n this.hoverCloseTimer = setTimeout(() => {\r\n this.hoverCloseTimer = undefined;\r\n if (!this.host.destroyed() && this.host.open()) {\r\n this.host.onHoverElapsed();\r\n }\r\n }, HOVER_GAP_MS);\r\n }\r\n\r\n /** Removes only the pending-open Escape listener; the hover-open delay is untouched. */\r\n removePendingEscape(): void {\r\n if (this.pendingEscapeListener !== undefined) {\r\n this.document.removeEventListener('keydown', this.pendingEscapeListener);\r\n this.pendingEscapeListener = undefined;\r\n }\r\n }\r\n\r\n // Dismissible while pending, even when focus is not on the trigger.\r\n private armPendingEscape(): void {\r\n this.removePendingEscape();\r\n const trigger = this.host.trigger();\r\n if (trigger === null) {\r\n return;\r\n }\r\n this.pendingEscapeListener = (event: KeyboardEvent) => {\r\n if (event.key !== 'Escape') {\r\n return;\r\n }\r\n this.host.onEscape(trigger);\r\n };\r\n this.document.addEventListener('keydown', this.pendingEscapeListener);\r\n }\r\n}\r\n","import { DOCUMENT, NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Injector,\r\n OnDestroy,\r\n TemplateRef,\r\n ViewContainerRef,\r\n booleanAttribute,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\n\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { Overlay } from '@angular/cdk/overlay';\r\nimport { ScrollDispatcher, ViewportRuler } from '@angular/cdk/scrolling';\r\n\r\nimport {\r\n RAQM_TOOLTIP,\r\n RAQM_TOOLTIP_PROVIDER,\r\n RaqmTooltipContext,\r\n RaqmTooltipOpenReason,\r\n RaqmTooltipTriggerRef,\r\n} from './tooltip-context';\r\nimport { RaqmTooltipLifecycle } from './tooltip-lifecycle';\r\nimport {\r\n DEFAULT_ALIGN,\r\n DEFAULT_ALIGN_OFFSET,\r\n DEFAULT_SIDE,\r\n DEFAULT_SIDE_OFFSET,\r\n RaqmTooltipAlign,\r\n RaqmTooltipSide,\r\n toAlign,\r\n toDir,\r\n toOffset,\r\n toSide,\r\n} from './tooltip-model';\r\nimport { RaqmTooltipPane } from './tooltip-pane';\r\nimport { RaqmTooltipPosition } from './tooltip-position';\r\nimport { RaqmTooltipSlot } from './tooltip-slot';\r\nimport { RaqmTooltipTimers } from './tooltip-timers';\r\n\r\nexport type { RaqmTooltipAlign, RaqmTooltipSide } from './tooltip-model';\r\n\r\n@Component({\r\n selector: 'raqm-tooltip',\r\n imports: [NgTemplateOutlet],\r\n templateUrl: './tooltip.html',\r\n styleUrl: './tooltip.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n exportAs: 'raqmTooltip',\r\n providers: [\r\n // A dedicated token (not a component import) avoids a runtime module cycle.\r\n { provide: RAQM_TOOLTIP, useExisting: RaqmTooltipComponent },\r\n ],\r\n})\r\nexport class RaqmTooltipComponent implements RaqmTooltipContext, OnDestroy {\r\n // Read only for the live computed direction; the host renders no box of its own.\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n private readonly overlay = inject(Overlay);\r\n\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n\r\n private readonly injector = inject(Injector);\r\n\r\n // Optional Bidi service; the computed direction wins so a CSS-only `dir` ancestor works.\r\n private readonly directionality = inject(Directionality, { optional: true });\r\n\r\n private readonly viewportRuler = inject(ViewportRuler);\r\n\r\n private readonly scrollDispatcher = inject(ScrollDispatcher);\r\n\r\n private readonly document = inject(DOCUMENT);\r\n\r\n // Nearest provider (shared delay + single-active scope); without one the delay is 0.\r\n private readonly provider = inject(RAQM_TOOLTIP_PROVIDER, { optional: true });\r\n\r\n // An optional query so an interaction cannot throw while the view query is unresolved.\r\n private readonly panelTemplate = viewChild('panel', { read: TemplateRef });\r\n\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n readonly side = input<RaqmTooltipSide>(DEFAULT_SIDE, { transform: toSide });\r\n\r\n readonly align = input<RaqmTooltipAlign>(DEFAULT_ALIGN, {\r\n transform: toAlign,\r\n });\r\n\r\n readonly sideOffset = input(DEFAULT_SIDE_OFFSET, {\r\n transform: toOffset(DEFAULT_SIDE_OFFSET),\r\n });\r\n\r\n readonly alignOffset = input(DEFAULT_ALIGN_OFFSET, {\r\n transform: toOffset(DEFAULT_ALIGN_OFFSET),\r\n });\r\n\r\n readonly dir = input<'ltr' | 'rtl' | undefined>(undefined, {\r\n transform: toDir,\r\n });\r\n\r\n // Direction, physical side, the CDK strategy and the arrow.\r\n private readonly position: RaqmTooltipPosition = new RaqmTooltipPosition(this.overlay, {\r\n element: this.host.nativeElement,\r\n directionality: this.directionality,\r\n side: () => this.side(),\r\n align: () => this.align(),\r\n sideOffset: () => this.sideOffset(),\r\n alignOffset: () => this.alignOffset(),\r\n dir: () => this.dir(),\r\n anchor: () => this.slot.trigger()?.element ?? null,\r\n pane: () => this.pane.ref,\r\n });\r\n\r\n // The overlay pane, its subscriptions and the exit transition.\r\n private readonly pane: RaqmTooltipPane = new RaqmTooltipPane(\r\n this.overlay,\r\n this.viewportRuler,\r\n this.scrollDispatcher,\r\n this.document,\r\n this.viewContainerRef,\r\n this.position,\r\n {\r\n injector: this.injector,\r\n claimActive: () => this.lifecycle.claimActive(),\r\n onOutsidePress: (trigger) => this.lifecycle.requestClose(trigger, 'press'),\r\n onEscape: (trigger) => this.lifecycle.requestClose(trigger, 'escape'),\r\n onDetached: (overlayRef) => this.lifecycle.handleDetached(overlayRef),\r\n },\r\n );\r\n\r\n // The single trigger and the single content template, with their guards.\r\n private readonly slot: RaqmTooltipSlot = new RaqmTooltipSlot(this.document, {\r\n panel: () => this.panelTemplate(),\r\n onChanged: () => this.lifecycle.retryRequestedOpen(),\r\n onLost: () => this.lifecycle.closeForPeer(),\r\n });\r\n\r\n // The provider hover-open delay, the hover gap and the pending-open Escape listener.\r\n private readonly timers: RaqmTooltipTimers = new RaqmTooltipTimers(this.document, {\r\n open: () => this.open(),\r\n openReason: () => this.lifecycle.currentReason(),\r\n destroyed: () => this.destroyed,\r\n trigger: () => this.slot.trigger(),\r\n onOpenElapsed: () => this.lifecycle.onOpenElapsed(),\r\n onHoverElapsed: () => this.lifecycle.beginClose(false),\r\n onEscape: (trigger) => this.lifecycle.requestClose(trigger, 'escape'),\r\n });\r\n\r\n // The open/close policy, the provider claim and the pane hand-off.\r\n private readonly lifecycle: RaqmTooltipLifecycle = new RaqmTooltipLifecycle({\r\n pane: this.pane,\r\n position: this.position,\r\n slot: this.slot,\r\n timers: this.timers,\r\n provider: this.provider,\r\n disabled: () => this.disabled(),\r\n destroyed: () => this.destroyed,\r\n delay: () => this.delay(),\r\n panel: () => this.panelTemplate(),\r\n });\r\n\r\n // The hover delay from the nearest provider, or 0 without one.\r\n private readonly delay = computed(() => this.provider?.delay() ?? 0);\r\n\r\n private destroyed = false;\r\n\r\n readonly open = this.pane.open;\r\n\r\n readonly tooltipId = this.pane.tooltipId;\r\n\r\n private readonly contentTemplate = this.slot.contentTemplate;\r\n\r\n protected readonly panelDir = this.position.panelDir;\r\n\r\n protected readonly resolvedSide = this.position.resolvedSide;\r\n\r\n protected readonly closing = this.pane.closing;\r\n\r\n constructor() {\r\n // A root disabled while open closes immediately; a disabled root never opens.\r\n effect(() => {\r\n const disabled = this.disabled();\r\n untracked(() => {\r\n if (!disabled) {\r\n return;\r\n }\r\n this.lifecycle.closeNow();\r\n });\r\n });\r\n\r\n // A placement/offset/direction change while open repositions; closed it is a no-op.\r\n effect(() => {\r\n this.side();\r\n this.align();\r\n this.sideOffset();\r\n this.alignOffset();\r\n this.dir();\r\n untracked(() => this.applyPositionInputs());\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyed = true;\r\n this.pane.invalidate();\r\n this.lifecycle.destroy();\r\n }\r\n\r\n registerTrigger(ref: RaqmTooltipTriggerRef): void {\r\n this.slot.registerTrigger(ref);\r\n }\r\n\r\n /** Unregisters the trigger; an open tooltip is closed rather than orphaned. */\r\n unregisterTrigger(ref: RaqmTooltipTriggerRef): void {\r\n this.slot.unregisterTrigger(ref);\r\n }\r\n\r\n registerContent(template: TemplateRef<unknown>): void {\r\n this.slot.registerContent(template);\r\n }\r\n\r\n /** Unregisters the content template; an open tooltip is closed rather than orphaned. */\r\n unregisterContent(template: TemplateRef<unknown>): void {\r\n this.slot.unregisterContent(template);\r\n }\r\n\r\n requestOpen(ref: RaqmTooltipTriggerRef, reason: RaqmTooltipOpenReason): void {\r\n this.lifecycle.requestOpen(ref, reason);\r\n }\r\n\r\n requestClose(ref: RaqmTooltipTriggerRef, reason: 'mouse' | 'focus' | 'press' | 'escape'): void {\r\n this.lifecycle.requestClose(ref, reason);\r\n }\r\n\r\n cancelHoverClose(): void {\r\n this.timers.cancelHoverClose();\r\n }\r\n\r\n scheduleHoverClose(): void {\r\n this.timers.scheduleHoverClose();\r\n }\r\n\r\n closeForPeer(): void {\r\n this.lifecycle.closeForPeer();\r\n }\r\n\r\n // The wrapper's own pointer events keep a hover tooltip open across the gap.\r\n\r\n protected onContentPointerEnter(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n this.timers.cancelHoverClose();\r\n }\r\n }\r\n\r\n protected onContentPointerLeave(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n this.timers.scheduleHoverClose();\r\n }\r\n }\r\n\r\n private applyPositionInputs(): void {\r\n if (this.pane.hasPane) {\r\n this.pane.reposition();\r\n }\r\n }\r\n}\r\n","<!-- One `button[raqm-tooltip-trigger]` (or passive span for a disabled button) plus one\r\n `ng-template[raqm-tooltip-content]`; the root never wraps or clones the trigger. -->\r\n<ng-content />\r\n\r\n<ng-template #panel>\r\n <div\r\n class=\"raqm-tooltip-content\"\r\n role=\"tooltip\"\r\n [attr.id]=\"tooltipId()\"\r\n [attr.dir]=\"panelDir()\"\r\n [attr.data-raqm-side]=\"resolvedSide()\"\r\n [class.raqm-tooltip-content--closing]=\"closing()\"\r\n (pointerenter)=\"onContentPointerEnter($event)\"\r\n (pointerleave)=\"onContentPointerLeave($event)\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"contentTemplate()\" />\r\n\r\n <!-- The decorative diamond arrow is inert and never part of the description. -->\r\n <span class=\"raqm-tooltip-arrow\" aria-hidden=\"true\"></span>\r\n </div>\r\n</ng-template>\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n OnInit,\r\n Renderer2,\r\n TemplateRef,\r\n effect,\r\n inject,\r\n input,\r\n isDevMode,\r\n numberAttribute,\r\n untracked,\r\n} from '@angular/core';\r\n\r\nimport {\r\n RAQM_TOOLTIP,\r\n RAQM_TOOLTIP_PROVIDER,\r\n RaqmTooltipActive,\r\n RaqmTooltipContext,\r\n RaqmTooltipProviderContext,\r\n RaqmTooltipTriggerRef,\r\n} from './tooltip-context';\r\n\r\nfunction toDelay(value: unknown): number {\r\n const parsed = numberAttribute(value, 0);\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;\r\n}\r\n\r\n@Directive({\r\n selector: '[raqm-tooltip-provider]',\r\n exportAs: 'raqmTooltipProvider',\r\n providers: [{ provide: RAQM_TOOLTIP_PROVIDER, useExisting: RaqmTooltipProviderDirective }],\r\n})\r\nexport class RaqmTooltipProviderDirective implements RaqmTooltipProviderContext {\r\n readonly delay = input(0, { transform: toDelay });\r\n\r\n // The one currently open tooltip inside this provider scope, or null.\r\n private active: RaqmTooltipActive | null = null;\r\n\r\n /** Registers a newly open tooltip, closing the previous active one in this scope. */\r\n registerActive(active: RaqmTooltipActive): void {\r\n if (this.active !== null && this.active !== active) {\r\n this.active.closeForPeer();\r\n }\r\n this.active = active;\r\n }\r\n\r\n /** Clears the active registration only when it still belongs to this tooltip. */\r\n clearActive(active: RaqmTooltipActive): void {\r\n if (this.active === active) {\r\n this.active = null;\r\n }\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: 'button[raqm-tooltip-trigger], span[raqm-tooltip-trigger]',\r\n host: {\r\n class: 'raqm-tooltip-trigger',\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n '(pointerleave)': 'onPointerLeave($event)',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(focus)': 'onFocus()',\r\n '(blur)': 'onBlur()',\r\n '(keydown)': 'onKeydown($event)',\r\n '(click)': 'onClick()',\r\n },\r\n})\r\nexport class RaqmTooltipTriggerDirective implements OnInit {\r\n // Native host element; the selector guarantees a button or a span.\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n // Optional, so a misplaced trigger reports rather than crashes.\r\n private readonly tooltip = inject<RaqmTooltipContext | null>(RAQM_TOOLTIP, {\r\n optional: true,\r\n });\r\n\r\n private readonly renderer = inject(Renderer2);\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n private ownedToken: string | null = null;\r\n\r\n // Live getters keep the disabled state current.\r\n private readonly ref: RaqmTooltipTriggerRef = (() => {\r\n const self = this;\r\n return {\r\n get element(): HTMLElement {\r\n return self.host.nativeElement;\r\n },\r\n get disabled(): boolean {\r\n const element = self.host.nativeElement;\r\n return element instanceof HTMLButtonElement && element.disabled;\r\n },\r\n };\r\n })();\r\n\r\n constructor() {\r\n // Keep the host's aria-describedby in step with the root's live tooltip id.\r\n effect(() => {\r\n const token = this.tooltip?.open() ? this.tooltip.tooltipId() : null;\r\n untracked(() => this.syncDescribedBy(token));\r\n });\r\n\r\n // Default a native button's type to `button` so a trigger never submits its form.\r\n const element = this.host.nativeElement;\r\n if (element instanceof HTMLButtonElement && !element.hasAttribute('type')) {\r\n element.setAttribute('type', 'button');\r\n }\r\n\r\n if (isDevMode() && this.tooltip === null) {\r\n console.error(\r\n '[raqm-tooltip-trigger] No parent <raqm-tooltip> found; the trigger cannot show a tooltip.',\r\n );\r\n }\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.tooltip?.unregisterTrigger(this.ref);\r\n this.syncDescribedBy(null);\r\n });\r\n }\r\n\r\n /** Registers the trigger with the root once the directive is initialized. */\r\n ngOnInit(): void {\r\n this.tooltip?.registerTrigger(this.ref);\r\n }\r\n\r\n /** Opens on mouse hover only; touch/pen hover is deliberately ignored. */\r\n protected onPointerEnter(event: Event): void {\r\n const pointer = event as PointerEvent;\r\n if (pointer.pointerType !== 'mouse') {\r\n return;\r\n }\r\n this.tooltip?.requestOpen(this.ref, 'mouse');\r\n }\r\n\r\n /** Requests the bounded hover-gap close on mouse leave. */\r\n protected onPointerLeave(event: Event): void {\r\n const pointer = event as PointerEvent;\r\n if (pointer.pointerType !== 'mouse') {\r\n return;\r\n }\r\n this.tooltip?.requestClose(this.ref, 'mouse');\r\n }\r\n\r\n /** A primary press closes an open tooltip; touch presses are included. */\r\n protected onPointerDown(event: Event): void {\r\n const pointer = event as PointerEvent;\r\n if (pointer.button !== 0) {\r\n return;\r\n }\r\n this.tooltip?.requestClose(this.ref, 'press');\r\n }\r\n\r\n /** Native keyboard focus opens immediately (the root applies any suppression). */\r\n protected onFocus(): void {\r\n this.tooltip?.requestOpen(this.ref, 'focus');\r\n }\r\n\r\n /** Losing focus closes the tooltip and clears any focus suppression in the root. */\r\n protected onBlur(): void {\r\n this.tooltip?.requestClose(this.ref, 'focus');\r\n }\r\n\r\n /** Escape closes an open tooltip or dismisses a pending delayed open. */\r\n protected onKeydown(event: Event): void {\r\n const key = event as KeyboardEvent;\r\n if (key.key !== 'Escape' || this.tooltip === null) {\r\n return;\r\n }\r\n // Consume the key only while open; a pending delayed open closes via the policy.\r\n if (this.tooltip.open()) {\r\n key.preventDefault();\r\n key.stopPropagation();\r\n }\r\n this.tooltip.requestClose(this.ref, 'escape');\r\n }\r\n\r\n /** A native/assistive click (including Enter/Space) closes an open tooltip. */\r\n protected onClick(): void {\r\n if (this.tooltip?.open()) {\r\n this.tooltip.requestClose(this.ref, 'press');\r\n }\r\n }\r\n\r\n // Merges/removes only the owned id in the host's aria-describedby token list.\r\n private syncDescribedBy(nextToken: string | null): void {\r\n const element = this.host.nativeElement;\r\n const previous = this.ownedToken;\r\n if (previous === nextToken) {\r\n return;\r\n }\r\n const tokens = (element.getAttribute('aria-describedby') ?? '')\r\n .split(/\\s+/)\r\n .filter((token) => token.length > 0 && token !== previous);\r\n if (nextToken !== null && !tokens.includes(nextToken)) {\r\n tokens.push(nextToken);\r\n }\r\n if (tokens.length > 0) {\r\n this.renderer.setAttribute(element, 'aria-describedby', tokens.join(' '));\r\n } else {\r\n this.renderer.removeAttribute(element, 'aria-describedby');\r\n }\r\n this.ownedToken = nextToken;\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: 'ng-template[raqm-tooltip-content]',\r\n exportAs: 'raqmTooltipContent',\r\n})\r\nexport class RaqmTooltipContentDirective implements OnInit {\r\n private readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n\r\n // Optional, so a misplaced template reports instead of crashing.\r\n private readonly tooltip = inject<RaqmTooltipContext | null>(RAQM_TOOLTIP, {\r\n optional: true,\r\n });\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n if (isDevMode() && this.tooltip === null) {\r\n console.error(\r\n '[raqm-tooltip-content] No parent <raqm-tooltip> found; the content is never rendered.',\r\n );\r\n }\r\n this.destroyRef.onDestroy(() => this.tooltip?.unregisterContent(this.template));\r\n }\r\n\r\n /** Registers the content template with the root once initialized. */\r\n ngOnInit(): void {\r\n this.tooltip?.registerContent(this.template);\r\n }\r\n}\r\n","import { RaqmTooltipComponent } from './tooltip';\r\nimport {\r\n RaqmTooltipContentDirective,\r\n RaqmTooltipProviderDirective,\r\n RaqmTooltipTriggerDirective,\r\n} from './tooltip.directive';\r\n\r\nexport {\r\n RaqmTooltipComponent,\r\n RaqmTooltipContentDirective,\r\n RaqmTooltipProviderDirective,\r\n RaqmTooltipTriggerDirective,\r\n};\r\n// @internal Sidebar composition contract.\r\nexport type { RaqmTooltipTriggerRef } from './tooltip-context';\r\n\r\nexport const RaqmTooltip = [\r\n RaqmTooltipComponent,\r\n RaqmTooltipContentDirective,\r\n RaqmTooltipProviderDirective,\r\n RaqmTooltipTriggerDirective,\r\n] as const;\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raqm-ui-tooltip.mjs","names":["pointer"],"sources":["../../../projects/ui/tooltip/tooltip-context.ts","../../../projects/ui/tooltip/tooltip-lifecycle.ts","../../../projects/ui/tooltip/tooltip-model.ts","../../../projects/ui/tooltip/tooltip-pane.ts","../../../projects/ui/tooltip/tooltip-position.ts","../../../projects/ui/tooltip/tooltip-slot.ts","../../../projects/ui/tooltip/tooltip-timers.ts","../../../projects/ui/tooltip/tooltip.ts","../../../projects/ui/tooltip/tooltip.html","../../../projects/ui/tooltip/tooltip.directive.ts","../../../projects/ui/tooltip/public-api.ts"],"sourcesContent":["import { InjectionToken, Signal, TemplateRef } from '@angular/core';\r\n\r\nexport interface RaqmTooltipTriggerRef {\r\n /** The native button or passive span the root anchors the tooltip to. */\r\n readonly element: HTMLElement;\r\n /** Live native disabled state, read by the root's open policy at event time. */\r\n readonly disabled: boolean;\r\n}\r\n\r\n/** The interaction that requested the tooltip open. */\r\nexport type RaqmTooltipOpenReason = 'mouse' | 'focus';\r\n\r\n/** The interaction that requested the tooltip close. */\r\nexport type RaqmTooltipCloseReason = 'mouse' | 'focus' | 'press' | 'escape';\r\n\r\nexport interface RaqmTooltipContext {\r\n /** Whether the tooltip is currently shown (enabled and attached). */\r\n readonly open: Signal<boolean>;\r\n /** The live content id while shown (the trigger's `aria-describedby` token), or `null`. */\r\n readonly tooltipId: Signal<string | null>;\r\n /** Registers the single trigger; called once per root. */\r\n registerTrigger(ref: RaqmTooltipTriggerRef): void;\r\n /** Unregisters the trigger on destroy; never changes open state. */\r\n unregisterTrigger(ref: RaqmTooltipTriggerRef): void;\r\n /** Registers the single content template; called once per root. */\r\n registerContent(template: TemplateRef<unknown>): void;\r\n /** Unregisters the content template on destroy. */\r\n unregisterContent(template: TemplateRef<unknown>): void;\r\n /** Requests opening from a hover or keyboard-focus interaction. */\r\n requestOpen(ref: RaqmTooltipTriggerRef, reason: RaqmTooltipOpenReason): void;\r\n /** Requests closing from a hover, blur, press or Escape interaction. */\r\n requestClose(ref: RaqmTooltipTriggerRef, reason: RaqmTooltipCloseReason): void;\r\n /** Cancels a pending hover-gap close when the pointer enters the content. */\r\n cancelHoverClose(): void;\r\n /** Schedules a bounded hover-gap close when the pointer leaves the content. */\r\n scheduleHoverClose(): void;\r\n}\r\n\r\n/** One open tooltip registered with a provider, so the provider keeps a single active one. */\r\nexport interface RaqmTooltipActive {\r\n /** Immediately closes this tooltip without an exit animation (peer opened). */\r\n closeForPeer(): void;\r\n}\r\n\r\nexport interface RaqmTooltipProviderContext {\r\n /** The hover-open delay in milliseconds applied to descendant tooltips. */\r\n readonly delay: Signal<number>;\r\n /** Registers a newly open tooltip and closes the previous active one. */\r\n registerActive(active: RaqmTooltipActive): void;\r\n /** Clears the active registration when a tooltip closes or is destroyed. */\r\n clearActive(active: RaqmTooltipActive): void;\r\n}\r\n\r\n/** Injection token for the parent Tooltip root; injected optionally, so a misplaced child reports rather than crashes. */\r\nexport const RAQM_TOOLTIP = new InjectionToken<RaqmTooltipContext>('RaqmTooltip');\r\n\r\n/** Injection token for the nearest Tooltip provider; without one a root uses a 0ms delay and has no sibling scope. */\r\nexport const RAQM_TOOLTIP_PROVIDER = new InjectionToken<RaqmTooltipProviderContext>(\r\n 'RaqmTooltipProvider',\r\n);\r\n","// Tooltip lifecycle: the open/close policy, provider claim and the pane hand-off.\r\n\r\nimport { TemplateRef } from '@angular/core';\r\n\r\nimport { OverlayRef } from '@angular/cdk/overlay';\r\n\r\nimport {\r\n RaqmTooltipActive,\r\n RaqmTooltipOpenReason,\r\n RaqmTooltipProviderContext,\r\n RaqmTooltipTriggerRef,\r\n} from './tooltip-context';\r\nimport { RaqmTooltipPane } from './tooltip-pane';\r\nimport { RaqmTooltipPosition } from './tooltip-position';\r\nimport { RaqmTooltipSlot } from './tooltip-slot';\r\nimport { RaqmTooltipTimers } from './tooltip-timers';\r\n\r\nexport interface RaqmTooltipLifecycleHost {\r\n readonly pane: RaqmTooltipPane;\r\n readonly position: RaqmTooltipPosition;\r\n readonly slot: RaqmTooltipSlot;\r\n readonly timers: RaqmTooltipTimers;\r\n /** Nearest provider (shared delay + single-active scope). */\r\n readonly provider: RaqmTooltipProviderContext | null;\r\n disabled(): boolean;\r\n destroyed(): boolean;\r\n /** The hover delay from the nearest provider, or 0 without one. */\r\n delay(): number;\r\n /** The panel template; an open has nothing to attach without it. */\r\n panel(): TemplateRef<unknown> | undefined;\r\n}\r\n\r\nexport class RaqmTooltipLifecycle implements RaqmTooltipActive {\r\n // Set while an open is requested, so a late trigger/content registration retries.\r\n private openRequested = false;\r\n\r\n private openReason: RaqmTooltipOpenReason = 'mouse';\r\n\r\n // Whether focus may open the tooltip; set by a press/Escape close and cleared on blur.\r\n private suppressFocusOpen = false;\r\n\r\n private providerRegistered = false;\r\n\r\n constructor(private readonly host: RaqmTooltipLifecycleHost) {}\r\n\r\n /** The interaction that requested the current open; hover closes are skipped for focus. */\r\n currentReason(): RaqmTooltipOpenReason {\r\n return this.openReason;\r\n }\r\n\r\n requestOpen(ref: RaqmTooltipTriggerRef, reason: RaqmTooltipOpenReason): void {\r\n if (ref !== this.host.slot.trigger()) {\r\n return;\r\n }\r\n // A live native disabled button never opens; a passive span around one stays allowed.\r\n if (this.host.disabled() || ref.disabled) {\r\n return;\r\n }\r\n if (reason === 'focus' && this.suppressFocusOpen) {\r\n return;\r\n }\r\n if (this.host.pane.open() || this.host.pane.hasPane) {\r\n // A re-entry cancels a pending hover close; only focus upgrades ownership.\r\n this.host.timers.cancelHoverClose();\r\n if (reason === 'focus') {\r\n this.openReason = 'focus';\r\n }\r\n return;\r\n }\r\n if (!this.host.slot.canOpen()) {\r\n this.openRequested = true;\r\n this.openReason = reason;\r\n return;\r\n }\r\n this.openRequested = true;\r\n this.openReason = reason;\r\n this.host.timers.cancelOpen();\r\n if (reason === 'focus') {\r\n this.host.timers.cancelHoverClose();\r\n this.beginOpen('focus');\r\n return;\r\n }\r\n const delay = this.host.delay();\r\n if (delay > 0) {\r\n this.host.timers.armOpen(delay);\r\n return;\r\n }\r\n this.beginOpen('mouse');\r\n }\r\n\r\n requestClose(ref: RaqmTooltipTriggerRef, reason: 'mouse' | 'focus' | 'press' | 'escape'): void {\r\n if (ref !== this.host.slot.trigger()) {\r\n return;\r\n }\r\n this.openRequested = false;\r\n this.host.timers.cancelOpen();\r\n if (reason === 'focus') {\r\n this.suppressFocusOpen = false;\r\n this.host.timers.cancelHoverClose();\r\n if (this.host.pane.open() || this.host.pane.hasPane) {\r\n this.beginClose(false);\r\n }\r\n return;\r\n }\r\n if (reason === 'mouse') {\r\n if (!this.host.pane.open()) {\r\n return;\r\n }\r\n if (this.openReason === 'focus' && this.host.slot.isTriggerFocused()) {\r\n return;\r\n }\r\n this.host.timers.scheduleHoverClose();\r\n return;\r\n }\r\n // Press/Escape suppresses the focus event that may follow, even with no surface yet.\r\n this.suppressFocusOpen = true;\r\n this.host.timers.cancelHoverClose();\r\n if (!this.host.pane.open()) {\r\n return;\r\n }\r\n this.beginClose(false);\r\n }\r\n\r\n // A disabled root drops any pending request and closes immediately; a peer take-over does the same.\r\n closeNow(): void {\r\n this.openRequested = false;\r\n this.host.timers.cancelOpen();\r\n this.host.timers.cancelHoverClose();\r\n if (this.host.pane.open() || this.host.pane.hasPane) {\r\n this.beginClose(true);\r\n }\r\n }\r\n\r\n closeForPeer(): void {\r\n this.closeNow();\r\n }\r\n\r\n /** Registers this tooltip as the scope's active one, before the overlay exists. */\r\n claimActive(): void {\r\n this.host.provider?.registerActive(this);\r\n this.providerRegistered = true;\r\n }\r\n\r\n // Retries a requested open if it was waiting for a late trigger/template.\r\n retryRequestedOpen(): void {\r\n if (!this.openRequested || this.host.destroyed() || this.host.pane.hasPane) {\r\n return;\r\n }\r\n if (!this.host.slot.canOpen()) {\r\n return;\r\n }\r\n this.beginOpen(this.openReason);\r\n }\r\n\r\n // Re-checks the open policy once the provider's hover delay has elapsed.\r\n onOpenElapsed(): void {\r\n const trigger = this.host.slot.trigger();\r\n if (this.openRequested && !this.host.destroyed() && trigger !== null) {\r\n if (trigger.disabled) {\r\n this.openRequested = false;\r\n return;\r\n }\r\n this.beginOpen('mouse');\r\n }\r\n }\r\n\r\n // The CDK detached the pane, so its subscriptions and the active claim go with it.\r\n handleDetached(overlayRef: OverlayRef): void {\r\n if (!this.host.pane.owns(overlayRef)) {\r\n return;\r\n }\r\n this.host.pane.releaseOwnership();\r\n this.openRequested = false;\r\n this.host.pane.open.set(false);\r\n this.host.pane.tooltipId.set(null);\r\n this.host.pane.closing.set(false);\r\n this.host.position.clear();\r\n this.host.timers.cancelOpen();\r\n this.host.timers.cancelHoverClose();\r\n this.clearProviderRegistration();\r\n this.host.pane.releaseSubscriptions();\r\n }\r\n\r\n /** Tears down every timer, subscription and pane the destroy pass still owns. */\r\n destroy(): void {\r\n this.openRequested = false;\r\n this.host.timers.cancelOpen();\r\n this.host.timers.cancelHoverClose();\r\n this.host.pane.releaseSubscriptions();\r\n const { pending, overlay } = this.host.pane.takeForDestroy();\r\n this.clearProviderRegistration();\r\n pending?.dispose();\r\n overlay?.dispose();\r\n }\r\n\r\n // Creates the one overlay for a fresh open; content is revealed after the next render.\r\n private beginOpen(reason: RaqmTooltipOpenReason): void {\r\n const trigger = this.host.slot.trigger();\r\n const content = this.host.slot.content();\r\n const panel = this.host.panel();\r\n if (\r\n this.host.destroyed() ||\r\n this.host.disabled() ||\r\n trigger === null ||\r\n trigger.disabled ||\r\n content === null ||\r\n panel === undefined ||\r\n this.host.pane.hasPane\r\n ) {\r\n return;\r\n }\r\n this.openRequested = true;\r\n this.openReason = reason;\r\n this.host.timers.removePendingEscape();\r\n this.host.pane.flushPendingDispose();\r\n this.host.timers.cancelHoverClose();\r\n this.host.pane.openLayer(trigger, panel);\r\n }\r\n\r\n // Tears down now when requested or under reduced motion, else after the exit transition.\r\n beginClose(immediate: boolean): void {\r\n this.openRequested = false;\r\n this.host.pane.open.set(false);\r\n this.host.pane.tooltipId.set(null);\r\n this.host.timers.cancelOpen();\r\n this.host.timers.cancelHoverClose();\r\n this.clearProviderRegistration();\r\n this.host.pane.disposePane(immediate);\r\n }\r\n\r\n private clearProviderRegistration(): void {\r\n if (this.providerRegistered) {\r\n this.host.provider?.clearActive(this);\r\n this.providerRegistered = false;\r\n }\r\n }\r\n}\r\n","// Tooltip model: accepted input values, defaults, durations and the root id mint.\r\n\r\nimport { numberAttribute } from '@angular/core';\r\n\r\nexport type RaqmTooltipSide = 'top' | 'bottom' | 'left' | 'right' | 'inline-start' | 'inline-end';\r\n\r\nexport type RaqmTooltipAlign = 'start' | 'center' | 'end';\r\n\r\n// A side after logical resolution; positions, arrow placement and motion all use it.\r\nexport type RaqmTooltipPhysicalSide = 'top' | 'bottom' | 'left' | 'right';\r\n\r\n// The accepted input values; anything else falls back to the default.\r\nconst SIDES: readonly RaqmTooltipSide[] = [\r\n 'top',\r\n 'bottom',\r\n 'left',\r\n 'right',\r\n 'inline-start',\r\n 'inline-end',\r\n];\r\nconst ALIGNS: readonly RaqmTooltipAlign[] = ['start', 'center', 'end'];\r\n\r\nexport const DEFAULT_SIDE: RaqmTooltipSide = 'top';\r\nexport const DEFAULT_ALIGN: RaqmTooltipAlign = 'center';\r\nexport const DEFAULT_SIDE_OFFSET = 4;\r\nexport const DEFAULT_ALIGN_OFFSET = 0;\r\n\r\n// 5px is the positioner's collision padding; the CDK gets the same margin.\r\nexport const VIEWPORT_MARGIN = 5;\r\n\r\nexport const EXIT_ANIMATION_MS = 150;\r\n\r\n// Grace for a pointer crossing the 4px trigger/content gap; not an animation duration.\r\nexport const HOVER_GAP_MS = 100;\r\n\r\n// The overlay pane class; the visual surface lives on `.raqm-tooltip-content`.\r\nexport const PANE_CLASS = 'raqm-tooltip-overlay-pane';\r\n\r\n// The library-owned classes this component toggles directly on the overlay nodes.\r\nexport const CONTENT_CLASS = 'raqm-tooltip-content';\r\nexport const CONTENT_ENTERING_CLASS = 'raqm-tooltip-content--entering';\r\nexport const CONTENT_CLOSING_CLASS = 'raqm-tooltip-content--closing';\r\n\r\nlet nextTooltipId = 0;\r\n\r\n// Minted once per root and exposed only while the content exists.\r\nexport function nextTooltipRootId(): string {\r\n return `raqm-tooltip-${++nextTooltipId}`;\r\n}\r\n\r\nexport function prefersReducedMotion(): boolean {\r\n return typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n}\r\n\r\nexport function toSide(value: unknown): RaqmTooltipSide {\r\n return SIDES.includes(value as RaqmTooltipSide) ? (value as RaqmTooltipSide) : DEFAULT_SIDE;\r\n}\r\n\r\nexport function toAlign(value: unknown): RaqmTooltipAlign {\r\n return ALIGNS.includes(value as RaqmTooltipAlign) ? (value as RaqmTooltipAlign) : DEFAULT_ALIGN;\r\n}\r\n\r\nexport function toDir(value: unknown): 'ltr' | 'rtl' | undefined {\r\n return value === 'ltr' || value === 'rtl' ? value : undefined;\r\n}\r\n\r\nexport function toOffset(fallback: number): (value: unknown) => number {\r\n return (value: unknown): number => {\r\n const parsed = numberAttribute(value, fallback);\r\n return Number.isFinite(parsed) ? parsed : fallback;\r\n };\r\n}\r\n","// Tooltip pane: overlay creation, pane subscriptions, the exit transition and disposal.\r\n\r\nimport {\r\n Injector,\r\n TemplateRef,\r\n ViewContainerRef,\r\n WritableSignal,\r\n afterNextRender,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { ScrollDispatcher, ViewportRuler } from '@angular/cdk/scrolling';\r\n\r\nimport { registerOverlayOwnership } from '@raqm/ui/overlay-internal';\r\n\r\nimport { RaqmTooltipTriggerRef } from './tooltip-context';\r\nimport {\r\n CONTENT_CLASS,\r\n CONTENT_CLOSING_CLASS,\r\n CONTENT_ENTERING_CLASS,\r\n EXIT_ANIMATION_MS,\r\n PANE_CLASS,\r\n nextTooltipRootId,\r\n prefersReducedMotion,\r\n} from './tooltip-model';\r\nimport { RaqmTooltipPosition } from './tooltip-position';\r\n\r\nexport interface RaqmTooltipPaneHost {\r\n /** Injection context for the after-render placement pass. */\r\n readonly injector: Injector;\r\n /** Registers this tooltip as the scope's active one, before the overlay exists. */\r\n claimActive(): void;\r\n /** A primary press outside the pane asks the caller to close. */\r\n onOutsidePress(trigger: RaqmTooltipTriggerRef): void;\r\n /** Escape while the pane is visible asks the caller to close. */\r\n onEscape(trigger: RaqmTooltipTriggerRef): void;\r\n /** The CDK detached the pane, so the caller syncs its own state. */\r\n onDetached(overlayRef: OverlayRef): void;\r\n}\r\n\r\nexport class RaqmTooltipPane {\r\n readonly open: WritableSignal<boolean> = signal(false);\r\n readonly tooltipId: WritableSignal<string | null> = signal(null);\r\n readonly closing: WritableSignal<boolean> = signal(false);\r\n\r\n // Minted once per root and exposed only while the content exists.\r\n private readonly rootId = nextTooltipRootId();\r\n\r\n private overlayRef: OverlayRef | undefined;\r\n\r\n // Bumped per open and on destroy, so a queued after-render pass cannot reveal a dead pane.\r\n private generation = 0;\r\n\r\n private exitTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n private pendingDisposeOverlay: OverlayRef | undefined;\r\n\r\n // The overlay subscriptions, all torn down on every close/detach/destroy path.\r\n private detachSubscription: { unsubscribe(): void } | undefined;\r\n private outsideSubscription: { unsubscribe(): void } | undefined;\r\n private viewportSubscription: { unsubscribe(): void } | undefined;\r\n private scrollSubscription: { unsubscribe(): void } | undefined;\r\n\r\n private escapeListener: ((event: KeyboardEvent) => void) | undefined;\r\n\r\n constructor(\r\n private readonly overlay: Overlay,\r\n private readonly viewportRuler: ViewportRuler,\r\n private readonly scrollDispatcher: ScrollDispatcher,\r\n private readonly document: Document,\r\n private readonly viewContainerRef: ViewContainerRef,\r\n private readonly position: RaqmTooltipPosition,\r\n private readonly host: RaqmTooltipPaneHost,\r\n ) {}\r\n\r\n get hasPane(): boolean {\r\n return this.overlayRef !== undefined;\r\n }\r\n\r\n get ref(): OverlayRef | undefined {\r\n return this.overlayRef;\r\n }\r\n\r\n owns(overlayRef: OverlayRef): boolean {\r\n return this.overlayRef === overlayRef;\r\n }\r\n\r\n /** Creates and attaches the one overlay for a fresh open. */\r\n openLayer(trigger: RaqmTooltipTriggerRef, panel: TemplateRef<unknown>): void {\r\n const generation = ++this.generation;\r\n const preferred = this.position.beginPlacement();\r\n\r\n // Register before the overlay exists, so two surfaces are never visible at once.\r\n this.host.claimActive();\r\n\r\n const strategy = this.position.buildStrategy(trigger.element, preferred);\r\n const config: OverlayConfig = {\r\n positionStrategy: strategy,\r\n // Descriptive and nonmodal: no backdrop, scroll lock, focus trap or role.\r\n hasBackdrop: false,\r\n scrollStrategy: this.overlay.scrollStrategies.noop(),\r\n panelClass: [PANE_CLASS],\r\n disposeOnNavigation: true,\r\n direction: this.position.direction,\r\n };\r\n const overlayRef = this.overlay.create(config);\r\n registerOverlayOwnership(trigger.element, overlayRef);\r\n this.overlayRef = overlayRef;\r\n this.position.watchSide(strategy, overlayRef);\r\n // A primary press anywhere outside the content dismisses the tooltip.\r\n this.outsideSubscription = overlayRef.outsidePointerEvents().subscribe((event) => {\r\n if (event.button === 0) {\r\n this.host.onOutsidePress(trigger);\r\n }\r\n });\r\n this.detachSubscription = overlayRef\r\n .detachments()\r\n .subscribe(() => this.host.onDetached(overlayRef));\r\n // The position collapses burst notifications into one placement pass per frame.\r\n this.viewportSubscription = this.viewportRuler\r\n .change(0)\r\n .subscribe(() => this.position.scheduleReposition());\r\n this.scrollSubscription = this.scrollDispatcher\r\n .ancestorScrolled(trigger.element, 0)\r\n .subscribe(() => this.position.scheduleReposition());\r\n // Escape while a hover-opened tooltip is visible (focus elsewhere) still dismisses it.\r\n this.escapeListener = (event: KeyboardEvent) => {\r\n if (event.key !== 'Escape' || !this.open()) {\r\n return;\r\n }\r\n this.host.onEscape(trigger);\r\n };\r\n this.document.addEventListener('keydown', this.escapeListener);\r\n\r\n overlayRef.attach(new TemplatePortal(panel, this.viewContainerRef));\r\n // Hidden until the after-render placement pass, so it never paints at the CDK origin.\r\n overlayRef.overlayElement.style.visibility = 'hidden';\r\n overlayRef.overlayElement.style.pointerEvents = 'none';\r\n this.open.set(true);\r\n this.tooltipId.set(this.rootId);\r\n this.position.attachResizeObserver(trigger.element, overlayRef);\r\n\r\n afterNextRender(\r\n () => {\r\n if (generation !== this.generation || this.overlayRef !== overlayRef) {\r\n return;\r\n }\r\n this.position.reposition();\r\n this.reveal(overlayRef);\r\n },\r\n { injector: this.host.injector },\r\n );\r\n }\r\n\r\n /** Repositions the live pane; a closed tooltip is a no-op. */\r\n reposition(): void {\r\n this.position.reposition();\r\n }\r\n\r\n /** Drops the pane reference and its strategy; the element is the caller's to dispose. */\r\n releaseOwnership(): void {\r\n this.overlayRef = undefined;\r\n this.position.discard();\r\n }\r\n\r\n /** Blocks a queued after-render reveal for a pane that is going away. */\r\n invalidate(): void {\r\n this.generation += 1;\r\n }\r\n\r\n // Tears down now when requested or under reduced motion, else after the exit transition.\r\n disposePane(immediate: boolean): void {\r\n const overlayRef = this.overlayRef;\r\n this.overlayRef = undefined;\r\n this.position.reset();\r\n this.releaseSubscriptions();\r\n if (!overlayRef) {\r\n this.closing.set(false);\r\n return;\r\n }\r\n // Inert and aria-hidden before disposal: not clickable or announced while it fades.\r\n overlayRef.overlayElement.setAttribute('inert', '');\r\n overlayRef.overlayElement.setAttribute('aria-hidden', 'true');\r\n if (immediate || prefersReducedMotion()) {\r\n this.closing.set(false);\r\n overlayRef.dispose();\r\n return;\r\n }\r\n const surface = overlayRef.overlayElement.querySelector<HTMLElement>(`.${CONTENT_CLASS}`);\r\n surface?.classList.remove(CONTENT_ENTERING_CLASS);\r\n surface?.classList.add(CONTENT_CLOSING_CLASS);\r\n this.closing.set(true);\r\n this.pendingDisposeOverlay = overlayRef;\r\n this.exitTimer = setTimeout(() => {\r\n this.exitTimer = undefined;\r\n this.pendingDisposeOverlay = undefined;\r\n this.closing.set(false);\r\n overlayRef.dispose();\r\n }, EXIT_ANIMATION_MS);\r\n }\r\n\r\n flushPendingDispose(): void {\r\n if (this.exitTimer !== undefined) {\r\n clearTimeout(this.exitTimer);\r\n this.exitTimer = undefined;\r\n }\r\n this.closing.set(false);\r\n const pending = this.pendingDisposeOverlay;\r\n this.pendingDisposeOverlay = undefined;\r\n pending?.dispose();\r\n }\r\n\r\n private reveal(overlayRef: OverlayRef): void {\r\n const surface = overlayRef.overlayElement.querySelector<HTMLElement>(`.${CONTENT_CLASS}`);\r\n if (!surface || this.overlayRef !== overlayRef) {\r\n return;\r\n }\r\n surface.classList.remove(CONTENT_CLOSING_CLASS);\r\n surface.classList.add(CONTENT_ENTERING_CLASS);\r\n overlayRef.overlayElement.style.pointerEvents = '';\r\n overlayRef.overlayElement.style.visibility = '';\r\n }\r\n\r\n /** Clears the exit timer and hands over the panes a destroy pass still has to dispose. */\r\n takeForDestroy(): { pending: OverlayRef | undefined; overlay: OverlayRef | undefined } {\r\n if (this.exitTimer !== undefined) {\r\n clearTimeout(this.exitTimer);\r\n this.exitTimer = undefined;\r\n }\r\n const pending = this.pendingDisposeOverlay;\r\n this.pendingDisposeOverlay = undefined;\r\n const overlayRef = this.overlayRef;\r\n this.overlayRef = undefined;\r\n this.position.discard();\r\n this.closing.set(false);\r\n this.open.set(false);\r\n this.tooltipId.set(null);\r\n return { pending, overlay: overlayRef };\r\n }\r\n\r\n // Safe to call repeatedly; never disposes an overlay itself.\r\n releaseSubscriptions(): void {\r\n this.position.releaseSide();\r\n this.detachSubscription?.unsubscribe();\r\n this.detachSubscription = undefined;\r\n this.outsideSubscription?.unsubscribe();\r\n this.outsideSubscription = undefined;\r\n this.viewportSubscription?.unsubscribe();\r\n this.viewportSubscription = undefined;\r\n this.scrollSubscription?.unsubscribe();\r\n this.scrollSubscription = undefined;\r\n this.position.releaseResizeObserver();\r\n if (this.escapeListener !== undefined) {\r\n this.document.removeEventListener('keydown', this.escapeListener);\r\n this.escapeListener = undefined;\r\n }\r\n }\r\n}\r\n","// Tooltip positioning: direction, physical sides, the CDK strategy, the arrow and resize.\r\n\r\nimport { signal } from '@angular/core';\r\n\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport {\r\n ConnectedPosition,\r\n FlexibleConnectedPositionStrategy,\r\n Overlay,\r\n OverlayRef,\r\n} from '@angular/cdk/overlay';\r\n\r\nimport {\r\n CONTENT_CLASS,\r\n RaqmTooltipAlign,\r\n RaqmTooltipPhysicalSide,\r\n RaqmTooltipSide,\r\n VIEWPORT_MARGIN,\r\n} from './tooltip-model';\r\n\r\nexport interface RaqmTooltipPositionHost {\r\n /** The root element; its computed direction is read before the CDK Bidi value. */\r\n readonly element: HTMLElement;\r\n /** Optional Bidi service; the computed direction wins so a CSS-only `dir` ancestor works. */\r\n readonly directionality: Directionality | null;\r\n side(): RaqmTooltipSide;\r\n align(): RaqmTooltipAlign;\r\n sideOffset(): number;\r\n alignOffset(): number;\r\n dir(): 'ltr' | 'rtl' | undefined;\r\n /** The trigger element the pane is anchored to. */\r\n anchor(): HTMLElement | null;\r\n /** The live pane, while one exists. */\r\n pane(): OverlayRef | undefined;\r\n}\r\n\r\n// The surface's layout box in viewport coordinates; a transform on it (the enter/exit\r\n// scale) is excluded, since it would skew the measured arrow centre.\r\nfunction layoutBox(element: HTMLElement): {\r\n left: number;\r\n top: number;\r\n width: number;\r\n height: number;\r\n} {\r\n const parent = element.offsetParent as HTMLElement | null;\r\n if (!parent) {\r\n const rect = element.getBoundingClientRect();\r\n return { left: rect.left, top: rect.top, width: rect.width, height: rect.height };\r\n }\r\n const parentRect = parent.getBoundingClientRect();\r\n return {\r\n left: parentRect.left + parent.clientLeft + element.offsetLeft,\r\n top: parentRect.top + parent.clientTop + element.offsetTop,\r\n width: element.offsetWidth,\r\n height: element.offsetHeight,\r\n };\r\n}\r\n\r\nexport class RaqmTooltipPosition {\r\n readonly panelDir = signal<'ltr' | 'rtl'>('ltr');\r\n readonly resolvedSide = signal<RaqmTooltipPhysicalSide>('top');\r\n\r\n private positionStrategy: FlexibleConnectedPositionStrategy | undefined;\r\n\r\n private currentPositions: ConnectedPosition[] = [];\r\n private currentSides: RaqmTooltipPhysicalSide[] = [];\r\n\r\n private currentAppliedSide: RaqmTooltipPhysicalSide = 'top';\r\n\r\n private currentDir: 'ltr' | 'rtl' = 'ltr';\r\n\r\n // Torn down on every close/detach/destroy path.\r\n private sideSubscription: { unsubscribe(): void } | undefined;\r\n\r\n private resizeObserver: ResizeObserver | undefined;\r\n\r\n private frame = 0;\r\n private frameView: Window | undefined;\r\n\r\n constructor(\r\n private readonly overlay: Overlay,\r\n private readonly host: RaqmTooltipPositionHost,\r\n ) {}\r\n\r\n /** The direction the open pane was placed with. */\r\n get direction(): 'ltr' | 'rtl' {\r\n return this.currentDir;\r\n }\r\n\r\n /** Resolves direction and the preferred side; both seed the arrow and motion state. */\r\n beginPlacement(): RaqmTooltipPhysicalSide {\r\n const dir = this.readResolvedDir();\r\n this.currentDir = dir;\r\n this.panelDir.set(dir);\r\n const preferred = this.resolvePhysicalSide(this.host.side());\r\n this.currentAppliedSide = preferred;\r\n this.resolvedSide.set(preferred);\r\n return preferred;\r\n }\r\n\r\n // Seeded with the preferred and opposite side, so attach always has a position.\r\n buildStrategy(\r\n origin: HTMLElement,\r\n preferred: RaqmTooltipPhysicalSide,\r\n ): FlexibleConnectedPositionStrategy {\r\n const strategy = this.overlay.position().flexibleConnectedTo(origin);\r\n strategy\r\n .withFlexibleDimensions(false)\r\n .withGrowAfterOpen(false)\r\n .withPush(true)\r\n .withViewportMargin(VIEWPORT_MARGIN);\r\n this.setPositions(strategy, [preferred, this.oppositeSide(preferred)]);\r\n this.positionStrategy = strategy;\r\n return strategy;\r\n }\r\n\r\n reposition(): void {\r\n this.cancelScheduledReposition();\r\n const overlayRef = this.host.pane();\r\n const strategy = this.positionStrategy;\r\n if (!overlayRef || !strategy) {\r\n return;\r\n }\r\n const dir = this.readResolvedDir();\r\n if (dir !== this.currentDir) {\r\n this.currentDir = dir;\r\n this.panelDir.set(dir);\r\n overlayRef.setDirection(dir);\r\n }\r\n const preferred = this.resolvePhysicalSide(this.host.side());\r\n this.setPositions(strategy, [preferred, this.oppositeSide(preferred)]);\r\n overlayRef.updatePosition();\r\n this.positionArrow(this.currentAppliedSide);\r\n }\r\n\r\n // Scroll and resize notifications can burst within one frame; one pass leaves the same\r\n // final placement and arrow as the last event would.\r\n scheduleReposition(): void {\r\n if (!this.host.pane() || !this.positionStrategy || this.frame) {\r\n return;\r\n }\r\n const view = this.host.element.ownerDocument.defaultView;\r\n if (!view || typeof view.requestAnimationFrame !== 'function') {\r\n this.reposition();\r\n return;\r\n }\r\n this.frameView = view;\r\n this.frame = view.requestAnimationFrame(() => {\r\n this.frame = 0;\r\n this.frameView = undefined;\r\n this.reposition();\r\n });\r\n }\r\n\r\n // Arrow and enter motion follow a collision flip rather than the preferred side.\r\n watchSide(strategy: FlexibleConnectedPositionStrategy, overlayRef: OverlayRef): void {\r\n this.sideSubscription = strategy.positionChanges.subscribe((change) => {\r\n const index = this.currentPositions.indexOf(change.connectionPair);\r\n const side = this.currentSides[index] ?? this.currentSides[0] ?? this.resolvedSide();\r\n this.currentAppliedSide = side;\r\n this.resolvedSide.set(side);\r\n const surface = overlayRef.overlayElement.querySelector<HTMLElement>(`.${CONTENT_CLASS}`);\r\n surface?.setAttribute('data-raqm-side', side);\r\n this.positionArrow(side, surface ?? undefined);\r\n });\r\n }\r\n\r\n // Keeps the index -> side map in step, so a collision fallback maps back.\r\n private setPositions(\r\n strategy: FlexibleConnectedPositionStrategy,\r\n sides: readonly RaqmTooltipPhysicalSide[],\r\n ): void {\r\n this.currentSides = [...sides];\r\n this.currentPositions = sides.map((side) => this.buildPositionFor(side));\r\n strategy.withPositions(this.currentPositions);\r\n }\r\n\r\n // The single position for one physical side; offsets are signed outward from the\r\n // trigger, with logical start/end resolved for horizontal sides.\r\n private buildPositionFor(side: RaqmTooltipPhysicalSide): ConnectedPosition {\r\n const align = this.host.align();\r\n const x = align;\r\n const y = this.toVerticalAlign(align);\r\n const mainOffset = this.signedSideOffset(side);\r\n switch (side) {\r\n case 'bottom':\r\n return {\r\n originX: x,\r\n originY: 'bottom',\r\n overlayX: x,\r\n overlayY: 'top',\r\n offsetX: this.host.alignOffset(),\r\n offsetY: mainOffset,\r\n };\r\n case 'left':\r\n return this.horizontalPosition('left', y, mainOffset);\r\n case 'right':\r\n return this.horizontalPosition('right', y, mainOffset);\r\n case 'top':\r\n default:\r\n return {\r\n originX: x,\r\n originY: 'top',\r\n overlayX: x,\r\n overlayY: 'bottom',\r\n offsetX: this.host.alignOffset(),\r\n offsetY: mainOffset,\r\n };\r\n }\r\n }\r\n\r\n // Direction-aware on the inline axis; the alignment offset applies vertically.\r\n private horizontalPosition(\r\n side: 'left' | 'right',\r\n alignY: 'top' | 'center' | 'bottom',\r\n offsetX: number,\r\n ): ConnectedPosition {\r\n const rtl = this.currentDir === 'rtl';\r\n const originX = side === 'right' ? (rtl ? 'start' : 'end') : rtl ? 'end' : 'start';\r\n const overlayX = side === 'right' ? (rtl ? 'end' : 'start') : rtl ? 'start' : 'end';\r\n return {\r\n originX,\r\n originY: alignY,\r\n overlayX,\r\n overlayY: alignY,\r\n offsetX,\r\n offsetY: this.host.alignOffset(),\r\n };\r\n }\r\n\r\n private signedSideOffset(side: RaqmTooltipPhysicalSide): number {\r\n return side === 'bottom' || side === 'right' ? this.host.sideOffset() : -this.host.sideOffset();\r\n }\r\n\r\n private toVerticalAlign(align: RaqmTooltipAlign): 'top' | 'center' | 'bottom' {\r\n return align === 'start' ? 'top' : align === 'end' ? 'bottom' : 'center';\r\n }\r\n\r\n // Physical sides pass through; logical sides resolve against the live direction.\r\n private resolvePhysicalSide(side: RaqmTooltipSide): RaqmTooltipPhysicalSide {\r\n switch (side) {\r\n case 'inline-start':\r\n return this.currentDir === 'rtl' ? 'right' : 'left';\r\n case 'inline-end':\r\n return this.currentDir === 'rtl' ? 'left' : 'right';\r\n default:\r\n return side;\r\n }\r\n }\r\n\r\n // The opposite physical side, used as the collision fallback.\r\n private oppositeSide(side: RaqmTooltipPhysicalSide): RaqmTooltipPhysicalSide {\r\n switch (side) {\r\n case 'top':\r\n return 'bottom';\r\n case 'bottom':\r\n return 'top';\r\n case 'left':\r\n return 'right';\r\n default:\r\n return 'left';\r\n }\r\n }\r\n\r\n // Centers the arrow on the trigger, clamped inside the rounded corners via a CSS var.\r\n private positionArrow(side: RaqmTooltipPhysicalSide, surface?: HTMLElement): void {\r\n const content =\r\n surface ?? this.host.pane()?.overlayElement.querySelector<HTMLElement>(`.${CONTENT_CLASS}`);\r\n const trigger = this.host.anchor();\r\n if (!content || !trigger) {\r\n return;\r\n }\r\n // The enter/exit animation scales the surface, so its layout box is measured.\r\n const contentRect = layoutBox(content);\r\n const triggerRect = trigger.getBoundingClientRect();\r\n const vertical = side === 'top' || side === 'bottom';\r\n const size = vertical ? contentRect.width : contentRect.height;\r\n const center = vertical\r\n ? triggerRect.left + triggerRect.width / 2 - contentRect.left\r\n : triggerRect.top + triggerRect.height / 2 - contentRect.top;\r\n if (size <= 0) {\r\n return;\r\n }\r\n const edge = Math.min(12, size / 2);\r\n const offset = Math.max(edge, Math.min(center, size - edge));\r\n content.style.setProperty('--raqm-tooltip-arrow-offset', `${offset}px`);\r\n }\r\n\r\n // Explicit input first, then the computed direction, then the CDK Bidi value.\r\n private readResolvedDir(): 'ltr' | 'rtl' {\r\n const explicit = this.host.dir();\r\n if (explicit === 'ltr' || explicit === 'rtl') {\r\n return explicit;\r\n }\r\n const computedStyle = getComputedStyle(this.host.element).direction;\r\n if (computedStyle === 'rtl') {\r\n return 'rtl';\r\n }\r\n if (computedStyle === 'ltr') {\r\n return 'ltr';\r\n }\r\n return this.host.directionality?.value ?? 'ltr';\r\n }\r\n\r\n // Observes trigger/content size changes while open; one bounded reposition each.\r\n attachResizeObserver(trigger: HTMLElement, overlayRef: OverlayRef): void {\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n this.resizeObserver?.disconnect();\r\n const observer = new ResizeObserver(() => {\r\n if (this.host.pane() === overlayRef) {\r\n this.scheduleReposition();\r\n }\r\n });\r\n this.resizeObserver = observer;\r\n observer.observe(trigger);\r\n const surface = overlayRef.overlayElement.querySelector<HTMLElement>(`.${CONTENT_CLASS}`);\r\n if (surface) {\r\n observer.observe(surface);\r\n }\r\n }\r\n\r\n releaseSide(): void {\r\n this.sideSubscription?.unsubscribe();\r\n this.sideSubscription = undefined;\r\n }\r\n\r\n releaseResizeObserver(): void {\r\n if (this.resizeObserver !== undefined) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = undefined;\r\n }\r\n }\r\n\r\n // A closed pane drops the strategy and the position/arrow map together.\r\n reset(): void {\r\n this.cancelScheduledReposition();\r\n this.positionStrategy = undefined;\r\n this.currentPositions = [];\r\n this.currentSides = [];\r\n }\r\n\r\n // A detached or destroyed pane drops the strategy; the map is cleared separately.\r\n discard(): void {\r\n this.cancelScheduledReposition();\r\n this.positionStrategy = undefined;\r\n }\r\n\r\n clear(): void {\r\n this.currentPositions = [];\r\n this.currentSides = [];\r\n }\r\n\r\n private cancelScheduledReposition(): void {\r\n if (!this.frame) {\r\n return;\r\n }\r\n this.frameView?.cancelAnimationFrame(this.frame);\r\n this.frame = 0;\r\n this.frameView = undefined;\r\n }\r\n}\r\n","// Tooltip slots: the single trigger and the single content template, with their guards.\r\n\r\nimport { TemplateRef, computed, isDevMode, signal } from '@angular/core';\r\n\r\nimport { RaqmTooltipTriggerRef } from './tooltip-context';\r\n\r\nexport interface RaqmTooltipSlotHost {\r\n /** The panel template; without it an open has nothing to attach. */\r\n panel(): TemplateRef<unknown> | undefined;\r\n /** A registration changed, so a pending open may now be possible. */\r\n onChanged(): void;\r\n /** A registered slot went away; an open tooltip is closed rather than orphaned. */\r\n onLost(): void;\r\n}\r\n\r\nexport class RaqmTooltipSlot {\r\n private readonly triggerRef = signal<RaqmTooltipTriggerRef | null>(null);\r\n\r\n /** Template-facing: the consumer content, or `null` before it registers. */\r\n readonly contentTemplate = signal<TemplateRef<unknown> | null>(null);\r\n\r\n /** Whether every slot an open needs is registered. */\r\n readonly canOpen = computed(\r\n () =>\r\n this.triggerRef() !== null &&\r\n this.contentTemplate() !== null &&\r\n this.host.panel() !== undefined,\r\n );\r\n\r\n constructor(\r\n private readonly document: Document,\r\n private readonly host: RaqmTooltipSlotHost,\r\n ) {}\r\n\r\n trigger(): RaqmTooltipTriggerRef | null {\r\n return this.triggerRef();\r\n }\r\n\r\n content(): TemplateRef<unknown> | null {\r\n return this.contentTemplate();\r\n }\r\n\r\n registerTrigger(ref: RaqmTooltipTriggerRef): void {\r\n const current = this.triggerRef();\r\n if (current !== null && current !== ref) {\r\n if (isDevMode()) {\r\n console.error(\r\n '[raqm-tooltip] Only one `[raqm-tooltip-trigger]` is supported per <raqm-tooltip>; the extra trigger is ignored.',\r\n );\r\n }\r\n return;\r\n }\r\n this.triggerRef.set(ref);\r\n this.host.onChanged();\r\n }\r\n\r\n /** Unregisters the trigger; an open tooltip is closed rather than orphaned. */\r\n unregisterTrigger(ref: RaqmTooltipTriggerRef): void {\r\n if (this.triggerRef() !== ref) {\r\n return;\r\n }\r\n this.triggerRef.set(null);\r\n this.host.onLost();\r\n }\r\n\r\n registerContent(template: TemplateRef<unknown>): void {\r\n const current = this.contentTemplate();\r\n if (current !== null && current !== template) {\r\n if (isDevMode()) {\r\n console.error(\r\n '[raqm-tooltip] Only one `ng-template[raqm-tooltip-content]` is supported per <raqm-tooltip>; the extra template is ignored.',\r\n );\r\n }\r\n return;\r\n }\r\n this.contentTemplate.set(template);\r\n this.host.onChanged();\r\n }\r\n\r\n /** Unregisters the content template; an open tooltip is closed rather than orphaned. */\r\n unregisterContent(template: TemplateRef<unknown>): void {\r\n if (this.contentTemplate() !== template) {\r\n return;\r\n }\r\n this.contentTemplate.set(null);\r\n this.host.onLost();\r\n }\r\n\r\n isTriggerFocused(): boolean {\r\n const trigger = this.triggerRef();\r\n return trigger !== null && this.document.activeElement === trigger.element;\r\n }\r\n}\r\n","// Tooltip timers: the provider hover-open delay, the hover gap and the pending-open Escape.\r\n\r\nimport { RaqmTooltipOpenReason, RaqmTooltipTriggerRef } from './tooltip-context';\r\nimport { HOVER_GAP_MS } from './tooltip-model';\r\n\r\nexport interface RaqmTooltipTimersHost {\r\n open(): boolean;\r\n openReason(): RaqmTooltipOpenReason;\r\n destroyed(): boolean;\r\n trigger(): RaqmTooltipTriggerRef | null;\r\n /** The hover delay elapsed; the caller re-checks its open policy. */\r\n onOpenElapsed(): void;\r\n /** The hover gap elapsed for a still-open tooltip; the caller closes it. */\r\n onHoverElapsed(): void;\r\n /** Escape during a pending delay, or while the pane is visible. */\r\n onEscape(trigger: RaqmTooltipTriggerRef): void;\r\n}\r\n\r\nexport class RaqmTooltipTimers {\r\n private openTimer: ReturnType<typeof setTimeout> | undefined;\r\n private hoverCloseTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n // Armed only while a delayed hover open is pending; dismissible without trigger focus.\r\n private pendingEscapeListener: ((event: KeyboardEvent) => void) | undefined;\r\n\r\n constructor(\r\n private readonly document: Document,\r\n private readonly host: RaqmTooltipTimersHost,\r\n ) {}\r\n\r\n /** Arms the one pending hover-open delay, and its pending-open Escape listener. */\r\n armOpen(delay: number): void {\r\n this.openTimer = setTimeout(() => {\r\n this.openTimer = undefined;\r\n this.removePendingEscape();\r\n this.host.onOpenElapsed();\r\n }, delay);\r\n // Escape can dismiss the pending hover interaction before any overlay exists.\r\n this.armPendingEscape();\r\n }\r\n\r\n /** Cancels the one pending hover-open delay and its pending Escape listener. */\r\n cancelOpen(): void {\r\n if (this.openTimer !== undefined) {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = undefined;\r\n }\r\n this.removePendingEscape();\r\n }\r\n\r\n cancelHoverClose(): void {\r\n if (this.hoverCloseTimer !== undefined) {\r\n clearTimeout(this.hoverCloseTimer);\r\n this.hoverCloseTimer = undefined;\r\n }\r\n }\r\n\r\n scheduleHoverClose(): void {\r\n if (\r\n !this.host.open() ||\r\n this.host.openReason() === 'focus' ||\r\n this.hoverCloseTimer !== undefined\r\n ) {\r\n return;\r\n }\r\n this.hoverCloseTimer = setTimeout(() => {\r\n this.hoverCloseTimer = undefined;\r\n if (!this.host.destroyed() && this.host.open()) {\r\n this.host.onHoverElapsed();\r\n }\r\n }, HOVER_GAP_MS);\r\n }\r\n\r\n /** Removes only the pending-open Escape listener; the hover-open delay is untouched. */\r\n removePendingEscape(): void {\r\n if (this.pendingEscapeListener !== undefined) {\r\n this.document.removeEventListener('keydown', this.pendingEscapeListener);\r\n this.pendingEscapeListener = undefined;\r\n }\r\n }\r\n\r\n // Dismissible while pending, even when focus is not on the trigger.\r\n private armPendingEscape(): void {\r\n this.removePendingEscape();\r\n const trigger = this.host.trigger();\r\n if (trigger === null) {\r\n return;\r\n }\r\n this.pendingEscapeListener = (event: KeyboardEvent) => {\r\n if (event.key !== 'Escape') {\r\n return;\r\n }\r\n this.host.onEscape(trigger);\r\n };\r\n this.document.addEventListener('keydown', this.pendingEscapeListener);\r\n }\r\n}\r\n","import { DOCUMENT, NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Injector,\r\n OnDestroy,\r\n TemplateRef,\r\n ViewContainerRef,\r\n booleanAttribute,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\n\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { Overlay } from '@angular/cdk/overlay';\r\nimport { ScrollDispatcher, ViewportRuler } from '@angular/cdk/scrolling';\r\n\r\nimport {\r\n RAQM_TOOLTIP,\r\n RAQM_TOOLTIP_PROVIDER,\r\n RaqmTooltipContext,\r\n RaqmTooltipOpenReason,\r\n RaqmTooltipTriggerRef,\r\n} from './tooltip-context';\r\nimport { RaqmTooltipLifecycle } from './tooltip-lifecycle';\r\nimport {\r\n DEFAULT_ALIGN,\r\n DEFAULT_ALIGN_OFFSET,\r\n DEFAULT_SIDE,\r\n DEFAULT_SIDE_OFFSET,\r\n RaqmTooltipAlign,\r\n RaqmTooltipSide,\r\n toAlign,\r\n toDir,\r\n toOffset,\r\n toSide,\r\n} from './tooltip-model';\r\nimport { RaqmTooltipPane } from './tooltip-pane';\r\nimport { RaqmTooltipPosition } from './tooltip-position';\r\nimport { RaqmTooltipSlot } from './tooltip-slot';\r\nimport { RaqmTooltipTimers } from './tooltip-timers';\r\n\r\nexport type { RaqmTooltipAlign, RaqmTooltipSide } from './tooltip-model';\r\n\r\n@Component({\r\n selector: 'raqm-tooltip',\r\n imports: [NgTemplateOutlet],\r\n templateUrl: './tooltip.html',\r\n styleUrl: './tooltip.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n exportAs: 'raqmTooltip',\r\n providers: [\r\n // A dedicated token (not a component import) avoids a runtime module cycle.\r\n { provide: RAQM_TOOLTIP, useExisting: RaqmTooltipComponent },\r\n ],\r\n})\r\nexport class RaqmTooltipComponent implements RaqmTooltipContext, OnDestroy {\r\n // Read only for the live computed direction; the host renders no box of its own.\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n private readonly overlay = inject(Overlay);\r\n\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n\r\n private readonly injector = inject(Injector);\r\n\r\n // Optional Bidi service; the computed direction wins so a CSS-only `dir` ancestor works.\r\n private readonly directionality = inject(Directionality, { optional: true });\r\n\r\n private readonly viewportRuler = inject(ViewportRuler);\r\n\r\n private readonly scrollDispatcher = inject(ScrollDispatcher);\r\n\r\n private readonly document = inject(DOCUMENT);\r\n\r\n // Nearest provider (shared delay + single-active scope); without one the delay is 0.\r\n private readonly provider = inject(RAQM_TOOLTIP_PROVIDER, { optional: true });\r\n\r\n // An optional query so an interaction cannot throw while the view query is unresolved.\r\n private readonly panelTemplate = viewChild('panel', { read: TemplateRef });\r\n\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n readonly side = input<RaqmTooltipSide>(DEFAULT_SIDE, { transform: toSide });\r\n\r\n readonly align = input<RaqmTooltipAlign>(DEFAULT_ALIGN, {\r\n transform: toAlign,\r\n });\r\n\r\n readonly sideOffset = input(DEFAULT_SIDE_OFFSET, {\r\n transform: toOffset(DEFAULT_SIDE_OFFSET),\r\n });\r\n\r\n readonly alignOffset = input(DEFAULT_ALIGN_OFFSET, {\r\n transform: toOffset(DEFAULT_ALIGN_OFFSET),\r\n });\r\n\r\n readonly dir = input<'ltr' | 'rtl' | undefined>(undefined, {\r\n transform: toDir,\r\n });\r\n\r\n // Direction, physical side, the CDK strategy and the arrow.\r\n private readonly position: RaqmTooltipPosition = new RaqmTooltipPosition(this.overlay, {\r\n element: this.host.nativeElement,\r\n directionality: this.directionality,\r\n side: () => this.side(),\r\n align: () => this.align(),\r\n sideOffset: () => this.sideOffset(),\r\n alignOffset: () => this.alignOffset(),\r\n dir: () => this.dir(),\r\n anchor: () => this.slot.trigger()?.element ?? null,\r\n pane: () => this.pane.ref,\r\n });\r\n\r\n // The overlay pane, its subscriptions and the exit transition.\r\n private readonly pane: RaqmTooltipPane = new RaqmTooltipPane(\r\n this.overlay,\r\n this.viewportRuler,\r\n this.scrollDispatcher,\r\n this.document,\r\n this.viewContainerRef,\r\n this.position,\r\n {\r\n injector: this.injector,\r\n claimActive: () => this.lifecycle.claimActive(),\r\n onOutsidePress: (trigger) => this.lifecycle.requestClose(trigger, 'press'),\r\n onEscape: (trigger) => this.lifecycle.requestClose(trigger, 'escape'),\r\n onDetached: (overlayRef) => this.lifecycle.handleDetached(overlayRef),\r\n },\r\n );\r\n\r\n // The single trigger and the single content template, with their guards.\r\n private readonly slot: RaqmTooltipSlot = new RaqmTooltipSlot(this.document, {\r\n panel: () => this.panelTemplate(),\r\n onChanged: () => this.lifecycle.retryRequestedOpen(),\r\n onLost: () => this.lifecycle.closeForPeer(),\r\n });\r\n\r\n // The provider hover-open delay, the hover gap and the pending-open Escape listener.\r\n private readonly timers: RaqmTooltipTimers = new RaqmTooltipTimers(this.document, {\r\n open: () => this.open(),\r\n openReason: () => this.lifecycle.currentReason(),\r\n destroyed: () => this.destroyed,\r\n trigger: () => this.slot.trigger(),\r\n onOpenElapsed: () => this.lifecycle.onOpenElapsed(),\r\n onHoverElapsed: () => this.lifecycle.beginClose(false),\r\n onEscape: (trigger) => this.lifecycle.requestClose(trigger, 'escape'),\r\n });\r\n\r\n // The open/close policy, the provider claim and the pane hand-off.\r\n private readonly lifecycle: RaqmTooltipLifecycle = new RaqmTooltipLifecycle({\r\n pane: this.pane,\r\n position: this.position,\r\n slot: this.slot,\r\n timers: this.timers,\r\n provider: this.provider,\r\n disabled: () => this.disabled(),\r\n destroyed: () => this.destroyed,\r\n delay: () => this.delay(),\r\n panel: () => this.panelTemplate(),\r\n });\r\n\r\n // The hover delay from the nearest provider, or 0 without one.\r\n private readonly delay = computed(() => this.provider?.delay() ?? 0);\r\n\r\n private destroyed = false;\r\n\r\n readonly open = this.pane.open;\r\n\r\n readonly tooltipId = this.pane.tooltipId;\r\n\r\n private readonly contentTemplate = this.slot.contentTemplate;\r\n\r\n protected readonly panelDir = this.position.panelDir;\r\n\r\n protected readonly resolvedSide = this.position.resolvedSide;\r\n\r\n protected readonly closing = this.pane.closing;\r\n\r\n constructor() {\r\n // A root disabled while open closes immediately; a disabled root never opens.\r\n effect(() => {\r\n const disabled = this.disabled();\r\n untracked(() => {\r\n if (!disabled) {\r\n return;\r\n }\r\n this.lifecycle.closeNow();\r\n });\r\n });\r\n\r\n // A placement/offset/direction change while open repositions; closed it is a no-op.\r\n effect(() => {\r\n this.side();\r\n this.align();\r\n this.sideOffset();\r\n this.alignOffset();\r\n this.dir();\r\n untracked(() => this.applyPositionInputs());\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyed = true;\r\n this.pane.invalidate();\r\n this.lifecycle.destroy();\r\n }\r\n\r\n registerTrigger(ref: RaqmTooltipTriggerRef): void {\r\n this.slot.registerTrigger(ref);\r\n }\r\n\r\n /** Unregisters the trigger; an open tooltip is closed rather than orphaned. */\r\n unregisterTrigger(ref: RaqmTooltipTriggerRef): void {\r\n this.slot.unregisterTrigger(ref);\r\n }\r\n\r\n registerContent(template: TemplateRef<unknown>): void {\r\n this.slot.registerContent(template);\r\n }\r\n\r\n /** Unregisters the content template; an open tooltip is closed rather than orphaned. */\r\n unregisterContent(template: TemplateRef<unknown>): void {\r\n this.slot.unregisterContent(template);\r\n }\r\n\r\n requestOpen(ref: RaqmTooltipTriggerRef, reason: RaqmTooltipOpenReason): void {\r\n this.lifecycle.requestOpen(ref, reason);\r\n }\r\n\r\n requestClose(ref: RaqmTooltipTriggerRef, reason: 'mouse' | 'focus' | 'press' | 'escape'): void {\r\n this.lifecycle.requestClose(ref, reason);\r\n }\r\n\r\n cancelHoverClose(): void {\r\n this.timers.cancelHoverClose();\r\n }\r\n\r\n scheduleHoverClose(): void {\r\n this.timers.scheduleHoverClose();\r\n }\r\n\r\n closeForPeer(): void {\r\n this.lifecycle.closeForPeer();\r\n }\r\n\r\n // The wrapper's own pointer events keep a hover tooltip open across the gap.\r\n\r\n protected onContentPointerEnter(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n this.timers.cancelHoverClose();\r\n }\r\n }\r\n\r\n protected onContentPointerLeave(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n this.timers.scheduleHoverClose();\r\n }\r\n }\r\n\r\n private applyPositionInputs(): void {\r\n if (this.pane.hasPane) {\r\n this.pane.reposition();\r\n }\r\n }\r\n}\r\n","<!-- One `button[raqm-tooltip-trigger]` (or passive span for a disabled button) plus one\r\n `ng-template[raqm-tooltip-content]`; the root never wraps or clones the trigger. -->\r\n<ng-content />\r\n\r\n<ng-template #panel>\r\n <div\r\n class=\"raqm-tooltip-content\"\r\n role=\"tooltip\"\r\n [attr.id]=\"tooltipId()\"\r\n [attr.dir]=\"panelDir()\"\r\n [attr.data-raqm-side]=\"resolvedSide()\"\r\n [class.raqm-tooltip-content--closing]=\"closing()\"\r\n (pointerenter)=\"onContentPointerEnter($event)\"\r\n (pointerleave)=\"onContentPointerLeave($event)\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"contentTemplate()\" />\r\n\r\n <!-- The decorative diamond arrow is inert and never part of the description. -->\r\n <span class=\"raqm-tooltip-arrow\" aria-hidden=\"true\"></span>\r\n </div>\r\n</ng-template>\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n OnInit,\r\n Renderer2,\r\n TemplateRef,\r\n effect,\r\n inject,\r\n input,\r\n isDevMode,\r\n numberAttribute,\r\n untracked,\r\n} from '@angular/core';\r\n\r\nimport {\r\n RAQM_TOOLTIP,\r\n RAQM_TOOLTIP_PROVIDER,\r\n RaqmTooltipActive,\r\n RaqmTooltipContext,\r\n RaqmTooltipProviderContext,\r\n RaqmTooltipTriggerRef,\r\n} from './tooltip-context';\r\n\r\nfunction toDelay(value: unknown): number {\r\n const parsed = numberAttribute(value, 0);\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;\r\n}\r\n\r\n@Directive({\r\n selector: '[raqm-tooltip-provider]',\r\n exportAs: 'raqmTooltipProvider',\r\n providers: [{ provide: RAQM_TOOLTIP_PROVIDER, useExisting: RaqmTooltipProviderDirective }],\r\n})\r\nexport class RaqmTooltipProviderDirective implements RaqmTooltipProviderContext {\r\n readonly delay = input(0, { transform: toDelay });\r\n\r\n // The one currently open tooltip inside this provider scope, or null.\r\n private active: RaqmTooltipActive | null = null;\r\n\r\n /** Registers a newly open tooltip, closing the previous active one in this scope. */\r\n registerActive(active: RaqmTooltipActive): void {\r\n if (this.active !== null && this.active !== active) {\r\n this.active.closeForPeer();\r\n }\r\n this.active = active;\r\n }\r\n\r\n /** Clears the active registration only when it still belongs to this tooltip. */\r\n clearActive(active: RaqmTooltipActive): void {\r\n if (this.active === active) {\r\n this.active = null;\r\n }\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: 'button[raqm-tooltip-trigger], span[raqm-tooltip-trigger]',\r\n host: {\r\n class: 'raqm-tooltip-trigger',\r\n '(pointerenter)': 'onPointerEnter($event)',\r\n '(pointerleave)': 'onPointerLeave($event)',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(focus)': 'onFocus()',\r\n '(blur)': 'onBlur()',\r\n '(keydown)': 'onKeydown($event)',\r\n '(click)': 'onClick()',\r\n },\r\n})\r\nexport class RaqmTooltipTriggerDirective implements OnInit {\r\n // Native host element; the selector guarantees a button or a span.\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n // Optional, so a misplaced trigger reports rather than crashes.\r\n private readonly tooltip = inject<RaqmTooltipContext | null>(RAQM_TOOLTIP, {\r\n optional: true,\r\n });\r\n\r\n private readonly renderer = inject(Renderer2);\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n private ownedToken: string | null = null;\r\n\r\n // Live getters keep the disabled state current.\r\n private readonly ref: RaqmTooltipTriggerRef = (() => {\r\n const self = this;\r\n return {\r\n get element(): HTMLElement {\r\n return self.host.nativeElement;\r\n },\r\n get disabled(): boolean {\r\n const element = self.host.nativeElement;\r\n return element instanceof HTMLButtonElement && element.disabled;\r\n },\r\n };\r\n })();\r\n\r\n constructor() {\r\n // Keep the host's aria-describedby in step with the root's live tooltip id.\r\n effect(() => {\r\n const token = this.tooltip?.open() ? this.tooltip.tooltipId() : null;\r\n untracked(() => this.syncDescribedBy(token));\r\n });\r\n\r\n // Default a native button's type to `button` so a trigger never submits its form.\r\n const element = this.host.nativeElement;\r\n if (element instanceof HTMLButtonElement && !element.hasAttribute('type')) {\r\n element.setAttribute('type', 'button');\r\n }\r\n\r\n if (isDevMode() && this.tooltip === null) {\r\n console.error(\r\n '[raqm-tooltip-trigger] No parent <raqm-tooltip> found; the trigger cannot show a tooltip.',\r\n );\r\n }\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.tooltip?.unregisterTrigger(this.ref);\r\n this.syncDescribedBy(null);\r\n });\r\n }\r\n\r\n /** Registers the trigger with the root once the directive is initialized. */\r\n ngOnInit(): void {\r\n this.tooltip?.registerTrigger(this.ref);\r\n }\r\n\r\n /** Opens on mouse hover only; touch/pen hover is deliberately ignored. */\r\n protected onPointerEnter(event: Event): void {\r\n const pointer = event as PointerEvent;\r\n if (pointer.pointerType !== 'mouse') {\r\n return;\r\n }\r\n this.tooltip?.requestOpen(this.ref, 'mouse');\r\n }\r\n\r\n /** Requests the bounded hover-gap close on mouse leave. */\r\n protected onPointerLeave(event: Event): void {\r\n const pointer = event as PointerEvent;\r\n if (pointer.pointerType !== 'mouse') {\r\n return;\r\n }\r\n this.tooltip?.requestClose(this.ref, 'mouse');\r\n }\r\n\r\n /** A primary press closes an open tooltip; touch presses are included. */\r\n protected onPointerDown(event: Event): void {\r\n const pointer = event as PointerEvent;\r\n if (pointer.button !== 0) {\r\n return;\r\n }\r\n this.tooltip?.requestClose(this.ref, 'press');\r\n }\r\n\r\n /** Native keyboard focus opens immediately (the root applies any suppression). */\r\n protected onFocus(): void {\r\n this.tooltip?.requestOpen(this.ref, 'focus');\r\n }\r\n\r\n /** Losing focus closes the tooltip and clears any focus suppression in the root. */\r\n protected onBlur(): void {\r\n this.tooltip?.requestClose(this.ref, 'focus');\r\n }\r\n\r\n /** Escape closes an open tooltip or dismisses a pending delayed open. */\r\n protected onKeydown(event: Event): void {\r\n const key = event as KeyboardEvent;\r\n if (key.key !== 'Escape' || this.tooltip === null) {\r\n return;\r\n }\r\n // Consume the key only while open; a pending delayed open closes via the policy.\r\n if (this.tooltip.open()) {\r\n key.preventDefault();\r\n key.stopPropagation();\r\n }\r\n this.tooltip.requestClose(this.ref, 'escape');\r\n }\r\n\r\n /** A native/assistive click (including Enter/Space) closes an open tooltip. */\r\n protected onClick(): void {\r\n if (this.tooltip?.open()) {\r\n this.tooltip.requestClose(this.ref, 'press');\r\n }\r\n }\r\n\r\n // Merges/removes only the owned id in the host's aria-describedby token list.\r\n private syncDescribedBy(nextToken: string | null): void {\r\n const element = this.host.nativeElement;\r\n const previous = this.ownedToken;\r\n if (previous === nextToken) {\r\n return;\r\n }\r\n const tokens = (element.getAttribute('aria-describedby') ?? '')\r\n .split(/\\s+/)\r\n .filter((token) => token.length > 0 && token !== previous);\r\n if (nextToken !== null && !tokens.includes(nextToken)) {\r\n tokens.push(nextToken);\r\n }\r\n if (tokens.length > 0) {\r\n this.renderer.setAttribute(element, 'aria-describedby', tokens.join(' '));\r\n } else {\r\n this.renderer.removeAttribute(element, 'aria-describedby');\r\n }\r\n this.ownedToken = nextToken;\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: 'ng-template[raqm-tooltip-content]',\r\n exportAs: 'raqmTooltipContent',\r\n})\r\nexport class RaqmTooltipContentDirective implements OnInit {\r\n private readonly template = inject<TemplateRef<unknown>>(TemplateRef);\r\n\r\n // Optional, so a misplaced template reports instead of crashing.\r\n private readonly tooltip = inject<RaqmTooltipContext | null>(RAQM_TOOLTIP, {\r\n optional: true,\r\n });\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n if (isDevMode() && this.tooltip === null) {\r\n console.error(\r\n '[raqm-tooltip-content] No parent <raqm-tooltip> found; the content is never rendered.',\r\n );\r\n }\r\n this.destroyRef.onDestroy(() => this.tooltip?.unregisterContent(this.template));\r\n }\r\n\r\n /** Registers the content template with the root once initialized. */\r\n ngOnInit(): void {\r\n this.tooltip?.registerContent(this.template);\r\n }\r\n}\r\n","import { RaqmTooltipComponent } from './tooltip';\r\nimport {\r\n RaqmTooltipContentDirective,\r\n RaqmTooltipProviderDirective,\r\n RaqmTooltipTriggerDirective,\r\n} from './tooltip.directive';\r\n\r\nexport {\r\n RaqmTooltipComponent,\r\n RaqmTooltipContentDirective,\r\n RaqmTooltipProviderDirective,\r\n RaqmTooltipTriggerDirective,\r\n};\r\n// @internal Sidebar composition contract.\r\nexport type { RaqmTooltipTriggerRef } from './tooltip-context';\r\n\r\nexport const RaqmTooltip = [\r\n RaqmTooltipComponent,\r\n RaqmTooltipContentDirective,\r\n RaqmTooltipProviderDirective,\r\n RaqmTooltipTriggerDirective,\r\n] as const;\r\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { __reExport as n, __exportAll as t };
|