BaseModal.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <template>
  2. <div
  3. v-if="show"
  4. class="relative z-10"
  5. aria-labelledby="modal-title"
  6. role="dialog"
  7. aria-modal="true"
  8. @keypress.esc="close()"
  9. @click="
  10. (event) => {
  11. if (event.target == $refs.modal) close();
  12. }
  13. "
  14. >
  15. <div
  16. class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity cursor-pointer"
  17. />
  18. <div class="fixed inset-0 z-10 overflow-y-auto">
  19. <div
  20. ref="modal"
  21. class="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0"
  22. >
  23. <div
  24. class="relative transform overflow-hidden rounded-lg bg-white dark:bg-gray-800 text-left shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-lg"
  25. data-name="modal"
  26. >
  27. <div class="bg-white dark:bg-gray-800 px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
  28. <button
  29. title="Schliessen"
  30. class="close-button"
  31. @click="close()"
  32. >
  33. <font-awesome-icon icon="fa-solid fa-xmark" />
  34. </button>
  35. <div class="mt-3 sm:mt-0 sm:ml-4 sm:text-left">
  36. <slot />
  37. </div>
  38. </div>
  39. </div>
  40. </div>
  41. </div>
  42. </div>
  43. </template>
  44. <script lang="ts">
  45. export default {
  46. name: "BaseModal",
  47. props: {
  48. show: {
  49. type: Boolean,
  50. required: true,
  51. },
  52. },
  53. emits: ["close"],
  54. methods: {
  55. close() {
  56. this.$emit("close");
  57. },
  58. },
  59. };
  60. </script>
  61. <style scoped>
  62. .close-button {
  63. @apply absolute
  64. right-1
  65. top-0
  66. m-4
  67. cursor-pointer
  68. hover:bg-gray-200
  69. active:bg-gray-300
  70. dark:hover:bg-gray-600
  71. dark:active:bg-gray-700
  72. aspect-square
  73. w-7
  74. rounded;
  75. }
  76. </style>