diff --git a/src/components/modal/Modal.vue b/src/components/modal/Modal.vue index 7fe14f430fe8973400b50f907bd663c2739391ef..06b5186574dd0099c5a8b8bcdba99af1948c03f4 100644 --- a/src/components/modal/Modal.vue +++ b/src/components/modal/Modal.vue @@ -1,6 +1,24 @@ <script setup lang="ts"> +import { useScroll, useResizeObserver } from '@vueuse/core' +import { ref } from 'vue' + const title = defineProp<string>('title', { required: true }) const open = defineModel<boolean>({ required: true }) + +const content = ref<HTMLDivElement>() +const { arrivedState } = useScroll(content) + +const scrollable = ref(false) +useResizeObserver(content, () => { + const div = content.value + if (!div) return + + if (div.scrollHeight > div.clientHeight) { + scrollable.value = true + } else { + scrollable.value = false + } +}) </script> <template> @@ -13,7 +31,7 @@ const open = defineModel<boolean>({ required: true }) <FwButton icon="bi:x-lg" color="secondary" variant="ghost" @click="open = false" /> </h2> - <div class="modal-content"> + <div class="modal-content" ref="content" :class="[arrivedState, { scrollable }]"> <Transition> <div v-if="$slots.alert" class="alert-container"> <div> diff --git a/src/components/modal/style.scss b/src/components/modal/style.scss index 9f522f12a9dae961aba47d59c433cbc941fe09c3..64246577c9d6dce737118009d7ee8b1468c28e02 100644 --- a/src/components/modal/style.scss +++ b/src/components/modal/style.scss @@ -30,6 +30,19 @@ padding: 1rem 2rem; overflow: auto; position: relative; + background: var(--fw-beige-100); + + &.scrollable { + &:not(.top), + &:not(.bottom) + * { + border-top: 1px solid var(--fw-gray-300); + } + + &:not(.top) > .alert-container { + margin-top: calc(-1rem - 1px); + top: calc(-1rem - 1px); + } + } > .alert-container { position: sticky;