@@ -4,15 +4,12 @@ import {
4
4
useEscapeKeydown ,
5
5
useForwardRef ,
6
6
} from '@oku-ui/use-composable'
7
- import type { OkuElement , PrimitiveProps } from '@oku-ui/primitive'
8
7
import { Primitive , primitiveProps } from '@oku-ui/primitive'
9
- import type { Ref } from 'vue'
10
8
import {
11
9
computed ,
12
10
defineComponent ,
13
11
h ,
14
12
mergeProps ,
15
- nextTick ,
16
13
onBeforeUnmount ,
17
14
onMounted ,
18
15
reactive ,
@@ -27,108 +24,11 @@ import {
27
24
useFocusoutSide ,
28
25
usePointerdownOutside ,
29
26
} from './util'
30
-
31
- export const dismissableLayerContext = reactive ( {
32
- layersRoot : new Set < DismissableLayerElement > ( ) ,
33
- layersWithOutsidePointerEventsDisabled : new Set < DismissableLayerElement > ( ) ,
34
- branches : new Set < DismissableLayerElement > ( ) ,
35
- } )
36
-
37
- export const INJECT_UPDATE = 'dismissableLayer.update'
38
- export const POINTER_DOWN_OUTSIDE = 'dismissableLayer.pointerDownOutside'
39
- export const FOCUS_OUTSIDE = 'dismissableLayer.focusOutside'
27
+ import type { DismissableLayerNativeElement , FocusBlurCaptureEvent , FocusCaptureEvent , PointerdownCaptureEvent } from './props'
28
+ import { DISMISSABLE_NAME , INJECT_UPDATE , dismissableLayerContext , dismissableLayerProps } from './props'
40
29
41
30
let originalBodyPointerEvents : string
42
31
43
- export const DISMISSABLE_NAME = 'OkuDismissableLayer'
44
- export const DismissableLayerProvideKey = Symbol ( 'DismissableLayerProvide' )
45
-
46
- export type DismissableLayerNativeElement = OkuElement < 'div' >
47
- export type DismissableLayerElement = HTMLDivElement
48
-
49
- export type DismissableLayerProvideValue = {
50
- layers : Ref < Set < DismissableLayerElement > >
51
- layersWithOutsidePointerEventsDisabled : Ref < Set < DismissableLayerElement > >
52
- branches : Ref < Set < DismissableLayerElement > >
53
- }
54
-
55
- export type PointerdownOutsideEvent = CustomEvent < {
56
- originalEvent : PointerEvent
57
- } >
58
- export type FocusoutSideEvent = CustomEvent < { originalEvent : FocusEvent } >
59
- export type FocusCaptureEvent = CustomEvent < { originalEvent : FocusEvent } >
60
- export type FocusBlurCaptureEvent = CustomEvent < { originalEvent : FocusEvent } >
61
- export type PointerdownCaptureEvent = CustomEvent < {
62
- originalEvent : PointerEvent
63
- } >
64
-
65
- export interface DismissableLayerProps extends PrimitiveProps {
66
- /**
67
- * When `true`, hover/focus/click interactions will be disabled on elements outside
68
- * the `DismissableLayer`. Users will need to click twice on outside elements to
69
- * interact with them: once to close the `DismissableLayer`, and again to trigger the element.
70
- */
71
- disableOutsidePointerEvents ?: boolean
72
- }
73
-
74
- export type DismissableLayerEmits = {
75
- /**
76
- * Event handler called when the escape key is down.
77
- * Can be prevented.
78
- */
79
- escapeKeyDown : [ event : KeyboardEvent ]
80
- /**
81
- * Event handler called when the a `pointerdown` event happens outside of the `DismissableLayer`.
82
- * Can be prevented.
83
- */
84
- pointerdownOutside : [ event : PointerdownOutsideEvent ]
85
- /**
86
- * Event handler called when the focus moves outside of the `DismissableLayer`.
87
- * Can be prevented.
88
- */
89
- focusoutSide : [ event : FocusoutSideEvent ]
90
- /**
91
- * Event handler called when an interaction happens outside the `DismissableLayer`.
92
- * Specifically, when a `pointerdown` event happens outside or focus moves outside of it.
93
- * Can be prevented.
94
- */
95
- interactOutside : [ event : PointerdownOutsideEvent | FocusoutSideEvent ]
96
- /**
97
- * Handler called when the `DismissableLayer` should be dismissed
98
- */
99
- dismiss : [ ]
100
- focusCapture : [ event : FocusCaptureEvent ]
101
- blurCapture : [ event : FocusBlurCaptureEvent ]
102
- pointerdownCapture : [ event : PointerdownCaptureEvent ]
103
- }
104
-
105
- export const dismissableLayerProps = {
106
- props : {
107
- disableOutsidePointerEvents : {
108
- type : Boolean ,
109
- default : false ,
110
- } ,
111
- } ,
112
-
113
- emits : {
114
- // eslint-disable-next-line unused-imports/no-unused-vars
115
- escapeKeyDown : ( event : KeyboardEvent ) => true ,
116
- // eslint-disable-next-line unused-imports/no-unused-vars
117
- pointerdownOutside : ( event : PointerdownOutsideEvent ) => true ,
118
- // eslint-disable-next-line unused-imports/no-unused-vars
119
- focusoutSide : ( event : FocusoutSideEvent ) => true ,
120
- // eslint-disable-next-line unused-imports/no-unused-vars
121
- interactOutside : ( event : PointerdownOutsideEvent | FocusoutSideEvent ) => true ,
122
- dismiss : ( ) => true ,
123
- // eslint-disable-next-line unused-imports/no-unused-vars
124
- focusCapture : ( event : FocusCaptureEvent ) => true ,
125
- // eslint-disable-next-line unused-imports/no-unused-vars
126
- blurCapture : ( event : FocusBlurCaptureEvent ) => true ,
127
- // eslint-disable-next-line unused-imports/no-unused-vars
128
- pointerdownCapture : ( event : PointerdownCaptureEvent ) => true ,
129
- } ,
130
- }
131
-
132
32
const DismissableLayer = defineComponent ( {
133
33
name : DISMISSABLE_NAME ,
134
34
inheritAttrs : false ,
@@ -188,7 +88,7 @@ const DismissableLayer = defineComponent({
188
88
189
89
if ( ! event . defaultPrevented )
190
90
emit ( 'dismiss' )
191
- } , ownerDocument . value )
91
+ } , ownerDocument )
192
92
193
93
const focusoutSide = useFocusoutSide ( ( event ) => {
194
94
const target = event . target as HTMLElement
@@ -204,7 +104,7 @@ const DismissableLayer = defineComponent({
204
104
205
105
if ( ! event . defaultPrevented )
206
106
emit ( 'dismiss' )
207
- } , ownerDocument . value )
107
+ } , ownerDocument )
208
108
209
109
useEscapeKeydown ( ( event ) => {
210
110
const isHighestLayer = index . value === dismissableLayerContext . layersRoot . size - 1
@@ -214,9 +114,9 @@ const DismissableLayer = defineComponent({
214
114
215
115
emit ( 'escapeKeyDown' , event )
216
116
217
- if ( ! event . defaultPrevented && props . onDismiss )
117
+ if ( ! event . defaultPrevented )
218
118
emit ( 'dismiss' )
219
- } , ownerDocument . value )
119
+ } , ownerDocument )
220
120
221
121
watchEffect ( async ( onInvalidate ) => {
222
122
if ( ! node . value )
@@ -228,7 +128,6 @@ const DismissableLayer = defineComponent({
228
128
= ownerDocument . value . body . style . pointerEvents
229
129
ownerDocument . value . body . style . pointerEvents = 'none'
230
130
}
231
- await nextTick ( )
232
131
dismissableLayerContext . layersWithOutsidePointerEventsDisabled . add ( node . value )
233
132
}
234
133
0 commit comments