@@ -223,6 +223,8 @@ export class GlPopover extends GlElement {
223
223
document . removeEventListener ( 'focusin' , this . handlePopupBlur ) ;
224
224
window . removeEventListener ( 'webview-blur' , this . handleWebviewBlur , false ) ;
225
225
document . removeEventListener ( 'keydown' , this . handleDocumentKeyDown ) ;
226
+ document . removeEventListener ( 'mousedown' , this . handleWebviewMouseDown ) ;
227
+ super . disconnectedCallback ( ) ;
226
228
}
227
229
228
230
override firstUpdated ( ) {
@@ -235,6 +237,64 @@ export class GlPopover extends GlElement {
235
237
}
236
238
}
237
239
240
+ override render ( ) {
241
+ return html `< sl-popup
242
+ part ="base "
243
+ exportparts ="
244
+ popup:base__popup,
245
+ arrow:base__arrow
246
+ "
247
+ class ="popover "
248
+ .anchor =${ this . anchor }
249
+ placement =${ this . placement }
250
+ distance=${ this . distance }
251
+ skidding=${ this . skidding }
252
+ strategy=${ this . hoist ? 'fixed' : 'absolute' }
253
+ auto-size="horizontal"
254
+ auto-size-padding="3"
255
+ flip-padding="3"
256
+ flip
257
+ shift
258
+ ?arrow=${ this . arrow }
259
+ hover-bridge
260
+ >
261
+ < div slot ="anchor " aria-describedby ="popover ">
262
+ < slot name ="anchor "> </ slot >
263
+ </ div >
264
+
265
+ < div
266
+ part ="body "
267
+ id ="popover "
268
+ class ="popover__body "
269
+ role ="tooltip "
270
+ aria-live =${ this . open ? 'polite' : 'off' }
271
+ >
272
+ < slot name ="content "> </ slot >
273
+ </ div >
274
+ </ sl-popup > ` ;
275
+ }
276
+
277
+ private _triggeredBy : TriggerType | undefined ;
278
+ /** Shows the popover. */
279
+ async show ( triggeredBy ?: TriggerType ) {
280
+ if ( this . _triggeredBy == null || triggeredBy !== 'hover' ) {
281
+ this . _triggeredBy = triggeredBy ;
282
+ }
283
+ if ( this . open ) return undefined ;
284
+
285
+ this . open = true ;
286
+ return waitForEvent ( this , 'gl-popover-after-show' ) ;
287
+ }
288
+
289
+ /** Hides the popover */
290
+ async hide ( ) {
291
+ this . _triggeredBy = undefined ;
292
+ if ( ! this . open ) return undefined ;
293
+
294
+ this . open = false ;
295
+ return waitForEvent ( this , 'gl-popover-after-hide' ) ;
296
+ }
297
+
238
298
private handleTriggerBlur = ( e : FocusEvent ) => {
239
299
if ( this . open && this . hasTrigger ( 'focus' ) ) {
240
300
if ( e . relatedTarget && this . contains ( e . relatedTarget as Node ) ) return ;
@@ -243,14 +303,17 @@ export class GlPopover extends GlElement {
243
303
}
244
304
} ;
245
305
246
- private handleTriggerClick = ( ) => {
306
+ private handleTriggerClick = ( e : MouseEvent ) => {
247
307
if ( this . hasTrigger ( 'click' ) ) {
248
308
if ( this . open && this . _triggeredBy !== 'hover' ) {
249
309
if ( this . _skipHideOnClick ) {
250
310
this . _skipHideOnClick = false ;
251
311
return ;
252
312
}
253
313
314
+ const composedPath = e . composedPath ( ) ;
315
+ if ( composedPath . includes ( this . body ) ) return ;
316
+
254
317
void this . hide ( ) ;
255
318
} else {
256
319
void this . show ( 'click' ) ;
@@ -287,7 +350,7 @@ export class GlPopover extends GlElement {
287
350
288
351
private handlePopupBlur = ( e : FocusEvent ) => {
289
352
const composedPath = e . composedPath ( ) ;
290
- if ( ! composedPath . includes ( this ) ) {
353
+ if ( ! composedPath . includes ( this ) && ! composedPath . includes ( this . body ) ) {
291
354
void this . hide ( ) ;
292
355
}
293
356
} ;
@@ -298,7 +361,7 @@ export class GlPopover extends GlElement {
298
361
299
362
private handleWebviewMouseDown = ( e : MouseEvent ) => {
300
363
const composedPath = e . composedPath ( ) ;
301
- if ( ! composedPath . includes ( this ) ) {
364
+ if ( ! composedPath . includes ( this ) && ! composedPath . includes ( this . body ) ) {
302
365
void this . hide ( ) ;
303
366
}
304
367
} ;
@@ -394,62 +457,4 @@ export class GlPopover extends GlElement {
394
457
void this . hide ( ) ;
395
458
}
396
459
}
397
-
398
- private _triggeredBy : TriggerType | undefined ;
399
- /** Shows the popover. */
400
- async show ( triggeredBy ?: TriggerType ) {
401
- if ( this . _triggeredBy == null || triggeredBy !== 'hover' ) {
402
- this . _triggeredBy = triggeredBy ;
403
- }
404
- if ( this . open ) return undefined ;
405
-
406
- this . open = true ;
407
- return waitForEvent ( this , 'gl-popover-after-show' ) ;
408
- }
409
-
410
- /** Hides the popover */
411
- async hide ( ) {
412
- this . _triggeredBy = undefined ;
413
- if ( ! this . open ) return undefined ;
414
-
415
- this . open = false ;
416
- return waitForEvent ( this , 'gl-popover-after-hide' ) ;
417
- }
418
-
419
- override render ( ) {
420
- return html `< sl-popup
421
- part ="base "
422
- exportparts ="
423
- popup:base__popup,
424
- arrow:base__arrow
425
- "
426
- class ="popover "
427
- .anchor =${ this . anchor }
428
- placement =${ this . placement }
429
- distance=${ this . distance }
430
- skidding=${ this . skidding }
431
- strategy=${ this . hoist ? 'fixed' : 'absolute' }
432
- auto-size="horizontal"
433
- auto-size-padding="3"
434
- flip-padding="3"
435
- flip
436
- shift
437
- ?arrow=${ this . arrow }
438
- hover-bridge
439
- >
440
- < div slot ="anchor " aria-describedby ="popover ">
441
- < slot name ="anchor "> </ slot >
442
- </ div >
443
-
444
- < div
445
- part ="body "
446
- id ="popover "
447
- class ="popover__body "
448
- role ="tooltip "
449
- aria-live =${ this . open ? 'polite' : 'off' }
450
- >
451
- < slot name ="content "> </ slot >
452
- </ div >
453
- </ sl-popup > ` ;
454
- }
455
460
}
0 commit comments