Collapsible Component
CSS-only Tailwind CSS collapsible panel using native
{% trans "Collapsible components allow users to expand and collapse sections of content. Built with a hidden checkbox pattern, collapsibles work without any JavaScript and support animated transitions via CSS grid." %}
Hanya CSS, tidak diperlukan JavaScript. WCAG AA dapat diakses dan tidak memiliki kerangka kerja — bekerja dengan Django, HTMX, Laravel, React, dan tumpukan apa pun.
| Kelas | Jenis | Keterangan |
|---|---|---|
| collapsible | Basis | Kontainer yang dapat dilipat didorong oleh kotak centang tersembunyi |
| collapsible-toggle | Pengubah | Input kotak centang tersembunyi yang mengontrol status buka/tutup |
| collapsible-title | Pengubah | Label yang dapat diklik yang mengubah label yang dapat diciutkan |
| collapsible-content | Pengubah | Area konten animasi terungkap saat terbuka |
| collapsible-arrow | Pengubah | Menambahkan indikator panah berputar ke judul |
| collapsible-group | Pengubah | Pembungkus untuk barang lipat yang dikelompokkan bergaya akordeon |
| collapsible-overlay | Pengubah | Varian overlay untuk barang lipat bergaya laci |
| collapsible-peek | Pengubah | Menampilkan sekilas konten saat diciutkan |
| is-collapsible-open | Pengubah | Kelas yang diterapkan JS untuk memaksa keadaan terbuka |
| is-collapsible-close | Pengubah | Kelas yang diterapkan JS untuk memaksa keadaan tertutup |
Penggunaan Dasar
Kotak centang tersembunyi menggerakkan status buka/tutup. label memicunya; div konten yang dapat diciutkan dianimasikan terbuka.
1 2 3 4 5 6 7 8 9 10 11 | <div class="collapsible border border-base-soft rounded-lg"> <input type="checkbox" class="collapsible-toggle" id="col-basic" /> <label for="col-basic" class="collapsible-title px-4 py-3 font-medium">Click to expand</label> <div class="collapsible-content"> <div> <div class="px-4 pb-3 text-sm opacity-70"> This content is hidden until expanded. </div> </div> </div> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import { useCollapsible } from 'frutjam/react' export default function CollapsibleDemo() { const collapsible = useCollapsible() return ( <div ref={collapsible.ref} className="collapsible border border-base-soft rounded-lg"> <button className="collapsible-title px-4 py-3 font-medium" onClick={collapsible.toggle}>Click to expand</button> <div className="collapsible-content"> <div> <div className="px-4 pb-3 text-sm opacity-70"> This content is hidden until expanded. </div> </div> </div> </div> ) } |
Dengan Indikator Panah
Tambahkan panah yang dapat dilipat ke label untuk mendapatkan chevron berputar yang mencerminkan keadaan buka/tutup.
1 2 3 4 5 6 7 8 9 10 11 | <div class="collapsible border border-base-soft rounded-lg"> <input type="checkbox" class="collapsible-toggle" id="col-arrow" /> <label for="col-arrow" class="collapsible-title collapsible-arrow px-4 py-3 font-medium">What is Frutjam?</label> <div class="collapsible-content"> <div> <div class="px-4 pb-3 text-sm opacity-70"> Frutjam is a Tailwind CSS v4 component library built with CSS utilities and a PostCSS plugin. </div> </div> </div> </div> |
Beberapa Dapat Dilipat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <div class="flex flex-col gap-2"> <div class="collapsible border border-base-soft rounded-lg"> <input type="checkbox" class="collapsible-toggle" id="col-1" /> <label for="col-1" class="collapsible-title collapsible-arrow px-4 py-3 font-medium">Section One</label> <div class="collapsible-content"> <div> <div class="px-4 pb-3 text-sm opacity-70">Content for the first section.</div> </div> </div> </div> <div class="collapsible border border-base-soft rounded-lg"> <input type="checkbox" class="collapsible-toggle" id="col-2" /> <label for="col-2" class="collapsible-title collapsible-arrow px-4 py-3 font-medium">Section Two</label> <div class="collapsible-content"> <div> <div class="px-4 pb-3 text-sm opacity-70">Content for the second section.</div> </div> </div> </div> <div class="collapsible border border-base-soft rounded-lg"> <input type="checkbox" class="collapsible-toggle" id="col-3" /> <label for="col-3" class="collapsible-title collapsible-arrow px-4 py-3 font-medium">Section Three</label> <div class="collapsible-content"> <div> <div class="px-4 pb-3 text-sm opacity-70">Content for the third section.</div> </div> </div> </div> </div> |
Buka secara Default
Tambahkan dicentang ke input kotak centang untuk memulai pembukaan panel.
1 2 3 4 5 6 7 8 9 10 11 | <div class="collapsible border border-base-soft rounded-lg"> <input type="checkbox" class="collapsible-toggle" id="col-open" checked /> <label for="col-open" class="collapsible-title collapsible-arrow px-4 py-3 font-medium">Open by default</label> <div class="collapsible-content"> <div> <div class="px-4 pb-3 text-sm opacity-70"> This content is visible on initial load. </div> </div> </div> </div> |
JS Terkendali
Alihkan collapsible-open pada elemen wrapper alih-alih menggunakan kotak centang — berguna ketika pemicu berada di tempat lain.
collapsible-open class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <div class="collapsible collapsible-open border border-base-soft rounded-lg" id="js-col"> <button class="collapsible-title collapsible-arrow px-4 py-3 font-medium" onclick="this.closest('.collapsible').classList.toggle('collapsible-open')" > Toggle via JS (starts open) </button> <div class="collapsible-content"> <div> <div class="px-4 py-3 text-sm opacity-70 border-t border-base-soft"> No hidden checkbox needed — state is managed by the <code>collapsible-open</code> class. </div> </div> </div> </div> |
Intip Varian
collapsible-peek menampilkan pratinjau terpotong dengan gradien memudar dan pemicu overlay.
Ganti --peek-height untuk mengontrol seberapa banyak konten yang terlihat saat diciutkan.
Frutjam is a Tailwind CSS v4 component library built around a PostCSS plugin architecture. Every component is a set of @utility definitions that integrate natively with Tailwind's utility pipeline.
Theming is handled entirely through CSS custom properties. Swap themes by setting a data-theme attribute on any container, or override individual tokens inline.
Components ship with sensible defaults and are designed to compose cleanly.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <div class="collapsible collapsible-peek rounded-xl border border-base-soft" style="--peek-height: 5rem;"> <input type="checkbox" class="collapsible-toggle" id="col-peek" /> <div class="collapsible-content"> <div class="p-4 text-sm leading-relaxed"> <p>Frutjam is a Tailwind CSS v4 component library built around a PostCSS plugin architecture. Every component is a set of <code>@utility</code> definitions that integrate natively with Tailwind's utility pipeline.</p> <p class="mt-3">Theming is handled entirely through CSS custom properties. Swap themes by setting a <code>data-theme</code> attribute on any container, or override individual tokens inline.</p> <p class="mt-3">Components ship with sensible defaults and are designed to compose cleanly.</p> </div> </div> <label for="col-peek" class="collapsible-overlay"> <span class="btn btn-sm">Read more</span> </label> </div> |
JS & Pembantu React
Gunakan createCollapsible dari frutjam/js atau useCollapsible dari frutjam/react untuk kontrol terprogram dan sinkronisasi aria-expanded otomatis pada pemicu apa pun.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <button class="btn btn-sm mb-3" id="col-helper-btn">Toggle</button> <div class="collapsible border border-base-soft rounded-lg" id="js-collapsible"> <div class="collapsible-title collapsible-arrow px-4 py-3 font-medium">Controlled section</div> <div class="collapsible-content"> <div> <div class="px-4 pb-3 text-sm opacity-70">Toggled by the external button above.</div> </div> </div> </div> <script type="module"> import { createCollapsible } from 'frutjam/js' const col = createCollapsible(document.getElementById('js-collapsible')) document.getElementById('col-helper-btn').onclick = () => col.toggle() </script> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import { useCollapsible } from 'frutjam/react' export default function CollapsibleDemo() { const collapsible = useCollapsible() return ( <> <button className="btn btn-sm mb-3" onClick={collapsible.toggle}>Toggle</button> <div ref={collapsible.ref} className="collapsible border border-base-soft rounded-lg"> <div className="collapsible-title collapsible-arrow px-4 py-3 font-medium">Controlled section</div> <div className="collapsible-content"> <div> <div className="px-4 pb-3 text-sm opacity-70">Toggled by the external button above.</div> </div> </div> </div> </> ) } |
Pemicu Eksternal dengan grup yang dapat dilipat
Gabungkan trigger dan collapsible ke dalam collapsible-group untuk membiarkan label berada di luar .collapsible
merespons status buka/tutupnya melalui is-collapsible-open dan is-collapsible-close.
.collapsible but inside .collapsible-group.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <div class="collapsible-group border border-base-soft rounded-lg p-4 flex flex-col gap-3"> <div class="flex items-center justify-between"> <span class="font-medium">Section A</span> <label for="cg-1" class="btn btn-sm btn-ghost"> <span class="is-collapsible-close">Expand</span> <span class="is-collapsible-open">Collapse</span> </label> </div> <div class="collapsible"> <input type="checkbox" class="collapsible-toggle" id="cg-1" /> <div class="collapsible-content"> <div> <div class="text-sm opacity-70"> This content is toggled by the button above, which lives outside <code>.collapsible</code> but inside <code>.collapsible-group</code>. </div> </div> </div> </div> </div> |