1
1
import { getShadowRootNode , isPrimaryPointerButton } from "../../utils/dom" ;
2
2
import { ReferenceElement } from "../../utils/floating-ui" ;
3
- import { TOOLTIP_DELAY_MS } from "./resources" ;
3
+ import { TOOLTIP_OPEN_DELAY_MS , TOOLTIP_CLOSE_DELAY_MS } from "./resources" ;
4
4
import { getEffectiveReferenceElement } from "./utils" ;
5
5
6
6
export default class TooltipManager {
@@ -14,7 +14,9 @@ export default class TooltipManager {
14
14
15
15
private registeredShadowRootCounts = new WeakMap < ShadowRoot , number > ( ) ;
16
16
17
- private hoverTimeout : number = null ;
17
+ private hoverOpenTimeout : number = null ;
18
+
19
+ private hoverCloseTimeout : number = null ;
18
20
19
21
private hoveredTooltip : HTMLCalciteTooltipElement = null ;
20
22
@@ -80,7 +82,7 @@ export default class TooltipManager {
80
82
81
83
if ( activeTooltip ?. open ) {
82
84
this . clearHoverTimeout ( ) ;
83
- this . closeExistingTooltip ( ) ;
85
+ this . closeActiveTooltip ( ) ;
84
86
85
87
const referenceElement = getEffectiveReferenceElement ( activeTooltip ) ;
86
88
@@ -111,9 +113,9 @@ export default class TooltipManager {
111
113
this . clickedTooltip = null ;
112
114
113
115
if ( tooltip ) {
114
- this . toggleHoveredTooltip ( tooltip , true ) ;
116
+ this . openHoveredTooltip ( tooltip ) ;
115
117
} else if ( activeTooltip ) {
116
- this . toggleHoveredTooltip ( activeTooltip , false ) ;
118
+ this . closeHoveredTooltip ( ) ;
117
119
}
118
120
} ;
119
121
@@ -166,61 +168,83 @@ export default class TooltipManager {
166
168
document . removeEventListener ( "focusout" , this . focusOutHandler , { capture : true } ) ;
167
169
}
168
170
171
+ private clearHoverOpenTimeout ( ) : void {
172
+ window . clearTimeout ( this . hoverOpenTimeout ) ;
173
+ this . hoverOpenTimeout = null ;
174
+ }
175
+
176
+ private clearHoverCloseTimeout ( ) : void {
177
+ window . clearTimeout ( this . hoverCloseTimeout ) ;
178
+ this . hoverCloseTimeout = null ;
179
+ }
180
+
169
181
private clearHoverTimeout ( ) : void {
170
- window . clearTimeout ( this . hoverTimeout ) ;
171
- this . hoverTimeout = null ;
182
+ this . clearHoverOpenTimeout ( ) ;
183
+ this . clearHoverCloseTimeout ( ) ;
172
184
}
173
185
174
- private closeExistingTooltip ( ) : void {
186
+ private closeActiveTooltip ( ) : void {
175
187
const { activeTooltip } = this ;
176
188
177
189
if ( activeTooltip ?. open ) {
178
190
this . toggleTooltip ( activeTooltip , false ) ;
179
191
}
180
192
}
181
193
182
- private toggleFocusedTooltip ( tooltip : HTMLCalciteTooltipElement , value : boolean ) : void {
183
- this . closeExistingTooltip ( ) ;
194
+ private toggleFocusedTooltip ( tooltip : HTMLCalciteTooltipElement , open : boolean ) : void {
195
+ this . closeActiveTooltip ( ) ;
184
196
185
- if ( value ) {
197
+ if ( open ) {
186
198
this . clearHoverTimeout ( ) ;
187
199
}
188
200
189
- this . toggleTooltip ( tooltip , value ) ;
201
+ this . toggleTooltip ( tooltip , open ) ;
190
202
}
191
203
192
- private toggleTooltip ( tooltip : HTMLCalciteTooltipElement , value : boolean ) : void {
193
- tooltip . open = value ;
204
+ private toggleTooltip ( tooltip : HTMLCalciteTooltipElement , open : boolean ) : void {
205
+ tooltip . open = open ;
194
206
195
- if ( value ) {
196
- this . activeTooltip = tooltip ;
197
- }
207
+ this . activeTooltip = open ? tooltip : null ;
198
208
}
199
209
200
- private toggleHoveredTooltip = ( tooltip : HTMLCalciteTooltipElement , value : boolean ) : void => {
201
- this . hoverTimeout = window . setTimeout ( ( ) => {
202
- if ( this . hoverTimeout === null ) {
203
- return ;
204
- }
210
+ private openHoveredTooltip = ( tooltip : HTMLCalciteTooltipElement ) : void => {
211
+ this . hoverOpenTimeout = window . setTimeout (
212
+ ( ) => {
213
+ if ( this . hoverOpenTimeout === null ) {
214
+ return ;
215
+ }
216
+
217
+ this . clearHoverCloseTimeout ( ) ;
218
+ this . closeActiveTooltip ( ) ;
205
219
206
- this . closeExistingTooltip ( ) ;
220
+ if ( tooltip !== this . hoveredTooltip ) {
221
+ return ;
222
+ }
223
+
224
+ this . toggleTooltip ( tooltip , true ) ;
225
+ } ,
226
+ this . activeTooltip ? 0 : TOOLTIP_OPEN_DELAY_MS
227
+ ) ;
228
+ } ;
207
229
208
- if ( tooltip !== this . hoveredTooltip ) {
230
+ private closeHoveredTooltip = ( ) : void => {
231
+ this . hoverCloseTimeout = window . setTimeout ( ( ) => {
232
+ if ( this . hoverCloseTimeout === null ) {
209
233
return ;
210
234
}
211
235
212
- this . toggleTooltip ( tooltip , value ) ;
213
- } , TOOLTIP_DELAY_MS ) ;
236
+ this . closeActiveTooltip ( ) ;
237
+ } , TOOLTIP_CLOSE_DELAY_MS ) ;
214
238
} ;
215
239
216
- private queryFocusedTooltip ( event : FocusEvent , value : boolean ) : void {
240
+ private queryFocusedTooltip ( event : FocusEvent , open : boolean ) : void {
217
241
const tooltip = this . queryTooltip ( event . composedPath ( ) ) ;
218
242
219
243
if ( ! tooltip || this . isClosableClickedTooltip ( tooltip ) ) {
220
244
return ;
221
245
}
222
246
223
- this . toggleFocusedTooltip ( tooltip , value ) ;
247
+ this . toggleFocusedTooltip ( tooltip , open ) ;
224
248
}
225
249
226
250
private isClosableClickedTooltip ( tooltip : HTMLCalciteTooltipElement ) : boolean {
0 commit comments