function treeInput(tree, { name = getName, children = getChildren, open = 0, value = tree } = {}) {
const id = DOM.uid().id;
const form = htl.html`<form style=${{
fontFamily: "var(--sans-serif)",
fontSize: "smaller"
}}>
${inner(tree, { open })}
</form>`;
set(value)();
return form;
function set(value) {
return function () {
form.value = value;
form.dispatchEvent(new Event("input", { bubbles: true }));
};
}
function inner(node, { checked = false, open } = {}) {
const item = htl.html`
<label><input type="radio" name="${id}" checked=${node === value} onInput=${set(node)}>
${name(node)}</label>`;
return node.children?.length
? htl.html`<details open=${Boolean(open)}>
<summary>${item}</summary>
<div style=${{ marginLeft: "24px" }}>
${children(node).map(d => inner(d, {open: open - 1}))}
</div>
</details>`
: htl.html`<div>${item}</div>`;
}
}