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.
- package/fesm2022/ng-primitives-combobox.mjs +10 -1
- package/fesm2022/ng-primitives-combobox.mjs.map +1 -1
- package/fesm2022/ng-primitives-date-picker.mjs +1 -1
- package/fesm2022/ng-primitives-date-picker.mjs.map +1 -1
- package/fesm2022/ng-primitives-internal.mjs +184 -3
- package/fesm2022/ng-primitives-internal.mjs.map +1 -1
- package/fesm2022/ng-primitives-menu.mjs +131 -19
- package/fesm2022/ng-primitives-menu.mjs.map +1 -1
- package/fesm2022/ng-primitives-portal.mjs +74 -12
- package/fesm2022/ng-primitives-portal.mjs.map +1 -1
- package/fesm2022/ng-primitives-select.mjs +10 -1
- package/fesm2022/ng-primitives-select.mjs.map +1 -1
- package/fesm2022/ng-primitives-tooltip.mjs +19 -118
- package/fesm2022/ng-primitives-tooltip.mjs.map +1 -1
- package/fesm2022/ng-primitives-utils.mjs +40 -23
- package/fesm2022/ng-primitives-utils.mjs.map +1 -1
- package/package.json +1 -1
- package/schematics/ng-generate/templates/toggle-group/toggle-group.__fileSuffix@dasherize__.ts.template +2 -2
- package/types/ng-primitives-internal.d.ts +95 -3
- package/types/ng-primitives-menu.d.ts +42 -10
- package/types/ng-primitives-portal.d.ts +31 -1
- package/types/ng-primitives-tooltip.d.ts +6 -9
- package/types/ng-primitives-utils.d.ts +12 -9
|
@@ -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 {
|
|
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
|
-
|
|
199
|
+
hoverBridge.clear();
|
|
248
200
|
overlay()?.destroy();
|
|
249
201
|
}
|
|
250
202
|
function show() {
|
|
251
203
|
performShow(true);
|
|
252
204
|
}
|
|
253
205
|
function hide() {
|
|
254
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
272
|
+
const started = hoverBridge.track({
|
|
321
273
|
triggerRect: trigger.nativeElement.getBoundingClientRect(),
|
|
322
|
-
|
|
274
|
+
targetRect: tooltipElement.getBoundingClientRect(),
|
|
323
275
|
exitPoint: { x: event.clientX, y: event.clientY },
|
|
324
276
|
});
|
|
325
|
-
if (!
|
|
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
|
-
|
|
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(
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
-
*
|
|
167
|
-
* @param
|
|
168
|
-
* @param
|
|
169
|
-
* @param
|
|
170
|
-
* @param
|
|
171
|
-
* @
|
|
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
|
|
184
|
-
|
|
185
|
-
|
|
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
|
|
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
|
|
200
|
-
|
|
201
|
-
|
|
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(
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
}
|