function input(config) {
let {form, type = "text", attributes = {}, action, getValue, title, description, format, submit, options, css_class=""} = config;
if (!form) form = html`<form>
<input name=input type=${type}/>
</form>`;
const input = form.input;
Object.keys(attributes).forEach(key => {
const val = attributes[key];
if (val != null) input.setAttribute(key, val);
});
if (submit) form.append(html`<input name=submit type=submit style="margin: 0 0.75em" value="${typeof submit == 'string' ? submit : 'Submit'}" />`);
form.append(html`<output name=output style="font: 14px Menlo, Consolas, monospace; margin-left: 0.5em;"></output>`);
if (title) form.prepend(html`<div style="font: 700 0.9rem sans-serif;">${title}</div>`);
if (description) form.append(html`<div style="font-size: 0.85rem; font-style: italic;">${description}</div>`);
if (format) format = format;
if (action) {
action(form);
} else {
const verb = submit ? "onsubmit" : type == "button" ? "onclick" : type == "checkbox" || type == "radio" ? "onchange" : "oninput";
form[verb] = (e) => {
e && e.preventDefault();
const value = getValue ? getValue(input) : input.value;
if (form.output) form.output.value = format ? format(value) : value;
form.value = value;
if (verb !== "oninput") form.dispatchEvent(new CustomEvent("input"));
};
if (verb !== "oninput") input.oninput = e => e && e.stopPropagation() && e.preventDefault();
if (verb !== "onsubmit") form.onsubmit = (e) => e && e.preventDefault();
form[verb]();
}
return form;
}