empower_front/src/components/customUI/Modal.vue

67 lines
1.5 KiB
Vue

<script setup>
import { twMerge } from "tailwind-merge";
import { defineProps } from "vue";
const props = defineProps({
id: String,
title: String,
onCancel: Function,
modalClass: String,
width: Number || String,
draggable: { type: Boolean, default: false },
backdrop: { type: Boolean, default: true },
modalStyle: { type: Object, default: () => ({}) },
});
</script>
<template>
<dialog
:id="id"
:class="
twMerge(
'modal',
backdrop ? '' : 'focus-visible:outline-none backdrop:bg-transparent'
)
"
:style="modalStyle"
v-draggable="
draggable ? { handle: '[data-drag-handle]', target: '.modal-box' } : false
"
>
<div
:class="
twMerge(
'modal-box static rounded-md border border-info py-5 px-6 overflow-y-auto bg-normal',
modalClass
)
"
:style="{ maxWidth: isNaN(width) ? width : `${width}px` }"
>
<!-- 把手:只在這裡按下才可拖動 -->
<div class="text-2xl font-bold select-none" data-drag-handle>
<slot name="modalTitle">{{ title }}</slot>
</div>
<div class="min-h-[200px]">
<slot name="modalContent"></slot>
</div>
<div class="modal-action relative">
<slot name="modalAction"></slot>
</div>
</div>
<form v-if="backdrop" method="dialog" class="modal-backdrop">
<button
@click="
() => {
onCancel && onCancel();
}
"
>
close
</button>
</form>
</dialog>
</template>