diff --git a/app/components/malio/drawer/Drawer.test.ts b/app/components/malio/drawer/Drawer.test.ts
index 5be7684..db9d6df 100644
--- a/app/components/malio/drawer/Drawer.test.ts
+++ b/app/components/malio/drawer/Drawer.test.ts
@@ -145,4 +145,32 @@ describe('MalioDrawer', () => {
const wrapper = mountComponent({ modelValue: true, headerClass: 'bg-m-primary' })
expect(wrapper.find('[data-test="header"]').classes()).toContain('bg-m-primary')
})
+
+ it('renders the #footer slot inside the body (scrollable zone)', () => {
+ const wrapper = mountComponent(
+ { modelValue: true },
+ { footer: '' },
+ )
+ expect(wrapper.find('[data-test="body"] [data-test="footer"] [data-test="save"]').exists()).toBe(true)
+ })
+
+ it('does not render the footer wrapper when no #footer slot', () => {
+ const wrapper = mountComponent({ modelValue: true })
+ expect(wrapper.find('[data-test="footer"]').exists()).toBe(false)
+ })
+
+ it('applies bodyClass to the body', () => {
+ const wrapper = mountComponent({ modelValue: true, bodyClass: 'px-10' })
+ expect(wrapper.find('[data-test="body"]').classes()).toContain('px-10')
+ })
+
+ it('applies footerClass to the footer wrapper', () => {
+ const wrapper = mountComponent(
+ { modelValue: true, footerClass: 'sticky bottom-0' },
+ { footer: 'pied' },
+ )
+ const footer = wrapper.find('[data-test="footer"]')
+ expect(footer.classes()).toContain('sticky')
+ expect(footer.classes()).toContain('bottom-0')
+ })
})
diff --git a/app/components/malio/drawer/Drawer.vue b/app/components/malio/drawer/Drawer.vue
index 2a712af..fdddf87 100644
--- a/app/components/malio/drawer/Drawer.vue
+++ b/app/components/malio/drawer/Drawer.vue
@@ -62,6 +62,13 @@
data-test="body"
>