2022-03-11 15:00:57 +05:30
|
|
|
<template>
|
2022-11-08 14:49:28 +05:30
|
|
|
<Transition>
|
2022-05-30 14:30:27 +05:30
|
|
|
<div
|
2022-11-08 14:49:28 +05:30
|
|
|
class="
|
|
|
|
fixed
|
|
|
|
top-0
|
2023-01-17 18:30:26 +02:00
|
|
|
start-0
|
2022-11-08 14:49:28 +05:30
|
|
|
w-screen
|
|
|
|
h-screen
|
|
|
|
z-20
|
|
|
|
flex
|
|
|
|
justify-center
|
|
|
|
items-center
|
|
|
|
"
|
2023-02-15 10:16:00 +05:30
|
|
|
:style="
|
|
|
|
useBackdrop
|
|
|
|
? 'background: rgba(0, 0, 0, 0.1); backdrop-filter: blur(2px)'
|
|
|
|
: ''
|
|
|
|
"
|
2022-11-08 14:49:28 +05:30
|
|
|
@click="$emit('closemodal')"
|
|
|
|
v-if="openModal"
|
2022-05-30 14:30:27 +05:30
|
|
|
>
|
2022-11-08 14:49:28 +05:30
|
|
|
<div
|
2023-01-30 16:20:40 +05:30
|
|
|
class="bg-white rounded-lg shadow-2xl border overflow-hidden inner"
|
2022-11-08 14:49:28 +05:30
|
|
|
v-bind="$attrs"
|
|
|
|
@click.stop
|
|
|
|
>
|
|
|
|
<slot></slot>
|
|
|
|
</div>
|
2022-03-11 15:00:57 +05:30
|
|
|
</div>
|
2022-11-08 14:49:28 +05:30
|
|
|
</Transition>
|
2022-03-11 15:00:57 +05:30
|
|
|
</template>
|
|
|
|
|
2022-10-17 22:38:06 +05:30
|
|
|
<script lang="ts">
|
2023-03-23 14:28:15 +05:30
|
|
|
import { shortcutsKey } from 'src/utils/injectionKeys';
|
|
|
|
import { defineComponent, inject } from 'vue';
|
2022-10-17 22:38:06 +05:30
|
|
|
|
|
|
|
export default defineComponent({
|
2023-03-23 14:28:15 +05:30
|
|
|
setup() {
|
|
|
|
return { shortcuts: inject(shortcutsKey) };
|
|
|
|
},
|
2022-03-11 15:00:57 +05:30
|
|
|
props: {
|
|
|
|
openModal: {
|
|
|
|
default: false,
|
|
|
|
type: Boolean,
|
|
|
|
},
|
2023-02-15 10:16:00 +05:30
|
|
|
useBackdrop: {
|
|
|
|
default: true,
|
|
|
|
type: Boolean,
|
|
|
|
},
|
2022-03-11 15:00:57 +05:30
|
|
|
},
|
2022-05-30 14:30:27 +05:30
|
|
|
emits: ['closemodal'],
|
2022-10-17 22:38:06 +05:30
|
|
|
watch: {
|
|
|
|
openModal(value: boolean) {
|
|
|
|
if (value) {
|
2023-03-23 14:28:15 +05:30
|
|
|
this.shortcuts?.set(this.context, ['Escape'], () => {
|
|
|
|
this.$emit('closemodal');
|
|
|
|
});
|
2022-10-17 22:38:06 +05:30
|
|
|
} else {
|
2023-03-23 14:28:15 +05:30
|
|
|
this.shortcuts?.delete(this.context);
|
2022-10-17 22:38:06 +05:30
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
2023-03-23 14:28:15 +05:30
|
|
|
computed: {
|
|
|
|
context(): string {
|
|
|
|
return `Modal-` + Math.random().toString(36).slice(2, 6);
|
2022-10-17 22:38:06 +05:30
|
|
|
},
|
|
|
|
},
|
|
|
|
});
|
2022-03-11 15:00:57 +05:30
|
|
|
</script>
|
2022-11-08 14:49:28 +05:30
|
|
|
<style scoped>
|
|
|
|
.v-enter-active,
|
|
|
|
.v-leave-active {
|
|
|
|
transition: all 100ms ease-out;
|
|
|
|
}
|
|
|
|
|
|
|
|
.inner {
|
|
|
|
transition: all 150ms ease-out;
|
|
|
|
}
|
|
|
|
|
|
|
|
.v-enter-from,
|
|
|
|
.v-leave-to {
|
|
|
|
opacity: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.v-enter-from .inner,
|
|
|
|
.v-leave-to .inner {
|
|
|
|
transform: translateY(-50px);
|
|
|
|
}
|
|
|
|
|
|
|
|
.v-enter-to .inner,
|
|
|
|
.v-leave-from .inner {
|
|
|
|
transform: translateY(0px);
|
|
|
|
}
|
|
|
|
</style>
|