71 lines
1.6 KiB
Vue
Raw Normal View History

<template>
<transition name="fade">
<div v-if="show" class="modal is-active">
<div class="modal-background" @click="$emit('close')" />
<div class="modal-content">
<div class="card">
<div class="card-content">
2025-02-08 14:35:25 +01:00
<p v-if="title" class="title is-4" v-text="title" />
2025-02-09 08:05:03 +01:00
<slot name="content" />
</div>
2025-02-09 08:05:03 +01:00
<footer v-if="actions.length" class="card-footer">
2025-02-08 14:35:25 +01:00
<a
v-for="action in actions"
2025-02-09 17:52:45 +01:00
:key="action.label"
2025-02-08 14:35:25 +01:00
class="card-footer-item"
:class="{ 'is-disabled': action.disabled }"
2025-02-09 08:05:03 +01:00
@click="action.handler"
2025-02-08 14:35:25 +01:00
>
<mdicon class="icon" :name="action.icon" size="16" />
<span class="is-size-7" v-text="action.label" />
</a>
</footer>
</div>
</div>
</div>
</transition>
</template>
<script>
export default {
2025-02-09 08:05:03 +01:00
name: 'ModalDialog',
2024-02-27 17:18:58 +01:00
props: {
2025-02-09 08:05:03 +01:00
actions: { type: Array, required: true },
2025-02-08 14:35:25 +01:00
show: Boolean,
2025-02-09 08:05:03 +01:00
title: { type: String, default: '' }
2024-02-27 17:18:58 +01:00
},
emits: ['close'],
watch: {
show(value) {
const { classList } = document.querySelector('html')
if (value) {
classList.add('is-clipped')
} else {
classList.remove('is-clipped')
}
}
}
}
</script>
<style scoped>
.fade-leave-active {
transition: opacity 0.2s ease;
}
.fade-enter-active {
transition: opacity 0.5s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
.fade-enter-to,
.fade-leave-from {
opacity: 1;
}
2025-02-09 08:05:03 +01:00
.card-content {
max-height: calc(100vh - calc(4 * var(--bulma-navbar-height)));
overflow: auto;
}
</style>