The repo tracks work progress for ura.design website redesign
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

118 lines
3.9 KiB

document.addEventListener("DOMContentLoaded", function () {
// Get all instances of the toggle switch, sliders, and containers
const toggleSwitches = document.querySelectorAll(".toggle-input");
const sliders = document.querySelectorAll(".slider");
const containers = document.querySelectorAll(".ba-slider");
const beforeTexts = document.querySelectorAll(".before-text");
const afterTexts = document.querySelectorAll(".after-text");
// Function to animate the slider
const animateSlider = (slider, container, start, end, duration = 350) => {
const stepTime = 10; // Step interval in ms
const steps = duration / stepTime;
const stepValue = (end - start) / steps;
let currentValue = start;
let currentStep = 0;
const interval = setInterval(() => {
currentStep++;
currentValue += stepValue;
slider.value = currentValue;
container.style.setProperty("--position", `${currentValue}%`);
if (currentStep >= steps) {
clearInterval(interval);
slider.value = end; // Ensure it ends exactly at the target
container.style.setProperty("--position", `${end}%`);
}
}, stepTime);
};
// Function to update the toggle switch based on slider position
const updateToggleFromSlider = (
container,
slider,
toggleSwitch,
beforeText,
afterText
) => {
const position =
parseFloat(container.style.getPropertyValue("--position")) || 0;
if (position === 0 && !toggleSwitch.checked) {
toggleSwitch.checked = true;
afterText.classList.remove("text-muted");
beforeText.classList.add("text-muted");
toggleSwitch.setAttribute("aria-checked", "true");
} else if (position === 100 && toggleSwitch.checked) {
toggleSwitch.checked = false;
afterText.classList.add("text-muted");
beforeText.classList.remove("text-muted");
toggleSwitch.setAttribute("aria-checked", "false");
}
};
// Function to handle toggle switch logic
const handleToggle = (
toggleSwitch,
slider,
container,
beforeText,
afterText
) => {
const isChecked = toggleSwitch.checked;
if (isChecked) {
// Show "After" view
animateSlider(slider, container, parseFloat(slider.value), 0); // Animate to 0% (After)
beforeText.classList.add("text-muted");
afterText.classList.remove("text-muted");
toggleSwitch.setAttribute("aria-checked", "true");
} else {
// Show "Before" view
animateSlider(slider, container, parseFloat(slider.value), 100); // Animate to 100% (Before)
afterText.classList.add("text-muted");
beforeText.classList.remove("text-muted");
toggleSwitch.setAttribute("aria-checked", "false");
}
};
// Initialize the state for each slider instance
toggleSwitches.forEach((toggleSwitch, index) => {
const slider = sliders[index];
const container = containers[index];
const beforeText = beforeTexts[index];
const afterText = afterTexts[index];
if (slider && container && beforeText && afterText) {
// Initialize slider position
container.style.setProperty("--position", "0%");
slider.value = 0;
beforeText.classList.add("text-muted");
afterText.classList.remove("text-muted");
toggleSwitch.setAttribute("aria-checked", "true");
// Add event listener for the switch toggle
toggleSwitch.addEventListener("change", () => {
handleToggle(toggleSwitch, slider, container, beforeText, afterText);
});
// Add event listener for manual slider input
slider.addEventListener("input", () => {
const value = parseFloat(slider.value);
container.style.setProperty("--position", `${value}%`);
updateToggleFromSlider(
container,
slider,
toggleSwitch,
beforeText,
afterText
);
});
} else {
console.error(
"One or more elements (slider, container, beforeText, afterText) are missing."
);
}
});
});