UIPackage
Menu

Framework

Change language

Boilerplate repo

Accordion

accordionui

Vertically stacked, collapsible panels — one or many open at a time. Use for FAQs, settings groups, and any place where space is tight but content needs to stay browsable. Built on reka-ui with smooth animation and full keyboard support.

Also available for React ->

Installation

$npx shadcn-vue@latest add https://uipkge.dev/r/vue/accordion.json
Named registry:npx shadcn-vue@latest add @uipkge/accordionInstalls to:app/components/ui/accordion/

Examples

Loading interactive previews…

Props

NameType / ValuesDefaultRequired
classHTMLAttributes['class']optional
variant
'default''separated''ghost'
'default'optional
type
'single''multiple'
optional
modelValuestring | string[]optional
defaultValuestring | string[]optional
collapsiblebooleanoptional
disabledbooleanoptional
dir
'ltr''rtl'
optional
orientation
'horizontal''vertical'
optional
asChildbooleanoptional
asstring | objectoptional

Used by

Files installed (7)

  • app/components/ui/accordion/Accordion.vue1.4 kB
    <script setup lang="ts">
    import { computed, provide } from 'vue'
    import type { AccordionRootEmits } from 'reka-ui'
    import type { HTMLAttributes } from 'vue'
    import { reactiveOmit } from '@vueuse/core'
    import { AccordionRoot, useForwardPropsEmits } from 'reka-ui'
    import { cn } from '@/lib/utils'
    import { accordionVariants } from './accordion.variants'
    
    // Inlined unions: SFC compiler can't extract runtime props from
    // `NonNullable<AccordionVariants['variant']>` or reka-ui's
    // `AccordionRootProps`. Inline only the surface we expose.
    const props = withDefaults(
      defineProps<{
        class?: HTMLAttributes['class']
        variant?: 'default' | 'separated' | 'ghost'
        type?: 'single' | 'multiple'
        modelValue?: string | string[]
        defaultValue?: string | string[]
        collapsible?: boolean
        disabled?: boolean
        dir?: 'ltr' | 'rtl'
        orientation?: 'horizontal' | 'vertical'
        asChild?: boolean
        as?: string | object
      }>(),
      {
        variant: 'default',
      },
    )
    
    const emits = defineEmits<AccordionRootEmits>()
    
    const delegated = reactiveOmit(props, 'class', 'variant')
    const forwarded = useForwardPropsEmits(delegated, emits)
    
    provide(
      Symbol.for('accordionVariant'),
      computed(() => props.variant),
    )
    </script>
    
    <template>
      <AccordionRoot
        data-uipkge
        data-slot="accordion"
        :data-variant="variant"
        v-bind="forwarded"
        :class="cn(accordionVariants({ variant }), props.class)"
      >
        <slot />
      </AccordionRoot>
    </template>
    
  • app/components/ui/accordion/AccordionContent.vue1 kB
  • app/components/ui/accordion/AccordionHeader.vue0.6 kB
  • app/components/ui/accordion/AccordionItem.vue0.9 kB
  • app/components/ui/accordion/AccordionTrigger.vue1.2 kB
  • app/components/ui/accordion/accordion.variants.ts1.8 kB
  • app/components/ui/accordion/index.ts0.7 kB

Raw manifest:https://uipkge.dev/r/vue/accordion.json