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;