0.0.4

Collapsible

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


Anatomy

The Collapsible component consists of the following data-part

root trigger content
<div class="collapsible collapsible-js">
                  <div data-part="root">
                  <button data-part="trigger" class="button">
                  <span class="trigger__open">Open</span>
                  <span class="trigger__closed">Close</span>
                  <span data-part="indicator">
                  <svg class="button__icon" 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>
                  <div data-part="content">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam varius, augue a pulvinar
                  facilisis, eros urna
                  accumsan risus, ut laoreet est sapien eu ipsum. Fusce nec quam turpis. Maecenas congue
                  ornare vestibulum.
                  Pellentesque vel risus nulla. Suspendisse feugiat est tortor, nec efficitur ligula ultricies
                  sed
                  </div>
                  </div>
                  </div>

Data attributes

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

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam varius, augue a pulvinar facilisis, eros urna accumsan risus, ut laoreet est sapien eu ipsum. Fusce nec quam turpis. Maecenas congue ornare vestibulum. Pellentesque vel risus nulla. Suspendisse feugiat est tortor, nec efficitur ligula ultricies sed
<div class="collapsible collapsible-js" data-default-open="true" data-disabled="true">
                  <div data-part="root">
                  <button data-part="trigger" class="button">
                  <span class="trigger__open">Open</span>
                  <span class="trigger__closed">Close</span>
                  <span data-part="indicator">
                  <svg class="button__icon" 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>
                  <div data-part="content">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam varius, augue a pulvinar
                  facilisis, eros urna
                  accumsan risus, ut laoreet est sapien eu ipsum. Fusce nec quam turpis. Maecenas congue
                  ornare vestibulum.
                  Pellentesque vel risus nulla. Suspendisse feugiat est tortor, nec efficitur ligula ultricies
                  sed
                  </div>
                  </div>
                  </div>
Data attribute Type / Options Description
id string The unique id of the component. Default generated if none is provided
data-default-open boolean The initial open state of the collapsible when rendered. Use when you don't need to control the open state of the collapsible.
data-open boolean The controlled open state of the collapsible.
data-disabled boolean Whether the collapsible is disabled.

Callbacks

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

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


                      document.getElementById("my-callback-collapsible")
                      ?.addEventListener("my-callback-collapsible-event", (event) => {
                        console.log("Received event:", (event as CustomEvent).detail);
                      });
                  
<div id="my-callback-collapsible" class="collapsible collapsible-js" data-on-open-change="my-callback-collapsible-event">
                  <div data-part="root">
                  <button data-part="trigger" class="button">
                  <span class="trigger__open">Open</span>
                  <span class="trigger__closed">Close</span>
                  <span data-part="indicator">
                  <svg class="button__icon" 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>
                  <div data-part="content">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam varius, augue a pulvinar
                  facilisis, eros urna
                  accumsan risus, ut laoreet est sapien eu ipsum. Fusce nec quam turpis. Maecenas congue
                  ornare vestibulum.
                  Pellentesque vel risus nulla. Suspendisse feugiat est tortor, nec efficitur ligula ultricies
                  sed
                  </div>
                  </div>
                  </div>

Open your browser's console to see the events received when the collapsible is opened or closed


Open State Control

Dialog open state can be control with data attributes on any element, it can also be outside of the dialog

You must set a custom id for your collapsible, as the default is randomly generated

data-open-collapsible="collapsible-id" data-close-collapsible="collapsible-id"
<div>
                  <button data-open-collapsible="my-collapsible" class="button button--sm">Outside Open</button>
                  <button data-close-collapsible="my-collapsible" class="button button--sm">Outside Close</button>
                  </div>
                  <div id="my-collapsible" class="collapsible collapsible-js">
                  <div data-part="root">
                  <button data-part="trigger" class="button">
                  <span class="trigger__open">Open</span>
                  <span class="trigger__closed">Close</span>
                  <span data-part="indicator">
                  <svg class="button__icon" 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>
                  <div data-part="content">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam varius, augue a pulvinar
                  facilisis, eros urna
                  accumsan risus, ut laoreet est sapien eu ipsum. Fusce nec quam turpis. Maecenas congue
                  ornare vestibulum.
                  Pellentesque vel risus nulla. Suspendisse feugiat est tortor, nec efficitur ligula ultricies
                  sed
                  </div>
                  </div>
                  </div>

You also dispatch an event named collapsible:set-open to the collapsible id with a boolean value


                  const el = document.getElementById("my-collapsible");
                  if (el) {
                    el.dispatchEvent(
                      new CustomEvent("collapsible:set-open", {
                        detail: { value: true },
                      })
                    );
                  } else {
                    console.warn("Element with ID 'my-collapsible' not found");
                  }
              

Custom (Tailwind)

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

<div class="collapsible collapsible-js">
                  <div data-part="root">
                  <button data-part="trigger" class="button text-contrast-alert  border-contrast-alert border-2 rounded-full">
                  <span class="trigger__open">Open</span>
                  <span class="trigger__closed">Close</span>
                  <span data-part="indicator" class="text-contrast-brand">
                  <svg class="button__icon" 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>
                  <div data-part="content" class="text-contrast-brand  border-contrast-brand border-2 rounded-xl shadow-xl">
                  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam varius, augue a pulvinar
                  facilisis, eros urna
                  accumsan risus, ut laoreet est sapien eu ipsum. Fusce nec quam turpis. Maecenas congue
                  ornare vestibulum.
                  Pellentesque vel risus nulla. Suspendisse feugiat est tortor, nec efficitur ligula ultricies
                  sed
                  </div>
                  </div>
                  </div>

Templates

Collapsible components is available in the followng templates

Code Combobox