customSlider = (options = {}) => {
const {
title,
min = 0,
max = 1,
value = (min + max) / 2,
step = "any",
precision = 2,
format,
description
} = options;
const slider = html`<div class="slider"></div>`;
const id = Date.now();
if (title) {
slider.append(html`<label for="${id}" class="title">${title}</label>`);
}
const input = html`<input id="${id}" type="range" min="${min}" max="${max}" value="${value}" step="${step}">`;
slider.append(input);
const output = html`<output class="value"></output>`;
slider.append(output);
if (description) {
slider.append(html`<small class="description">${description}</small>`);
}
slider.addEventListener("input", (e) => {
const roundedValue = round(slider.value, precision);
slider.value = roundedValue;
input.value = roundedValue;
output.innerText = format ? format(roundedValue) : roundedValue;
});
input.addEventListener("input", () => {
slider.value = round(input.valueAsNumber, precision);
slider.dispatchEvent(new CustomEvent("input"));
});
input.dispatchEvent(new CustomEvent("input"));
return slider;
}