@@ -18,10 +18,16 @@ import { getDefaultConfig, getAllParentThemes } from '../config'
18
18
19
19
export type ComputePositionConfig = Parameters < typeof computePosition > [ 2 ]
20
20
21
- const shownPoppers = [ ]
21
+ interface PopperEvent extends Event {
22
+ usedByTooltip ?: boolean
23
+ closeAllPopover ?: boolean
24
+ closePopover ?: boolean
25
+ }
26
+
27
+ const shownPoppers : PopperInstance [ ] = [ ]
22
28
let hidingPopper = null
23
29
24
- const shownPoppersByTheme : Record < string , any [ ] > = { }
30
+ const shownPoppersByTheme : Record < string , PopperInstance [ ] > = { }
25
31
function getShownPoppersByTheme ( theme : string ) {
26
32
let list = shownPoppersByTheme [ theme ]
27
33
if ( ! list ) {
@@ -43,7 +49,7 @@ function defaultPropFactory (prop: string) {
43
49
44
50
const PROVIDE_KEY = '__floating-vue__popper'
45
51
46
- export default ( ) => defineComponent ( {
52
+ const createPopper = ( ) => defineComponent ( {
47
53
name : 'VPopper' ,
48
54
49
55
provide ( ) {
@@ -308,8 +314,12 @@ export default () => defineComponent({
308
314
} ,
309
315
transformOrigin : null ,
310
316
} ,
317
+ randomId : `popper_${ [ Math . random ( ) , Date . now ( ) ] . map ( n => n . toString ( 36 ) . substring ( 2 , 10 ) ) . join ( '_' ) } ` ,
311
318
shownChildren : new Set ( ) ,
312
319
lastAutoHide : true ,
320
+ $_pendingHide : false ,
321
+ $_containsGlobalTarget : false ,
322
+ $_isDisposed : false ,
313
323
}
314
324
} ,
315
325
@@ -397,7 +407,6 @@ export default () => defineComponent({
397
407
398
408
created ( ) {
399
409
this . $_isDisposed = true
400
- this . randomId = `popper_${ [ Math . random ( ) , Date . now ( ) ] . map ( n => n . toString ( 36 ) . substring ( 2 , 10 ) ) . join ( '_' ) } `
401
410
if ( this . autoMinSize ) {
402
411
console . warn ( '[floating-vue] `autoMinSize` option is deprecated. Use `autoSize="min"` instead.' )
403
412
}
@@ -662,7 +671,7 @@ export default () => defineComponent({
662
671
} )
663
672
} ,
664
673
665
- $_scheduleShow ( event = null , skipDelay = false ) {
674
+ $_scheduleShow ( _event , skipDelay = false ) {
666
675
this . $_updateParentShownChildren ( true )
667
676
this . $_hideInProgress = false
668
677
clearTimeout ( this . $_scheduleTimer )
@@ -680,7 +689,7 @@ export default () => defineComponent({
680
689
}
681
690
} ,
682
691
683
- $_scheduleHide ( event = null , skipDelay = false ) {
692
+ $_scheduleHide ( _event , skipDelay = false ) {
684
693
if ( this . shownChildren . size > 0 ) {
685
694
this . $_pendingHide = true
686
695
return
@@ -701,7 +710,7 @@ export default () => defineComponent({
701
710
}
702
711
} ,
703
712
704
- $_computeDelay ( type ) {
713
+ $_computeDelay ( type : 'show' | 'hide' ) {
705
714
const delay = this . delay
706
715
return parseInt ( ( delay && delay [ type ] ) || delay || 0 )
707
716
} ,
@@ -878,7 +887,7 @@ export default () => defineComponent({
878
887
$_addEventListeners ( ) {
879
888
// Add trigger show events
880
889
881
- const handleShow = event => {
890
+ const handleShow = ( event : PopperEvent ) => {
882
891
if ( this . isShown && ! this . $_hideInProgress ) {
883
892
return
884
893
}
@@ -892,7 +901,7 @@ export default () => defineComponent({
892
901
893
902
// Add trigger hide events
894
903
895
- const handleHide = event => {
904
+ const handleHide = ( event : PopperEvent ) => {
896
905
if ( event . usedByTooltip ) {
897
906
return
898
907
}
@@ -903,7 +912,7 @@ export default () => defineComponent({
903
912
this . $_registerTriggerListeners ( [ this . $_popperNode ] , HIDE_EVENT_MAP , this . popperTriggers , this . popperHideTriggers , handleHide )
904
913
} ,
905
914
906
- $_registerEventListeners ( targetNodes : any [ ] , eventType : string , handler : ( event : Event ) => void ) {
915
+ $_registerEventListeners ( targetNodes : Element [ ] , eventType : string , handler : ( event : Event ) => void ) {
907
916
this . $_events . push ( { targetNodes, eventType, handler } )
908
917
targetNodes . forEach ( node => node . addEventListener ( eventType , handler , supportsPassive
909
918
? {
@@ -912,7 +921,7 @@ export default () => defineComponent({
912
921
: undefined ) )
913
922
} ,
914
923
915
- $_registerTriggerListeners ( targetNodes : any [ ] , eventMap : Record < string , string > , commonTriggers , customTrigger , handler : ( event : Event ) => void ) {
924
+ $_registerTriggerListeners ( targetNodes : Element [ ] , eventMap : Record < string , string > , commonTriggers , customTrigger , handler : ( event : Event ) => void ) {
916
925
let triggers = commonTriggers
917
926
918
927
if ( customTrigger != null ) {
@@ -1030,6 +1039,10 @@ export default () => defineComponent({
1030
1039
}
1031
1040
return false
1032
1041
} ,
1042
+
1043
+ $_mouseDownContains ( ) {
1044
+ // replaced by handleGlobalMousedown
1045
+ } ,
1033
1046
} ,
1034
1047
1035
1048
render ( ) {
@@ -1058,7 +1071,7 @@ if (typeof document !== 'undefined' && typeof window !== 'undefined') {
1058
1071
window . addEventListener ( 'resize' , computePositionAllShownPoppers )
1059
1072
}
1060
1073
1061
- function handleGlobalMousedown ( event ) {
1074
+ function handleGlobalMousedown ( event : PopperEvent ) {
1062
1075
for ( let i = 0 ; i < shownPoppers . length ; i ++ ) {
1063
1076
const popper = shownPoppers [ i ]
1064
1077
try {
@@ -1070,15 +1083,15 @@ function handleGlobalMousedown (event) {
1070
1083
}
1071
1084
}
1072
1085
1073
- function handleGlobalClick ( event ) {
1086
+ function handleGlobalClick ( event : PopperEvent ) {
1074
1087
handleGlobalClose ( event )
1075
1088
}
1076
1089
1077
- function handleGlobalTouchend ( event ) {
1090
+ function handleGlobalTouchend ( event : PopperEvent ) {
1078
1091
handleGlobalClose ( event , true )
1079
1092
}
1080
1093
1081
- function handleGlobalClose ( event , touch = false ) {
1094
+ function handleGlobalClose ( event : PopperEvent , touch = false ) {
1082
1095
const preventClose : Record < string , true > = { }
1083
1096
1084
1097
for ( let i = shownPoppers . length - 1 ; i >= 0 ; i -- ) {
@@ -1123,16 +1136,16 @@ function handleGlobalClose (event, touch = false) {
1123
1136
}
1124
1137
}
1125
1138
1126
- function isContainingEventTarget ( popper , event ) : boolean {
1139
+ function isContainingEventTarget ( popper : PopperInstance , event : Event ) : boolean {
1127
1140
const popperContent = popper . popperNode ( )
1128
1141
return popper . $_mouseDownContains || popperContent . contains ( event . target )
1129
1142
}
1130
1143
1131
- function shouldAutoHide ( popper , contains , event ) : boolean {
1144
+ function shouldAutoHide ( popper : PopperInstance , contains , event : PopperEvent ) : boolean {
1132
1145
return event . closeAllPopover || ( event . closePopover && contains ) || ( getAutoHideResult ( popper , event ) && ! contains )
1133
1146
}
1134
1147
1135
- function getAutoHideResult ( popper , event ) {
1148
+ function getAutoHideResult ( popper : PopperInstance , event : Event ) {
1136
1149
if ( typeof popper . autoHide === 'function' ) {
1137
1150
const result = popper . autoHide ( event )
1138
1151
popper . lastAutoHide = result
@@ -1141,10 +1154,10 @@ function getAutoHideResult (popper, event) {
1141
1154
return popper . autoHide
1142
1155
}
1143
1156
1144
- function computePositionAllShownPoppers ( event ) {
1157
+ function computePositionAllShownPoppers ( ) {
1145
1158
for ( let i = 0 ; i < shownPoppers . length ; i ++ ) {
1146
1159
const popper = shownPoppers [ i ]
1147
- popper . $_computePosition ( event )
1160
+ popper . $_computePosition ( )
1148
1161
}
1149
1162
}
1150
1163
@@ -1180,3 +1193,7 @@ function lineIntersectsLine (x1: number, y1: number, x2: number, y2: number, x3:
1180
1193
const uB = ( ( x2 - x1 ) * ( y1 - y3 ) - ( y2 - y1 ) * ( x1 - x3 ) ) / ( ( y4 - y3 ) * ( x2 - x1 ) - ( x4 - x3 ) * ( y2 - y1 ) )
1181
1194
return ( uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1 )
1182
1195
}
1196
+
1197
+ export default createPopper
1198
+
1199
+ export type PopperInstance = ReturnType < typeof createPopper > extends { new ( ) : infer T } ? T : never
0 commit comments