galhui
Version:
UI library using galho framework
804 lines • 71 kB
JavaScript
import { G, active, clearEvent, delay, div, g, getAll, isE, onfocusout, svg, toSVG, wrap } from "galho";
import { orray, range } from "galho/orray.js";
import { call, def, isA, isF, isN, isP, isS, l, t } from "galho/util.js";
import { anim } from "./util.js";
export const icons = {};
/**settings */
export const $ = {
// c: "_",
delay: 500,
rem: 16
};
/**words */
export const w = {};
export function word(key) { return key; }
export function sentence(format) {
const exp = /\{\w+\}/;
format.replace(exp, (v) => w[v.slice(1, v.length - 1)]);
}
export const body = () => new G(document.body);
export const doc = () => new G(document);
/**selector for element that can gain focus*/
export const focusable = ":not(:disabled):is(a[href],button,input,textarea,select,[tabindex])";
export function icon(d, s) {
if (d) {
if (isS(d))
d = { d };
else if (isE(d))
return d.c(`icon ${s || ''}`);
return svg('svg', {
fill: d.c || "currentColor",
viewBox: $.is || "0 0 24 24",
}, svg('path', { d: d.d })).c(`icon ${s || ''}`);
}
}
export const label = (v, cls) => v && ((isS(v) ? div(0, v) : isA(v) ? div([icon(v[0]), v[1]]) : g(v)))?.c(cls);
export function bt(text, click, type = "button") {
return g("button", "_ bt", text).p("type", type).on("click", click);
}
export const link = (text, href) => g("a", "_ link", text).p("href", href);
/** button with icon */
export function ibt(i, text, click, type = "button") {
return g("button", "_ bt", [icon(i), text])
.p("type", type)
.c("icon", !text).on("click", click);
}
export function positive(i, text, click, type) {
return ibt(i, text, click, type).c("accept");
}
export function negative(i, text, click, type) {
return ibt(i, text, click, type).c("error");
}
/** link with icon */
export function ilink(i, text, href) {
return g("a", "lk" /* C.link */, [icon(i), text]).p("href", href);
}
/**close button */
export function close(click) {
return g("button", `_ ${"cl" /* C.close */}`, icon(icons.close)).p({ type: "button", tabIndex: -1 }).on("click", click);
}
/**cancel button */
export function cancel(click) {
return negative(icons.cancel, w.cancel, click);
}
/**confirm button */
export function confirm(click) {
return positive(null, w.confirm, click, "submit");
}
export function buttons(...buttons) {
return div("bs" /* C.buttons */, buttons);
}
export const img = (src, cls) => g("img", cls).p("src", src);
export const a = (href, content, cls) => g("a", cls, content).p("href", href);
export const hr = (cls) => g("hr", cls);
export function logo(v) {
if (v)
if (isS(v)) {
switch (v[0]) {
case ".":
case "/":
return img(v).c("icon");
case "<":
return toSVG(v).c("icon");
}
}
else
return icon(v);
}
export function hoverBox({ x, y, right: r, bottom: b }, e, [o, side, main]) {
/*m:main,s:side,w:windows,e:Element,h:Horizontal */
let { innerHeight: wh, innerWidth: ww } = window, { width: ew, height: eh } = e.rect, h = o == "h", border = $.rem * .4, [ws, wm, es, em, s0, m0, s1, m1] = h ? [wh, ww, eh, ew, y, x, b, r] : [ww, wh, ew, eh, x, y, r, b];
main ||= (m0 + (m1 - m0) / 2) > (wm / 2) ? "s" : "e";
e
.css({
//main
["max" + (h ? "Width" : "Height")]: (main == "e" ? wm - m1 : m0) - border * 2 + "px",
[h ? "left" : "top"]: (main == "e" ? m1 + border : Math.max(0, m0 - em) - border) + "px",
//side
["max" + (h ? "Height" : "Width")]: (side == "e" ? ws - s0 : s1) - border + "px",
[h ? "top" : "left"]: Math.max(0, Math.min(ws - es, side == "s" ? s1 - es : side == "e" ? s0 : s0 + (s1 - s0) / 2 - es / 2)) + "px",
});
}
export function notify(content, { style, close: cl, v, h }) {
let temp = div(`_ notify msg ${style || ""} ${v || ""} ${h || ""}`).addTo(body());
let r = () => temp.remove();
temp.add([
content,
t(cl) && close(r)
]);
setTimeout(r, 2_000);
}
export function menu(items) { return div("_ menu", g("table", 0, items)); }
/**menu item */
export function menuitem(i, text, action, side, disabled) {
return g("tr", `i ${disabled ? "ds" /* C.disabled */ : ""}`, [
g("td", 0, icon(i)),
g("td", 0, text),
g("td", "sd" /* C.side */, side),
g("td")
]).on("click", !disabled && action);
}
// export function menuitemFull(){
// return g("tr","i",[g("td"),g("td",{colSpan:3})])
// }
/**checkbox */
export function menucb(checked, text, toggle, id, disabled) {
let input = g("input", { id, checked, disabled, indeterminate: checked == null, type: "checkbox" });
toggle && input.on("input", () => toggle.call(input, input.e.checked));
return g("tr", `i ${disabled ? "ds" /* C.disabled */ : ""}`, [
g("td", 0, input),
g("td", 0, text).on("click", () => input.e.click()),
g("td"), g("td")
]).on("click", e => e.stopPropagation());
}
export function menuwait(callback) {
return call(g("tr", 0, g("td", 0, wait(1 /* WaitType.out */)).p("colSpan", 4)), tr => waiter(tr, callback));
}
export const submenu = (i, text, items) => call(g("tr", "i", [
g("td", 0, icon(i)),
g("td", 0, text),
g("td"),
g("td", 0, icon("menuR"))
]), e => {
let mn;
e.on("click", () => {
e.tcls("on" /* C.on */).is('.' + "on" /* C.on */) ?
hoverBox(e.rect, (mn ||= g("table", "menu", items)).addTo(e), "h") :
mn.remove();
});
});
export const menusep = () => g("tr", "_ hr");
/** @deprecated */
export function menubar(...items) { return div("_ bar", items); }
export function containedBar(...items) {
return g("nav", "_ bar", div("_ container", items));
}
/** @deprecated */
export function right() { return div("r" /* HAlign.right */); }
export function mbitem(i, text, action) {
return g("button", "i", [icon(i), text]).p({ type: "button" }).on("click", action);
}
/**menubar separator */
export function mbsep() { return g("hr"); }
/**menubar checkbox */
export function barcb(checked, text, toggle, disabled) {
let input = g("input", { checked, disabled, indeterminate: checked == null, type: "checkbox" });
toggle && input.on("input", () => toggle.call(input, input.e.checked));
return g("label", `i ${disabled ? "ds" /* C.disabled */ : ""}`, [input, text]);
}
/**place holder */
export function ph(type = 1 /* WaitType.out */) {
switch (type) {
case 0 /* WaitType.inline */:
case 1 /* WaitType.out */:
return div("ld" /* C.loading */, [
//icon({ /*s: size, */d: `loading ${C.centered}` }),
//icon({ /*s: size, */d: `loading ${C.itemA} ${C.centered}` }),
]);
}
}
export function waiter(element, cb) {
cb && (isP(cb) ? cb : cb?.()).then(t => {
if (t instanceof G) {
t.c(Array.from(element.e.classList).slice(1));
t.attr("style", (t.attr("style") || "") +
(element.attr("style") || ""));
}
element.replace(t);
});
}
export function wait(type, body) {
if (!isN(type)) {
body = type;
type = 0 /* WaitType.inline */;
}
let loader = ph(type);
waiter(loader, body);
return loader;
}
//todo: colocar no galhui
export function loading(sz = "n") { return div("_ blank", div("_ load " + sz)); }
export function busy(arg0, arg1, arg2, arg3) {
if (isF(arg0)) {
let e = g("span");
(async () => {
let t = setTimeout(() => e.replace(e = loading(arg1)), def(arg2, 750));
e.replace(e = await arg0());
clearTimeout(t);
})();
// setTimeout(async () => e.replace(e = await arg0()), def(arg2, 750));
// let t = await arg0();
// e.parent && e.replace(t);
// e = t;
return e;
}
else {
let e = loading(arg2), p, t = setTimeout(() => {
p = arg0.add(e).css("position");
arg0.css({ position: "relative" });
}, arg3);
let close = () => {
e.remove();
clearTimeout(t);
arg0.css({ position: p });
};
return (async () => {
try {
await arg1(close);
}
finally {
close();
}
})();
}
}
export const blobToBase64 = (v) => new Promise((rs, rj) => {
var reader = new FileReader();
reader.readAsDataURL(v);
reader.onloadend = () => rs(reader.result);
reader.onerror = rj;
});
export function moveondoc(cursor, move, endcallback) {
topLayer().css({ cursor, userSelect: "none" });
doc()
.on('mousemove', move)
.one('mouseup', e => {
topLayer().uncss("cursor", "userSelect");
doc().off('mousemove', move);
endcallback?.(e);
});
}
export const input = (type, name, ph, input) => g("input", { type, name, placeholder: ph }).c("_ in").on("input", input);
export const textarea = (name, ph, input) => g("textarea", { name, placeholder: ph }).c("_ in").on("input", input && (function () { input(this.value); }));
export const checkbox = (label, input, checked) => g("label", "_ cb", [g("input", { type: "checkbox", checked }).on("input", input && (function () { input(this.checked); })), label]);
export const radio = (label, name, input, checked) => g("label", "_ cb", [g("input", { type: "radio", checked, name }).on("input", input && (function () { input(this.checked); })), label]);
export function search(input, value) {
let t = g("input", { type: "search", placeholder: w.search, value }), i = icon(icons.search);
input && delay(t, "input", $.delay, () => input(t.v()));
return (i ? div([t, i]) : t).c("_ in");
}
// export const loadImg = () => new Promise<Blob>((cb) => {
// let p=g("img",{ onload:()=>cb()});
// });
//#region output
export const output = (...content) => g("span", "_ out", content);
export const keyVal = (key, val, c, tag = "span") => g(tag, `_ out ${c || ""}`, [key, ": ", val]);
export const message = (c, data) => div("_ msg", data).c(c);
export const errorMessage = (data) => message("error", data);
export function dialog(cls, hd, bd, blur = true) {
let content = g("dialog", "_ " + cls);
content.on("cancel", (e) => {
if (blur) {
content.remove();
clearEvent(e);
}
});
if (blur)
content.on("click", e => {
if (e.target == e.currentTarget)
content.remove();
});
content
.add(g("form", 0, [
hd,
bd(() => content.remove(), content),
]))
.addTo(body())
.e.showModal();
return content;
}
export function sidebar(hd, bd, blur = true) {
return dialog("side", hd, isF(bd) ? bd : (() => bd), blur);
}
/**open modal
* @returns modal container, to close modal only remove the modal container */
export function modal(hd, bd, actions, sz, blur = true) {
return dialog("modal " + (sz || ""), label(hd, "hd"), (cl, c) => [
isE(bd) ? bd.c("bd") : bd,
actions && div("ft", actions(cl, c))
], blur);
}
export function tabModal(initial, items, actions = (cl) => confirm(cl), sz = "xl") {
let form = g("form", "_ tab");
let content = g("dialog", "_ modal " + (sz || ""), form);
let hd = div("_ main bar", items.map(([h, b]) => call(label(h, "i"), e => e.on("click", () => {
form.set([hd, b, div("ft", actions(() => content.remove(), content))]);
hd.childs().c("on", false);
e.c("on");
}))));
content.addTo(body()).e.showModal();
hd.child(initial).e.click();
return content;
}
export const showDialog = (e) => e.addTo(body().c("dialog-on")).call("showModal").on("close", () => {
e.remove();
body().c("dialog-on", false);
});
/**modal with ok and cancel buttons */
export function mdOkCancel(body, sz = "xs", valid = () => true) {
return new Promise(ok => modal(null, wrap(body), cl => [
confirm(() => { if (valid) {
cl();
ok(true);
} }).css({ width: "50%" }),
cancel(() => { cl(); ok(false); }).css({ width: "50%" })
], sz));
}
/**modal with yes/no buttons */
export function mdYN(body, sz = "xs", valid = () => true) {
return new Promise(ok => modal(null, wrap(body), cl => [
positive(null, w.yes, () => { if (valid) {
cl();
ok(true);
} }).css({ width: "50%" }),
negative(null, w.no, () => { cl(); ok(false); }).css({ width: "50%" })
], sz));
}
/**modal with ok */
export function mdOk(body, sz = "xs") {
return new Promise(ok => modal(null, wrap(body), cl => confirm(() => { cl(); ok(); }), sz));
}
/**md with error style and ok button */
export function mdError(body, sz = "xs") {
return new Promise(ok => modal(null, wrap(body), cl => confirm(() => { cl(); ok(); }), sz).c("error"));
}
export const topLayer = () => g(getAll(":modal>form").at(-1)) || body();
export function popup(refArea, div, align) {
return anim(() => topLayer().contains(div) && hoverBox(refArea(), div, align));
}
/**context menu */
export function ctxmenu(e, data, align = "ve") {
clearEvent(e);
let last = active(), tl = topLayer();
let wheelHandler = (e) => clearEvent(e);
let ctx = div("_ menu", g("table", 0, data)).p("tabIndex", 0)
.on({
focusout(e) {
ctx.contains(e.relatedTarget) || (ctx.remove() && tl.off("wheel", wheelHandler));
},
keydown(e) {
if (e.key == "Escape") {
e.stopPropagation();
ctx.blur();
}
}
}).addTo(tl).focus();
ctx.queryAll('button').on('click', function () { last ? last.focus() : this.blur(); });
tl.on("wheel", wheelHandler, { passive: false });
popup(() => new DOMRect(e.clientX, e.clientY, 0, 0), ctx, align);
}
export function tip(root, tip, align = "v") {
if (tip) {
if (isP(tip)) {
let t = tip;
tip = div("_ tip", wait);
t.then(v => { tip = wrap(v, "_ tip"); });
}
else
tip = wrap(tip, "_ tip");
return (root = g(root))?.on({
mouseenter() {
let tl = topLayer();
tl.add(tip);
anim(() => tl.contains(root) && tip.parent ?
hoverBox(root.rect, tip, align) :
(tip.remove(), false));
},
mouseleave() { tip.remove(); },
//TODO:focusin,focusout
// focusout(e) {
// tip.remove()
// },
// focusin(){
// }
});
}
else
return root;
}
/**create root, add handlers */
export function selectRoot(me, options, label, menu, setValue, tag) {
let p = me.p;
let root = onfocusout(g(tag || "button", `_ in ${"sel" /* C.select */}`, [label.c("bd"), t(p.icon) && icon(icons.dd)?.c("sd" /* C.side */) /*, me.menu*/]), () => me.set("open", false))
.p("tabIndex", 0).on({
focus(e) {
if (p.off) {
if (e.relatedTarget)
g(e.relatedTarget).focus();
else
root.blur();
}
else
root.c("on");
},
keydown(e) {
switch (e.key) {
case "ArrowUp":
me.set("open", true);
range.move(options, "on", -1, range.tp(e.shiftKey, e.ctrlKey));
break;
case "ArrowDown":
me.set("open", true);
range.move(options, "on", 1, range.tp(e.shiftKey, e.ctrlKey));
break;
case "Enter":
if (me.p.open) {
let _ = (l(options) == 1 ? options[0] : options.tag('on'));
_ && setValue(_[options.key]);
//sub(range.list(, "on"), options.key as any)[0]
me.set("open", false);
}
else
return;
// else {
// let frm = g(me).closest("form");
// if (frm) frm?.e.requestSubmit();
// else return;
// }
break;
case "Escape":
if (me.p.open) {
me.set("open", false);
break;
}
else
return;
default:
return;
}
clearEvent(e);
},
});
tag || root.attr("type", "button");
if (t(p.click))
root.on('click', (e) => {
// if (p.off) {
// e.stopImmediatePropagation();
// } else { }
if (!menu.contains(e.target))
me.toggle("open");
});
me.on(state => {
if ("off" in state) {
if (p.off)
me.set("open", false);
//{root.blur().attr("disabled", true).p('tabIndex', -1); }
root.attr("disabled", p.off); //.p('tabIndex', t(p.tab) ? 0 : -1);
}
if ("open" in state) {
if (p.open && p.off) {
me.set("open", false);
return;
}
me.emit('open', p.open);
root.c("on", p.open);
if (p.open) {
root.add(menu);
anim(() => {
let r = root.rect;
return body().contains(menu) && (menu.css("minWidth", r.width + "px"), hoverBox(r, menu, "ve"));
});
}
else {
root.c(["b" /* VAlign.bottom */, "t" /* VAlign.top */], false);
menu.remove();
}
}
});
return root;
}
export async function setValue(me, label) {
let v = me.value;
if (label.is("input")) {
label.p("value", me.value == null ? "" : me.value);
}
else {
if (v == null)
label.c("_ ph").set(me.p.ph);
else {
let o = await me.option(v);
label.c("ph", false).set([me.p.item(o), t(me.p.clear) && close(() => me.value = null)]);
me.set("open", false);
}
}
}
export const dropdown = (label, items, align = "ve", closeOnBlur) => call(div("_ dd i", label).p("tabIndex", 0), e => {
function cl() { mn?.remove(); e.c("on", false); }
let mn; // = ;
t(closeOnBlur) && onfocusout(e, cl);
e.on("click", () => {
if (mn?.parent)
cl();
else {
(mn ||= isF(items) ? items(cl) : menu(items)).addTo(e.c("on"));
popup(() => e.rect, mn, align);
}
});
});
export const idropdown = (label, items, align, closeOnBlur) => dropdown([label, icon(icons.dd)], items, align, closeOnBlur);
export const hidden = (head, body, open) => div(`_ ${"ac" /* C.accordion */}`, [
head = div("hd", [
icon("menuR"),
head
]).c("on" /* C.on */, !!open).on("click", () => head.tcls("on" /* C.on */)),
wrap(body, "bd")
]);
export function accordion(items, i = {}) {
return orray(items).bind(div("_ accordion"), ([hd, bd], j, p) => {
p.place(j * 2, [
hd = div("hd", [
t(i.icon) && icon("menuR"),
hd
]).c("on" /* C.on */, i.def == j).on("click", () => {
if (hd.is('.' + "on" /* C.on */))
hd.c("on" /* C.on */, false);
else {
t(i.single) && p.childs("." + "hd").c("on" /* C.on */, false);
hd.c("on" /* C.on */);
}
}),
wrap(bd, "bd")
]);
});
}
export function tab(initial, items) {
let hd = div("_ bar", items.map(([h, b]) => call(label(h, "i"), e => e.on("click", () => {
d.set([hd, b]);
hd.childs().c("on", false);
e.c("on");
})))), d = div("_ tab");
hd.child(initial).e.click();
return d;
}
//#endregion
// export interface IOpenSelect<T extends Object = Dic, K extends Key = Key> extends bg.ISelect<T, K> {
// input?: 'text' | 'number';
// valid?: (value: string) => boolean;
// }
// export function openSelect<T extends Object = Dic, K extends Key = Key>(input: (this: Select<T, K>, value) => any, options: (T | K)[], i: IOpenSelect<T, K> = {}) {
// let ip = i.labelE = g('input', { type: i.input }).on('input', function () {
// input.call(select, this.value);
// });
// i.label = (value) => {
// ip.p('value', <any>value);
// }
// let select = new Select<T, K>(i, options);
// return select;
// }
// export interface ISelectBase<T extends Object, K> extends IRoot {
// menuE?: S;
// labelE?: S;
// /**element in menu or menu itself where items will be added */
// items?: S<HTMLTableElement>;
// labelParent?: S;
// menu?: (this: this, value: T) => One;
// /**called when value change */
// setMenu?: (this: this, value: K) => void;
// /**elemento dentro da label onde a label vai ser renderizada */
// //labelItem?: S;
// //label: S | ((key: K) => void);
// }
// export abstract class SelectBase<M extends ISelectBase<T, K> = ISelectBase<any, any>, T extends Object = any, K = Key, E extends SelectEvents = SelectEvents> extends E<M, E> {
// menu: S;
// label: S;
// options: L<T, K>;
// abstract setValue(...value: K[]): void;
// constructor(i: M, options?: Alias<T, K>) {
// super(i);
// this.options = extend<T, K>(options, {
// key: "key",
// parse: (e) => isO(e) ? e : { key: e } as any
// });
// }
// view(): S {
// let
// i = this.i,
// lb = g(i.labelE || 'div').c("bd");
// this.label = i.labelParent || lb // model.labelItem || label;
// this.menu = (i.menuE || div(0, i.items = g("table"))).c("_ menu");
// //if (model.menuItems && model.menuItems != this.menu) {
// // this.menu.setClass(Cls.fill);
// // model.menuItems.setClass(Cls.full);
// //}
// i.open = false;
// //if (!md.menuRender)
// // md.menuRender = value => div( null, value[md.key]);
// return root(this, i, this.options);
// }
// protected insertItem(value: T) {
// var model = this.i;
// return g(model.menu(value))
// //.setClass(Cls.option)
// .on('click', (e) => {
// e.stopPropagation();
// let k = value[model.key];
// this.setValue(k);
// });
// }
// }
// export interface IMultselect<T extends Object = any, K extends str | num = str> extends ISelectBase<T, K> {
// value?: L<K>;
// empty?: (empty: boolean, container?: S) => void;
// label?: (this: L<K>, value: K, index?: number, container?: S) => void | One;// Child | Promise;
// }
// export class Multselect<T extends Object = { key: str }, K extends str | num = str> extends SelectBase<IMultselect<T, K>, T, K, { add: K[], remove: K[]; input: K[] } & SelectEvents> {
// constructor(i: IMultselect<T, K>, options?: Array<T | K>) {
// super(i, options);
// this.options.addGroup("on");
// i.value = orray(i.value, {
// parse(item) {
// if (this.indexOf(item) == -1)
// return item;
// }
// });
// //.bindToE(this, "value");
// }
// get value() { return this.i.value; }
// view() {
// let
// i = this.i,
// values = i.value,
// options = this.options,
// div = super.view(),
// mItems = i.items,
// menu = i.items || this.menu;
// this.label.css('flexWrap', 'wrap');
// bind(options, menu, {
// insert: this.insertItem.bind(this),
// tag(s, active, tag) {
// s.c(tag, active);
// if (active) {
// vScroll(menu, s.e.offsetTop - menu.p('clientHeight') / 2 + s.p('clientHeight') / 2);
// }
// },
// groups: {
// ["on"](e, active) { e.c(C.on, active); }
// }
// });
// bind(values, menu, {
// insert(key) {
// let index = itemIndex(options, key);
// if (index != -1)
// mItems
// .child(index)
// .c(C.main);
// },
// remove(key) {
// let index = itemIndex(options, key);
// if (index != -1)
// mItems
// .child(index)
// .c(C.main, false);
// }
// });
// bind(values, this.label, {
// insert: i.label,
// empty: i.empty
// });
// return root(this, i).on("keydown", e => {
// switch (e.key) {
// case "Delete": {
// let target = g(e.target as HTMLElement);
// if (is(target, 'input') || is(target, 'textarea') || !this.delete())
// return;
// else break;
// }
// case "Backspace": {
// let target = g(e.target as HTMLElement);
// if (is(target, 'input') || is(target, 'textarea') || !this.backspace())
// return;
// else break;
// }
// }
// keydown(e, this.options);
// });
// }
// delete() {
// let vl = this.i.value;
// if (!vl.length)
// return false;
// this.removeValue(vl[0]);
// return true;
// }
// backspace() {
// let vl = this.i.value;
// if (!vl.length)
// return false;
// this.removeValue(z(vl));
// return true;
// }
// setValue(...values: K[]) {
// let md = this.i;
// //let list = this.model.value;
// if (values.length) {
// //let l = list.length;
// let inserted: K[] = [];
// for (let value of values) {
// if (md.value.indexOf(value) == -1) {
// inserted.push(value);
// }
// }
// //md.value.push(...values);
// if (inserted.length > 0) {
// md.value.push(...inserted);
// this.emit('add', inserted);
// this.emit('input', md.value.slice());
// if (md.open && this.$)
// this.setMenu(this.$)
// }
// }
// }
// removeValue(...values: K[]) {
// let
// md = this.i,
// removed: K[] = [];
// for (let value of values) {
// let i = md.value.indexOf(value);
// if (i != -1) {
// md.value.removeAt(i);
// removed.push(value);
// }
// }
// if (removed.length > 0) {
// this.emit('remove', removed);
// this.emit('input', md.value.slice());
// if (md.open && this.$)
// this.setMenu(this.$)
// }
// }
// //setLabel(value: T) {
// // var model = this.model;
// // return model.menuRender(<T>value)
// // .setClass(Cls.option)
// // .on('click', (e) => {
// // e.stopPropagation();
// // let k = value[model.key];
// // this.set('value', k);
// // model.child.setTag(focusKey, k);
// // })
// //}
// }
// export interface IOpenMultselect<T extends Object = Dic, K extends Key = Key> extends IMultselect<T, K> {
// input?: 'text' | 'number';
// valid?: (value: string) => boolean;
// /**place holder */
// ph?: str;
// }
// export function openMultselect<T extends Object = Dic, K extends Key = Key>(i: IOpenMultselect<T, K>, allOptions: T[]) {
// let
// select = new Multselect<T, K>(assign(i, {
// label(value) {
// i.labelE.p('value', value);
// },
// labelE: g('input', { type: i.input, placeholder: i.ph }).on({
// input() {
// let arg: Arg<str> = { v: this.value };
// select.emit("type" as any, arg);
// if (!arg.p) {
// allOptions ||= opts.slice();
// let parts = valid(arg.v.split(/\s+/g)).map(q => new RegExp(q, "gu"));
// opts.set(allOptions.filter(o => parts.every(p => p.test(o[i.key]))));
// }
// if (l(opts) == 1)
// addSelection(opts, "on", opts[0], SelectionTp.set);
// },
// keydown(e) {
// if (e.key == "Enter" && !opts.tags["on"]) {
// clearEvent(e);
// let arg: Arg<str> = { v: this.value };
// if (i.valid ? i.valid(arg.v) : false) {
// select.emit("submit" as any, arg)
// if (!arg.p) {
// opts.push({ [i.key]: arg.v } as any);
// select.setValue(arg.v as K);
// }
// }
// }
// }
// })
// }), allOptions),
// opts = select.options;
// g(select).c(C.input)
// return select;
// }
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsaHVpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2FsaHVpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0IsQ0FBQyxFQUF3RCxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xMLE9BQU8sRUFBSyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUF3QixJQUFJLEVBQUUsR0FBRyxFQUFxQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBWSxDQUFDLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQTZFakMsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFtQixFQUFFLENBQUE7QUFDdkMsY0FBYztBQUNkLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBYTtJQUN6QixVQUFVO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixHQUFHLEVBQUUsRUFBRTtDQUNSLENBQUE7QUFDRCxXQUFXO0FBQ1gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFtQixFQUFFLENBQUE7QUFJbkMsTUFBTSxVQUFVLElBQUksQ0FBQyxHQUFRLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlDLE1BQU0sVUFBVSxRQUFRLENBQUMsTUFBVztJQUNsQyxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUM7SUFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBMEJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWUsQ0FBQyxDQUFDO0FBRWhELDZDQUE2QztBQUM3QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcscUVBQXFFLENBQUM7QUFJL0YsTUFBTSxVQUFVLElBQUksQ0FBQyxDQUFPLEVBQUUsQ0FBUTtJQUNwQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ04sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7YUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEMsT0FBTyxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQ2hCLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWM7WUFDM0IsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksV0FBVztTQUM3QixFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0FBQ0gsQ0FBQztBQUdELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQVEsRUFBRSxHQUFTLEVBQUUsRUFBRSxDQUMzQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFLaEYsTUFBTSxVQUFVLEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBYSxFQUFFLE9BQW1CLFFBQVE7SUFDdEUsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLElBQVcsRUFBRSxJQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFeEYsdUJBQXVCO0FBQ3ZCLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBTyxFQUFFLElBQVcsRUFBRSxLQUFhLEVBQUUsT0FBbUIsUUFBUTtJQUNsRixPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3hDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1NBQ2YsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsQ0FBTyxFQUFFLElBQVcsRUFBRSxLQUFhLEVBQUUsSUFBaUI7SUFDN0UsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFDRCxNQUFNLFVBQVUsUUFBUSxDQUFDLENBQU8sRUFBRSxJQUFXLEVBQUUsS0FBYSxFQUFFLElBQWlCO0lBQzdFLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQscUJBQXFCO0FBQ3JCLE1BQU0sVUFBVSxLQUFLLENBQUMsQ0FBTyxFQUFFLElBQVcsRUFBRSxJQUFVO0lBQ3BELE9BQU8sQ0FBQyxDQUFDLEdBQUcscUJBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRCxrQkFBa0I7QUFDbEIsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFhO0lBQ2pDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLGtCQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0csQ0FBQztBQUNELG1CQUFtQjtBQUNuQixNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQWE7SUFDbEMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFDRCxvQkFBb0I7QUFDcEIsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhO0lBQ25DLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxHQUFHLE9BQVk7SUFDckMsT0FBTyxHQUFHLHVCQUFZLE9BQU8sQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFRLEVBQUUsR0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBUyxFQUFFLE9BQVksRUFBRSxHQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUYsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTlDLE1BQU0sVUFBVSxJQUFJLENBQUMsQ0FBYTtJQUNoQyxJQUFJLENBQUM7UUFDSCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1gsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDYixLQUFLLEdBQUcsQ0FBQztnQkFDVCxLQUFLLEdBQUc7b0JBQ04sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQixLQUFLLEdBQUc7b0JBQ04sT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDOztZQUFNLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFVRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQWEsRUFBRSxDQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBYTtJQUNsRyxtREFBbUQ7SUFDbkQsSUFDRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFDNUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUNsQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFDWixNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQ25CLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDckQsQ0FBQztTQUNFLEdBQUcsQ0FBQztRQUNILE1BQU07UUFDTixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJO1FBQ3BGLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUk7UUFDeEYsTUFBTTtRQUNOLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSTtRQUNoRixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7S0FDcEksQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQU9E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