lumecss
Version:
LumeCss is a modern, lightweight, and flexible CSS library designed for building fast and responsive user interfaces. Built with SCSS and TypeScript, LumeCss provides utility-first classes, customizable themes, and reusable components to speed up your dev
136 lines (102 loc) • 5.7 kB
text/typescript
// Get the NodeList of the HTML elements that contains the class 'accordion'
const accordionElements: NodeListOf<HTMLElement> = document.querySelectorAll('.accordion');
// Convert the NodeList to an array
const accordionElementsArray: HTMLElement[] = Array.from(accordionElements);
// Iterate over each element in the accordionElementsArray
accordionElements.forEach((accordionObj: HTMLElement):void => {
// Get the HTML elements that contains the 'accordion-header' class
const headerElements: NodeListOf<HTMLElement> = document.querySelectorAll('.accordion-header');
// Convert the headerElements to an array
const headerElementsArray: HTMLElement[] = Array.from(headerElements);
/* Get the data-allow-multiple attribute. It is used to specify whether
the user can open only one accordion or multiple accordions. If data-allow-multiple
is set to false, previous accordions will close when the user opens a new one. */
const allowMultiple: boolean = accordionObj?.getAttribute('data-allow-multiple') === 'true';
// Ensure that the headerElementsArray is not empty
if (headerElementsArray.length > 1) {
// Iterate over each headerElementsArray to add an eventListener to each header
headerElementsArray.forEach((headerObj: HTMLElement):void => {
// Add an event listener to each headerObj
headerObj.addEventListener('click', (e: MouseEvent): void => {
// Get the parent element
const accordionItemElement: HTMLElement | null = (e.target as HTMLElement).closest('.accordion-item');
// Declare the accordionCollapseElement variable
let accordionCollapseElement: HTMLElement | null = null;
// Get the collapse HTML element
if (!accordionItemElement) return;
accordionCollapseElement = accordionItemElement.querySelector('.accordion-collapse');
// Make sure that the accordionCollapseElement exists
if (!accordionCollapseElement) return;
// Get the accordion header button or null if it does not exist
const accordionHeaderButton: HTMLElement
| null = headerObj.querySelector('.accordion-header-button');
// Get the body element of the accordionCollapseElement
const bodyElement: HTMLElement |
null = accordionCollapseElement.querySelector('.accordion-body');
// Check if the accordionItemElement has already the 'collapsed' class
if (!accordionItemElement.classList.contains('collapsed')) {
// Check if the multiple accordion opening is allowed
if (!allowMultiple) {
closeOpenedAccordions(accordionObj);
}
collapseAccordion(accordionItemElement, accordionCollapseElement, accordionHeaderButton, bodyElement);
} else {
uncollapseAccordion(accordionItemElement, accordionCollapseElement, accordionHeaderButton);
}
});
});
}
});
function closeOpenedAccordions(accordionObj: HTMLElement):void {
/* This function searches for the opened accordions and closes them */
// Get the NodeList of the opened accordions
const openedAccordions: NodeListOf<HTMLElement> = accordionObj.querySelectorAll('.accordion-item.collapsed');
// Convert the NodeList to an array
const openedAccordionsArray: HTMLElement[] = Array.from(openedAccordions);
// Ensure the array is not empty
if (openedAccordionsArray.length < 1) return;
// Iterate over each opened accordion to close it
openedAccordionsArray.forEach((element: HTMLElement): void => {
// Get the collapse HTML element
const accordionCollapseElement: HTMLElement | null = element.querySelector('.accordion-collapse');
// Make sure the collapse object exists
if (!accordionCollapseElement) return;
// Get the header button
const accordionHeaderButton: HTMLElement | null = element.querySelector('.accordion-header-button');
// Close the accordion
uncollapseAccordion(element, accordionCollapseElement, accordionHeaderButton)
});
}
function collapseAccordion(
accordionItemElement: HTMLElement,
accordionCollapseElement: HTMLElement,
accordionHeaderButton: HTMLElement | null,
bodyElement: HTMLElement | null
):void {
/* Collapse the accordion object by giving the specific classes */
// Add the 'collapsed' class to the accordionItemElement
accordionItemElement.classList.add('collapsed');
// Add the dynamic height to the accordionCollapseElement
if (bodyElement) {
accordionCollapseElement.style.height = `${bodyElement.offsetHeight}px`;
}
// Add the 'active' class to the header button if it is not null
if (accordionHeaderButton) {
accordionHeaderButton.classList.add('active');
}
}
function uncollapseAccordion(
accordionItemElement: HTMLElement,
accordionCollapseElement: HTMLElement,
accordionHeaderButton: HTMLElement | null
):void {
/* Uncollapse the accordion object by removing the specific classes */
// Remove the 'collapsed' class to the accordionItemElement
accordionItemElement.classList.remove('collapsed');
// Set the height to 0 in the accordionCollapseElement
accordionCollapseElement.style.height = `0`;
// Remove the 'active' class to the header button if it is not null
if (accordionHeaderButton) {
accordionHeaderButton.classList.remove('active');
}
}