ng-primitives 0.114.0 → 0.115.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/dialog/index.d.ts +4 -1
- package/fesm2022/ng-primitives-dialog.mjs +28 -9
- package/fesm2022/ng-primitives-dialog.mjs.map +1 -1
- package/fesm2022/ng-primitives-portal.mjs +83 -15
- package/fesm2022/ng-primitives-portal.mjs.map +1 -1
- package/fesm2022/ng-primitives-tooltip.mjs +192 -13
- package/fesm2022/ng-primitives-tooltip.mjs.map +1 -1
- package/package.json +1 -1
- package/portal/index.d.ts +10 -1
- package/schematics/ng-generate/templates/tooltip/tooltip-trigger.__fileSuffix@dasherize__.ts.template +1 -0
- package/tooltip/index.d.ts +63 -3
|
@@ -4,7 +4,7 @@ import * as i0 from '@angular/core';
|
|
|
4
4
|
import { InjectionToken, inject, input, numberAttribute, Directive, Component, ElementRef, Injector, ViewContainerRef, booleanAttribute, signal, computed } from '@angular/core';
|
|
5
5
|
import { createPrimitive, createStateToken, createStateProvider, createStateInjector, createState } from 'ng-primitives/state';
|
|
6
6
|
import { explicitEffect, setupOverflowListener } from 'ng-primitives/internal';
|
|
7
|
-
import { isString } from 'ng-primitives/utils';
|
|
7
|
+
import { injectDisposables, isString } from 'ng-primitives/utils';
|
|
8
8
|
import { ngpHover } from 'ng-primitives/interactions';
|
|
9
9
|
|
|
10
10
|
const defaultTooltipConfig = {
|
|
@@ -20,6 +20,7 @@ const defaultTooltipConfig = {
|
|
|
20
20
|
trackPosition: false,
|
|
21
21
|
scrollBehavior: 'reposition',
|
|
22
22
|
cooldown: 300,
|
|
23
|
+
hoverableContent: false,
|
|
23
24
|
};
|
|
24
25
|
const NgpTooltipConfigToken = new InjectionToken('NgpTooltipConfigToken');
|
|
25
26
|
/**
|
|
@@ -116,13 +117,8 @@ class NgpTooltip {
|
|
|
116
117
|
explicitEffect([this.id], ([id]) => this.overlay.id.set(id));
|
|
117
118
|
// if the mouse moves over the tooltip, we want to keep it open
|
|
118
119
|
ngpHover({
|
|
119
|
-
onHoverStart: () => this.
|
|
120
|
-
onHoverEnd: () =>
|
|
121
|
-
if (this.tooltipTrigger().disabled()) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
this.tooltipTrigger().hide();
|
|
125
|
-
},
|
|
120
|
+
onHoverStart: () => this.tooltipTrigger().onTooltipHoverStart(),
|
|
121
|
+
onHoverEnd: () => this.tooltipTrigger().onTooltipHoverEnd(),
|
|
126
122
|
});
|
|
127
123
|
}
|
|
128
124
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpTooltip, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
@@ -175,10 +171,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
175
171
|
}]
|
|
176
172
|
}] });
|
|
177
173
|
|
|
174
|
+
/**
|
|
175
|
+
* Builds a pointer grace polygon between the trigger exit point and the tooltip.
|
|
176
|
+
* The polygon is intentionally directional so moving away from the tooltip exits quickly.
|
|
177
|
+
*/
|
|
178
|
+
function createTooltipHoverBridgePolygon({ triggerRect, tooltipRect, exitPoint, corridorHalfSize = 8, }) {
|
|
179
|
+
if (!triggerRect || !tooltipRect) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
const triggerCenterX = triggerRect.left + triggerRect.width / 2;
|
|
183
|
+
const triggerCenterY = triggerRect.top + triggerRect.height / 2;
|
|
184
|
+
const tooltipCenterX = tooltipRect.left + tooltipRect.width / 2;
|
|
185
|
+
const tooltipCenterY = tooltipRect.top + tooltipRect.height / 2;
|
|
186
|
+
const dx = tooltipCenterX - triggerCenterX;
|
|
187
|
+
const dy = tooltipCenterY - triggerCenterY;
|
|
188
|
+
const horizontalDominant = Math.abs(dx) >= Math.abs(dy);
|
|
189
|
+
if (horizontalDominant) {
|
|
190
|
+
const targetX = dx >= 0 ? tooltipRect.left : tooltipRect.right;
|
|
191
|
+
return [
|
|
192
|
+
{ x: exitPoint.x, y: exitPoint.y - corridorHalfSize },
|
|
193
|
+
{ x: exitPoint.x, y: exitPoint.y + corridorHalfSize },
|
|
194
|
+
{ x: targetX, y: tooltipRect.bottom + corridorHalfSize },
|
|
195
|
+
{ x: targetX, y: tooltipRect.top - corridorHalfSize },
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
const targetY = dy >= 0 ? tooltipRect.top : tooltipRect.bottom;
|
|
199
|
+
return [
|
|
200
|
+
{ x: exitPoint.x - corridorHalfSize, y: exitPoint.y },
|
|
201
|
+
{ x: exitPoint.x + corridorHalfSize, y: exitPoint.y },
|
|
202
|
+
{ x: tooltipRect.right + corridorHalfSize, y: targetY },
|
|
203
|
+
{ x: tooltipRect.left - corridorHalfSize, y: targetY },
|
|
204
|
+
];
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Returns true when the point lies inside the provided polygon.
|
|
208
|
+
*/
|
|
209
|
+
function isPointInHoverBridgePolygon(point, polygon) {
|
|
210
|
+
let inside = false;
|
|
211
|
+
for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
|
|
212
|
+
const xi = polygon[i].x;
|
|
213
|
+
const yi = polygon[i].y;
|
|
214
|
+
const xj = polygon[j].x;
|
|
215
|
+
const yj = polygon[j].y;
|
|
216
|
+
const intersects = yi > point.y !== yj > point.y &&
|
|
217
|
+
point.x < ((xj - xi) * (point.y - yi)) / (yj - yi || Number.EPSILON) + xi;
|
|
218
|
+
if (intersects) {
|
|
219
|
+
inside = !inside;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return inside;
|
|
223
|
+
}
|
|
224
|
+
|
|
178
225
|
/**
|
|
179
226
|
* Apply the `ngpTooltipTrigger` directive to an element that triggers the tooltip to show.
|
|
180
227
|
*/
|
|
181
228
|
class NgpTooltipTrigger {
|
|
229
|
+
/**
|
|
230
|
+
* Maximum time allowed to cross from trigger to tooltip without pointer movement.
|
|
231
|
+
*/
|
|
232
|
+
static { this.HOVER_BRIDGE_TIMEOUT_MS = 150; }
|
|
182
233
|
constructor() {
|
|
183
234
|
/**
|
|
184
235
|
* Access the trigger element
|
|
@@ -196,6 +247,10 @@ class NgpTooltipTrigger {
|
|
|
196
247
|
* Access the global tooltip configuration.
|
|
197
248
|
*/
|
|
198
249
|
this.config = injectTooltipConfig();
|
|
250
|
+
/**
|
|
251
|
+
* Disposables for managing event listeners and timers with automatic teardown.
|
|
252
|
+
*/
|
|
253
|
+
this.disposables = injectDisposables();
|
|
199
254
|
/**
|
|
200
255
|
* Access the tooltip template ref.
|
|
201
256
|
*/
|
|
@@ -336,6 +391,15 @@ class NgpTooltipTrigger {
|
|
|
336
391
|
alias: 'ngpTooltipTriggerCooldown',
|
|
337
392
|
transform: numberAttribute,
|
|
338
393
|
}]));
|
|
394
|
+
/**
|
|
395
|
+
* Whether hovering tooltip content keeps the tooltip open.
|
|
396
|
+
* @default false
|
|
397
|
+
*/
|
|
398
|
+
this.hoverableContent = input(this.config.hoverableContent, ...(ngDevMode ? [{ debugName: "hoverableContent", alias: 'ngpTooltipTriggerHoverableContent',
|
|
399
|
+
transform: booleanAttribute }] : [{
|
|
400
|
+
alias: 'ngpTooltipTriggerHoverableContent',
|
|
401
|
+
transform: booleanAttribute,
|
|
402
|
+
}]));
|
|
339
403
|
/**
|
|
340
404
|
* The overlay that manages the tooltip
|
|
341
405
|
* @internal
|
|
@@ -350,6 +414,18 @@ class NgpTooltipTrigger {
|
|
|
350
414
|
* @internal
|
|
351
415
|
*/
|
|
352
416
|
this.open = computed(() => this.overlay()?.isOpen() ?? false, ...(ngDevMode ? [{ debugName: "open" }] : []));
|
|
417
|
+
/**
|
|
418
|
+
* Tracks whether pointer is currently over trigger.
|
|
419
|
+
*/
|
|
420
|
+
this.triggerHovered = false;
|
|
421
|
+
/**
|
|
422
|
+
* Tracks whether pointer is currently over tooltip content.
|
|
423
|
+
*/
|
|
424
|
+
this.contentHovered = false;
|
|
425
|
+
/**
|
|
426
|
+
* Current pointer grace polygon used while crossing trigger -> tooltip.
|
|
427
|
+
*/
|
|
428
|
+
this.hoverBridgePolygon = null;
|
|
353
429
|
/**
|
|
354
430
|
* Store the state of the tooltip.
|
|
355
431
|
* @internal
|
|
@@ -360,6 +436,7 @@ class NgpTooltipTrigger {
|
|
|
360
436
|
});
|
|
361
437
|
}
|
|
362
438
|
ngOnDestroy() {
|
|
439
|
+
this.clearHoverBridge();
|
|
363
440
|
this.overlay()?.destroy();
|
|
364
441
|
}
|
|
365
442
|
/**
|
|
@@ -372,6 +449,7 @@ class NgpTooltipTrigger {
|
|
|
372
449
|
* Hide the tooltip.
|
|
373
450
|
*/
|
|
374
451
|
hide() {
|
|
452
|
+
this.clearHoverBridge();
|
|
375
453
|
this.overlay()?.hide();
|
|
376
454
|
}
|
|
377
455
|
/**
|
|
@@ -382,6 +460,8 @@ class NgpTooltipTrigger {
|
|
|
382
460
|
if (this.state.disabled()) {
|
|
383
461
|
return;
|
|
384
462
|
}
|
|
463
|
+
this.triggerHovered = true;
|
|
464
|
+
this.clearHoverBridge();
|
|
385
465
|
this.performShow(false);
|
|
386
466
|
}
|
|
387
467
|
/**
|
|
@@ -408,11 +488,65 @@ class NgpTooltipTrigger {
|
|
|
408
488
|
* Hide the tooltip from an interaction (respects disabled state).
|
|
409
489
|
* @internal
|
|
410
490
|
*/
|
|
411
|
-
hideFromInteraction() {
|
|
491
|
+
hideFromInteraction(event) {
|
|
412
492
|
if (this.state.disabled()) {
|
|
413
493
|
return;
|
|
414
494
|
}
|
|
415
|
-
this.
|
|
495
|
+
this.triggerHovered = false;
|
|
496
|
+
// Blur should close regardless of hover bridge or tooltip hover state.
|
|
497
|
+
if (!event) {
|
|
498
|
+
this.contentHovered = false;
|
|
499
|
+
this.clearHoverBridge();
|
|
500
|
+
this.hide();
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
if (!this.state.hoverableContent()) {
|
|
504
|
+
this.hide();
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
const tooltipElement = this.overlay()?.getElements()[0];
|
|
508
|
+
if (!tooltipElement) {
|
|
509
|
+
this.hide();
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
const polygon = createTooltipHoverBridgePolygon({
|
|
513
|
+
triggerRect: this.trigger.nativeElement.getBoundingClientRect(),
|
|
514
|
+
tooltipRect: tooltipElement.getBoundingClientRect(),
|
|
515
|
+
exitPoint: { x: event.clientX, y: event.clientY },
|
|
516
|
+
});
|
|
517
|
+
if (!polygon) {
|
|
518
|
+
this.hide();
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
this.hoverBridgePolygon = polygon;
|
|
522
|
+
this.overlay()?.cancelPendingClose();
|
|
523
|
+
this.registerPointerMoveListener();
|
|
524
|
+
this.scheduleHoverBridgeCloseFallback();
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Called by tooltip content when pointer enters the tooltip.
|
|
528
|
+
* @internal
|
|
529
|
+
*/
|
|
530
|
+
onTooltipHoverStart() {
|
|
531
|
+
if (this.state.disabled() || !this.state.hoverableContent()) {
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
this.contentHovered = true;
|
|
535
|
+
this.clearHoverBridge();
|
|
536
|
+
this.overlay()?.cancelPendingClose();
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Called by tooltip content when pointer leaves the tooltip.
|
|
540
|
+
* @internal
|
|
541
|
+
*/
|
|
542
|
+
onTooltipHoverEnd() {
|
|
543
|
+
if (this.state.disabled() || !this.state.hoverableContent()) {
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
this.contentHovered = false;
|
|
547
|
+
if (!this.triggerHovered) {
|
|
548
|
+
this.hide();
|
|
549
|
+
}
|
|
416
550
|
}
|
|
417
551
|
/**
|
|
418
552
|
* Create the overlay that will contain the tooltip
|
|
@@ -472,8 +606,53 @@ class NgpTooltipTrigger {
|
|
|
472
606
|
setTooltipId(id) {
|
|
473
607
|
this.tooltipId.set(id);
|
|
474
608
|
}
|
|
609
|
+
/**
|
|
610
|
+
* Register document-level pointer tracking while crossing trigger -> tooltip.
|
|
611
|
+
*/
|
|
612
|
+
registerPointerMoveListener() {
|
|
613
|
+
if (this.removePointerMoveListener) {
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
const cleanup = this.disposables.addEventListener(document, 'pointermove', ((event) => {
|
|
617
|
+
if (this.triggerHovered || this.contentHovered || !this.hoverBridgePolygon) {
|
|
618
|
+
this.clearHoverBridge();
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
const inBridge = isPointInHoverBridgePolygon({ x: event.clientX, y: event.clientY }, this.hoverBridgePolygon);
|
|
622
|
+
if (!inBridge) {
|
|
623
|
+
this.clearHoverBridge();
|
|
624
|
+
this.hide();
|
|
625
|
+
}
|
|
626
|
+
}), true);
|
|
627
|
+
this.removePointerMoveListener = () => {
|
|
628
|
+
cleanup();
|
|
629
|
+
this.removePointerMoveListener = undefined;
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
/**
|
|
633
|
+
* Clear hover bridge state and global listeners.
|
|
634
|
+
*/
|
|
635
|
+
clearHoverBridge() {
|
|
636
|
+
this.hoverBridgePolygon = null;
|
|
637
|
+
this.clearHoverBridgeTimeout?.();
|
|
638
|
+
this.clearHoverBridgeTimeout = undefined;
|
|
639
|
+
this.removePointerMoveListener?.();
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Close if pointer leaves trigger and does not move into tooltip soon enough.
|
|
643
|
+
*/
|
|
644
|
+
scheduleHoverBridgeCloseFallback() {
|
|
645
|
+
this.clearHoverBridgeTimeout?.();
|
|
646
|
+
this.clearHoverBridgeTimeout = this.disposables.setTimeout(() => {
|
|
647
|
+
this.clearHoverBridgeTimeout = undefined;
|
|
648
|
+
if (!this.triggerHovered && !this.contentHovered && this.hoverBridgePolygon) {
|
|
649
|
+
this.clearHoverBridge();
|
|
650
|
+
this.hide();
|
|
651
|
+
}
|
|
652
|
+
}, NgpTooltipTrigger.HOVER_BRIDGE_TIMEOUT_MS);
|
|
653
|
+
}
|
|
475
654
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpTooltipTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
476
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpTooltipTrigger, isStandalone: true, selector: "[ngpTooltipTrigger]", inputs: { tooltip: { classPropertyName: "tooltip", publicName: "ngpTooltipTrigger", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpTooltipTriggerDisabled", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "ngpTooltipTriggerPlacement", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "ngpTooltipTriggerOffset", isSignal: true, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "ngpTooltipTriggerShowDelay", isSignal: true, isRequired: false, transformFunction: null }, hideDelay: { classPropertyName: "hideDelay", publicName: "ngpTooltipTriggerHideDelay", isSignal: true, isRequired: false, transformFunction: null }, flip: { classPropertyName: "flip", publicName: "ngpTooltipTriggerFlip", isSignal: true, isRequired: false, transformFunction: null }, shift: { classPropertyName: "shift", publicName: "ngpTooltipTriggerShift", isSignal: true, isRequired: false, transformFunction: null }, container: { classPropertyName: "container", publicName: "ngpTooltipTriggerContainer", isSignal: true, isRequired: false, transformFunction: null }, showOnOverflow: { classPropertyName: "showOnOverflow", publicName: "ngpTooltipTriggerShowOnOverflow", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "ngpTooltipTriggerContext", isSignal: true, isRequired: false, transformFunction: null }, useTextContent: { classPropertyName: "useTextContent", publicName: "ngpTooltipTriggerUseTextContent", isSignal: true, isRequired: false, transformFunction: null }, trackPosition: { classPropertyName: "trackPosition", publicName: "ngpTooltipTriggerTrackPosition", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "ngpTooltipTriggerPosition", isSignal: true, isRequired: false, transformFunction: null }, scrollBehavior: { classPropertyName: "scrollBehavior", publicName: "ngpTooltipTriggerScrollBehavior", isSignal: true, isRequired: false, transformFunction: null }, cooldown: { classPropertyName: "cooldown", publicName: "ngpTooltipTriggerCooldown", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "mouseenter": "showFromInteraction()", "mouseleave": "hideFromInteraction()", "focus": "showFromInteraction()", "blur": "hideFromInteraction()" }, properties: { "attr.data-open": "open() ? \"\" : null", "attr.data-disabled": "state.disabled() ? \"\" : null", "attr.aria-describedby": "overlay()?.ariaDescribedBy()" } }, providers: [provideTooltipTriggerState({ inherit: false })], exportAs: ["ngpTooltipTrigger"], ngImport: i0 }); }
|
|
655
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.9", type: NgpTooltipTrigger, isStandalone: true, selector: "[ngpTooltipTrigger]", inputs: { tooltip: { classPropertyName: "tooltip", publicName: "ngpTooltipTrigger", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpTooltipTriggerDisabled", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "ngpTooltipTriggerPlacement", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "ngpTooltipTriggerOffset", isSignal: true, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "ngpTooltipTriggerShowDelay", isSignal: true, isRequired: false, transformFunction: null }, hideDelay: { classPropertyName: "hideDelay", publicName: "ngpTooltipTriggerHideDelay", isSignal: true, isRequired: false, transformFunction: null }, flip: { classPropertyName: "flip", publicName: "ngpTooltipTriggerFlip", isSignal: true, isRequired: false, transformFunction: null }, shift: { classPropertyName: "shift", publicName: "ngpTooltipTriggerShift", isSignal: true, isRequired: false, transformFunction: null }, container: { classPropertyName: "container", publicName: "ngpTooltipTriggerContainer", isSignal: true, isRequired: false, transformFunction: null }, showOnOverflow: { classPropertyName: "showOnOverflow", publicName: "ngpTooltipTriggerShowOnOverflow", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "ngpTooltipTriggerContext", isSignal: true, isRequired: false, transformFunction: null }, useTextContent: { classPropertyName: "useTextContent", publicName: "ngpTooltipTriggerUseTextContent", isSignal: true, isRequired: false, transformFunction: null }, trackPosition: { classPropertyName: "trackPosition", publicName: "ngpTooltipTriggerTrackPosition", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "ngpTooltipTriggerPosition", isSignal: true, isRequired: false, transformFunction: null }, scrollBehavior: { classPropertyName: "scrollBehavior", publicName: "ngpTooltipTriggerScrollBehavior", isSignal: true, isRequired: false, transformFunction: null }, cooldown: { classPropertyName: "cooldown", publicName: "ngpTooltipTriggerCooldown", isSignal: true, isRequired: false, transformFunction: null }, hoverableContent: { classPropertyName: "hoverableContent", publicName: "ngpTooltipTriggerHoverableContent", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "mouseenter": "showFromInteraction()", "mouseleave": "hideFromInteraction($event)", "focus": "showFromInteraction()", "blur": "hideFromInteraction()" }, properties: { "attr.data-open": "open() ? \"\" : null", "attr.data-disabled": "state.disabled() ? \"\" : null", "attr.aria-describedby": "overlay()?.ariaDescribedBy()" } }, providers: [provideTooltipTriggerState({ inherit: false })], exportAs: ["ngpTooltipTrigger"], ngImport: i0 }); }
|
|
477
656
|
}
|
|
478
657
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NgpTooltipTrigger, decorators: [{
|
|
479
658
|
type: Directive,
|
|
@@ -486,12 +665,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
486
665
|
'[attr.data-disabled]': 'state.disabled() ? "" : null',
|
|
487
666
|
'[attr.aria-describedby]': 'overlay()?.ariaDescribedBy()',
|
|
488
667
|
'(mouseenter)': 'showFromInteraction()',
|
|
489
|
-
'(mouseleave)': 'hideFromInteraction()',
|
|
668
|
+
'(mouseleave)': 'hideFromInteraction($event)',
|
|
490
669
|
'(focus)': 'showFromInteraction()',
|
|
491
670
|
'(blur)': 'hideFromInteraction()',
|
|
492
671
|
},
|
|
493
672
|
}]
|
|
494
|
-
}], ctorParameters: () => [], propDecorators: { tooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTrigger", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerDisabled", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerPlacement", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerOffset", required: false }] }], showDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerShowDelay", required: false }] }], hideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerHideDelay", required: false }] }], flip: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerFlip", required: false }] }], shift: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerShift", required: false }] }], container: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerContainer", required: false }] }], showOnOverflow: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerShowOnOverflow", required: false }] }], context: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerContext", required: false }] }], useTextContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerUseTextContent", required: false }] }], trackPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerTrackPosition", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerPosition", required: false }] }], scrollBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerScrollBehavior", required: false }] }], cooldown: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerCooldown", required: false }] }] } });
|
|
673
|
+
}], ctorParameters: () => [], propDecorators: { tooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTrigger", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerDisabled", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerPlacement", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerOffset", required: false }] }], showDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerShowDelay", required: false }] }], hideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerHideDelay", required: false }] }], flip: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerFlip", required: false }] }], shift: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerShift", required: false }] }], container: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerContainer", required: false }] }], showOnOverflow: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerShowOnOverflow", required: false }] }], context: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerContext", required: false }] }], useTextContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerUseTextContent", required: false }] }], trackPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerTrackPosition", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerPosition", required: false }] }], scrollBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerScrollBehavior", required: false }] }], cooldown: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerCooldown", required: false }] }], hoverableContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngpTooltipTriggerHoverableContent", required: false }] }] } });
|
|
495
674
|
|
|
496
675
|
/**
|
|
497
676
|
* Generated bundle index. Do not edit.
|
|
@@ -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-trigger/tooltip-trigger-state.ts","../../../../packages/ng-primitives/tooltip/src/tooltip/tooltip.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-text-content/tooltip-text-content.component.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 in to 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\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};\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 private 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 {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpTooltipTrigger } from './tooltip-trigger';\n\n/**\n * The state token for the TooltipTrigger primitive.\n */\nexport const NgpTooltipTriggerStateToken =\n createStateToken<NgpTooltipTrigger<unknown>>('TooltipTrigger');\n\n/**\n * Provides the TooltipTrigger state.\n */\nexport const provideTooltipTriggerState = createStateProvider(NgpTooltipTriggerStateToken);\n\n/**\n * Injects the TooltipTrigger state.\n */\nexport const injectTooltipTriggerState = createStateInjector<NgpTooltipTrigger<unknown>>(\n NgpTooltipTriggerStateToken,\n);\n\n/**\n * The TooltipTrigger state registration function.\n */\nexport const tooltipTriggerState = createState(NgpTooltipTriggerStateToken);\n","import { Directive, input } from '@angular/core';\nimport { ngpHover } from 'ng-primitives/interactions';\nimport { explicitEffect } from 'ng-primitives/internal';\nimport { injectOverlay } from 'ng-primitives/portal';\nimport { injectTooltipTriggerState } from '../tooltip-trigger/tooltip-trigger-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 host: {\n role: 'tooltip',\n '[id]': 'id()',\n '[style.left.px]': 'overlay.position().x',\n '[style.top.px]': 'overlay.position().y',\n '[style.--ngp-tooltip-trigger-width.px]': 'overlay.triggerWidth()',\n '[style.--ngp-tooltip-transform-origin]': 'overlay.transformOrigin()',\n '[style.--ngp-tooltip-available-width.px]': 'overlay.availableWidth()',\n '[style.--ngp-tooltip-available-height.px]': 'overlay.availableHeight()',\n '[attr.data-placement]': 'overlay.finalPlacement()',\n 'data-overlay': '',\n },\n})\nexport class NgpTooltip {\n /**\n * Access the overlay.\n */\n protected readonly overlay = injectOverlay();\n\n /**\n * Access the tooltip trigger state.\n */\n private readonly tooltipTrigger = injectTooltipTriggerState();\n\n /**\n * The unique id of the tooltip.\n */\n readonly id = input(this.overlay.id());\n\n constructor() {\n explicitEffect([this.id], ([id]) => this.overlay.id.set(id));\n\n // if the mouse moves over the tooltip, we want to keep it open\n ngpHover({\n onHoverStart: () => this.overlay.cancelPendingClose(),\n onHoverEnd: () => {\n if (this.tooltipTrigger().disabled()) {\n return;\n }\n\n this.tooltipTrigger().hide();\n },\n });\n }\n}\n","import { Component } from '@angular/core';\nimport { injectOverlayContext } from 'ng-primitives/portal';\nimport { NgpTooltip } from '../tooltip/tooltip';\n\n/**\n * Internal component for wrapping string content in tooltip portals\n * @internal\n */\n@Component({\n template: '{{ content() }}',\n hostDirectives: [NgpTooltip],\n host: {\n // Used only for styling, since the host directive isn’t added to the DOM.\n // This acts as the styling entry point.\n ngpTooltip: '',\n },\n})\nexport class NgpTooltipTextContentComponent {\n /**\n * The string content to display\n */\n readonly content = injectOverlayContext();\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n ElementRef,\n inject,\n Injector,\n input,\n numberAttribute,\n OnDestroy,\n Signal,\n signal,\n ViewContainerRef,\n} from '@angular/core';\nimport { setupOverflowListener } from 'ng-primitives/internal';\nimport {\n coerceFlip,\n coerceOffset,\n coerceShift,\n createOverlay,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlay,\n NgpOverlayConfig,\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 { NgpTooltipTextContentComponent } from '../tooltip-text-content/tooltip-text-content.component';\nimport { provideTooltipTriggerState, tooltipTriggerState } 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 host: {\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-disabled]': 'state.disabled() ? \"\" : null',\n '[attr.aria-describedby]': 'overlay()?.ariaDescribedBy()',\n '(mouseenter)': 'showFromInteraction()',\n '(mouseleave)': 'hideFromInteraction()',\n '(focus)': 'showFromInteraction()',\n '(blur)': 'hideFromInteraction()',\n },\n})\nexport class NgpTooltipTrigger<T = null> implements OnDestroy {\n /**\n * Access the trigger element\n */\n private readonly trigger = inject(ElementRef<HTMLElement>);\n\n /**\n * Access the injector.\n */\n private readonly injector = inject(Injector);\n\n /**\n * Access the view container reference.\n */\n private readonly viewContainerRef = inject(ViewContainerRef);\n\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 * Define if the trigger should be disabled. This will prevent the tooltip from being shown or hidden from interactions.\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 * 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 * The overlay that manages the tooltip\n * @internal\n */\n readonly overlay = signal<NgpOverlay<T | string> | null>(null);\n\n /**\n * The unique id of the tooltip.\n */\n readonly tooltipId = signal<string | undefined>(undefined);\n\n /**\n * The open state of the tooltip.\n * @internal\n */\n readonly open = computed(() => this.overlay()?.isOpen() ?? false);\n\n /**\n * Determine if the trigger element has overflow.\n */\n private readonly hasOverflow: Signal<boolean>;\n\n /**\n * Store the state of the tooltip.\n * @internal\n */\n readonly state = tooltipTriggerState<NgpTooltipTrigger<T>>(this);\n\n constructor() {\n this.hasOverflow = setupOverflowListener(this.trigger.nativeElement, {\n disabled: computed(() => !this.state.showOnOverflow()),\n });\n }\n\n ngOnDestroy(): void {\n this.overlay()?.destroy();\n }\n\n /**\n * Show the tooltip programmatically (skips cooldown so multiple tooltips can coexist).\n */\n show(): void {\n this.performShow(true);\n }\n\n /**\n * Hide the tooltip.\n */\n hide(): void {\n this.overlay()?.hide();\n }\n\n /**\n * Show the tooltip from an interaction (respects disabled state, uses cooldown).\n * @internal\n */\n protected showFromInteraction(): void {\n if (this.state.disabled()) {\n return;\n }\n this.performShow(false);\n }\n\n /**\n * Shared show logic.\n * @param skipCooldown When true, skip cooldown registration so multiple tooltips can coexist.\n */\n private performShow(skipCooldown: boolean): void {\n // If already open, cancel any pending close\n if (this.open()) {\n this.overlay()?.cancelPendingClose();\n return;\n }\n\n // if we should only show when there is overflow, check if the trigger has overflow\n if (this.state.showOnOverflow() && !this.hasOverflow()) {\n return;\n }\n\n // Create the overlay if it doesn't exist yet\n if (!this.overlay()) {\n this.createOverlay();\n }\n\n this.overlay()?.show({ skipCooldown });\n }\n\n /**\n * Hide the tooltip from an interaction (respects disabled state).\n * @internal\n */\n protected hideFromInteraction(): void {\n if (this.state.disabled()) {\n return;\n }\n this.hide();\n }\n\n /**\n * Create the overlay that will contain the tooltip\n */\n private createOverlay(): void {\n // Determine the content and context based on useTextContent setting\n const shouldUseTextContent = this.state.useTextContent();\n let content = this.state.tooltip();\n let context: Signal<T | string | undefined> = this.state.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 = this.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: this.trigger.nativeElement,\n injector: this.injector,\n context,\n container: this.state.container(),\n placement: this.state.placement,\n offset: this.state.offset(),\n flip: this.state.flip(),\n shift: this.state.shift(),\n showDelay: this.state.showDelay(),\n hideDelay: this.state.hideDelay(),\n closeOnEscape: true,\n closeOnOutsideClick: true,\n viewContainerRef: this.viewContainerRef,\n trackPosition: this.state.trackPosition(),\n position: this.state.position,\n scrollBehaviour: this.state.scrollBehavior(),\n overlayType: 'tooltip',\n cooldown: this.state.cooldown(),\n };\n\n // Create the overlay instance\n this.overlay.set(createOverlay(config));\n }\n\n /**\n * Set the tooltip id.\n */\n setTooltipId(id: string): void {\n this.tooltipId.set(id);\n }\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","/**\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-trigger/tooltip-trigger-state.ts","../../../../packages/ng-primitives/tooltip/src/tooltip/tooltip.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-text-content/tooltip-text-content.component.ts","../../../../packages/ng-primitives/tooltip/src/tooltip-trigger/tooltip-hover-bridge.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 private 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 {\n createState,\n createStateInjector,\n createStateProvider,\n createStateToken,\n} from 'ng-primitives/state';\nimport type { NgpTooltipTrigger } from './tooltip-trigger';\n\n/**\n * The state token for the TooltipTrigger primitive.\n */\nexport const NgpTooltipTriggerStateToken =\n createStateToken<NgpTooltipTrigger<unknown>>('TooltipTrigger');\n\n/**\n * Provides the TooltipTrigger state.\n */\nexport const provideTooltipTriggerState = createStateProvider(NgpTooltipTriggerStateToken);\n\n/**\n * Injects the TooltipTrigger state.\n */\nexport const injectTooltipTriggerState = createStateInjector<NgpTooltipTrigger<unknown>>(\n NgpTooltipTriggerStateToken,\n);\n\n/**\n * The TooltipTrigger state registration function.\n */\nexport const tooltipTriggerState = createState(NgpTooltipTriggerStateToken);\n","import { Directive, input } from '@angular/core';\nimport { ngpHover } from 'ng-primitives/interactions';\nimport { explicitEffect } from 'ng-primitives/internal';\nimport { injectOverlay } from 'ng-primitives/portal';\nimport { injectTooltipTriggerState } from '../tooltip-trigger/tooltip-trigger-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 host: {\n role: 'tooltip',\n '[id]': 'id()',\n '[style.left.px]': 'overlay.position().x',\n '[style.top.px]': 'overlay.position().y',\n '[style.--ngp-tooltip-trigger-width.px]': 'overlay.triggerWidth()',\n '[style.--ngp-tooltip-transform-origin]': 'overlay.transformOrigin()',\n '[style.--ngp-tooltip-available-width.px]': 'overlay.availableWidth()',\n '[style.--ngp-tooltip-available-height.px]': 'overlay.availableHeight()',\n '[attr.data-placement]': 'overlay.finalPlacement()',\n 'data-overlay': '',\n },\n})\nexport class NgpTooltip {\n /**\n * Access the overlay.\n */\n protected readonly overlay = injectOverlay();\n\n /**\n * Access the tooltip trigger state.\n */\n private readonly tooltipTrigger = injectTooltipTriggerState();\n\n /**\n * The unique id of the tooltip.\n */\n readonly id = input(this.overlay.id());\n\n constructor() {\n explicitEffect([this.id], ([id]) => this.overlay.id.set(id));\n\n // if the mouse moves over the tooltip, we want to keep it open\n ngpHover({\n onHoverStart: () => this.tooltipTrigger().onTooltipHoverStart(),\n onHoverEnd: () => this.tooltipTrigger().onTooltipHoverEnd(),\n });\n }\n}\n","import { Component } from '@angular/core';\nimport { injectOverlayContext } from 'ng-primitives/portal';\nimport { NgpTooltip } from '../tooltip/tooltip';\n\n/**\n * Internal component for wrapping string content in tooltip portals\n * @internal\n */\n@Component({\n template: '{{ content() }}',\n hostDirectives: [NgpTooltip],\n host: {\n // Used only for styling, since the host directive isn’t added to the DOM.\n // This acts as the styling entry point.\n ngpTooltip: '',\n },\n})\nexport class NgpTooltipTextContentComponent {\n /**\n * The string content to display\n */\n readonly content = injectOverlayContext();\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 { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n Directive,\n ElementRef,\n inject,\n Injector,\n input,\n numberAttribute,\n OnDestroy,\n Signal,\n signal,\n ViewContainerRef,\n} from '@angular/core';\nimport { setupOverflowListener } from 'ng-primitives/internal';\nimport {\n coerceFlip,\n coerceOffset,\n coerceShift,\n createOverlay,\n NgpFlip,\n NgpFlipInput,\n NgpOffset,\n NgpOffsetInput,\n NgpOverlay,\n NgpOverlayConfig,\n NgpOverlayContent,\n NgpPosition,\n NgpShift,\n NgpShiftInput,\n} from 'ng-primitives/portal';\nimport { injectDisposables, isString } from 'ng-primitives/utils';\nimport { injectTooltipConfig } from '../config/tooltip-config';\nimport { NgpTooltipTextContentComponent } from '../tooltip-text-content/tooltip-text-content.component';\nimport {\n createTooltipHoverBridgePolygon,\n isPointInHoverBridgePolygon,\n TooltipHoverBridgePoint,\n} from './tooltip-hover-bridge';\nimport { provideTooltipTriggerState, tooltipTriggerState } 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 host: {\n '[attr.data-open]': 'open() ? \"\" : null',\n '[attr.data-disabled]': 'state.disabled() ? \"\" : null',\n '[attr.aria-describedby]': 'overlay()?.ariaDescribedBy()',\n '(mouseenter)': 'showFromInteraction()',\n '(mouseleave)': 'hideFromInteraction($event)',\n '(focus)': 'showFromInteraction()',\n '(blur)': 'hideFromInteraction()',\n },\n})\nexport class NgpTooltipTrigger<T = null> implements OnDestroy {\n /**\n * Maximum time allowed to cross from trigger to tooltip without pointer movement.\n */\n private static readonly HOVER_BRIDGE_TIMEOUT_MS = 150;\n\n /**\n * Access the trigger element\n */\n private readonly trigger = inject(ElementRef<HTMLElement>);\n\n /**\n * Access the injector.\n */\n private readonly injector = inject(Injector);\n\n /**\n * Access the view container reference.\n */\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n /**\n * Access the global tooltip configuration.\n */\n private readonly config = injectTooltipConfig();\n\n /**\n * Disposables for managing event listeners and timers with automatic teardown.\n */\n private readonly disposables = injectDisposables();\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 * Define if the trigger should be disabled. This will prevent the tooltip from being shown or hidden from interactions.\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 * 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 /**\n * The overlay that manages the tooltip\n * @internal\n */\n readonly overlay = signal<NgpOverlay<T | string> | null>(null);\n\n /**\n * The unique id of the tooltip.\n */\n readonly tooltipId = signal<string | undefined>(undefined);\n\n /**\n * The open state of the tooltip.\n * @internal\n */\n readonly open = computed(() => this.overlay()?.isOpen() ?? false);\n\n /**\n * Determine if the trigger element has overflow.\n */\n private readonly hasOverflow: Signal<boolean>;\n\n /**\n * Tracks whether pointer is currently over trigger.\n */\n private triggerHovered = false;\n\n /**\n * Tracks whether pointer is currently over tooltip content.\n */\n private contentHovered = false;\n\n /**\n * Current pointer grace polygon used while crossing trigger -> tooltip.\n */\n private hoverBridgePolygon: TooltipHoverBridgePoint[] | null = null;\n\n /**\n * Cleanup callback for the document pointermove listener.\n */\n private removePointerMoveListener?: () => void;\n\n /**\n * Cleanup callback for the hover bridge timeout.\n */\n private clearHoverBridgeTimeout?: () => void;\n\n /**\n * Store the state of the tooltip.\n * @internal\n */\n readonly state = tooltipTriggerState<NgpTooltipTrigger<T>>(this);\n\n constructor() {\n this.hasOverflow = setupOverflowListener(this.trigger.nativeElement, {\n disabled: computed(() => !this.state.showOnOverflow()),\n });\n }\n\n ngOnDestroy(): void {\n this.clearHoverBridge();\n this.overlay()?.destroy();\n }\n\n /**\n * Show the tooltip programmatically (skips cooldown so multiple tooltips can coexist).\n */\n show(): void {\n this.performShow(true);\n }\n\n /**\n * Hide the tooltip.\n */\n hide(): void {\n this.clearHoverBridge();\n this.overlay()?.hide();\n }\n\n /**\n * Show the tooltip from an interaction (respects disabled state, uses cooldown).\n * @internal\n */\n protected showFromInteraction(): void {\n if (this.state.disabled()) {\n return;\n }\n this.triggerHovered = true;\n this.clearHoverBridge();\n this.performShow(false);\n }\n\n /**\n * Shared show logic.\n * @param skipCooldown When true, skip cooldown registration so multiple tooltips can coexist.\n */\n private performShow(skipCooldown: boolean): void {\n // If already open, cancel any pending close\n if (this.open()) {\n this.overlay()?.cancelPendingClose();\n return;\n }\n\n // if we should only show when there is overflow, check if the trigger has overflow\n if (this.state.showOnOverflow() && !this.hasOverflow()) {\n return;\n }\n\n // Create the overlay if it doesn't exist yet\n if (!this.overlay()) {\n this.createOverlay();\n }\n\n this.overlay()?.show({ skipCooldown });\n }\n\n /**\n * Hide the tooltip from an interaction (respects disabled state).\n * @internal\n */\n protected hideFromInteraction(event?: MouseEvent): void {\n if (this.state.disabled()) {\n return;\n }\n\n this.triggerHovered = false;\n\n // Blur should close regardless of hover bridge or tooltip hover state.\n if (!event) {\n this.contentHovered = false;\n this.clearHoverBridge();\n this.hide();\n return;\n }\n\n if (!this.state.hoverableContent()) {\n this.hide();\n return;\n }\n\n const tooltipElement = this.overlay()?.getElements()[0];\n if (!tooltipElement) {\n this.hide();\n return;\n }\n\n const polygon = createTooltipHoverBridgePolygon({\n triggerRect: this.trigger.nativeElement.getBoundingClientRect(),\n tooltipRect: tooltipElement.getBoundingClientRect(),\n exitPoint: { x: event.clientX, y: event.clientY },\n });\n\n if (!polygon) {\n this.hide();\n return;\n }\n\n this.hoverBridgePolygon = polygon;\n this.overlay()?.cancelPendingClose();\n this.registerPointerMoveListener();\n this.scheduleHoverBridgeCloseFallback();\n }\n\n /**\n * Called by tooltip content when pointer enters the tooltip.\n * @internal\n */\n onTooltipHoverStart(): void {\n if (this.state.disabled() || !this.state.hoverableContent()) {\n return;\n }\n\n this.contentHovered = true;\n this.clearHoverBridge();\n this.overlay()?.cancelPendingClose();\n }\n\n /**\n * Called by tooltip content when pointer leaves the tooltip.\n * @internal\n */\n onTooltipHoverEnd(): void {\n if (this.state.disabled() || !this.state.hoverableContent()) {\n return;\n }\n\n this.contentHovered = false;\n\n if (!this.triggerHovered) {\n this.hide();\n }\n }\n\n /**\n * Create the overlay that will contain the tooltip\n */\n private createOverlay(): void {\n // Determine the content and context based on useTextContent setting\n const shouldUseTextContent = this.state.useTextContent();\n let content = this.state.tooltip();\n let context: Signal<T | string | undefined> = this.state.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 = this.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: this.trigger.nativeElement,\n injector: this.injector,\n context,\n container: this.state.container(),\n placement: this.state.placement,\n offset: this.state.offset(),\n flip: this.state.flip(),\n shift: this.state.shift(),\n showDelay: this.state.showDelay(),\n hideDelay: this.state.hideDelay(),\n closeOnEscape: true,\n closeOnOutsideClick: true,\n viewContainerRef: this.viewContainerRef,\n trackPosition: this.state.trackPosition(),\n position: this.state.position,\n scrollBehaviour: this.state.scrollBehavior(),\n overlayType: 'tooltip',\n cooldown: this.state.cooldown(),\n };\n\n // Create the overlay instance\n this.overlay.set(createOverlay(config));\n }\n\n /**\n * Set the tooltip id.\n */\n setTooltipId(id: string): void {\n this.tooltipId.set(id);\n }\n\n /**\n * Register document-level pointer tracking while crossing trigger -> tooltip.\n */\n private registerPointerMoveListener(): void {\n if (this.removePointerMoveListener) {\n return;\n }\n\n const cleanup = this.disposables.addEventListener(\n document,\n 'pointermove' as keyof HTMLElementEventMap,\n ((event: PointerEvent): void => {\n if (this.triggerHovered || this.contentHovered || !this.hoverBridgePolygon) {\n this.clearHoverBridge();\n return;\n }\n\n const inBridge = isPointInHoverBridgePolygon(\n { x: event.clientX, y: event.clientY },\n this.hoverBridgePolygon,\n );\n\n if (!inBridge) {\n this.clearHoverBridge();\n this.hide();\n }\n }) as EventListener,\n true,\n );\n\n this.removePointerMoveListener = () => {\n cleanup();\n this.removePointerMoveListener = undefined;\n };\n }\n\n /**\n * Clear hover bridge state and global listeners.\n */\n private clearHoverBridge(): void {\n this.hoverBridgePolygon = null;\n this.clearHoverBridgeTimeout?.();\n this.clearHoverBridgeTimeout = undefined;\n this.removePointerMoveListener?.();\n }\n\n /**\n * Close if pointer leaves trigger and does not move into tooltip soon enough.\n */\n private scheduleHoverBridgeCloseFallback(): void {\n this.clearHoverBridgeTimeout?.();\n\n this.clearHoverBridgeTimeout = this.disposables.setTimeout(() => {\n this.clearHoverBridgeTimeout = undefined;\n\n if (!this.triggerHovered && !this.contentHovered && this.hoverBridgePolygon) {\n this.clearHoverBridge();\n this.hide();\n }\n }, NgpTooltipTrigger.HOVER_BRIDGE_TIMEOUT_MS);\n }\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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "ng-primitives",
|
|
3
3
|
"description": "Angular Primitives is a low-level headless UI component library with a focus on accessibility, customization, and developer experience. ",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.115.0",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"angular",
|
|
8
8
|
"primitives",
|
package/portal/index.d.ts
CHANGED
|
@@ -630,9 +630,18 @@ declare class NgpOverlayRegistry {
|
|
|
630
630
|
*/
|
|
631
631
|
private detachListeners;
|
|
632
632
|
/**
|
|
633
|
-
* Outside-click dismiss:
|
|
633
|
+
* Outside-click dismiss: checks all overlays (not just the topmost) and
|
|
634
|
+
* dismisses every overlay tree where the click landed outside.
|
|
635
|
+
*
|
|
636
|
+
* This handles the case where a non-dismissable overlay (e.g. a tooltip) is
|
|
637
|
+
* topmost but other overlays (e.g. a popover) should still be dismissed.
|
|
634
638
|
*/
|
|
635
639
|
private handleOutsideClick;
|
|
640
|
+
/**
|
|
641
|
+
* Check if a click (represented by its composedPath) is outside an entry's
|
|
642
|
+
* elements, trigger, and anchor.
|
|
643
|
+
*/
|
|
644
|
+
private isClickOutsideEntry;
|
|
636
645
|
/**
|
|
637
646
|
* Escape-key dismiss: only the topmost overlay responds.
|
|
638
647
|
*/
|
|
@@ -16,6 +16,7 @@ import { Tooltip } from './tooltip';
|
|
|
16
16
|
'ngpTooltipTriggerFlip:appTooltipTriggerFlip',
|
|
17
17
|
'ngpTooltipTriggerContainer:appTooltipTriggerContainer',
|
|
18
18
|
'ngpTooltipTriggerShowOnOverflow:appTooltipTriggerShowOnOverflow',
|
|
19
|
+
'ngpTooltipTriggerHoverableContent:appTooltipTriggerHoverableContent',
|
|
19
20
|
'ngpTooltipTriggerContext:appTooltipTrigger',
|
|
20
21
|
],
|
|
21
22
|
},
|