builder = ({ source } = {}) => {
const ui = view`
${["elements", [], (value) => Inputs.range([0, 1], { value: value })]}
<div style="display: flex;">
${Inputs.button("add", {
reduce: () => ui.value.elements.push(Math.random())
})}
${Inputs.button("remove", {
reduce: () => ui.value.elements.pop()
})}
</div>
`;
if (source) {
ui.value = source.value;
source.addEventListener("input", () => {
source.value.elements.forEach((v, i) => {
if (ui.value.elements[i] != v) ui.value.elements[i] = v;
});
ui.value.elements.splice(
source.value.elements.length,
ui.value.elements.length - source.value.elements.length
);
});
ui.addEventListener("input", () => {
ui.value.elements.forEach((v, i) => {
source.value.elements[i] = v;
});
source.value.elements.splice(
ui.value.elements.length,
source.value.elements.length - ui.value.elements.length
);
source.dispatchEvent(new Event("input", { bubbles: true }));
});
}
return ui;
}