diff --git a/src/runtime/app.config.ts b/src/runtime/app.config.ts index b253f3ab..8e2b7683 100644 --- a/src/runtime/app.config.ts +++ b/src/runtime/app.config.ts @@ -267,12 +267,8 @@ const accordion = { padding: 'py-2' }, transition: { - enterActiveClass: 'transition duration-100 ease-in', - enterFromClass: 'transform opacity-0', - enterToClass: 'transform opacity-100', - leaveActiveClass: 'transition duration-75 ease-out', - leaveFromClass: 'transform opacity-100', - leaveToClass: 'transform opacity-0' + enterActiveClass: 'overflow-hidden transition-[height] duration-200 ease-out', + leaveActiveClass: 'overflow-hidden transition-[height] duration-200 ease-out' }, default: { openIcon: 'i-heroicons-chevron-down-20-solid', diff --git a/src/runtime/components/elements/Accordion.vue b/src/runtime/components/elements/Accordion.vue index 1ce841ad..4a861b17 100644 --- a/src/runtime/components/elements/Accordion.vue +++ b/src/runtime/components/elements/Accordion.vue @@ -18,12 +18,20 @@ - - - - {{ item.content }} - - + +
+ + + {{ item.content }} + + +
@@ -82,10 +90,37 @@ export default defineComponent({ const uiButton = computed>(() => appConfig.ui.button) + function onEnter (el: HTMLElement, done) { + el.style.height = '0' + el.offsetHeight // Trigger a reflow, flushing the CSS changes + el.style.height = el.scrollHeight + 'px' + + el.addEventListener('transitionend', done, { once: true }) + } + + function onBeforeLeave (el: HTMLElement) { + el.style.height = el.scrollHeight + 'px' + el.offsetHeight // Trigger a reflow, flushing the CSS changes + } + + function onAfterEnter (el: HTMLElement) { + el.style.height = 'auto' + } + + function onLeave (el: HTMLElement, done) { + el.style.height = '0'; + + (el as HTMLElement).addEventListener('transitionend', done, { once: true }) + } + return { // eslint-disable-next-line vue/no-dupe-keys ui, uiButton, + onEnter, + onBeforeLeave, + onAfterEnter, + onLeave, omit } }