Files
amdruzstvo/quarter/assets/js/accordion.js
Marek Lesko ae69533a35 Add devcontainer configuration and Dependabot setup
- Created a new devcontainer.json file for an Alpine-based development environment.
- Added a Dependabot configuration file to automate dependency updates for devcontainers.
2025-08-05 10:13:48 +00:00

98 lines
3.1 KiB
JavaScript

// style controllers
const controllerStyle = (accordionController, isActive) => {
const rotateAbleLine = accordionController.querySelectorAll("span")[1];
if (rotateAbleLine) {
rotateAbleLine.style.transform = !isActive
? "rotate(0deg)"
: "rotate(90deg)";
}
};
// accordion hide and show
const toggleAccordion = (accordion, isActive, currentIndex, index) => {
const parentContent = accordion.closest(".accordion-content");
const content = accordion.querySelector(".accordion-content");
const contentWrapper = accordion.querySelector(".content-wrapper");
const contentHeight = contentWrapper.offsetHeight;
let contenStyleHeight = content.style.height;
if (contenStyleHeight === "auto") {
content.style.height = `${contentHeight}px`;
}
setTimeout(() => {
content.style.height = !isActive ? `${contentHeight}px` : 0;
}, 1);
if (!isActive) {
setTimeout(() => {
if (!parentContent) {
content.style.height = `auto`;
}
}, 500);
}
};
// get accordion controller and listen click event
const accordionController = (accordionContainer) => {
const groupOfAccordion = accordionContainer.querySelectorAll(".accordion");
groupOfAccordion.forEach((accordion, idx) => {
const accordionController = accordion.querySelector(
".accordion-controller"
);
const isInitialyActive = accordion.classList.contains("active");
if (isInitialyActive) {
const contents = accordion.querySelector(".accordion-content");
const contentHeight = contents.children[0].offsetHeight;
if (contentHeight) {
contents.style.height = `${contentHeight}px`;
}
}
if (accordionController) {
accordionController.addEventListener("click", function () {
const currentAccordion = this.closest(".accordion");
const isActive = currentAccordion.classList.contains("active");
let waitForDblClick = setTimeout(() => {
groupOfAccordion.forEach((accordion, idx1) => {
const isAccordionController = accordion.querySelector(
".accordion-controller"
);
if (isAccordionController) {
accordion.classList.remove("active");
const accordionController = accordion.querySelector(
".accordion-controller"
);
controllerStyle(accordionController, true);
toggleAccordion(accordion, true, idx, idx1);
}
});
if (!isActive) {
currentAccordion.classList.add("active");
controllerStyle(accordionController, false);
toggleAccordion(currentAccordion, false);
}
}, 10);
accordionController.addEventListener("dblclick", function () {
clearTimeout(waitForDblClick);
});
});
}
});
};
const accordions = () => {
const accordionContainers = document.querySelectorAll(".accordion-container");
if (!accordionContainers.length) {
return;
}
accordionContainers.forEach((accordionContainer) => {
accordionController(accordionContainer);
});
};