function combo({
slab = 'slabel',
sinit = 50,
clab = 'clab',
cbool = true,
width,
widthLab
}) {
const buildWrapper = () =>
html`<div style="border:1px gray solid;width:${width};padding:3px;padding-left:8px;">`;
const buildContain = () =>
html`<div style="display:flex;justify-content:left;align-items:center">`;
const buildLabel = lab =>
html`<div style="font:16px Arial;margin-right:1.0em;width:${widthLab}">${lab}`;
const buildOutput = () =>
html`<output style="font:14px Menlo,Consolas,monospace;margin-left:1.0em;">`;
const wrapper = buildWrapper();
const s = buildContain();
const labelS = buildLabel(slab);
const slider = html`<input type=range value=${sinit}>`;
const outputS = buildOutput();
const oninputS = e => {
e && e.preventDefault();
const v = +slider.value;
outputS.value = v;
wrapper.value.s = v;
wrapper.dispatchEvent(new CustomEvent("input", { bubbles: true }));
};
slider.addEventListener('input', oninputS);
s.append(labelS);
s.append(slider);
s.append(outputS);
s.append(outputS);
const c = buildContain();
const labelC = buildLabel(clab);
const checkbox = html`<input type=checkbox value=${cbool}>`;
const outputC = buildOutput();
const onchangeC = e => {
e && e.preventDefault();
const v = checkbox.checked;
outputC.value = v;
wrapper.value.c = v;
wrapper.dispatchEvent(new CustomEvent("input", { bubbles: true }));
};
checkbox.addEventListener('change', onchangeC);
c.append(labelC);
c.append(checkbox);
c.append(outputC);
wrapper.append(s);
wrapper.append(c);
wrapper.value = { s: sinit, c: cbool };
oninputS();
onchangeC();
invalidation.then(() => {
slider.removeEventListener('input', oninputS);
checkbox.removeEventListener('change', onchangeC);
});
const actions = { slider: oninputS, checkbox: onchangeC };
const dom = { slider, checkbox };
return Object.assign(wrapper, {
update(value) {
for (const [k, v] of Object.entries(value)) {
if (k === 's') {
dom.slider.value = v;
actions.slider();
}
if (k === 'c') {
dom.checkbox.checked = v;
actions.checkbox();
}
}
}
});
}