Skip to content

SimpleDisclosure ​

Kartu yang seluruh body-nya jadi trigger — klik di mana saja untuk membuka panel di bawahnya, tanpa baris trigger terpisah.

Bagian dari: vue-salayout · Family: Expandable


Import ​

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

Instalasi: lihat Installation & Setup di halaman utama.


Usage ​

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

<template>
  <SimpleDisclosure>
    Klik di mana saja pada kartu ini untuk membuka panel.
    <template #children>
      <p>Isi panel muncul di sini, meluncur turun.</p>
    </template>
  </SimpleDisclosure>
</template>

API Reference ​

NOTE

Dibangun di atas dua composable internal: useCardFoundation (region/warna/padding, sama seperti BasicCard, tapi hanya dipakai untuk region body/children) dan useDisclosure (state buka/tutup + ARIA — juga diekspor publik untuk UI custom). Saat dipasang di dalam Accordion, ia otomatis mengambil accordionContext (juga internal) lewat inject dan beroperasi dalam mode controlled — lihat Expandable Family.

SimpleDisclosure ​

Cara Penggunaan:

Berbeda dari Disclosure, tidak ada baris trigger terpisah — default slot (region body) itu sendiri yang jadi area klik (role="button", bukan <button> asli, karena isi body bisa saja memuat elemen interaktif sendiri seperti link/button yang tidak boleh nested di dalam <button>). Region children adalah panel yang meluncur turun tepat di bawah body, tanpa indentasi. Component ini hanya punya region body/children — tidak ada header/footer/tag/leftSide/rightSide seperti BasicCard/Disclosure.

Accessibility:

Component ini sudah include built-in accessibility features:

  • Keyboard navigation: trigger (role="button") bisa difokus (tabindex="0"), aktif dengan Enter/Space (di-handle manual karena bukan <button> asli)
  • ARIA attributes: trigger dapat aria-expanded, panel dapat id yang direferensikan lewat aria-controls
  • Focus ring: trigger punya :focus-visible ring eksplisit, karena role="button" div tidak dapat focus styling bawaan browser seperti <button> asli

Props

NameTypeDefaultDescription
colorCardColor'card'Warna body, atau map warna body/children sekaligus
bodyColorCardAccent'card'Warna region body (trigger), menang atas color
childrenColorCardAccent(family body)Warna region children (panel), menang atas color.children
altCardTogglefalseToggle shade -alt untuk body/children
noPaddingCardTogglefalseHilangkan padding untuk body/children
noAnimatebooleanfalseMatikan animasi fade-in-up saat kartu muncul
overflowingbooleanfalseClip konten yang melebihi wrapper luar
caretPosition'left' | 'right' | 'none' | false'left'Posisi icon caret penanda dropdown, atau 'none'/false untuk sembunyikan Lihat selengkapnya
defaultOpenbooleanfalseStatus awal panel terbuka. Diabaikan kalau nested di Accordion
valuestringauto (item0, item1, ...)Key stabil untuk diidentifikasi oleh Accordion induk
caretPosition ​

Urutan DOM caret selalu tetap konten-lalu-caret (supaya screen reader membaca konten trigger dulu, terlepas dari posisi visualnya) — 'left' cuma membalik urutan visual-nya lewat flex order, bukan urutan DOM sesungguhnya. Diabaikan sepenuhnya kalau slot caret diisi — slot selalu menang karena bisa render apa saja, bukan cuma atur posisi/visibilitas.

Contoh:

vue
<!-- caret di kanan, mengikuti konten -->
<SimpleDisclosure caret-position="right">
  Konten trigger.
  <template #children>Panel.</template>
</SimpleDisclosure>

<!-- sembunyikan caret bawaan sepenuhnya -->
<SimpleDisclosure :caret-position="false">
  Konten trigger, tanpa penanda dropdown.
  <template #children>Panel.</template>
</SimpleDisclosure>

Use Case: 'right' cocok untuk trigger dengan konten rata kiri yang panjang/bervariasi; 'none'/false untuk kasus di mana penanda dropdown sudah jelas dari konteks lain (mis. icon custom di dalam slot default).

Slots

NamePropsDescription
default-Konten region body — sekaligus jadi area klik trigger
caret{ isOpen: boolean }Override penuh icon caret bawaan Lihat selengkapnya
children-Konten panel yang muncul saat terbuka
caret ​

Scoped slot yang menerima status buka/tutup, untuk mengganti icon caret bawaan dengan apa pun.

Slot Scope:

ts
{ isOpen: boolean }

Contoh:

vue
<SimpleDisclosure>
  Klik untuk toggle.
  <template #caret="{ isOpen }">
    <strong>{{ isOpen ? '▲' : '▼' }}</strong>
  </template>
  <template #children>Panel.</template>
</SimpleDisclosure>

Use Case: Ganti caret bawaan dengan icon library lain, atau tampilkan indikator status yang lebih spesifik dari sekadar arah panah.

Model

NameTypeDefaultDescription
v-modelbooleanundefinedControlled open state saat dipakai standalone (di luar Accordion)

Events

NamePayloadDescription
update:modelValuebooleanEmit saat toggle dalam mode controlled standalone
open-Emit setiap kali panel bertransisi ke terbuka (tidak fire saat mount)
close-Emit setiap kali panel bertransisi ke tertutup (tidak fire saat mount)
togglebooleanEmit setiap transisi open/close, dengan state baru

Contoh:

vue
<SimpleDisclosure v-model="isOpen" body-color="primary" @open="onOpen">
  <p>Klik kartu ini untuk membuka.</p>
  <template #children>
    <p>Isi panel.</p>
  </template>
</SimpleDisclosure>

Examples ​

1. Standalone Controlled (v-model) ​

vue
<script setup lang="ts">
import { ref } from 'vue';
const isOpen = ref(false);
</script>

<template>
  <SimpleDisclosure v-model="isOpen">
    Konten trigger.
    <template #children>Panel dikontrol dari luar.</template>
  </SimpleDisclosure>
</template>

2. Warna Body & Children Independen ​

vue
<SimpleDisclosure body-color="primary" children-color="danger">
  bodyColor="primary", childrenColor="danger" — dua family berbeda.
  <template #children>Panel ini tetap danger-alt, bukan primary-alt.</template>
</SimpleDisclosure>

NOTE

Untuk penggunaan bersama Accordion (dicampur dengan Disclosure), lihat Accordion.


Styling ​

Styling sepenuhnya self-contained — lihat Import CSS di halaman utama. Panel expand/collapse memakai animasi CSS grid bawaan yang sama dengan Disclosure (grid-template-rows: 0fr -> 1fr), tidak butuh JS animation library.

CSS Variables ​

Warna trigger dan panel mengikuti token yang sama dengan BasicCard — lihat Accent Palette & alt Shading.


Bagian dari family Expandable:

  • Disclosure — punya baris trigger terpisah dari body, dipakai saat trigger butuh label/caret sendiri
  • Accordion — mengoordinasikan open/close beberapa Disclosure/SimpleDisclosure sekaligus