Skip to content
API 风格:

Collapse ​

Accordion / multi-expand panels, aligned with the APG accordion pattern.

Basic usage ​

Basic

vue
<script setup lang="ts">
</script>

<template>
  <LhCollapse>
    <LhCollapseItem name="a" title="Consistency">Content</LhCollapseItem>
    <LhCollapseItem name="b" title="Feedback">Content</LhCollapseItem>
  </LhCollapse>
</template>
vue
<script>
export default {}
</script>

<template>
  <LhCollapse>
    <LhCollapseItem name="a" title="Consistency">Content</LhCollapseItem>
    <LhCollapseItem name="b" title="Feedback">Content</LhCollapseItem>
  </LhCollapse>
</template>

Accordion ​

Accordion

vue
<script setup lang="ts">
</script>

<template>
  <!-- Accordion -->
  <LhCollapse accordion>
    <LhCollapseItem name="a" title="Only one open">Content</LhCollapseItem>
    <LhCollapseItem name="b" title="Click again to collapse">Content</LhCollapseItem>
  </LhCollapse>
</template>
vue
<script>
export default {}
</script>

<template>
  <!-- Accordion -->
  <LhCollapse accordion>
    <LhCollapseItem name="a" title="Only one open">Content</LhCollapseItem>
    <LhCollapseItem name="b" title="Click again to collapse">Content</LhCollapseItem>
  </LhCollapse>
</template>

Controlled v-model and disabled items ​

v-model controls the open panel(s) (single value or array depending on accordion mode); disabled disables an individual panel.

Controlled

Controlled content A

vue
<script setup>
import { ref } from 'vue'

const activeNames = ref(['a'])
</script>

<template>
  <LhCollapse v-model="activeNames">
    <LhCollapseItem name="a" title="Panel A">Controlled content A</LhCollapseItem>
    <LhCollapseItem name="b" title="Panel B (disabled)" disabled>Disabled content</LhCollapseItem>
    <LhCollapseItem name="c" title="Panel C">Controlled content C</LhCollapseItem>
  </LhCollapse>
</template>
vue
<script>
export default {
  data() {
    return { activeNames: ['a'] }
  },
}
</script>

<template>
  <LhCollapse v-model="activeNames">
    <LhCollapseItem name="a" title="Panel A">Controlled content A</LhCollapseItem>
    <LhCollapseItem name="b" title="Panel B (disabled)" disabled>Disabled content</LhCollapseItem>
    <LhCollapseItem name="c" title="Panel C">Controlled content C</LhCollapseItem>
  </LhCollapse>
</template>

API ​

LhCollapse Props ​

AttributeDescriptionTypeDefault
modelValueActive panel(s) (controlled v-model)LhCollapseKey | LhCollapseKey[]—
accordionOnly one panel open at a timebooleanfalse
sxQuick layout propsLhSxProps—

LhCollapse Events ​

EventDescriptionCallback
update:modelValueActive panel(s) changed; emitted in controlled mode (when modelValue is passed, v-model)(value: LhCollapseKey | LhCollapseKey[]) => void
changeActive panel(s) changed; emitted in uncontrolled mode (accordion yields a single key)(value: LhCollapseKey | LhCollapseKey[]) => void

LhCollapseItem Props ​

AttributeDescriptionTypeDefault
nameUnique panel keystring | number—
titleTitle (or title slot)string—
disabledDisabledbooleanfalse
sxQuick layout propsLhSxProps—

Accessibility ​

  • APG accordion: header is a real <button aria-expanded aria-controls>, content is role="region" + aria-labelledby
  • Height transition uses CSS grid-template-rows: 0fr/1fr; respects prefers-reduced-motion

Type Definitions ​

The TypeScript type structures exported by this component (auto-extracted from packages/components/collapse/src/types.ts and @lh-ui/share/core/* sources; click each entry to expand; see the Props table above for attribute descriptions):

LhCollapseProps
ts
export interface LhCollapseProps {
  modelValue?: LhCollapseKey | LhCollapseKey[]
  accordion?: boolean
  sx?: LhSxProps
}
LhCollapseItemProps
ts
export interface LhCollapseItemProps {
  name: LhCollapseKey
  title?: string
  disabled?: boolean
  sx?: LhSxProps
}
LhCollapseKey (from @lh-ui/share/core/collapse)
ts
export type LhCollapseKey = string | number

Beauty of tradition, foundation of code