Skip to content

Accordion

Provider yang mengoordinasikan open/close beberapa Disclosure/SimpleDisclosure sekaligus — single-open secara default, atau multi-open lewat multiple.

Bagian dari: vue-salayout · Family: Expandable


Import

ts
import { Accordion } from '@bpmlib/vue-salayout';

Instalasi: lihat Installation & Setup di halaman utama.


Usage

vue
<script setup lang="ts">
import { Accordion, Disclosure } from '@bpmlib/vue-salayout';
</script>

<template>
  <Accordion>
    <Disclosure>
      <template #header>Bagian 1</template>
      <template #list>Isi bagian 1.</template>
    </Disclosure>
    <Disclosure>
      <template #header>Bagian 2</template>
      <template #list>Isi bagian 2.</template>
    </Disclosure>
  </Accordion>
</template>

Accordion tidak menggunakan useCardFoundation — ia hanya wrapper <div> (flex flex-col gap-4) yang menyediakan koordinasi state lewat context ke Disclosure anak, bukan region/warna sendiri.


API Reference

Accordion adalah provider/context controller: API sebenarnya bukan tampilan sendiri, melainkan kontrak koordinasi yang di-inject ke tiap Disclosure anak. Detail render/props visual ada di halaman Disclosure.

Accordion

Cara Penggunaan:

Setiap Disclosure/SimpleDisclosure yang dipasang sebagai descendant langsung dari Accordion otomatis mengambil context ini lewat inject dan berhenti mengelola state buka/tutupnya sendiri — defaultOpen/v-model pada instance tersebut diabaikan. Keduanya bisa dicampur bebas di dalam satu Accordion yang sama.

Provider Props

NameTypeDefaultDescription
multiplebooleanfalseIzinkan lebih dari satu Disclosure anak terbuka sekaligus

Model

NameTypeDefaultDescription
v-modelstring[] | Partial<Record<string, boolean>>undefinedItem mana saja yang terbuka, keyed by value tiap Disclosure (atau id posisional item0, item1, ...) Lihat selengkapnya
modelValue

Bentuknya polymorphic, tapi satu instance Accordion selalu emit balik dalam bentuk yang sama seperti nilai awal yang diberikan (default: array, kalau modelValue awalnya undefined).

ts
type AccordionModelValue = string[] | Partial<Record<string, boolean>>;

Contoh:

vue
<script setup lang="ts">
import { ref } from 'vue';
const openIds = ref<string[]>(['item0']);
</script>

<template>
  <Accordion v-model="openIds">
    <Disclosure value="item0">
      <template #list>Terbuka di awal.</template>
    </Disclosure>
    <Disclosure value="item1">
      <template #list>Tertutup di awal.</template>
    </Disclosure>
  </Accordion>
</template>

Use Case: Buka/tutup item secara programmatic dari luar (mis. tombol "Buka Semua"), atau persist state terbuka ke URL/localStorage.

NOTE

defaultOpen dan v-model pada Disclosure/SimpleDisclosure tidak berpengaruh saat dipasang sebagai descendant Accordion — status buka/tutup sepenuhnya diambil alih dan dikoordinasikan oleh Accordion induknya lewat context internal (bukan lewat prop instance itu sendiri).

Events

NamePayloadDescription
update:modelValuestring[] | Partial<Record<string, boolean>>Emit tiap kali item dibuka/ditutup
toggle(opened: string[], closed: string[])Emit dengan diff id yang baru terbuka/tertutup Lihat selengkapnya
toggle

Payload:

ts
toggle: (opened: string[], closed: string[]) => void

Parameters:

  • opened - id yang baru menjadi terbuka pada perubahan ini
  • closed - id yang baru menjadi tertutup pada perubahan ini

Contoh:

vue
<Accordion @toggle="(opened, closed) => console.log('Dibuka:', opened, 'Ditutup:', closed)">
  <Disclosure value="a"><template #list>A</template></Disclosure>
  <Disclosure value="b"><template #list>B</template></Disclosure>
</Accordion>

Use Case: Tracking interaksi per item tanpa harus diff modelValue sendiri.

Consumed By

  • Disclosure — via injectAccordionContext(), beroperasi dalam mode controlled saat nested di dalam Accordion ini
  • SimpleDisclosure — via injectAccordionContext() yang sama, bisa dicampur dengan Disclosure di dalam satu Accordion

Examples

1. Grup Single-Open Dasar

vue
<Accordion>
  <Disclosure v-for="item in items" :key="item.id" :value="item.id">
    <template #header>{{ item.title }}</template>
    <template #list>{{ item.content }}</template>
  </Disclosure>
</Accordion>

2. Multi-Open

vue
<Accordion multiple>
  <Disclosure value="a"><template #list>Bisa terbuka bareng B</template></Disclosure>
  <Disclosure value="b"><template #list>Bisa terbuka bareng A</template></Disclosure>
</Accordion>

3. Campur Disclosure & SimpleDisclosure

vue
<Accordion>
  <SimpleDisclosure value="simple">
    Klik di mana saja pada kartu ini untuk membuka.
    <template #children>Panel SimpleDisclosure.</template>
  </SimpleDisclosure>
  <Disclosure value="regular">
    <template #header>Item biasa</template>
    <template #list>Panel Disclosure.</template>
  </Disclosure>
</Accordion>

Bagian dari family Expandable: