-
-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathModal.vue
121 lines (115 loc) · 3.99 KB
/
Modal.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<script setup>
import { DialogOverlay, DialogPortal, DialogRoot } from 'radix-vue'
import ModalContent from './ModalContent.vue'
import HeadlessModal from './HeadlessModal.vue'
import SlideoverContent from './SlideoverContent.vue'
import { ref } from 'vue'
const modal = ref(null)
const rendered = ref(false)
defineExpose({
afterLeave: () => modal.value?.afterLeave(),
close: () => modal.value?.close(),
emit: (...args) => modal.value?.emit(...args),
getChildModal: () => modal.value?.getChildModal(),
getParentModal: () => modal.value?.getParentModal(),
reload: (...args) => modal.value?.reload(...args),
setOpen: (...args) => modal.value?.setOpen(...args),
get config() {
return modal.value?.config
},
get id() {
return modal.value?.id
},
get index() {
return modal.value?.index
},
get isOpen() {
return modal.value?.isOpen
},
get modalContext() {
return modal.value?.modalContext
},
get onTopOfStack() {
return modal.value?.onTopOfStack
},
get shouldRender() {
return modal.value?.shouldRender
},
})
</script>
<template>
<HeadlessModal
ref="modal"
v-slot="{
afterLeave,
close,
config,
emit,
getChildModal,
getParentModal,
id,
index,
isOpen,
modalContext,
onTopOfStack,
reload,
setOpen,
shouldRender,
}"
>
<DialogRoot
:open="isOpen"
@update:open="setOpen"
>
<DialogPortal>
<div
:data-inertiaui-modal-id="id"
:data-inertiaui-modal-index="index"
class="im-dialog relative z-20"
>
<Transition
v-if="index === 0 && onTopOfStack"
:appear="!rendered"
enter-active-class="transition transform ease-in-out duration-300"
enter-from-class="opacity-0"
enter-to-class="opacity-100"
leave-active-class="transition transform ease-in-out duration-300"
leave-from-class="opacity-100"
leave-to-class="opacity-0"
@after-appear="rendered = true"
>
<DialogOverlay class="im-backdrop fixed inset-0 z-30 bg-black/75" />
</Transition>
<!-- On multiple modals, only show a backdrop for the modal that is on top of the stack -->
<div
v-if="index > 0 && onTopOfStack"
class="im-backdrop fixed inset-0 z-30 bg-black/75"
/>
<!-- The modal/slideover content itself -->
<component
:is="config?.slideover ? SlideoverContent : ModalContent"
:modal-context="modalContext"
:config="config"
>
<slot
:id="id"
:after-leave="afterLeave"
:close="close"
:config="config"
:emit="emit"
:get-child-modal="getChildModal"
:get-parent-modal="getParentModal"
:index="index"
:is-open="isOpen"
:modal-context="modalContext"
:on-top-of-stack="onTopOfStack"
:reload="reload"
:set-open="setOpen"
:should-render="shouldRender"
/>
</component>
</div>
</DialogPortal>
</DialogRoot>
</HeadlessModal>
</template>