Только он не учитывает кучу всяких edge-case, самое очевидное: изменения ширины в процессе работы - следует добавить ещё обёртку и ResizeObserver.
Но и не очевидных там много, потому для таких вещей обычно используют готовые либы.)
alaskafx, https://www.google.com/search?q=vue+expansion
Я юзаю те, что идут с той библиотекой с которой я сейчас работаю(такой компонент есть в каждой).)
Без библиотеки компонентов\фреймворка смысла особо нет самому фигачить, как по мне, лишние телодвижения.