ng-primitives 0.122.0 → 0.123.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,8 +3,8 @@ export { injectOverlayContext as injectTooltipContext } from 'ng-primitives/port
3
3
  import * as i0 from '@angular/core';
4
4
  import { InjectionToken, inject, input, numberAttribute, Directive, signal, Component, Injector, ViewContainerRef, ElementRef, computed, booleanAttribute } from '@angular/core';
5
5
  import { createPrimitive, controlled, attrBinding, dataBinding, styleBinding, listener, deprecatedSetter } from 'ng-primitives/state';
6
- import { injectDisposables, isString } from 'ng-primitives/utils';
7
- import { injectElementRef, explicitEffect, setupOverflowListener } from 'ng-primitives/internal';
6
+ import { isString } from 'ng-primitives/utils';
7
+ import { injectElementRef, explicitEffect, setupOverflowListener, createHoverBridge } from 'ng-primitives/internal';
8
8
  import { ngpHover } from 'ng-primitives/interactions';
9
9
 
10
10
  const defaultTooltipConfig = {
@@ -163,78 +163,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
163
163
  }]
164
164
  }] });
165
165
 
166
- /**
167
- * Builds a pointer grace polygon between the trigger exit point and the tooltip.
168
- * The polygon is intentionally directional so moving away from the tooltip exits quickly.
169
- */
170
- function createTooltipHoverBridgePolygon({ triggerRect, tooltipRect, exitPoint, corridorHalfSize = 8, }) {
171
- if (!triggerRect || !tooltipRect) {
172
- return null;
173
- }
174
- const triggerCenterX = triggerRect.left + triggerRect.width / 2;
175
- const triggerCenterY = triggerRect.top + triggerRect.height / 2;
176
- const tooltipCenterX = tooltipRect.left + tooltipRect.width / 2;
177
- const tooltipCenterY = tooltipRect.top + tooltipRect.height / 2;
178
- const dx = tooltipCenterX - triggerCenterX;
179
- const dy = tooltipCenterY - triggerCenterY;
180
- const horizontalDominant = Math.abs(dx) >= Math.abs(dy);
181
- if (horizontalDominant) {
182
- const targetX = dx >= 0 ? tooltipRect.left : tooltipRect.right;
183
- return [
184
- { x: exitPoint.x, y: exitPoint.y - corridorHalfSize },
185
- { x: exitPoint.x, y: exitPoint.y + corridorHalfSize },
186
- { x: targetX, y: tooltipRect.bottom + corridorHalfSize },
187
- { x: targetX, y: tooltipRect.top - corridorHalfSize },
188
- ];
189
- }
190
- const targetY = dy >= 0 ? tooltipRect.top : tooltipRect.bottom;
191
- return [
192
- { x: exitPoint.x - corridorHalfSize, y: exitPoint.y },
193
- { x: exitPoint.x + corridorHalfSize, y: exitPoint.y },
194
- { x: tooltipRect.right + corridorHalfSize, y: targetY },
195
- { x: tooltipRect.left - corridorHalfSize, y: targetY },
196
- ];
197
- }
198
- /**
199
- * Returns true when the point lies inside the provided polygon.
200
- */
201
- function isPointInHoverBridgePolygon(point, polygon) {
202
- let inside = false;
203
- for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
204
- const xi = polygon[i].x;
205
- const yi = polygon[i].y;
206
- const xj = polygon[j].x;
207
- const yj = polygon[j].y;
208
- const intersects = yi > point.y !== yj > point.y &&
209
- point.x < ((xj - xi) * (point.y - yi)) / (yj - yi || Number.EPSILON) + xi;
210
- if (intersects) {
211
- inside = !inside;
212
- }
213
- }
214
- return inside;
215
- }
216
-
217
166
  const [NgpTooltipTriggerStateToken, ngpTooltipTrigger, _injectTooltipTriggerState, provideTooltipTriggerState,] = createPrimitive('NgpTooltipTrigger', ({ tooltip: _tooltip = signal(null), disabled = signal(false), placement = signal('top'), offset = signal(0), showDelay = signal(500), hideDelay = signal(0), flip = signal(true), shift = signal(undefined), container: _container, showOnOverflow = signal(false), anchor = signal(null), context = signal(undefined), useTextContent = signal(true), trackPosition = signal(false), position = signal(null), scrollBehavior = signal('reposition'), cooldown = signal(300), hoverableContent = signal(false), }) => {
218
- const HOVER_BRIDGE_TIMEOUT_MS = 150;
219
167
  const elementRef = injectElementRef();
220
168
  const injector = inject(Injector);
221
169
  const viewContainerRef = inject(ViewContainerRef);
222
170
  const trigger = inject((ElementRef));
223
171
  const tooltipTriggerState = injectTooltipTriggerState();
224
- const disposables = injectDisposables();
225
172
  const tooltip = controlled(_tooltip);
226
173
  const container = controlled(_container, 'body');
227
174
  const tooltipId = signal(undefined, ...(ngDevMode ? [{ debugName: "tooltipId" }] : /* istanbul ignore next */ []));
228
175
  const triggerHovered = signal(false, ...(ngDevMode ? [{ debugName: "triggerHovered" }] : /* istanbul ignore next */ []));
229
176
  const contentHovered = signal(false, ...(ngDevMode ? [{ debugName: "contentHovered" }] : /* istanbul ignore next */ []));
230
- const hoverBridgePolygon = signal(null, ...(ngDevMode ? [{ debugName: "hoverBridgePolygon" }] : /* istanbul ignore next */ []));
231
177
  const overlay = signal(null, ...(ngDevMode ? [{ debugName: "overlay" }] : /* istanbul ignore next */ []));
232
178
  const hasOverflow = setupOverflowListener(trigger.nativeElement, {
233
179
  disabled: computed(() => !showOnOverflow()),
234
180
  });
235
- let removePointerMoveListener = undefined;
236
- let clearHoverBridgeTimeout = undefined;
237
181
  const open = computed(() => overlay()?.isOpen() ?? false, ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
182
+ // Safe-polygon hover intent for hoverable tooltip content. Tooltips preserve
183
+ // their original behaviour: no direction gate (requireForwardMovement off)
184
+ // and a fixed crossing grace rather than an idle timer that resets on move.
185
+ const hoverBridge = createHoverBridge({
186
+ isPointerInAnchor: () => triggerHovered() || contentHovered(),
187
+ close: () => hide(),
188
+ resetFallbackOnMove: false,
189
+ });
238
190
  // Host binding
239
191
  attrBinding(elementRef, 'aria-describedby', () => overlay()?.ariaDescribedBy());
240
192
  dataBinding(elementRef, 'data-open', () => (open() ? '' : null));
@@ -244,14 +196,14 @@ const [NgpTooltipTriggerStateToken, ngpTooltipTrigger, _injectTooltipTriggerStat
244
196
  listener(elementRef, 'mouseleave', hideFromInteraction);
245
197
  listener(elementRef, 'blur', () => hideFromInteraction());
246
198
  function destroy() {
247
- clearHoverBridge();
199
+ hoverBridge.clear();
248
200
  overlay()?.destroy();
249
201
  }
250
202
  function show() {
251
203
  performShow(true);
252
204
  }
253
205
  function hide() {
254
- clearHoverBridge();
206
+ hoverBridge.clear();
255
207
  overlay()?.hide();
256
208
  }
257
209
  /**
@@ -263,7 +215,7 @@ const [NgpTooltipTriggerStateToken, ngpTooltipTrigger, _injectTooltipTriggerStat
263
215
  return;
264
216
  }
265
217
  triggerHovered.set(true);
266
- clearHoverBridge();
218
+ hoverBridge.clear();
267
219
  performShow(false);
268
220
  }
269
221
  /**
@@ -304,7 +256,7 @@ const [NgpTooltipTriggerStateToken, ngpTooltipTrigger, _injectTooltipTriggerStat
304
256
  // Blur should close regardless of hover bridge or tooltip hover state.
305
257
  if (!event) {
306
258
  contentHovered.set(false);
307
- clearHoverBridge();
259
+ hoverBridge.clear();
308
260
  hide();
309
261
  return;
310
262
  }
@@ -317,19 +269,16 @@ const [NgpTooltipTriggerStateToken, ngpTooltipTrigger, _injectTooltipTriggerStat
317
269
  hide();
318
270
  return;
319
271
  }
320
- const polygon = createTooltipHoverBridgePolygon({
272
+ const started = hoverBridge.track({
321
273
  triggerRect: trigger.nativeElement.getBoundingClientRect(),
322
- tooltipRect: tooltipElement.getBoundingClientRect(),
274
+ targetRect: tooltipElement.getBoundingClientRect(),
323
275
  exitPoint: { x: event.clientX, y: event.clientY },
324
276
  });
325
- if (!polygon) {
277
+ if (!started) {
326
278
  hide();
327
279
  return;
328
280
  }
329
- hoverBridgePolygon.set(polygon);
330
281
  overlay()?.cancelPendingClose();
331
- registerPointerMoveListener();
332
- scheduleHoverBridgeCloseFallback();
333
282
  }
334
283
  /**
335
284
  * Called by tooltip content when pointer enters the tooltip.
@@ -340,7 +289,7 @@ const [NgpTooltipTriggerStateToken, ngpTooltipTrigger, _injectTooltipTriggerStat
340
289
  return;
341
290
  }
342
291
  contentHovered.set(true);
343
- clearHoverBridge();
292
+ hoverBridge.clear();
344
293
  overlay()?.cancelPendingClose();
345
294
  }
346
295
  /**
@@ -409,54 +358,6 @@ const [NgpTooltipTriggerStateToken, ngpTooltipTrigger, _injectTooltipTriggerStat
409
358
  // Create the overlay instance
410
359
  overlay.set(createOverlay(config));
411
360
  }
412
- /**
413
- * Register document-level pointer tracking while crossing trigger -> tooltip.
414
- * @internal
415
- */
416
- function registerPointerMoveListener() {
417
- if (removePointerMoveListener) {
418
- return;
419
- }
420
- const cleanup = disposables.addEventListener(document, 'pointermove', ((event) => {
421
- if (triggerHovered() || contentHovered() || !hoverBridgePolygon()) {
422
- clearHoverBridge();
423
- return;
424
- }
425
- const inBridge = isPointInHoverBridgePolygon({ x: event.clientX, y: event.clientY }, hoverBridgePolygon());
426
- if (!inBridge) {
427
- clearHoverBridge();
428
- hide();
429
- }
430
- }), true);
431
- removePointerMoveListener = () => {
432
- cleanup();
433
- removePointerMoveListener = undefined;
434
- };
435
- }
436
- /**
437
- * Clear hover bridge state and global listeners.
438
- * @internal
439
- */
440
- function clearHoverBridge() {
441
- hoverBridgePolygon.set(null);
442
- clearHoverBridgeTimeout?.();
443
- clearHoverBridgeTimeout = undefined;
444
- removePointerMoveListener?.();
445
- }
446
- /**
447
- * Close if pointer leaves trigger and does not move into tooltip soon enough.
448
- * @internal
449
- */
450
- function scheduleHoverBridgeCloseFallback() {
451
- clearHoverBridgeTimeout?.();
452
- clearHoverBridgeTimeout = disposables.setTimeout(() => {
453
- clearHoverBridgeTimeout = undefined;
454
- if (!triggerHovered() && !contentHovered() && hoverBridgePolygon()) {
455
- clearHoverBridge();
456
- hide();
457
- }
458
- }, HOVER_BRIDGE_TIMEOUT_MS);
459
- }
460
361
  const state = {
461
362
  tooltip,
462
363
  disabled,
@@ -481,7 +382,7 @@ const [NgpTooltipTriggerStateToken, ngpTooltipTrigger, _injectTooltipTriggerStat
481
382
  open,
482
383
  hasOverflow,
483
384
  contentHovered,
484
- hoverBridgePolygon,
385
+ hoverBridgePolygon: hoverBridge.polygon,
485
386
  show,
486
387
  hide,
487
388
  setTooltipId,
@@ -1 +1 @@
1
- {"version":3,"file":"ng-primitives-tooltip.mjs","sources":["../../../../packages/ng-primitives/tooltip/src/config/tooltip-config.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-arrow/tooltip-arrow-state.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-arrow/tooltip-arrow.ts","../../../../packages/ng-primitives/tooltip/src/tooltip/tooltip-state.ts","../../../../packages/ng-primitives/tooltip/src/tooltip/tooltip.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-text-content/tooltip-text-content-state.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-text-content/tooltip-text-content.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-trigger/tooltip-hover-bridge.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-trigger/tooltip-trigger-state.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-trigger/tooltip-trigger.ts","../../../../packages/ng-primitives/tooltip/src/ng-primitives-tooltip.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\nimport { type Placement } from '@floating-ui/dom';\nimport { NgpFlip, NgpOffset, NgpShift } from 'ng-primitives/portal';\n\nexport interface NgpTooltipConfig {\n /**\n * Define the offset of the tooltip relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n offset: NgpOffset;\n\n /**\n * Define the placement of the tooltip relative to the trigger.\n * @default 'top'\n */\n placement: Placement;\n\n /**\n * Define the delay before the tooltip is shown.\n * @default 0\n */\n showDelay: number;\n\n /**\n * Define the delay before the tooltip is hidden.\n * @default 500\n */\n hideDelay: number;\n\n /**\n * Define whether the tooltip should flip when there is not enough space for the tooltip.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n flip: NgpFlip;\n\n /**\n * Define the container element or selector into which the tooltip should be attached.\n * @default 'body'\n */\n container: HTMLElement | string | null;\n\n /**\n * Whether the tooltip should only show when the trigger element overflows.\n * @default false\n */\n showOnOverflow: boolean;\n\n /**\n * Whether to use the text content of the trigger element as the tooltip content.\n * @default true\n */\n useTextContent: boolean;\n\n /**\n * Configure shift behavior to keep the tooltip in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * Whether to track the trigger element position on every animation frame.\n * Useful for moving elements like slider thumbs.\n * @default false\n */\n trackPosition: boolean;\n\n /**\n * Defines how the tooltip behaves when the window is scrolled.\n * @default 'reposition'\n */\n scrollBehavior: 'reposition' | 'close';\n\n /**\n * Cooldown duration in milliseconds.\n * When moving from one tooltip to another within this duration,\n * the showDelay is skipped for the new tooltip.\n * @default 300\n */\n cooldown: number;\n\n /**\n * Whether hovering the tooltip content keeps it open while moving from the trigger.\n * @default false\n */\n hoverableContent: boolean;\n}\n\nexport const defaultTooltipConfig: NgpTooltipConfig = {\n offset: 4,\n placement: 'top',\n showDelay: 0,\n hideDelay: 500,\n flip: true,\n container: 'body',\n showOnOverflow: false,\n useTextContent: true,\n shift: undefined,\n trackPosition: false,\n scrollBehavior: 'reposition',\n cooldown: 300,\n hoverableContent: false,\n};\n\nexport const NgpTooltipConfigToken = new InjectionToken<NgpTooltipConfig>('NgpTooltipConfigToken');\n\n/**\n * Provide the default Tooltip configuration\n * @param config The Tooltip configuration\n * @returns The provider\n */\nexport function provideTooltipConfig(config: Partial<NgpTooltipConfig>): Provider[] {\n return [\n {\n provide: NgpTooltipConfigToken,\n useValue: { ...defaultTooltipConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Tooltip configuration\n * @returns The global Tooltip configuration\n */\nexport function injectTooltipConfig(): NgpTooltipConfig {\n return inject(NgpTooltipConfigToken, { optional: true }) ?? defaultTooltipConfig;\n}\n","import { NgpOverlayArrowProps, NgpOverlayArrowState, ngpOverlayArrow } from 'ng-primitives/portal';\nimport { createPrimitive } from 'ng-primitives/state';\n\n// Re-export types with tooltip-specific aliases\nexport { NgpOverlayArrowProps as NgpTooltipArrowProps };\nexport { NgpOverlayArrowState as NgpTooltipArrowState };\n\nexport const [\n NgpTooltipArrowStateToken,\n ngpTooltipArrow,\n injectTooltipArrowState,\n provideTooltipArrowState,\n] = createPrimitive(\n 'NgpTooltipArrow',\n ({ padding }: NgpOverlayArrowProps): NgpOverlayArrowState => {\n return ngpOverlayArrow({ padding });\n },\n);\n","import { NumberInput } from '@angular/cdk/coercion';\nimport { Directive, input, numberAttribute } from '@angular/core';\nimport { ngpTooltipArrow, provideTooltipArrowState } from './tooltip-arrow-state';\n\n@Directive({\n selector: '[ngpTooltipArrow]',\n exportAs: 'ngpTooltipArrow',\n providers: [provideTooltipArrowState()],\n})\nexport class NgpTooltipArrow {\n /**\n * Padding between the arrow and the edges of the tooltip.\n * This prevents the arrow from overflowing the rounded corners.\n */\n readonly padding = input<number | undefined, NumberInput>(undefined, {\n alias: 'ngpTooltipArrowPadding',\n transform: numberAttribute,\n });\n\n protected readonly state = ngpTooltipArrow({ padding: this.padding });\n\n /**\n * Set the padding between the arrow and the edges of the tooltip.\n * @param value The padding value in pixels\n */\n setPadding(value: number | undefined): void {\n this.state.setPadding(value);\n }\n}\n","import { ElementRef, Signal, signal } from '@angular/core';\nimport { ngpHover } from 'ng-primitives/interactions';\nimport { explicitEffect, injectElementRef } from 'ng-primitives/internal';\nimport { injectOverlay } from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n styleBinding,\n} from 'ng-primitives/state';\nimport { injectTooltipTriggerState } from '../tooltip-trigger/tooltip-trigger-state';\n\nexport interface NgpTooltipState {\n /** Access the element's reference. */\n readonly elementRef: ElementRef;\n /** The unique id of the tooltip. */\n readonly id: Signal<string>;\n}\n\nexport interface NgpTooltipProps {\n /** The unique id of the tooltip. */\n readonly id?: Signal<string>;\n}\n\nexport const [NgpTooltipStateToken, ngpTooltip, injectTooltipState, provideTooltipState] =\n createPrimitive('NgpTooltip', ({ id: _id = signal<string>('') }: NgpTooltipProps) => {\n const elementRef = injectElementRef();\n const tooltipTriggerState = injectTooltipTriggerState();\n const overlay = injectOverlay();\n\n const id = controlled(_id);\n\n // Seed the id with the overlay's generated unique id so the tooltip has a\n // valid id (and the trigger a valid aria-describedby) when none is provided.\n // `controlled` returns a linkedSignal, so this is only a transient default:\n // if a consumer binds `id`, that source change supersedes this seed.\n id.set(overlay.id());\n\n // Setup interactions\n ngpHover({\n onHoverStart: () => tooltipTriggerState().onTooltipHoverStart(),\n onHoverEnd: () => tooltipTriggerState().onTooltipHoverEnd(),\n });\n\n // Host binding\n attrBinding(elementRef, 'role', 'tooltip');\n attrBinding(elementRef, 'id', () => id());\n dataBinding(elementRef, 'data-overlay', '');\n dataBinding(elementRef, 'data-placement', () => overlay.finalPlacement()?.toString() ?? null);\n styleBinding(elementRef, 'left.px', () => overlay.position().x ?? null);\n styleBinding(elementRef, 'top.px', () => overlay.position().y ?? null);\n styleBinding(elementRef, '--ngp-tooltip-trigger-width.px', () => overlay.triggerWidth());\n styleBinding(elementRef, '--ngp-tooltip-transform-origin', () => overlay.transformOrigin());\n styleBinding(elementRef, '--ngp-tooltip-available-width.px', () => overlay.availableWidth());\n styleBinding(elementRef, '--ngp-tooltip-available-height.px', () => overlay.availableHeight());\n\n // Effects\n explicitEffect([id], ([id]) => overlay.id.set(id));\n\n return {\n elementRef,\n id,\n } satisfies NgpTooltipState;\n });\n","import { Directive, input } from '@angular/core';\nimport { provideControlContainerIsolation } from 'ng-primitives/portal';\nimport { ngpTooltip } from './tooltip-state';\n\n/**\n * Apply the `ngpTooltip` directive to an element that represents the tooltip. This typically would be a `div` inside an `ng-template`.\n */\n@Directive({\n selector: '[ngpTooltip]',\n exportAs: 'ngpTooltip',\n providers: [provideControlContainerIsolation()],\n})\nexport class NgpTooltip {\n /**\n * The unique id of the tooltip.\n */\n readonly id = input('');\n\n protected readonly state = ngpTooltip({\n id: this.id,\n });\n}\n","import { ElementRef, Signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { injectOverlayContext } from 'ng-primitives/portal';\nimport { attrBinding, createPrimitive } from 'ng-primitives/state';\n\nexport interface NgpTooltipTextContentState {\n /** Access the component's context. */\n readonly elementRef: ElementRef;\n /** The string content to display. */\n readonly content: Signal<unknown>;\n}\n\nexport interface NgpTooltipTextContentProps {}\n\nexport const [\n NgpTooltipTextContentStateToken,\n ngpTooltipTextContent,\n injectTooltipTextContentState,\n provideTooltipTextContentState,\n] = createPrimitive('NgpTooltipTextContent', ({}: NgpTooltipTextContentProps) => {\n const elementRef = injectElementRef();\n const content = injectOverlayContext();\n\n // Host bindings\n attrBinding(elementRef, 'ngpTooltip', '');\n\n return { elementRef, content } satisfies NgpTooltipTextContentState;\n});\n","import { Component } from '@angular/core';\nimport { NgpTooltip } from '../tooltip/tooltip';\nimport { ngpTooltipTextContent } from './tooltip-text-content-state';\n\n/**\n * Internal component for wrapping string content in tooltip portals\n * @internal\n */\n@Component({\n template: '{{ state.content() }}',\n hostDirectives: [NgpTooltip],\n})\nexport class NgpTooltipTextContentComponent {\n protected readonly state = ngpTooltipTextContent({});\n}\n","export interface TooltipHoverBridgePoint {\n x: number;\n y: number;\n}\n\ninterface CreateTooltipHoverBridgePolygonOptions {\n triggerRect: DOMRect | null;\n tooltipRect: DOMRect | null;\n exitPoint: TooltipHoverBridgePoint;\n corridorHalfSize?: number;\n}\n\n/**\n * Builds a pointer grace polygon between the trigger exit point and the tooltip.\n * The polygon is intentionally directional so moving away from the tooltip exits quickly.\n */\nexport function createTooltipHoverBridgePolygon({\n triggerRect,\n tooltipRect,\n exitPoint,\n corridorHalfSize = 8,\n}: CreateTooltipHoverBridgePolygonOptions): TooltipHoverBridgePoint[] | null {\n if (!triggerRect || !tooltipRect) {\n return null;\n }\n\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n const tooltipCenterX = tooltipRect.left + tooltipRect.width / 2;\n const tooltipCenterY = tooltipRect.top + tooltipRect.height / 2;\n\n const dx = tooltipCenterX - triggerCenterX;\n const dy = tooltipCenterY - triggerCenterY;\n const horizontalDominant = Math.abs(dx) >= Math.abs(dy);\n\n if (horizontalDominant) {\n const targetX = dx >= 0 ? tooltipRect.left : tooltipRect.right;\n return [\n { x: exitPoint.x, y: exitPoint.y - corridorHalfSize },\n { x: exitPoint.x, y: exitPoint.y + corridorHalfSize },\n { x: targetX, y: tooltipRect.bottom + corridorHalfSize },\n { x: targetX, y: tooltipRect.top - corridorHalfSize },\n ];\n }\n\n const targetY = dy >= 0 ? tooltipRect.top : tooltipRect.bottom;\n return [\n { x: exitPoint.x - corridorHalfSize, y: exitPoint.y },\n { x: exitPoint.x + corridorHalfSize, y: exitPoint.y },\n { x: tooltipRect.right + corridorHalfSize, y: targetY },\n { x: tooltipRect.left - corridorHalfSize, y: targetY },\n ];\n}\n\n/**\n * Returns true when the point lies inside the provided polygon.\n */\nexport function isPointInHoverBridgePolygon(\n point: TooltipHoverBridgePoint,\n polygon: TooltipHoverBridgePoint[],\n): boolean {\n let inside = false;\n\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i].x;\n const yi = polygon[i].y;\n const xj = polygon[j].x;\n const yj = polygon[j].y;\n\n const intersects =\n yi > point.y !== yj > point.y &&\n point.x < ((xj - xi) * (point.y - yi)) / (yj - yi || Number.EPSILON) + xi;\n if (intersects) {\n inside = !inside;\n }\n }\n\n return inside;\n}\n","import {\n signal,\n Signal,\n WritableSignal,\n Injector,\n inject,\n ViewContainerRef,\n computed,\n ElementRef,\n} from '@angular/core';\nimport { injectElementRef, setupOverflowListener } from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n NgpPosition,\n NgpShift,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n StateInjectionOptions,\n} from 'ng-primitives/state';\nimport { injectDisposables, isString } from 'ng-primitives/utils';\nimport { NgpTooltipTextContentComponent } from '../tooltip-text-content/tooltip-text-content';\nimport {\n createTooltipHoverBridgePolygon,\n isPointInHoverBridgePolygon,\n TooltipHoverBridgePoint,\n} from './tooltip-hover-bridge';\n\nexport interface NgpTooltipTriggerState<T> {\n /** Access the tooltip template ref. */\n readonly tooltip: WritableSignal<NgpOverlayContent<T> | string | null>;\n /**\n * Whether the tooltip is disabled. This allows the tooltip to be enabled or disabled dynamically.\n * @default false\n */\n readonly disabled: Signal<boolean>;\n /**\n * Define the placement of the tooltip relative to the trigger.\n * @default 'top'\n */\n readonly placement: Signal<NgpTooltipPlacement>;\n /**\n * Define the offset of the tooltip relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset: Signal<NgpOffset>;\n /**\n * Define the delay before the tooltip is displayed.\n * @default 500\n */\n readonly showDelay: Signal<number>;\n /**\n * Define the delay before the tooltip is hidden.\n * @default 0\n */\n readonly hideDelay: Signal<number>;\n /**\n * Define whether the tooltip should flip when there is not enough space for the tooltip.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip: Signal<NgpFlip>;\n /**\n * Configure shift behavior to keep the tooltip in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift: Signal<NgpShift>;\n /**\n * Define the container in which the tooltip should be attached.\n * @default document.body\n */\n readonly container: WritableSignal<HTMLElement | string | null>;\n /**\n * Define whether the tooltip should only show when the trigger element overflows.\n * @default false\n */\n readonly showOnOverflow: Signal<boolean>;\n /**\n * Define an anchor element for positioning the tooltip.\n * If provided, the tooltip will be positioned relative to this element instead of the trigger.\n */\n readonly anchor: Signal<HTMLElement | null>;\n /**\n * Provide context to the tooltip. This can be used to pass data to the tooltip content.\n */\n readonly context: Signal<T | undefined>;\n /**\n * Define whether to use the text content of the trigger element as the tooltip content.\n * When enabled, the tooltip will display the text content of the trigger element.\n * @default true\n */\n readonly useTextContent: Signal<boolean>;\n /**\n * Define whether to track the trigger element position on every animation frame.\n * Useful for moving elements like slider thumbs.\n * @default false\n */\n readonly trackPosition: Signal<boolean>;\n /**\n * Programmatic position for the tooltip. When provided, the tooltip\n * will be positioned at these coordinates instead of the trigger element.\n * Use with trackPosition=\"true\" for smooth cursor following.\n */\n readonly position: Signal<NgpPosition | null>;\n /**\n * Defines how the tooltip behaves when the window is scrolled.\n * @default 'reposition'\n */\n readonly scrollBehavior: Signal<'reposition' | 'close'>;\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one tooltip to another within this duration,\n * the showDelay is skipped for the new tooltip.\n * @default 300\n */\n readonly cooldown: Signal<number>;\n /**\n * Whether hovering tooltip content keeps the tooltip open.\n * @default false\n */\n readonly hoverableContent: Signal<boolean>;\n /**\n * The overlay that manages the tooltip\n * @internal\n */\n readonly overlay: WritableSignal<NgpOverlay<T | string> | null>;\n /**\n * The unique id of the tooltip.\n */\n readonly tooltipId: Signal<string | undefined>;\n /**\n * The open state of the tooltip.\n * @internal\n */\n readonly open: Signal<boolean>;\n /**\n * Determine if the trigger element has overflow.\n */\n readonly hasOverflow: Signal<boolean>;\n /**\n * Tracks whether pointer is currently over tooltip content.\n */\n readonly contentHovered: Signal<boolean>;\n /**\n * Current pointer grace polygon used while crossing trigger -> tooltip.\n */\n readonly hoverBridgePolygon: Signal<TooltipHoverBridgePoint[] | null>;\n /**\n * Show the tooltip programmatically (skips cooldown so multiple tooltips can coexist).\n */\n show: () => void;\n /**\n * Hide the tooltip.\n */\n hide: () => void;\n /**\n * Set the tooltip id.\n */\n setTooltipId: (id: string) => void;\n /**\n * Set the container in which the tooltip should be attached. Takes effect the\n * next time the tooltip is shown; it does not move a tooltip that is already\n * visible.\n * @param container - The new container\n */\n setContainer: (container: HTMLElement | string | null) => void;\n /**\n * Called by tooltip content when pointer enters the tooltip.\n * @internal\n */\n onTooltipHoverStart: () => void;\n /**\n * Called by tooltip content when pointer leaves the tooltip.\n * @internal\n */\n onTooltipHoverEnd: () => void;\n destroy: () => void;\n}\n\nexport interface NgpTooltipTriggerProps<T> {\n /** Access the tooltip template ref. */\n readonly tooltip?: Signal<NgpOverlayContent<T> | string | null>;\n /**\n * Whether the tooltip is disabled. This allows the tooltip to be enabled or disabled dynamically.\n * @default false\n */\n readonly disabled?: Signal<boolean>;\n /**\n * Define the placement of the tooltip relative to the trigger.\n * @default 'top'\n */\n readonly placement?: Signal<NgpTooltipPlacement>;\n /**\n * Define the offset of the tooltip relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Define the delay before the tooltip is displayed.\n * @default 500\n */\n readonly showDelay?: Signal<number>;\n /**\n * Define the delay before the tooltip is hidden.\n * @default 0\n */\n readonly hideDelay?: Signal<number>;\n /**\n * Define whether the tooltip should flip when there is not enough space for the tooltip.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip?: Signal<NgpFlip>;\n /**\n * Configure shift behavior to keep the tooltip in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift?: Signal<NgpShift>;\n /**\n * Define the container in which the tooltip should be attached.\n * @default document.body\n */\n readonly container?: Signal<HTMLElement | string | null>;\n /**\n * Define whether the tooltip should only show when the trigger element overflows.\n * @default false\n */\n readonly showOnOverflow?: Signal<boolean>;\n /**\n * Define an anchor element for positioning the tooltip.\n * If provided, the tooltip will be positioned relative to this element instead of the trigger.\n */\n readonly anchor?: Signal<HTMLElement | null>;\n /**\n * Provide context to the tooltip. This can be used to pass data to the tooltip content.\n */\n readonly context?: Signal<T | undefined>;\n /**\n * Define whether to use the text content of the trigger element as the tooltip content.\n * When enabled, the tooltip will display the text content of the trigger element.\n * @default true\n */\n readonly useTextContent?: Signal<boolean>;\n /**\n * Define whether to track the trigger element position on every animation frame.\n * Useful for moving elements like slider thumbs.\n * @default false\n */\n readonly trackPosition?: Signal<boolean>;\n /**\n * Programmatic position for the tooltip. When provided, the tooltip\n * will be positioned at these coordinates instead of the trigger element.\n * Use with trackPosition=\"true\" for smooth cursor following.\n */\n readonly position?: Signal<NgpPosition | null>;\n /**\n * Defines how the tooltip behaves when the window is scrolled.\n * @default 'reposition'\n */\n readonly scrollBehavior?: Signal<'reposition' | 'close'>;\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one tooltip to another within this duration,\n * the showDelay is skipped for the new tooltip.\n * @default 300\n */\n readonly cooldown?: Signal<number>;\n /**\n * Whether hovering tooltip content keeps the tooltip open.\n * @default false\n */\n readonly hoverableContent?: Signal<boolean>;\n}\n\nexport const [\n NgpTooltipTriggerStateToken,\n ngpTooltipTrigger,\n _injectTooltipTriggerState,\n provideTooltipTriggerState,\n] = createPrimitive(\n 'NgpTooltipTrigger',\n <T>({\n tooltip: _tooltip = signal<NgpOverlayContent<T> | string | null>(null),\n disabled = signal<boolean>(false),\n placement = signal<NgpTooltipPlacement>('top'),\n offset = signal<NgpOffset>(0),\n showDelay = signal<number>(500),\n hideDelay = signal<number>(0),\n flip = signal<NgpFlip>(true),\n shift = signal<NgpShift | undefined>(undefined),\n container: _container,\n showOnOverflow = signal<boolean>(false),\n anchor = signal<HTMLElement | null>(null),\n context = signal<T | undefined>(undefined),\n useTextContent = signal<boolean>(true),\n trackPosition = signal<boolean>(false),\n position = signal<NgpPosition | null>(null),\n scrollBehavior = signal<'reposition' | 'close'>('reposition'),\n cooldown = signal<number>(300),\n hoverableContent = signal<boolean>(false),\n }: NgpTooltipTriggerProps<T>) => {\n const HOVER_BRIDGE_TIMEOUT_MS = 150;\n const elementRef = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const trigger = inject(ElementRef<HTMLElement>);\n const tooltipTriggerState = injectTooltipTriggerState<T>();\n const disposables = injectDisposables();\n\n const tooltip = controlled(_tooltip);\n const container = controlled(_container, 'body');\n\n const tooltipId = signal<string | undefined>(undefined);\n const triggerHovered = signal<boolean>(false);\n const contentHovered = signal<boolean>(false);\n const hoverBridgePolygon = signal<TooltipHoverBridgePoint[] | null>(null);\n const overlay = signal<NgpOverlay<T | string> | null>(null);\n const hasOverflow = setupOverflowListener(trigger.nativeElement, {\n disabled: computed(() => !showOnOverflow()),\n });\n\n let removePointerMoveListener: (() => void) | undefined = undefined;\n let clearHoverBridgeTimeout: (() => void) | undefined = undefined;\n\n const open = computed(() => overlay()?.isOpen() ?? false);\n\n // Host binding\n attrBinding(elementRef, 'aria-describedby', () => overlay()?.ariaDescribedBy());\n dataBinding(elementRef, 'data-open', () => (open() ? '' : null));\n\n // Listeners\n listener(elementRef, 'mouseenter', showFromInteraction);\n listener(elementRef, 'focus', showFromInteraction);\n listener(elementRef, 'mouseleave', hideFromInteraction);\n listener(elementRef, 'blur', () => hideFromInteraction());\n\n function destroy(): void {\n clearHoverBridge();\n overlay()?.destroy();\n }\n\n function show(): void {\n performShow(true);\n }\n\n function hide(): void {\n clearHoverBridge();\n overlay()?.hide();\n }\n\n /**\n * Show the tooltip from an interaction (respects disabled state, uses cooldown).\n * @internal\n */\n function showFromInteraction(): void {\n if (tooltipTriggerState().disabled()) {\n return;\n }\n triggerHovered.set(true);\n clearHoverBridge();\n performShow(false);\n }\n\n /**\n * Shared show logic.\n * @param skipCooldown When true, skip cooldown registration so multiple tooltips can coexist.\n */\n function performShow(skipCooldown: boolean): void {\n // If already open, cancel any pending close\n if (open()) {\n overlay()?.cancelPendingClose();\n return;\n }\n\n // if we should only show when there is overflow, check if the trigger has overflow\n if (tooltipTriggerState().showOnOverflow() && !hasOverflow()) {\n return;\n }\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n overlay()?.show({ skipCooldown });\n }\n\n function setTooltipId(id: string): void {\n tooltipId.set(id);\n }\n\n function setContainer(newContainer: HTMLElement | string | null): void {\n container.set(newContainer);\n }\n\n /**\n * Hide the tooltip from an interaction (respects disabled state).\n * @internal\n */\n function hideFromInteraction(event?: MouseEvent): void {\n if (tooltipTriggerState().disabled()) {\n return;\n }\n\n triggerHovered.set(false);\n\n // Blur should close regardless of hover bridge or tooltip hover state.\n if (!event) {\n contentHovered.set(false);\n clearHoverBridge();\n hide();\n return;\n }\n\n if (!tooltipTriggerState().hoverableContent()) {\n hide();\n return;\n }\n\n const tooltipElement = overlay()?.getElements()[0];\n if (!tooltipElement) {\n hide();\n return;\n }\n\n const polygon = createTooltipHoverBridgePolygon({\n triggerRect: trigger.nativeElement.getBoundingClientRect(),\n tooltipRect: tooltipElement.getBoundingClientRect(),\n exitPoint: { x: event.clientX, y: event.clientY },\n });\n\n if (!polygon) {\n hide();\n return;\n }\n\n hoverBridgePolygon.set(polygon);\n overlay()?.cancelPendingClose();\n registerPointerMoveListener();\n scheduleHoverBridgeCloseFallback();\n }\n\n /**\n * Called by tooltip content when pointer enters the tooltip.\n * @internal\n */\n function onTooltipHoverStart(): void {\n if (tooltipTriggerState().disabled() || !tooltipTriggerState().hoverableContent()) {\n return;\n }\n\n contentHovered.set(true);\n clearHoverBridge();\n overlay()?.cancelPendingClose();\n }\n\n /**\n * Called by tooltip content when pointer leaves the tooltip.\n * @internal\n */\n function onTooltipHoverEnd(): void {\n if (tooltipTriggerState().disabled() || !tooltipTriggerState().hoverableContent()) {\n return;\n }\n\n contentHovered.set(false);\n\n if (!triggerHovered()) {\n hide();\n }\n }\n\n /**\n * Create the overlay that will contain the tooltip\n */\n function createOverlayInstance(): void {\n // Determine the content and context based on useTextContent setting\n const shouldUseTextContent = tooltipTriggerState().useTextContent();\n let content = tooltip();\n let context: Signal<T | string | undefined> = tooltipTriggerState().context;\n\n if (!content) {\n if (!shouldUseTextContent) {\n if (ngDevMode) {\n console.error(\n '[ngpTooltipTrigger]: Tooltip must be a string, TemplateRef, or ComponentType. Alternatively, set useTextContent to true if none is provided.',\n );\n }\n\n return;\n }\n\n const textContent = trigger.nativeElement.textContent?.trim() || '';\n if (ngDevMode && !textContent) {\n console.warn(\n '[ngpTooltipTrigger]: useTextContent is enabled but trigger element has no text content',\n );\n return;\n }\n content = NgpTooltipTextContentComponent;\n context = signal(textContent);\n } else if (isString(content)) {\n context = signal(content);\n content = NgpTooltipTextContentComponent;\n }\n\n // Create config for the overlay\n const config: NgpOverlayConfig<T | string> = {\n content,\n triggerElement: trigger.nativeElement,\n anchorElement: anchor(),\n injector: injector,\n context,\n container: container(),\n placement: placement,\n offset: offset(),\n flip: flip(),\n shift: shift(),\n showDelay: showDelay(),\n hideDelay: hideDelay(),\n closeOnEscape: true,\n closeOnOutsideClick: true,\n viewContainerRef: viewContainerRef,\n trackPosition: trackPosition(),\n position: position,\n scrollBehaviour: scrollBehavior(),\n overlayType: 'tooltip',\n cooldown: cooldown(),\n };\n\n // Create the overlay instance\n overlay.set(createOverlay(config));\n }\n\n /**\n * Register document-level pointer tracking while crossing trigger -> tooltip.\n * @internal\n */\n function registerPointerMoveListener(): void {\n if (removePointerMoveListener) {\n return;\n }\n\n const cleanup = disposables.addEventListener(\n document,\n 'pointermove' as keyof HTMLElementEventMap,\n ((event: PointerEvent): void => {\n if (triggerHovered() || contentHovered() || !hoverBridgePolygon()) {\n clearHoverBridge();\n return;\n }\n\n const inBridge = isPointInHoverBridgePolygon(\n { x: event.clientX, y: event.clientY },\n hoverBridgePolygon()!,\n );\n\n if (!inBridge) {\n clearHoverBridge();\n hide();\n }\n }) as EventListener,\n true,\n );\n\n removePointerMoveListener = () => {\n cleanup();\n removePointerMoveListener = undefined;\n };\n }\n\n /**\n * Clear hover bridge state and global listeners.\n * @internal\n */\n function clearHoverBridge(): void {\n hoverBridgePolygon.set(null);\n clearHoverBridgeTimeout?.();\n clearHoverBridgeTimeout = undefined;\n removePointerMoveListener?.();\n }\n\n /**\n * Close if pointer leaves trigger and does not move into tooltip soon enough.\n * @internal\n */\n function scheduleHoverBridgeCloseFallback(): void {\n clearHoverBridgeTimeout?.();\n\n clearHoverBridgeTimeout = disposables.setTimeout(() => {\n clearHoverBridgeTimeout = undefined;\n\n if (!triggerHovered() && !contentHovered() && hoverBridgePolygon()) {\n clearHoverBridge();\n hide();\n }\n }, HOVER_BRIDGE_TIMEOUT_MS);\n }\n\n const state = {\n tooltip,\n disabled,\n placement,\n offset,\n showDelay,\n hideDelay,\n flip,\n shift,\n container: deprecatedSetter(container, 'setContainer', setContainer),\n showOnOverflow,\n anchor,\n context,\n useTextContent,\n trackPosition,\n position,\n scrollBehavior,\n cooldown,\n hoverableContent,\n overlay,\n tooltipId,\n open,\n hasOverflow,\n contentHovered,\n hoverBridgePolygon,\n show,\n hide,\n setTooltipId,\n setContainer,\n onTooltipHoverStart,\n onTooltipHoverEnd,\n destroy,\n } satisfies NgpTooltipTriggerState<T>;\n\n return state;\n },\n);\n\nexport function injectTooltipTriggerState<T>(\n options?: StateInjectionOptions,\n): Signal<NgpTooltipTriggerState<T>> {\n return _injectTooltipTriggerState(options) as Signal<NgpTooltipTriggerState<T>>;\n}\n\nexport type NgpTooltipPlacement =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-start'\n | 'top-end'\n | 'right-start'\n | 'right-end'\n | 'bottom-start'\n | 'bottom-end'\n | 'left-start'\n | 'left-end';\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, numberAttribute, OnDestroy } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n coerceShift,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n NgpPosition,\n NgpShift,\n NgpShiftInput,\n} from 'ng-primitives/portal';\nimport { isString } from 'ng-primitives/utils';\nimport { injectTooltipConfig } from '../config/tooltip-config';\nimport {\n NgpTooltipPlacement,\n ngpTooltipTrigger,\n provideTooltipTriggerState,\n} from './tooltip-trigger-state';\n\ntype TooltipInput<T> = NgpOverlayContent<T> | string | null | undefined;\n\n/**\n * Apply the `ngpTooltipTrigger` directive to an element that triggers the tooltip to show.\n */\n@Directive({\n selector: '[ngpTooltipTrigger]',\n exportAs: 'ngpTooltipTrigger',\n providers: [provideTooltipTriggerState({ inherit: false })],\n})\nexport class NgpTooltipTrigger<T = null> implements OnDestroy {\n /**\n * Access the global tooltip configuration.\n */\n private readonly config = injectTooltipConfig();\n\n /**\n * Access the tooltip template ref.\n */\n readonly tooltip = input<NgpOverlayContent<T> | string | null, TooltipInput<T>>(null, {\n alias: 'ngpTooltipTrigger',\n transform: (value: TooltipInput<T>) => (value && !isString(value) ? value : null),\n });\n\n /**\n * Whether the tooltip is disabled. This allows the tooltip to be enabled or disabled dynamically.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpTooltipTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the tooltip relative to the trigger.\n * @default 'top'\n */\n readonly placement = input<NgpTooltipPlacement>(this.config.placement, {\n alias: 'ngpTooltipTriggerPlacement',\n });\n\n /**\n * Define the offset of the tooltip relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(this.config.offset, {\n alias: 'ngpTooltipTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define the delay before the tooltip is displayed.\n * @default 500\n */\n readonly showDelay = input<number, NumberInput>(this.config.showDelay, {\n alias: 'ngpTooltipTriggerShowDelay',\n transform: numberAttribute,\n });\n\n /**\n * Define the delay before the tooltip is hidden.\n * @default 0\n */\n readonly hideDelay = input<number, NumberInput>(this.config.hideDelay, {\n alias: 'ngpTooltipTriggerHideDelay',\n transform: numberAttribute,\n });\n\n /**\n * Define whether the tooltip should flip when there is not enough space for the tooltip.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(this.config.flip, {\n alias: 'ngpTooltipTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Configure shift behavior to keep the tooltip in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift = input<NgpShift, NgpShiftInput>(this.config.shift, {\n alias: 'ngpTooltipTriggerShift',\n transform: coerceShift,\n });\n\n /**\n * Define the container in which the tooltip should be attached.\n * @default document.body\n */\n readonly container = input<HTMLElement | string | null>(this.config.container, {\n alias: 'ngpTooltipTriggerContainer',\n });\n\n /**\n * Define whether the tooltip should only show when the trigger element overflows.\n * @default false\n */\n readonly showOnOverflow = input<boolean, BooleanInput>(this.config.showOnOverflow, {\n alias: 'ngpTooltipTriggerShowOnOverflow',\n transform: booleanAttribute,\n });\n\n /**\n * Define an anchor element for positioning the tooltip.\n * If provided, the tooltip will be positioned relative to this element instead of the trigger.\n */\n readonly anchor = input<HTMLElement | null>(null, { alias: 'ngpTooltipTriggerAnchor' });\n\n /**\n * Provide context to the tooltip. This can be used to pass data to the tooltip content.\n */\n readonly context = input<T>(undefined, {\n alias: 'ngpTooltipTriggerContext',\n });\n\n /**\n * Define whether to use the text content of the trigger element as the tooltip content.\n * When enabled, the tooltip will display the text content of the trigger element.\n * @default true\n */\n readonly useTextContent = input<boolean, BooleanInput>(this.config.useTextContent, {\n alias: 'ngpTooltipTriggerUseTextContent',\n transform: booleanAttribute,\n });\n\n /**\n * Define whether to track the trigger element position on every animation frame.\n * Useful for moving elements like slider thumbs.\n * @default false\n */\n readonly trackPosition = input<boolean, BooleanInput>(this.config.trackPosition, {\n alias: 'ngpTooltipTriggerTrackPosition',\n transform: booleanAttribute,\n });\n\n /**\n * Programmatic position for the tooltip. When provided, the tooltip\n * will be positioned at these coordinates instead of the trigger element.\n * Use with trackPosition=\"true\" for smooth cursor following.\n */\n readonly position = input<NgpPosition | null>(null, {\n alias: 'ngpTooltipTriggerPosition',\n });\n\n /**\n * Defines how the tooltip behaves when the window is scrolled.\n * @default 'reposition'\n */\n readonly scrollBehavior = input<'reposition' | 'close'>(this.config.scrollBehavior, {\n alias: 'ngpTooltipTriggerScrollBehavior',\n });\n\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one tooltip to another within this duration,\n * the showDelay is skipped for the new tooltip.\n * @default 300\n */\n readonly cooldown = input<number, NumberInput>(this.config.cooldown, {\n alias: 'ngpTooltipTriggerCooldown',\n transform: numberAttribute,\n });\n\n /**\n * Whether hovering tooltip content keeps the tooltip open.\n * @default false\n */\n readonly hoverableContent = input<boolean, BooleanInput>(this.config.hoverableContent, {\n alias: 'ngpTooltipTriggerHoverableContent',\n transform: booleanAttribute,\n });\n\n protected readonly state = ngpTooltipTrigger({\n tooltip: this.tooltip,\n disabled: this.disabled,\n placement: this.placement,\n offset: this.offset,\n showDelay: this.showDelay,\n hideDelay: this.hideDelay,\n flip: this.flip,\n shift: this.shift,\n container: this.container,\n showOnOverflow: this.showOnOverflow,\n anchor: this.anchor,\n context: this.context,\n useTextContent: this.useTextContent,\n trackPosition: this.trackPosition,\n position: this.position,\n scrollBehavior: this.scrollBehavior,\n cooldown: this.cooldown,\n hoverableContent: this.hoverableContent,\n });\n\n ngOnDestroy(): void {\n return this.state.destroy();\n }\n\n /**\n * Show the tooltip programmatically (skips cooldown so multiple tooltips can coexist).\n */\n show(): void {\n return this.state.show();\n }\n\n /**\n * Hide the tooltip.\n */\n hide(): void {\n return this.state.hide();\n }\n\n /**\n * Called by tooltip content when pointer enters the tooltip.\n * @internal\n */\n onTooltipHoverStart(): void {\n return this.state.onTooltipHoverStart();\n }\n\n /**\n * Called by tooltip content when pointer leaves the tooltip.\n * @internal\n */\n onTooltipHoverEnd(): void {\n return this.state.onTooltipHoverEnd();\n }\n\n /**\n * Set the tooltip id.\n */\n setTooltipId(id: string): void {\n return this.state.setTooltipId(id);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-primitives-tooltip.mjs","sources":["../../../../packages/ng-primitives/tooltip/src/config/tooltip-config.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-arrow/tooltip-arrow-state.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-arrow/tooltip-arrow.ts","../../../../packages/ng-primitives/tooltip/src/tooltip/tooltip-state.ts","../../../../packages/ng-primitives/tooltip/src/tooltip/tooltip.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-text-content/tooltip-text-content-state.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-text-content/tooltip-text-content.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-trigger/tooltip-trigger-state.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-trigger/tooltip-trigger.ts","../../../../packages/ng-primitives/tooltip/src/ng-primitives-tooltip.ts"],"sourcesContent":["import { InjectionToken, Provider, inject } from '@angular/core';\nimport { type Placement } from '@floating-ui/dom';\nimport { NgpFlip, NgpOffset, NgpShift } from 'ng-primitives/portal';\n\nexport interface NgpTooltipConfig {\n /**\n * Define the offset of the tooltip relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 4\n */\n offset: NgpOffset;\n\n /**\n * Define the placement of the tooltip relative to the trigger.\n * @default 'top'\n */\n placement: Placement;\n\n /**\n * Define the delay before the tooltip is shown.\n * @default 0\n */\n showDelay: number;\n\n /**\n * Define the delay before the tooltip is hidden.\n * @default 500\n */\n hideDelay: number;\n\n /**\n * Define whether the tooltip should flip when there is not enough space for the tooltip.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n flip: NgpFlip;\n\n /**\n * Define the container element or selector into which the tooltip should be attached.\n * @default 'body'\n */\n container: HTMLElement | string | null;\n\n /**\n * Whether the tooltip should only show when the trigger element overflows.\n * @default false\n */\n showOnOverflow: boolean;\n\n /**\n * Whether to use the text content of the trigger element as the tooltip content.\n * @default true\n */\n useTextContent: boolean;\n\n /**\n * Configure shift behavior to keep the tooltip in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n shift: NgpShift;\n\n /**\n * Whether to track the trigger element position on every animation frame.\n * Useful for moving elements like slider thumbs.\n * @default false\n */\n trackPosition: boolean;\n\n /**\n * Defines how the tooltip behaves when the window is scrolled.\n * @default 'reposition'\n */\n scrollBehavior: 'reposition' | 'close';\n\n /**\n * Cooldown duration in milliseconds.\n * When moving from one tooltip to another within this duration,\n * the showDelay is skipped for the new tooltip.\n * @default 300\n */\n cooldown: number;\n\n /**\n * Whether hovering the tooltip content keeps it open while moving from the trigger.\n * @default false\n */\n hoverableContent: boolean;\n}\n\nexport const defaultTooltipConfig: NgpTooltipConfig = {\n offset: 4,\n placement: 'top',\n showDelay: 0,\n hideDelay: 500,\n flip: true,\n container: 'body',\n showOnOverflow: false,\n useTextContent: true,\n shift: undefined,\n trackPosition: false,\n scrollBehavior: 'reposition',\n cooldown: 300,\n hoverableContent: false,\n};\n\nexport const NgpTooltipConfigToken = new InjectionToken<NgpTooltipConfig>('NgpTooltipConfigToken');\n\n/**\n * Provide the default Tooltip configuration\n * @param config The Tooltip configuration\n * @returns The provider\n */\nexport function provideTooltipConfig(config: Partial<NgpTooltipConfig>): Provider[] {\n return [\n {\n provide: NgpTooltipConfigToken,\n useValue: { ...defaultTooltipConfig, ...config },\n },\n ];\n}\n\n/**\n * Inject the Tooltip configuration\n * @returns The global Tooltip configuration\n */\nexport function injectTooltipConfig(): NgpTooltipConfig {\n return inject(NgpTooltipConfigToken, { optional: true }) ?? defaultTooltipConfig;\n}\n","import { NgpOverlayArrowProps, NgpOverlayArrowState, ngpOverlayArrow } from 'ng-primitives/portal';\nimport { createPrimitive } from 'ng-primitives/state';\n\n// Re-export types with tooltip-specific aliases\nexport { NgpOverlayArrowProps as NgpTooltipArrowProps };\nexport { NgpOverlayArrowState as NgpTooltipArrowState };\n\nexport const [\n NgpTooltipArrowStateToken,\n ngpTooltipArrow,\n injectTooltipArrowState,\n provideTooltipArrowState,\n] = createPrimitive(\n 'NgpTooltipArrow',\n ({ padding }: NgpOverlayArrowProps): NgpOverlayArrowState => {\n return ngpOverlayArrow({ padding });\n },\n);\n","import { NumberInput } from '@angular/cdk/coercion';\nimport { Directive, input, numberAttribute } from '@angular/core';\nimport { ngpTooltipArrow, provideTooltipArrowState } from './tooltip-arrow-state';\n\n@Directive({\n selector: '[ngpTooltipArrow]',\n exportAs: 'ngpTooltipArrow',\n providers: [provideTooltipArrowState()],\n})\nexport class NgpTooltipArrow {\n /**\n * Padding between the arrow and the edges of the tooltip.\n * This prevents the arrow from overflowing the rounded corners.\n */\n readonly padding = input<number | undefined, NumberInput>(undefined, {\n alias: 'ngpTooltipArrowPadding',\n transform: numberAttribute,\n });\n\n protected readonly state = ngpTooltipArrow({ padding: this.padding });\n\n /**\n * Set the padding between the arrow and the edges of the tooltip.\n * @param value The padding value in pixels\n */\n setPadding(value: number | undefined): void {\n this.state.setPadding(value);\n }\n}\n","import { ElementRef, Signal, signal } from '@angular/core';\nimport { ngpHover } from 'ng-primitives/interactions';\nimport { explicitEffect, injectElementRef } from 'ng-primitives/internal';\nimport { injectOverlay } from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n styleBinding,\n} from 'ng-primitives/state';\nimport { injectTooltipTriggerState } from '../tooltip-trigger/tooltip-trigger-state';\n\nexport interface NgpTooltipState {\n /** Access the element's reference. */\n readonly elementRef: ElementRef;\n /** The unique id of the tooltip. */\n readonly id: Signal<string>;\n}\n\nexport interface NgpTooltipProps {\n /** The unique id of the tooltip. */\n readonly id?: Signal<string>;\n}\n\nexport const [NgpTooltipStateToken, ngpTooltip, injectTooltipState, provideTooltipState] =\n createPrimitive('NgpTooltip', ({ id: _id = signal<string>('') }: NgpTooltipProps) => {\n const elementRef = injectElementRef();\n const tooltipTriggerState = injectTooltipTriggerState();\n const overlay = injectOverlay();\n\n const id = controlled(_id);\n\n // Seed the id with the overlay's generated unique id so the tooltip has a\n // valid id (and the trigger a valid aria-describedby) when none is provided.\n // `controlled` returns a linkedSignal, so this is only a transient default:\n // if a consumer binds `id`, that source change supersedes this seed.\n id.set(overlay.id());\n\n // Setup interactions\n ngpHover({\n onHoverStart: () => tooltipTriggerState().onTooltipHoverStart(),\n onHoverEnd: () => tooltipTriggerState().onTooltipHoverEnd(),\n });\n\n // Host binding\n attrBinding(elementRef, 'role', 'tooltip');\n attrBinding(elementRef, 'id', () => id());\n dataBinding(elementRef, 'data-overlay', '');\n dataBinding(elementRef, 'data-placement', () => overlay.finalPlacement()?.toString() ?? null);\n styleBinding(elementRef, 'left.px', () => overlay.position().x ?? null);\n styleBinding(elementRef, 'top.px', () => overlay.position().y ?? null);\n styleBinding(elementRef, '--ngp-tooltip-trigger-width.px', () => overlay.triggerWidth());\n styleBinding(elementRef, '--ngp-tooltip-transform-origin', () => overlay.transformOrigin());\n styleBinding(elementRef, '--ngp-tooltip-available-width.px', () => overlay.availableWidth());\n styleBinding(elementRef, '--ngp-tooltip-available-height.px', () => overlay.availableHeight());\n\n // Effects\n explicitEffect([id], ([id]) => overlay.id.set(id));\n\n return {\n elementRef,\n id,\n } satisfies NgpTooltipState;\n });\n","import { Directive, input } from '@angular/core';\nimport { provideControlContainerIsolation } from 'ng-primitives/portal';\nimport { ngpTooltip } from './tooltip-state';\n\n/**\n * Apply the `ngpTooltip` directive to an element that represents the tooltip. This typically would be a `div` inside an `ng-template`.\n */\n@Directive({\n selector: '[ngpTooltip]',\n exportAs: 'ngpTooltip',\n providers: [provideControlContainerIsolation()],\n})\nexport class NgpTooltip {\n /**\n * The unique id of the tooltip.\n */\n readonly id = input('');\n\n protected readonly state = ngpTooltip({\n id: this.id,\n });\n}\n","import { ElementRef, Signal } from '@angular/core';\nimport { injectElementRef } from 'ng-primitives/internal';\nimport { injectOverlayContext } from 'ng-primitives/portal';\nimport { attrBinding, createPrimitive } from 'ng-primitives/state';\n\nexport interface NgpTooltipTextContentState {\n /** Access the component's context. */\n readonly elementRef: ElementRef;\n /** The string content to display. */\n readonly content: Signal<unknown>;\n}\n\nexport interface NgpTooltipTextContentProps {}\n\nexport const [\n NgpTooltipTextContentStateToken,\n ngpTooltipTextContent,\n injectTooltipTextContentState,\n provideTooltipTextContentState,\n] = createPrimitive('NgpTooltipTextContent', ({}: NgpTooltipTextContentProps) => {\n const elementRef = injectElementRef();\n const content = injectOverlayContext();\n\n // Host bindings\n attrBinding(elementRef, 'ngpTooltip', '');\n\n return { elementRef, content } satisfies NgpTooltipTextContentState;\n});\n","import { Component } from '@angular/core';\nimport { NgpTooltip } from '../tooltip/tooltip';\nimport { ngpTooltipTextContent } from './tooltip-text-content-state';\n\n/**\n * Internal component for wrapping string content in tooltip portals\n * @internal\n */\n@Component({\n template: '{{ state.content() }}',\n hostDirectives: [NgpTooltip],\n})\nexport class NgpTooltipTextContentComponent {\n protected readonly state = ngpTooltipTextContent({});\n}\n","import {\n signal,\n Signal,\n WritableSignal,\n Injector,\n inject,\n ViewContainerRef,\n computed,\n ElementRef,\n} from '@angular/core';\nimport {\n createHoverBridge,\n HoverBridgePoint,\n injectElementRef,\n setupOverflowListener,\n} from 'ng-primitives/internal';\nimport {\n createOverlay,\n NgpFlip,\n NgpOffset,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n NgpPosition,\n NgpShift,\n} from 'ng-primitives/portal';\nimport {\n attrBinding,\n controlled,\n createPrimitive,\n dataBinding,\n deprecatedSetter,\n listener,\n StateInjectionOptions,\n} from 'ng-primitives/state';\nimport { isString } from 'ng-primitives/utils';\nimport { NgpTooltipTextContentComponent } from '../tooltip-text-content/tooltip-text-content';\n\nexport interface NgpTooltipTriggerState<T> {\n /** Access the tooltip template ref. */\n readonly tooltip: WritableSignal<NgpOverlayContent<T> | string | null>;\n /**\n * Whether the tooltip is disabled. This allows the tooltip to be enabled or disabled dynamically.\n * @default false\n */\n readonly disabled: Signal<boolean>;\n /**\n * Define the placement of the tooltip relative to the trigger.\n * @default 'top'\n */\n readonly placement: Signal<NgpTooltipPlacement>;\n /**\n * Define the offset of the tooltip relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset: Signal<NgpOffset>;\n /**\n * Define the delay before the tooltip is displayed.\n * @default 500\n */\n readonly showDelay: Signal<number>;\n /**\n * Define the delay before the tooltip is hidden.\n * @default 0\n */\n readonly hideDelay: Signal<number>;\n /**\n * Define whether the tooltip should flip when there is not enough space for the tooltip.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip: Signal<NgpFlip>;\n /**\n * Configure shift behavior to keep the tooltip in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift: Signal<NgpShift>;\n /**\n * Define the container in which the tooltip should be attached.\n * @default document.body\n */\n readonly container: WritableSignal<HTMLElement | string | null>;\n /**\n * Define whether the tooltip should only show when the trigger element overflows.\n * @default false\n */\n readonly showOnOverflow: Signal<boolean>;\n /**\n * Define an anchor element for positioning the tooltip.\n * If provided, the tooltip will be positioned relative to this element instead of the trigger.\n */\n readonly anchor: Signal<HTMLElement | null>;\n /**\n * Provide context to the tooltip. This can be used to pass data to the tooltip content.\n */\n readonly context: Signal<T | undefined>;\n /**\n * Define whether to use the text content of the trigger element as the tooltip content.\n * When enabled, the tooltip will display the text content of the trigger element.\n * @default true\n */\n readonly useTextContent: Signal<boolean>;\n /**\n * Define whether to track the trigger element position on every animation frame.\n * Useful for moving elements like slider thumbs.\n * @default false\n */\n readonly trackPosition: Signal<boolean>;\n /**\n * Programmatic position for the tooltip. When provided, the tooltip\n * will be positioned at these coordinates instead of the trigger element.\n * Use with trackPosition=\"true\" for smooth cursor following.\n */\n readonly position: Signal<NgpPosition | null>;\n /**\n * Defines how the tooltip behaves when the window is scrolled.\n * @default 'reposition'\n */\n readonly scrollBehavior: Signal<'reposition' | 'close'>;\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one tooltip to another within this duration,\n * the showDelay is skipped for the new tooltip.\n * @default 300\n */\n readonly cooldown: Signal<number>;\n /**\n * Whether hovering tooltip content keeps the tooltip open.\n * @default false\n */\n readonly hoverableContent: Signal<boolean>;\n /**\n * The overlay that manages the tooltip\n * @internal\n */\n readonly overlay: WritableSignal<NgpOverlay<T | string> | null>;\n /**\n * The unique id of the tooltip.\n */\n readonly tooltipId: Signal<string | undefined>;\n /**\n * The open state of the tooltip.\n * @internal\n */\n readonly open: Signal<boolean>;\n /**\n * Determine if the trigger element has overflow.\n */\n readonly hasOverflow: Signal<boolean>;\n /**\n * Tracks whether pointer is currently over tooltip content.\n */\n readonly contentHovered: Signal<boolean>;\n /**\n * Current pointer grace polygon used while crossing trigger -> tooltip.\n */\n readonly hoverBridgePolygon: Signal<HoverBridgePoint[] | null>;\n /**\n * Show the tooltip programmatically (skips cooldown so multiple tooltips can coexist).\n */\n show: () => void;\n /**\n * Hide the tooltip.\n */\n hide: () => void;\n /**\n * Set the tooltip id.\n */\n setTooltipId: (id: string) => void;\n /**\n * Set the container in which the tooltip should be attached. Takes effect the\n * next time the tooltip is shown; it does not move a tooltip that is already\n * visible.\n * @param container - The new container\n */\n setContainer: (container: HTMLElement | string | null) => void;\n /**\n * Called by tooltip content when pointer enters the tooltip.\n * @internal\n */\n onTooltipHoverStart: () => void;\n /**\n * Called by tooltip content when pointer leaves the tooltip.\n * @internal\n */\n onTooltipHoverEnd: () => void;\n destroy: () => void;\n}\n\nexport interface NgpTooltipTriggerProps<T> {\n /** Access the tooltip template ref. */\n readonly tooltip?: Signal<NgpOverlayContent<T> | string | null>;\n /**\n * Whether the tooltip is disabled. This allows the tooltip to be enabled or disabled dynamically.\n * @default false\n */\n readonly disabled?: Signal<boolean>;\n /**\n * Define the placement of the tooltip relative to the trigger.\n * @default 'top'\n */\n readonly placement?: Signal<NgpTooltipPlacement>;\n /**\n * Define the offset of the tooltip relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset?: Signal<NgpOffset>;\n /**\n * Define the delay before the tooltip is displayed.\n * @default 500\n */\n readonly showDelay?: Signal<number>;\n /**\n * Define the delay before the tooltip is hidden.\n * @default 0\n */\n readonly hideDelay?: Signal<number>;\n /**\n * Define whether the tooltip should flip when there is not enough space for the tooltip.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip?: Signal<NgpFlip>;\n /**\n * Configure shift behavior to keep the tooltip in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift?: Signal<NgpShift>;\n /**\n * Define the container in which the tooltip should be attached.\n * @default document.body\n */\n readonly container?: Signal<HTMLElement | string | null>;\n /**\n * Define whether the tooltip should only show when the trigger element overflows.\n * @default false\n */\n readonly showOnOverflow?: Signal<boolean>;\n /**\n * Define an anchor element for positioning the tooltip.\n * If provided, the tooltip will be positioned relative to this element instead of the trigger.\n */\n readonly anchor?: Signal<HTMLElement | null>;\n /**\n * Provide context to the tooltip. This can be used to pass data to the tooltip content.\n */\n readonly context?: Signal<T | undefined>;\n /**\n * Define whether to use the text content of the trigger element as the tooltip content.\n * When enabled, the tooltip will display the text content of the trigger element.\n * @default true\n */\n readonly useTextContent?: Signal<boolean>;\n /**\n * Define whether to track the trigger element position on every animation frame.\n * Useful for moving elements like slider thumbs.\n * @default false\n */\n readonly trackPosition?: Signal<boolean>;\n /**\n * Programmatic position for the tooltip. When provided, the tooltip\n * will be positioned at these coordinates instead of the trigger element.\n * Use with trackPosition=\"true\" for smooth cursor following.\n */\n readonly position?: Signal<NgpPosition | null>;\n /**\n * Defines how the tooltip behaves when the window is scrolled.\n * @default 'reposition'\n */\n readonly scrollBehavior?: Signal<'reposition' | 'close'>;\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one tooltip to another within this duration,\n * the showDelay is skipped for the new tooltip.\n * @default 300\n */\n readonly cooldown?: Signal<number>;\n /**\n * Whether hovering tooltip content keeps the tooltip open.\n * @default false\n */\n readonly hoverableContent?: Signal<boolean>;\n}\n\nexport const [\n NgpTooltipTriggerStateToken,\n ngpTooltipTrigger,\n _injectTooltipTriggerState,\n provideTooltipTriggerState,\n] = createPrimitive(\n 'NgpTooltipTrigger',\n <T>({\n tooltip: _tooltip = signal<NgpOverlayContent<T> | string | null>(null),\n disabled = signal<boolean>(false),\n placement = signal<NgpTooltipPlacement>('top'),\n offset = signal<NgpOffset>(0),\n showDelay = signal<number>(500),\n hideDelay = signal<number>(0),\n flip = signal<NgpFlip>(true),\n shift = signal<NgpShift | undefined>(undefined),\n container: _container,\n showOnOverflow = signal<boolean>(false),\n anchor = signal<HTMLElement | null>(null),\n context = signal<T | undefined>(undefined),\n useTextContent = signal<boolean>(true),\n trackPosition = signal<boolean>(false),\n position = signal<NgpPosition | null>(null),\n scrollBehavior = signal<'reposition' | 'close'>('reposition'),\n cooldown = signal<number>(300),\n hoverableContent = signal<boolean>(false),\n }: NgpTooltipTriggerProps<T>) => {\n const elementRef = injectElementRef();\n const injector = inject(Injector);\n const viewContainerRef = inject(ViewContainerRef);\n const trigger = inject(ElementRef<HTMLElement>);\n const tooltipTriggerState = injectTooltipTriggerState<T>();\n\n const tooltip = controlled(_tooltip);\n const container = controlled(_container, 'body');\n\n const tooltipId = signal<string | undefined>(undefined);\n const triggerHovered = signal<boolean>(false);\n const contentHovered = signal<boolean>(false);\n const overlay = signal<NgpOverlay<T | string> | null>(null);\n const hasOverflow = setupOverflowListener(trigger.nativeElement, {\n disabled: computed(() => !showOnOverflow()),\n });\n\n const open = computed(() => overlay()?.isOpen() ?? false);\n\n // Safe-polygon hover intent for hoverable tooltip content. Tooltips preserve\n // their original behaviour: no direction gate (requireForwardMovement off)\n // and a fixed crossing grace rather than an idle timer that resets on move.\n const hoverBridge = createHoverBridge({\n isPointerInAnchor: () => triggerHovered() || contentHovered(),\n close: () => hide(),\n resetFallbackOnMove: false,\n });\n\n // Host binding\n attrBinding(elementRef, 'aria-describedby', () => overlay()?.ariaDescribedBy());\n dataBinding(elementRef, 'data-open', () => (open() ? '' : null));\n\n // Listeners\n listener(elementRef, 'mouseenter', showFromInteraction);\n listener(elementRef, 'focus', showFromInteraction);\n listener(elementRef, 'mouseleave', hideFromInteraction);\n listener(elementRef, 'blur', () => hideFromInteraction());\n\n function destroy(): void {\n hoverBridge.clear();\n overlay()?.destroy();\n }\n\n function show(): void {\n performShow(true);\n }\n\n function hide(): void {\n hoverBridge.clear();\n overlay()?.hide();\n }\n\n /**\n * Show the tooltip from an interaction (respects disabled state, uses cooldown).\n * @internal\n */\n function showFromInteraction(): void {\n if (tooltipTriggerState().disabled()) {\n return;\n }\n triggerHovered.set(true);\n hoverBridge.clear();\n performShow(false);\n }\n\n /**\n * Shared show logic.\n * @param skipCooldown When true, skip cooldown registration so multiple tooltips can coexist.\n */\n function performShow(skipCooldown: boolean): void {\n // If already open, cancel any pending close\n if (open()) {\n overlay()?.cancelPendingClose();\n return;\n }\n\n // if we should only show when there is overflow, check if the trigger has overflow\n if (tooltipTriggerState().showOnOverflow() && !hasOverflow()) {\n return;\n }\n\n // Create the overlay if it doesn't exist yet\n if (!overlay()) {\n createOverlayInstance();\n }\n\n overlay()?.show({ skipCooldown });\n }\n\n function setTooltipId(id: string): void {\n tooltipId.set(id);\n }\n\n function setContainer(newContainer: HTMLElement | string | null): void {\n container.set(newContainer);\n }\n\n /**\n * Hide the tooltip from an interaction (respects disabled state).\n * @internal\n */\n function hideFromInteraction(event?: MouseEvent): void {\n if (tooltipTriggerState().disabled()) {\n return;\n }\n\n triggerHovered.set(false);\n\n // Blur should close regardless of hover bridge or tooltip hover state.\n if (!event) {\n contentHovered.set(false);\n hoverBridge.clear();\n hide();\n return;\n }\n\n if (!tooltipTriggerState().hoverableContent()) {\n hide();\n return;\n }\n\n const tooltipElement = overlay()?.getElements()[0];\n if (!tooltipElement) {\n hide();\n return;\n }\n\n const started = hoverBridge.track({\n triggerRect: trigger.nativeElement.getBoundingClientRect(),\n targetRect: tooltipElement.getBoundingClientRect(),\n exitPoint: { x: event.clientX, y: event.clientY },\n });\n\n if (!started) {\n hide();\n return;\n }\n\n overlay()?.cancelPendingClose();\n }\n\n /**\n * Called by tooltip content when pointer enters the tooltip.\n * @internal\n */\n function onTooltipHoverStart(): void {\n if (tooltipTriggerState().disabled() || !tooltipTriggerState().hoverableContent()) {\n return;\n }\n\n contentHovered.set(true);\n hoverBridge.clear();\n overlay()?.cancelPendingClose();\n }\n\n /**\n * Called by tooltip content when pointer leaves the tooltip.\n * @internal\n */\n function onTooltipHoverEnd(): void {\n if (tooltipTriggerState().disabled() || !tooltipTriggerState().hoverableContent()) {\n return;\n }\n\n contentHovered.set(false);\n\n if (!triggerHovered()) {\n hide();\n }\n }\n\n /**\n * Create the overlay that will contain the tooltip\n */\n function createOverlayInstance(): void {\n // Determine the content and context based on useTextContent setting\n const shouldUseTextContent = tooltipTriggerState().useTextContent();\n let content = tooltip();\n let context: Signal<T | string | undefined> = tooltipTriggerState().context;\n\n if (!content) {\n if (!shouldUseTextContent) {\n if (ngDevMode) {\n console.error(\n '[ngpTooltipTrigger]: Tooltip must be a string, TemplateRef, or ComponentType. Alternatively, set useTextContent to true if none is provided.',\n );\n }\n\n return;\n }\n\n const textContent = trigger.nativeElement.textContent?.trim() || '';\n if (ngDevMode && !textContent) {\n console.warn(\n '[ngpTooltipTrigger]: useTextContent is enabled but trigger element has no text content',\n );\n return;\n }\n content = NgpTooltipTextContentComponent;\n context = signal(textContent);\n } else if (isString(content)) {\n context = signal(content);\n content = NgpTooltipTextContentComponent;\n }\n\n // Create config for the overlay\n const config: NgpOverlayConfig<T | string> = {\n content,\n triggerElement: trigger.nativeElement,\n anchorElement: anchor(),\n injector: injector,\n context,\n container: container(),\n placement: placement,\n offset: offset(),\n flip: flip(),\n shift: shift(),\n showDelay: showDelay(),\n hideDelay: hideDelay(),\n closeOnEscape: true,\n closeOnOutsideClick: true,\n viewContainerRef: viewContainerRef,\n trackPosition: trackPosition(),\n position: position,\n scrollBehaviour: scrollBehavior(),\n overlayType: 'tooltip',\n cooldown: cooldown(),\n };\n\n // Create the overlay instance\n overlay.set(createOverlay(config));\n }\n\n const state = {\n tooltip,\n disabled,\n placement,\n offset,\n showDelay,\n hideDelay,\n flip,\n shift,\n container: deprecatedSetter(container, 'setContainer', setContainer),\n showOnOverflow,\n anchor,\n context,\n useTextContent,\n trackPosition,\n position,\n scrollBehavior,\n cooldown,\n hoverableContent,\n overlay,\n tooltipId,\n open,\n hasOverflow,\n contentHovered,\n hoverBridgePolygon: hoverBridge.polygon,\n show,\n hide,\n setTooltipId,\n setContainer,\n onTooltipHoverStart,\n onTooltipHoverEnd,\n destroy,\n } satisfies NgpTooltipTriggerState<T>;\n\n return state;\n },\n);\n\nexport function injectTooltipTriggerState<T>(\n options?: StateInjectionOptions,\n): Signal<NgpTooltipTriggerState<T>> {\n return _injectTooltipTriggerState(options) as Signal<NgpTooltipTriggerState<T>>;\n}\n\nexport type NgpTooltipPlacement =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-start'\n | 'top-end'\n | 'right-start'\n | 'right-end'\n | 'bottom-start'\n | 'bottom-end'\n | 'left-start'\n | 'left-end';\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { booleanAttribute, Directive, input, numberAttribute, OnDestroy } from '@angular/core';\nimport {\n coerceFlip,\n coerceOffset,\n coerceShift,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlayContent,\n NgpPosition,\n NgpShift,\n NgpShiftInput,\n} from 'ng-primitives/portal';\nimport { isString } from 'ng-primitives/utils';\nimport { injectTooltipConfig } from '../config/tooltip-config';\nimport {\n NgpTooltipPlacement,\n ngpTooltipTrigger,\n provideTooltipTriggerState,\n} from './tooltip-trigger-state';\n\ntype TooltipInput<T> = NgpOverlayContent<T> | string | null | undefined;\n\n/**\n * Apply the `ngpTooltipTrigger` directive to an element that triggers the tooltip to show.\n */\n@Directive({\n selector: '[ngpTooltipTrigger]',\n exportAs: 'ngpTooltipTrigger',\n providers: [provideTooltipTriggerState({ inherit: false })],\n})\nexport class NgpTooltipTrigger<T = null> implements OnDestroy {\n /**\n * Access the global tooltip configuration.\n */\n private readonly config = injectTooltipConfig();\n\n /**\n * Access the tooltip template ref.\n */\n readonly tooltip = input<NgpOverlayContent<T> | string | null, TooltipInput<T>>(null, {\n alias: 'ngpTooltipTrigger',\n transform: (value: TooltipInput<T>) => (value && !isString(value) ? value : null),\n });\n\n /**\n * Whether the tooltip is disabled. This allows the tooltip to be enabled or disabled dynamically.\n * @default false\n */\n readonly disabled = input<boolean, BooleanInput>(false, {\n alias: 'ngpTooltipTriggerDisabled',\n transform: booleanAttribute,\n });\n\n /**\n * Define the placement of the tooltip relative to the trigger.\n * @default 'top'\n */\n readonly placement = input<NgpTooltipPlacement>(this.config.placement, {\n alias: 'ngpTooltipTriggerPlacement',\n });\n\n /**\n * Define the offset of the tooltip relative to the trigger.\n * Can be a number (applies to mainAxis) or an object with mainAxis, crossAxis, and alignmentAxis.\n * @default 0\n */\n readonly offset = input<NgpOffset, NgpOffsetInput>(this.config.offset, {\n alias: 'ngpTooltipTriggerOffset',\n transform: coerceOffset,\n });\n\n /**\n * Define the delay before the tooltip is displayed.\n * @default 500\n */\n readonly showDelay = input<number, NumberInput>(this.config.showDelay, {\n alias: 'ngpTooltipTriggerShowDelay',\n transform: numberAttribute,\n });\n\n /**\n * Define the delay before the tooltip is hidden.\n * @default 0\n */\n readonly hideDelay = input<number, NumberInput>(this.config.hideDelay, {\n alias: 'ngpTooltipTriggerHideDelay',\n transform: numberAttribute,\n });\n\n /**\n * Define whether the tooltip should flip when there is not enough space for the tooltip.\n * Can be a boolean to enable/disable, or an object with padding and fallbackPlacements options.\n * @default true\n */\n readonly flip = input<NgpFlip, NgpFlipInput>(this.config.flip, {\n alias: 'ngpTooltipTriggerFlip',\n transform: coerceFlip,\n });\n\n /**\n * Configure shift behavior to keep the tooltip in view.\n * Can be a boolean to enable/disable, or an object with padding and limiter options.\n * @default undefined (enabled by default in overlay)\n */\n readonly shift = input<NgpShift, NgpShiftInput>(this.config.shift, {\n alias: 'ngpTooltipTriggerShift',\n transform: coerceShift,\n });\n\n /**\n * Define the container in which the tooltip should be attached.\n * @default document.body\n */\n readonly container = input<HTMLElement | string | null>(this.config.container, {\n alias: 'ngpTooltipTriggerContainer',\n });\n\n /**\n * Define whether the tooltip should only show when the trigger element overflows.\n * @default false\n */\n readonly showOnOverflow = input<boolean, BooleanInput>(this.config.showOnOverflow, {\n alias: 'ngpTooltipTriggerShowOnOverflow',\n transform: booleanAttribute,\n });\n\n /**\n * Define an anchor element for positioning the tooltip.\n * If provided, the tooltip will be positioned relative to this element instead of the trigger.\n */\n readonly anchor = input<HTMLElement | null>(null, { alias: 'ngpTooltipTriggerAnchor' });\n\n /**\n * Provide context to the tooltip. This can be used to pass data to the tooltip content.\n */\n readonly context = input<T>(undefined, {\n alias: 'ngpTooltipTriggerContext',\n });\n\n /**\n * Define whether to use the text content of the trigger element as the tooltip content.\n * When enabled, the tooltip will display the text content of the trigger element.\n * @default true\n */\n readonly useTextContent = input<boolean, BooleanInput>(this.config.useTextContent, {\n alias: 'ngpTooltipTriggerUseTextContent',\n transform: booleanAttribute,\n });\n\n /**\n * Define whether to track the trigger element position on every animation frame.\n * Useful for moving elements like slider thumbs.\n * @default false\n */\n readonly trackPosition = input<boolean, BooleanInput>(this.config.trackPosition, {\n alias: 'ngpTooltipTriggerTrackPosition',\n transform: booleanAttribute,\n });\n\n /**\n * Programmatic position for the tooltip. When provided, the tooltip\n * will be positioned at these coordinates instead of the trigger element.\n * Use with trackPosition=\"true\" for smooth cursor following.\n */\n readonly position = input<NgpPosition | null>(null, {\n alias: 'ngpTooltipTriggerPosition',\n });\n\n /**\n * Defines how the tooltip behaves when the window is scrolled.\n * @default 'reposition'\n */\n readonly scrollBehavior = input<'reposition' | 'close'>(this.config.scrollBehavior, {\n alias: 'ngpTooltipTriggerScrollBehavior',\n });\n\n /**\n * Define the cooldown duration in milliseconds.\n * When moving from one tooltip to another within this duration,\n * the showDelay is skipped for the new tooltip.\n * @default 300\n */\n readonly cooldown = input<number, NumberInput>(this.config.cooldown, {\n alias: 'ngpTooltipTriggerCooldown',\n transform: numberAttribute,\n });\n\n /**\n * Whether hovering tooltip content keeps the tooltip open.\n * @default false\n */\n readonly hoverableContent = input<boolean, BooleanInput>(this.config.hoverableContent, {\n alias: 'ngpTooltipTriggerHoverableContent',\n transform: booleanAttribute,\n });\n\n protected readonly state = ngpTooltipTrigger({\n tooltip: this.tooltip,\n disabled: this.disabled,\n placement: this.placement,\n offset: this.offset,\n showDelay: this.showDelay,\n hideDelay: this.hideDelay,\n flip: this.flip,\n shift: this.shift,\n container: this.container,\n showOnOverflow: this.showOnOverflow,\n anchor: this.anchor,\n context: this.context,\n useTextContent: this.useTextContent,\n trackPosition: this.trackPosition,\n position: this.position,\n scrollBehavior: this.scrollBehavior,\n cooldown: this.cooldown,\n hoverableContent: this.hoverableContent,\n });\n\n ngOnDestroy(): void {\n return this.state.destroy();\n }\n\n /**\n * Show the tooltip programmatically (skips cooldown so multiple tooltips can coexist).\n */\n show(): void {\n return this.state.show();\n }\n\n /**\n * Hide the tooltip.\n */\n hide(): void {\n return this.state.hide();\n }\n\n /**\n * Called by tooltip content when pointer enters the tooltip.\n * @internal\n */\n onTooltipHoverStart(): void {\n return this.state.onTooltipHoverStart();\n }\n\n /**\n * Called by tooltip content when pointer leaves the tooltip.\n * @internal\n */\n onTooltipHoverEnd(): void {\n return this.state.onTooltipHoverEnd();\n }\n\n /**\n * Set the tooltip id.\n */\n setTooltipId(id: string): void {\n return this.state.setTooltipId(id);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -138,6 +138,11 @@ function booleanAttributeBinding(element, attribute, value) {
138
138
  * Disposable functions are a way to manage timers, intervals, and event listeners
139
139
  * that should be cleared when a component is destroyed.
140
140
  *
141
+ * Each disposable releases its DestroyRef registration as soon as the resource
142
+ * is gone (the timer fires or the returned cleanup runs), so repeated calls -
143
+ * e.g. rescheduling a timeout on every pointermove - don't accumulate destroy
144
+ * callbacks for the lifetime of the host.
145
+ *
141
146
  * This is heavily inspired by Headless UI disposables:
142
147
  * https://github.com/tailwindlabs/headlessui/blob/main/packages/%40headlessui-react/src/utils/disposables.ts
143
148
  */
@@ -157,20 +162,23 @@ function injectDisposables() {
157
162
  // eslint-disable-next-line @typescript-eslint/no-empty-function
158
163
  return () => { };
159
164
  }
160
- const id = setTimeout(callback, delay);
161
- const cleanup = () => clearTimeout(id);
162
- destroyRef.onDestroy(cleanup);
163
- return cleanup;
165
+ const id = setTimeout(() => {
166
+ unregister();
167
+ callback();
168
+ }, delay);
169
+ const unregister = destroyRef.onDestroy(() => clearTimeout(id));
170
+ return () => {
171
+ clearTimeout(id);
172
+ unregister();
173
+ };
164
174
  },
165
175
  /**
166
- * Set an interval that will be cleared when the component is destroyed.
167
- * @param callback The callback to execute
168
- * @param delay The delay before the callback is executed
169
- * @param target
170
- * @param type
171
- * @param listener
172
- * @param options
173
- * @returns A function to clear the interval
176
+ * Add an event listener that will be removed when the component is destroyed.
177
+ * @param target The event target
178
+ * @param type The event type
179
+ * @param listener The event listener
180
+ * @param options The event listener options
181
+ * @returns A function to remove the event listener
174
182
  */
175
183
  addEventListener: (target, type,
176
184
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -180,14 +188,16 @@ function injectDisposables() {
180
188
  return () => { };
181
189
  }
182
190
  target.addEventListener(type, listener, options);
183
- const cleanup = () => target.removeEventListener(type, listener, options);
184
- destroyRef.onDestroy(cleanup);
185
- return cleanup;
191
+ const unregister = destroyRef.onDestroy(() => target.removeEventListener(type, listener, options));
192
+ return () => {
193
+ target.removeEventListener(type, listener, options);
194
+ unregister();
195
+ };
186
196
  },
187
197
  /**
188
198
  * Set an interval that will be cleared when the component is destroyed.
189
199
  * @param callback The callback to execute
190
- * @param delay The delay before the callback is executed
200
+ * @param delay The delay between executions
191
201
  * @returns A function to clear the interval
192
202
  */
193
203
  setInterval: (callback, delay) => {
@@ -196,9 +206,11 @@ function injectDisposables() {
196
206
  return () => { };
197
207
  }
198
208
  const id = setInterval(callback, delay);
199
- const cleanup = () => clearInterval(id);
200
- destroyRef.onDestroy(cleanup);
201
- return cleanup;
209
+ const unregister = destroyRef.onDestroy(() => clearInterval(id));
210
+ return () => {
211
+ clearInterval(id);
212
+ unregister();
213
+ };
202
214
  },
203
215
  /**
204
216
  * Set a requestAnimationFrame that will be cleared when the component is destroyed.
@@ -210,10 +222,15 @@ function injectDisposables() {
210
222
  // eslint-disable-next-line @typescript-eslint/no-empty-function
211
223
  return () => { };
212
224
  }
213
- const id = requestAnimationFrame(callback);
214
- const cleanup = () => cancelAnimationFrame(id);
215
- destroyRef.onDestroy(cleanup);
216
- return cleanup;
225
+ const id = requestAnimationFrame(time => {
226
+ unregister();
227
+ callback(time);
228
+ });
229
+ const unregister = destroyRef.onDestroy(() => cancelAnimationFrame(id));
230
+ return () => {
231
+ cancelAnimationFrame(id);
232
+ unregister();
233
+ };
217
234
  },
218
235
  };
219
236
  }