Skip to content

Accordion

A vertically stacked set of interactive headings that each reveal a section of content.

Installation

bash
npx @galaxy-stack/nebula-cli@latest add accordion
bash
pnpm dlx @galaxy-stack/nebula-cli@latest add accordion
bash
yarn dlx @galaxy-stack/nebula-cli@latest add accordion
bash
bunx @galaxy-stack/nebula-cli@latest add accordion
bash
# If you have installed galaxy-design globally
galaxy-design add accordion

Dependencies

This component automatically installs the following dependencies:

  • React: @radix-ui/react-accordion
  • Vue: radix-vue
  • Angular: @radix-ng/primitives

No manual installation needed!

Usage

React

tsx
import {
  Accordion,
  AccordionItem,
  AccordionTrigger,
  AccordionContent,
} from "@/components/ui/accordion"

export default function App() {
  return (
    <Accordion type="single" collapsible>
      <AccordionItem value="item-1">
        <AccordionTrigger>Item 1</AccordionTrigger>
        <AccordionContent>
          Content for item 1.
        </AccordionContent>
      </AccordionItem>
      <AccordionItem value="item-2">
        <AccordionTrigger>Item 2</AccordionTrigger>
        <AccordionContent>
          Content for item 2.
        </AccordionContent>
      </AccordionItem>
    </Accordion>
  )
}

Vue

vue
<script setup lang="ts">
import {
  Accordion,
  AccordionItem,
  AccordionTrigger,
  AccordionContent,
} from '@/components/ui/accordion'
</script>

<template>
  <Accordion type="single" collapsible>
    <AccordionItem value="item-1">
      <AccordionTrigger>Item 1</AccordionTrigger>
      <AccordionContent>
        Content for item 1.
      </AccordionContent>
    </AccordionItem>
    <AccordionItem value="item-2">
      <AccordionTrigger>Item 2</AccordionTrigger>
      <AccordionContent>
        Content for item 2.
      </AccordionContent>
    </AccordionItem>
  </Accordion>
</template>

Angular

typescript
import { Component } from '@angular/core';
import { AccordionComponent } from '@/components/ui/accordion';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [AccordionComponent],
  template: `
    <ui-accordion type="single" collapsible>
      <ui-accordion-item value="item-1">
        <ui-accordion-trigger>Item 1</ui-accordion-trigger>
        <ui-accordion-content>
          Content for item 1.
        </ui-accordion-content>
      </ui-accordion-item>
      <ui-accordion-item value="item-2">
        <ui-accordion-trigger>Item 2</ui-accordion-trigger>
        <ui-accordion-content>
          Content for item 2.
        </ui-accordion-content>
      </ui-accordion-item>
    </ui-accordion>
  `
})
export class AppComponent {}

React Native

tsx
import {
  Accordion,
  AccordionItem,
  AccordionTrigger,
  AccordionContent,
} from '@/components/ui/accordion'

export default function App() {
  return (
    <Accordion type="single" collapsible>
      <AccordionItem value="item-1">
        <AccordionTrigger>Item 1</AccordionTrigger>
        <AccordionContent>
          Content for item 1.
        </AccordionContent>
      </AccordionItem>
      <AccordionItem value="item-2">
        <AccordionTrigger>Item 2</AccordionTrigger>
        <AccordionContent>
          Content for item 2.
        </AccordionContent>
      </AccordionItem>
    </Accordion>
  )
}

Flutter

dart
import 'package:flutter/material.dart';
import 'package:galaxy_design/galaxy_accordion.dart';

class AccordionExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GalaxyAccordion(
      type: AccordionType.single,
      collapsible: true,
      items: [
        GalaxyAccordionItem(
          value: 'item-1',
          header: const Text('Item 1'),
          content: const Text('Content for item 1.'),
        ),
        GalaxyAccordionItem(
          value: 'item-2',
          header: const Text('Item 2'),
          content: const Text('Content for item 2.'),
        ),
      ],
    );
  }
}

API Reference

Props

PropTypeDefaultDescriptionFrameworks
type'single' | 'multiple''single'Accordion selection behavior (single or multiple open items)All
valuestring | string[] | nullnullControlled value for the open item(s)All
defaultValuestring | string[]undefinedUncontrolled initial open item(s)All
collapsiblebooleanfalseAllow all items to be closed (single mode only)All
disabledbooleanfalseDisables the accordion and all itemsAll
orientation'vertical' | 'horizontal''vertical'Accordion orientationAll
dir'ltr' | 'rtl''ltr'Reading direction for RTL or LTR layoutsAll
asChildbooleanfalseRender the root as a child elementReact, Vue, Angular
classNamestring''CSS class names for the root elementReact, React Native
classstring''CSS class names for the root elementVue, Angular, Flutter

Subcomponents

AccordionItem

PropTypeDefaultDescriptionFrameworks
valuestring-Unique value for the itemAll
disabledbooleanfalseDisables the itemAll
asChildbooleanfalseRender as a child elementReact, Vue, Angular

AccordionTrigger

PropTypeDefaultDescriptionFrameworks
asChildbooleanfalseRender as a child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

AccordionContent

PropTypeDefaultDescriptionFrameworks
asChildbooleanfalseRender as a child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

Subcomponents

AccordionItem

Container for each accordion item

AccordionTrigger

Clickable trigger to toggle accordion item

AccordionContent

Collapsible content area

Accessibility

  • Keyboard Navigation: Space/Enter to toggle, Tab to navigate
  • Screen Reader: Uses proper ARIA accordion pattern
  • Focus Management: Focus management between triggers
  • WCAG Compliance: WAI-ARIA design pattern compliant

Author

Bùi Trọng Hiếu (kevinbui)

License

MIT © 2025 Bùi Trọng Hiếu (kevinbui)

Released under the MIT License.