+ Paragraphe {{ n }} — contenu long pour forcer le scroll interne ; le header et le footer restent fixes. +
+Ni le backdrop ni Échap ne ferment cette modal. Utilisez la croix.
+Contenu de la modal
+Fermeture via la croix uniquement
+Contenu
' }, + ) + expect(wrapper.find('[data-test="body"] [data-test="content"]').text()).toBe('Contenu') + }) + + it('works in uncontrolled mode (defaults closed)', () => { + const wrapper = mountComponent() + expect(wrapper.find('[data-test="panel"]').exists()).toBe(false) + }) + + it('uses custom id when provided', () => { + const wrapper = mountComponent({ modelValue: true, id: 'my-modal' }) + expect(wrapper.find('.fixed').attributes('id')).toBe('my-modal') + }) + + it('generates an id when not provided', () => { + const wrapper = mountComponent({ modelValue: true }) + expect(wrapper.find('.fixed').attributes('id')).toMatch(/^malio-modal-/) + }) + + it('has role="dialog" and aria-modal on the panel', () => { + const wrapper = mountComponent({ modelValue: true }) + const panel = wrapper.find('[data-test="panel"]') + expect(panel.attributes('role')).toBe('dialog') + expect(panel.attributes('aria-modal')).toBe('true') + }) + + it('applies modalClass to the panel', () => { + const wrapper = mountComponent({ modelValue: true, modalClass: 'max-w-2xl' }) + expect(wrapper.find('[data-test="panel"]').classes()).toContain('max-w-2xl') + }) + + it('renders the #header slot inside the header bar', () => { + const wrapper = mountComponent( + { modelValue: true }, + { header: 'Contenu simple de la modal.
+Ni le backdrop ni Échap ne ferment cette modal. Utilisez la croix.
+Contenu de la modal. Échap, clic backdrop et croix la ferment.
++ Paragraphe {{ n }} — contenu long pour forcer le scroll interne ; le header et le footer restent fixes. +
+Ni le backdrop ni Échap ne ferment cette modal. Utilisez la croix.
+Contenu simple de la modal.
+Ni le backdrop ni Échap ne ferment cette modal. Utilisez la croix.
+Contenu de la modal
+Fermeture via la croix uniquement
+