Skip to content

Collapsible

A collapsible component is used to display content that can be expanded and collapsed.

You have 3 new notifications
Someone mentioned you.
You have a new email.
You have a text message.
---
---
<div x-cloak x-data x-collapsible>
<div class="flex justify-between items-center">
<div class="text-sm">You have 3 new notifications</div>
<button x-collapsible:trigger>
<i class="i-lucide-plus w-5 h-5"></i>
</button>
</div>
<div data-part="messages">
<div data-part="message" class="!mb-0">Someone mentioned you.</div>
<div x-collapsible:content>
<div data-part="message">You have a new email.</div>
<div data-part="message">You have a text message.</div>
</div>
</div>
</div>
<style>
[data-part="root"] {
@apply w-64;
}
[data-part="trigger"] {
@apply inline-flex justify-center items-center w-6 h-6 bg-white text-zinc-900 border border-zinc-200/60 rounded-full cursor-pointer;
}
[data-part="trigger"] > i {
@apply transition-transform duration-200 ease-in-out;
}
[data-part="trigger"][data-state="open"] > i {
@apply rotate-45;
}
[data-part="trigger"][data-state="closed"] > i {
@apply rotate-0;
}
[data-part="content"] {
@apply overflow-hidden;
}
@keyframes expand {
from {
height: 0;
}
to {
height: var(--height);
}
}
@keyframes collapse {
from {
height: var(--height);
}
to {
height: 0;
}
}
[data-part="content"][data-state="open"] {
animation: expand 200ms cubic-bezier(0, 0, 0.38, 0.9);
}
[data-part="content"][data-state="closed"] {
animation: collapse 200ms cubic-bezier(0, 0, 0.38, 0.9);
}
[data-part="message"] {
@apply my-2 px-3 py-2 bg-white text-sm text-zinc-800 rounded border border-zinc-200/60;
}
</style>