2
0
mirror of https://github.com/frappe/books.git synced 2025-02-10 16:08:35 +00:00
books/src/components/Modal.vue

96 lines
1.7 KiB
Vue
Raw Normal View History

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
"
: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
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">
import { shortcutsKey } from 'src/utils/injectionKeys';
import { defineComponent, inject } from 'vue';
2022-10-17 22:38:06 +05:30
export default defineComponent({
setup() {
return { shortcuts: inject(shortcutsKey) };
},
2022-03-11 15:00:57 +05:30
props: {
openModal: {
default: false,
type: Boolean,
},
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) {
this.shortcuts?.set(this.context, ['Escape'], () => {
this.$emit('closemodal');
});
2022-10-17 22:38:06 +05:30
} else {
this.shortcuts?.delete(this.context);
2022-10-17 22:38:06 +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>