0.0.3

Accordion

A pure vanilla JS implementation of Zag JS Accordion Opens in a new window


Anatomy

The Accordion component consists of the following data-part

root item item-content item-trigger item-indicator

It can include multiple item, item-trigger and item-indicator parts.

data-value is required on all item, item-content, item-trigger and item-indicator parts

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Duis a sem ut diam interdum ultricies sit amet id arcu.

Donec pretium magna cursus ante tincidunt porta.
<div class="accordion accordion-js">
                  <div data-part="root">
                  <div data-part="item" data-value="item-1">
                  <h3>
                  <button data-part="item-trigger" data-value="item-1">
                  Lorem
                  <span data-part="item-indicator" data-value="item-1">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-1">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-2">
                  <h3>
                  <button data-part="item-trigger" data-value="item-2">
                  Duis
                  <span data-part="item-indicator" data-value="item-2">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-2">
                  Duis a sem ut diam interdum ultricies sit amet id arcu.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-3">
                  <h3>
                  <button data-part="item-trigger" data-value="item-3">
                  Donec
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-3">
                  Donec pretium magna cursus ante tincidunt porta.
                  </div>
                  </div>
                  </div>
                  </div>

Data attributes

Each accordion can be set with different settings with the following data-attribute.

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Duis a sem ut diam interdum ultricies sit amet id arcu.

Donec pretium magna cursus ante tincidunt porta.
<div class="accordion accordion-js" id="custom-accordion" data-default-value="item-1" data-dir="ltr" data-orientation="vertical" data-collapsible="true" data-disabled="false" data-multiple="true">
                  <div data-part="root">
                  <div data-part="item" data-value="item-1">
                  <h3>
                  <button data-part="item-trigger" data-value="item-1">
                  Lorem
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-1">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-2">
                  <h3>
                  <button data-part="item-trigger" data-value="item-2">
                  Duis
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-2">
                  Duis a sem ut diam interdum ultricies sit amet id arcu.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-3">
                  <h3>
                  <button data-part="item-trigger" data-value="item-3">
                  Donec
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-3">
                  Donec pretium magna cursus ante tincidunt porta.
                  </div>
                  </div>
                  </div>
                  </div>
Data attribute Type / Options Description
id string The unique id of the component. Default generated if none is provided
data-default-value string || string list The initial value(s) of the expanded accordion items. Separated by comma
data-dir ltr | rtl The orientation of the accordion. Can be `ltr` or `rtl`
data-collapsible boolean Whether an accordion item can be closed after it has been expanded.
data-multiple boolean Whether multiple accordion items can be expanded at the same time.
data-orientation horizontal | vertical The orientation of the accordion. Can be `horizontal` or `vertical` - `horizontal`: only left and right arrow key navigation will work. - `vertical`: only up and down arrow key navigation will work.

Callbacks

Each Accordion component can receive callbacks that can be used to respond to user interaction with custom behavior.

You must add a custom id for the accordion and a event listener for your event name


                      document.getElementById("my-callback-accordion")
                      ?.addEventListener("my-callback-accordion-event", (event) => {
                        console.log("Received event:", (event as CustomEvent).detail);
                      });
                  

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Duis a sem ut diam interdum ultricies sit amet id arcu.
<div id="my-callback-accordion" class="accordion accordion-js" data-on-value-change="my-callback-accordion-event">
                  <div data-part="root">
                  <div data-part="item" data-value="item-1">
                  <h3>
                  <button data-part="item-trigger" data-value="item-1">
                  Lorem
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-1">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-2">
                  <h3>
                  <button data-part="item-trigger" data-value="item-2">
                  Duis
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-2">
                  Duis a sem ut diam interdum ultricies sit amet id arcu. </div>
                  </div>
                  </div>
                  </div>

Open your browser's console to see the events received when the accordion value changes

Data attribute Type / Options Description
data-on-focus-change string Event name to be send when a accordion item is focused
data-on-value-change string Event name to be send when a accordion value changes

Disabled

Each accordion can be disabled globally or per item.

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Duis a sem ut diam interdum ultricies sit amet id arcu.

Donec pretium magna cursus ante tincidunt porta.

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Duis a sem ut diam interdum ultricies sit amet id arcu.

Donec pretium magna cursus ante tincidunt porta.
<div class="accordion accordion-js" data-disabled="true">
                  <div data-part="root">
                  <div data-part="item" data-value="item-1">
                  <h3>
                  <button data-part="item-trigger" data-value="item-1">
                  Lorem
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-1">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-2">
                  <h3>
                  <button data-part="item-trigger" data-value="item-2">
                  Duis
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-2">
                  Duis a sem ut diam interdum ultricies sit amet id arcu.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-3">
                  <h3>
                  <button data-part="item-trigger" data-value="item-3">
                  Donec
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-3">
                  Donec pretium magna cursus ante tincidunt porta.
                  </div>
                  </div>
                  </div>
                  </div>
                  <div class="accordion accordion-js">
                  <div data-part="root">
                  <div data-part="item" data-value="item-1">
                  <h3>
                  <button data-part="item-trigger" data-value="item-1">
                  Lorem
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-1">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-2" data-disabled="true">
                  <h3>
                  <button data-part="item-trigger" data-value="item-2" data-disabled="true">
                  Duis
                  <span data-part="item-indicator" data-disabled="true">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-2" data-disabled="true">
                  Duis a sem ut diam interdum ultricies sit amet id arcu.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-3">
                  <h3>
                  <button data-part="item-trigger" data-value="item-3">
                  Donec
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-3">
                  Donec pretium magna cursus ante tincidunt porta.
                  </div>
                  </div>
                  </div>
                  </div>

Orientation

Each accordion can be set as horizontal or vertical.

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Duis a sem ut diam interdum ultricies sit amet id arcu.

Donec pretium magna cursus ante tincidunt porta.

a

b
<div class="accordion accordion-js" data-orientation="vertical">
                  <div data-part="root">
                  <div data-part="item" data-value="item-1">
                  <h3>
                  <button data-part="item-trigger" data-value="item-1">
                  Lorem
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-1">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-2">
                  <h3>
                  <button data-part="item-trigger" data-value="item-2">
                  Duis
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-2">
                  Duis a sem ut diam interdum ultricies sit amet id arcu.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-3">
                  <h3>
                  <button data-part="item-trigger" data-value="item-3">
                  Donec
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-3">
                  Donec pretium magna cursus ante tincidunt porta.
                  </div>
                  </div>
                  </div>
                  </div>
                  <div class="accordion accordion-js" data-orientation="horizontal">
                  <div data-part="root">
                  <div data-part="item" data-value="item-1">
                  <h3>
                  <button data-part="item-trigger" data-value="item-1">
                  A
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-1">
                  a
                  </div>
                  </div>
                  <div data-part="item" data-value="item-2">
                  <h3>
                  <button data-part="item-trigger" data-value="item-2">
                  B
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-2">
                  b
                  </div>
                  </div>
                  </div>
                  </div>

RTL

RTL support for accordion

كلا لم قِبل الدّفاع, وصل مع هاربر الأوربيين, على العصبة بالرّغم الأوضاع تم

لعدم الهادي واعتلاء لكل قد, فعل في نقطة أفاق
<div class="accordion accordion-js" data-dir="rtl">
                  <div data-part="root">
                  <div data-part="item" data-value="item-1">
                  <h3>
                  <button data-part="item-trigger" data-value="item-1">
                  كلا لم
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-1">
                  كلا لم قِبل الدّفاع, وصل مع هاربر الأوربيين, على العصبة بالرّغم الأوضاع تم
                  </div>
                  </div>
                  <div data-part="item" data-value="item-2">
                  <h3>
                  <button data-part="item-trigger" data-value="item-2">
                  لعدم
                  <span data-part="item-indicator">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-2">
                  لعدم الهادي واعتلاء لكل قد, فعل في نقطة أفاق </div>
                  </div>
                  </div>
                  </div>

Custom (Tailwind)

If you are using Tailwind styling, you can customize each accordion and its parts with Tailwind utilities

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Duis a sem ut diam interdum ultricies sit amet id arcu.
<div class="accordion accordion-js">
                  <div data-part="root" class="shadow-xl shadow-ui-brand">
                  <div data-part="item" data-value="item-1" class="bg-ui-alert">
                  <h3>
                  <button data-part="item-trigger" data-value="item-1" class="text-contrast-brand">
                  Lorem
                  <span data-part="item-indicator" class="text-ui-contrast-brand">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-1" class="text-contrast-alert-2">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
                  </div>
                  </div>
                  <div data-part="item" data-value="item-2" class="bg-ui-brand shadow-xl text-ui-contrast-brand">
                  <h3>
                  <button data-part="item-trigger" data-value="item-2" class="text-contrast-alert">
                  Duis
                  <span data-part="item-indicator" class="text-ui-contrast-brand">
                  <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
                  <path stroke-linecap="round" stroke-linejoin="round" d="m8.25 4.5 7.5 7.5-7.5 7.5"></path>
                  </svg>
                  </span>
                  </button>
                  </h3>
                  <div data-part="item-content" data-value="item-2" class="text-contrast-brand-2">
                  Duis a sem ut diam interdum ultricies sit amet id arcu.
                  </div>
                  </div>
                  </div>
                  </div>

Templates

Accordion components is available in the followng templates

Color Avatar