Skip to content

Commit 0170e48

Browse files
committed
fix: prevent definition tooltip from flickering on first interaction
Signed-off-by: Akshat Patel <[email protected]>
1 parent ca741fd commit 0170e48

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

src/tooltip/definition-tooptip.component.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { PopoverContainer } from "carbon-components-angular/popover";
3030
[attr.aria-expanded]="isOpen"
3131
[attr.aria-describedby]="isOpen ? id : null"
3232
(blur)="onBlur($event)"
33-
(click)="onClick($event)"
33+
(mousedown)="onClick($event)"
3434
type="button">
3535
<ng-content></ng-content>
3636
</button>
@@ -39,7 +39,9 @@ import { PopoverContainer } from "carbon-components-angular/popover";
3939
class="cds--popover"
4040
[id]="id"
4141
[attr.aria-hidden]="!isOpen"
42-
role="tooltip">
42+
role="tooltip"
43+
(mousedown)="onPopoverMouseDown()"
44+
(mouseup)="onPopoverMouseUp()">
4345
<span class="cds--popover-content cds--definition-tooltip" aria-live="polite">
4446
<ng-container *ngIf="!isTemplate(description)">{{description}}</ng-container>
4547
<ng-template *ngIf="isTemplate(description)" [ngTemplateOutlet]="description" [ngTemplateOutletContext]="{ $implicit: templateContext }"></ng-template>
@@ -65,6 +67,11 @@ export class TooltipDefinition extends PopoverContainer {
6567

6668
@Input() openOnHover = false;
6769

70+
/**
71+
* Helper variable to ensure button blur doesn't fire on `click` of popover content
72+
*/
73+
private isInteractingWithPopover = false;
74+
6875
constructor(
6976
protected elementRef: ElementRef,
7077
protected ngZone: NgZone,
@@ -77,11 +84,24 @@ export class TooltipDefinition extends PopoverContainer {
7784
}
7885

7986
onBlur(event: Event) {
80-
this.handleChange(false, event);
87+
// Only close if user is not interacting with popover content
88+
if (!this.isInteractingWithPopover) {
89+
this.handleChange(false, event);
90+
}
91+
}
92+
93+
onClick(event: MouseEvent) {
94+
if (event.button === 0) {
95+
this.handleChange(!this.isOpen, event);
96+
}
97+
}
98+
99+
onPopoverMouseDown() {
100+
this.isInteractingWithPopover = true;
81101
}
82102

83-
onClick(event: Event) {
84-
this.handleChange(!this.isOpen, event);
103+
onPopoverMouseUp() {
104+
this.isInteractingWithPopover = false;
85105
}
86106

87107
@HostListener("keyup", ["$event"])

src/tooltip/definition-tooptip.stories.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ export default {
2323
caret: true,
2424
description: "Uniform Resource Locator; the address of a resource (such as a document or website) on the Internet.",
2525
align: "bottom",
26-
autoAlign: false
26+
autoAlign: false,
27+
openOnHover: true
2728
},
2829
argTypes: {
2930
autoAlign: {

0 commit comments

Comments
 (0)