function ColorAreaRange(extent = [0, 1], _options = {}) {
const o = Object.assign(
{
valueRanges: [
],
flexShrinkNumber: 5,
flexShrinkLabel: 10
},
_options
);
const range = Inputs.range(extent, o);
range.querySelector("label").style["flex-shrink"] = o.flexShrinkLabel;
range.querySelector("input[type=number]").style["flex-shrink"] =
o.flexShrinkNumber;
const scentEle = htl.html`<div></div>`;
const target = htl.html`<div>
${scentEle}
${range}
</div>`;
function set() {
target.value = range.value;
target.dispatchEvent(new Event("input", { bubbles: true }));
}
target.value = range.value;
function onResize() {
const rangeBB = range
.querySelector("input[type=range]")
.getBoundingClientRect();
console.log(range);
const x = d3.scaleLinear().domain(extent).range([0, rangeBB.width]);
scentEle.innerHTML = `<div style="
display:flex;
position:relative;
left: ${rangeBB.left - target.getBoundingClientRect().left}px;
top: ${rangeBB.top - target.getBoundingClientRect().top - 5}px;
height: 30px;
">
${o.valueRanges
.map(
(d) => `<div style="
background:${d.color};
width:${x(d.max - d.min)}px;
height: 10px;
margin-top:30px;
z-index:-1;">
<span style="transform-origin: 0 0;
transform: rotate(-35deg);
position: absolute;
top: ${15}px;
font-size: 8pt;
font-family: helvetica;
">${d.label}</span></div>`
)
.join("")}
</div>`;
}
const resizeObserver = new ResizeObserver(() => {
onResize();
resizeObserver.disconnect();
});
resizeObserver.observe(target);
range.addEventListener("input", set);
return target;
}