remove IIFE

This commit is contained in:
2026-05-10 01:33:44 +02:00
parent 0a790de054
commit 8b2e67b3b0
7 changed files with 827 additions and 1448 deletions

395
dist/sigpro.esm.js vendored
View File

@@ -1,395 +0,0 @@
// src/sigpro.js
var isF = (f) => typeof f == "function";
var isO = (o) => o && typeof o == "object";
var isA = Array.isArray;
var doc = typeof document < "u" ? document : null;
var txt = (s) => doc.createTextNode(s == null ? "" : String(s));
var toNd = (n) => n?._rt ? n._cnt : n instanceof Node ? n : txt(n);
var Fragment = (p) => p.children;
var val = (v) => isF(v) ? v() : v;
var aEff = null;
var aOwn = null;
var isFlushing = 0;
var bDepth = 0;
var eQ = new Set;
var MOUNTED = new WeakMap;
var SVG_NS = "http://www.w3.org/2000/svg";
var XLINK = "http://www.w3.org/1999/xlink";
var SVG_TAGS = new Set("svg,path,circle,rect,line,polyline,polygon,g,defs,text,textPath,tspan,use,symbol,image,marker,ellipse".split(","));
var DANG_ATTR = new Set(["src", "href", "formaction", "action", "background", "code", "archive"]);
var clr = (s) => {
if (s) {
s.forEach((f) => f());
s.clear();
}
};
var dispose = (e) => {
if (!e || e._x)
return;
e._x = 1;
let st = [e], c;
while (c = st.pop()) {
clr(c._c);
if (c._ch) {
c._ch.forEach((x) => st.push(x));
c._ch.clear();
}
if (c._d) {
c._d.forEach((d) => d.delete(c));
c._d.clear();
}
}
};
var onUnmount = (f) => aOwn && (aOwn._c ||= new Set).add(f);
var untrack = (f) => {
let p = aEff;
aEff = null;
try {
return f();
} finally {
aEff = p;
}
};
var createEffect = (f, isC = 0) => {
const e = () => {
if (e._x)
return;
if (e._d)
e._d.forEach((s) => s.delete(e));
clr(e._c);
let pE = aEff, pO = aOwn;
aEff = aOwn = e;
try {
return e._res = f();
} catch (err) {
console.error("[SigPro]", err);
} finally {
aEff = pE;
aOwn = pO;
}
};
e._d = e._c = e._ch = null;
e._x = 0;
e._iC = isC;
e._dp = aEff ? aEff._dp + 1 : 0;
e._m = [];
e._p = aOwn;
if (aOwn)
(aOwn._ch ||= new Set).add(e);
return e;
};
var flush = () => {
if (isFlushing)
return;
isFlushing = 1;
let q = [...eQ].sort((a, b) => a._dp - b._dp);
eQ.clear();
for (let e of q)
if (!e._x)
e();
isFlushing = 0;
};
var batch = (f) => {
bDepth++;
try {
return f();
} finally {
if (!--bDepth && eQ.size && !isFlushing)
flush();
}
};
var trkUpd = (s, trg = 0) => {
if (!trg && aEff && !aEff._x) {
s.add(aEff);
(aEff._d ||= new Set).add(s);
} else if (trg && s.size) {
let q = 0;
for (let e of s) {
if (e === aEff || e._x)
continue;
if (e._iC) {
e._dt = 1;
if (e._sb)
trkUpd(e._sb, 1);
} else {
eQ.add(e);
q = 1;
}
}
if (q && !isFlushing && !bDepth)
queueMicrotask(flush);
}
};
var $ = (v, k = null) => {
let s = new Set;
if (isF(v)) {
let c, cp = () => {
if (cp._dt) {
let p = aEff;
aEff = cp;
try {
let n = v();
if (!Object.is(c, n)) {
c = n;
trkUpd(s, 1);
}
} finally {
aEff = p;
}
cp._dt = 0;
}
trkUpd(s);
return c;
};
cp._iC = cp._dt = 1;
cp._sb = s;
cp._d = null;
cp._x = 0;
return cp;
}
if (k)
try {
v = JSON.parse(localStorage.getItem(k)) ?? v;
} catch (e) {}
return (...a) => {
if (a.length) {
let n = isF(a[0]) ? a[0](v) : a[0];
if (!Object.is(v, n)) {
v = n;
if (k)
localStorage.setItem(k, JSON.stringify(v));
trkUpd(s, 1);
}
}
trkUpd(s);
return v;
};
};
var watch = (src, cb) => {
let e = createEffect(cb ? () => {
let v = isA(src) ? src.map((s) => s()) : src();
untrack(() => cb(v));
} : src);
e();
return () => dispose(e);
};
var clnNd = (n) => {
if (!n)
return;
clr(n._c);
if (n._oE)
dispose(n._oE);
if (n.childNodes)
n.childNodes.forEach(clnNd);
};
var valAtt = (k, v) => v == null || v === false ? null : (DANG_ATTR.has(k) || k.startsWith("on")) && /^\s*(javascript|data|vbscript):/i.test(String(v)) ? "#" : v;
var h = (tag, prp = {}, ch = []) => {
if (prp instanceof Node || isA(prp) || !isO(prp)) {
ch = prp;
prp = {};
}
if (isF(tag)) {
let e = createEffect(() => e._res = tag(prp, { children: ch, emit: (ev, ...a) => prp[`on${ev[0].toUpperCase()}${ev.slice(1)}`]?.(...a) }));
e();
if (e._res == null)
return null;
let nd = e._res instanceof Node || isA(e._res) && e._res.every((n) => n instanceof Node) ? e._res : txt(e._res);
let att = (n) => {
if (isO(n) && !n._rt) {
n._m = e._m || [];
n._c = e._c || new Set;
n._oE = e;
}
};
isA(nd) ? nd.forEach(att) : att(nd);
return nd;
}
let isS = SVG_TAGS.has(tag), el = isS ? doc.createElementNS(SVG_NS, tag) : doc.createElement(tag);
el._c = new Set;
for (let k in prp) {
let v = prp[k];
if (k === "ref") {
isF(v) ? v(el) : v.current = el;
continue;
}
if (isS && k.startsWith("xlink:")) {
let cv = valAtt(k.slice(6), v);
cv == null ? el.removeAttributeNS(XLINK, k.slice(6)) : el.setAttributeNS(XLINK, k.slice(6), cv);
continue;
}
if (k.startsWith("on")) {
let ev = k.slice(2).toLowerCase();
el.addEventListener(ev, v);
let off = () => el.removeEventListener(ev, v);
el._c.add(off);
onUnmount(off);
} else if (isF(v)) {
let e = createEffect(() => {
let r = valAtt(k, v());
if (k === "class")
el.className = r || "";
else if (r == null)
el.removeAttribute(k);
else if (k === "style" && typeof r == "string")
el.setAttribute("style", r);
else if (k in el && !isS)
el[k] = r;
else
el.setAttribute(k, r === true ? "" : r);
});
e();
el._c.add(() => dispose(e));
onUnmount(() => dispose(e));
if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && (k === "value" || k === "checked")) {
el.addEventListener(k === "checked" ? "change" : "input", (ev) => v(ev.target[k]));
}
} else {
let r = valAtt(k, v);
if (r != null) {
if (k === "style" && typeof r == "string")
el.setAttribute("style", r);
else if (k in el && !isS)
el[k] = r;
else
el.setAttribute(k, r === true ? "" : r);
}
}
}
const app = (c) => {
if (isA(c))
return c.forEach(app);
if (isF(c)) {
let anc = txt(""), cur = [];
el.appendChild(anc);
let e = createEffect(() => {
let r = c(), nxt = (isA(r) ? r : [r]).map(toNd), ref = anc;
cur.forEach((n) => {
n._rt ? n._del() : clnNd(n);
if (n.parentNode)
n.remove();
});
for (let i = nxt.length - 1;i >= 0; i--) {
let nd = nxt[i];
if (nd.parentNode !== ref.parentNode)
ref.parentNode?.insertBefore(nd, ref);
if (nd._m)
nd._m.forEach((f) => f());
ref = nd;
}
cur = nxt;
});
e();
el._c.add(() => dispose(e));
onUnmount(() => dispose(e));
} else {
let nd = toNd(c);
el.appendChild(nd);
if (nd._m)
nd._m.forEach((f) => f());
}
};
app(ch);
return el;
};
var render = (rFn) => {
let c = new Set, pO = aOwn, pE = aEff, cnt = doc.createElement("div");
cnt.style.display = "contents";
cnt.setAttribute("role", "presentation");
aOwn = { _c: c };
aEff = null;
const pRes = (r) => {
if (!r)
return;
if (r._rt) {
c.add(r._del);
cnt.appendChild(r._cnt);
} else if (isA(r))
r.forEach(pRes);
else
cnt.appendChild(r instanceof Node ? r : txt(r));
};
try {
pRes(rFn({ onCleanup: (f) => c.add(f) }));
} finally {
aOwn = pO;
aEff = pE;
}
return { _rt: 1, _cnt: cnt, _del: () => {
clr(c);
clnNd(cnt);
cnt.remove();
} };
};
var when = (c, Y, N = null) => {
let anc = txt(""), rt = h("div", { style: "display:contents" }, [anc]), v;
watch(() => !!val(c), (s) => {
if (v) {
v._del();
v = null;
}
let ct = s ? Y : N;
if (ct) {
v = render(() => val(ct));
rt.insertBefore(v._cnt, anc);
}
});
onUnmount(() => v?._del());
return rt;
};
var each = (s, fn, kF) => {
let anc = txt(""), rt = h("div", { style: "display:contents" }, [anc]), cch = new Map;
watch(() => val(s) || [], (it) => {
let nCc = new Map, nOd = [];
for (let i = 0, l = (it || []).length;i < l; i++) {
let t = it[i], k = kF ? t?.[kF] ?? i : t?.id ?? i, v = cch.get(k);
if (!v)
v = render(() => fn(t, i));
else
cch.delete(k);
nCc.set(k, v);
nOd.push(v);
}
cch.forEach((v) => v._del());
let ref = anc;
for (let i = nOd.length - 1;i >= 0; i--) {
let nd = nOd[i]._cnt;
if (nd.nextSibling !== ref)
rt.insertBefore(nd, ref);
ref = nd;
}
cch = nCc;
});
return rt;
};
var mount = (c, tgt) => {
let t = typeof tgt == "string" ? doc.querySelector(tgt) : tgt;
if (!t)
return;
if (MOUNTED.has(t))
MOUNTED.get(t)._del();
let i = render(isF(c) ? c : () => c);
t.replaceChildren(i._cnt);
MOUNTED.set(t, i);
return i;
};
var SigPro = { $, watch, batch, h, Fragment, render, mount, when, each, onUnmount, val, isA, isF, isO };
if (typeof window !== "undefined") {
window.SigPro = SigPro;
"a abbr article aside audio b blockquote br button canvas caption cite code col colgroup datalist dd del details dfn dialog div dl dt em embed fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 header hr i iframe img input ins kbd label legend li main mark meter nav object ol optgroup option output p picture pre progress section select slot small source span strong sub summary sup svg table tbody td template textarea tfoot th thead time tr u ul video".split(" ").forEach((t) => window[t] = (p, c) => h(t, p, c));
}
export {
watch,
val,
render,
onUnmount,
mount,
isO,
isF,
isA,
h,
each,
batch,
SigPro,
Fragment,
$
};

850
dist/sigpro.js vendored
View File

@@ -1,503 +1,395 @@
(() => { // src/sigpro.js
var __defProp = Object.defineProperty; var isF = (f) => typeof f == "function";
var __returnValue = (v) => v; var isO = (o) => o && typeof o == "object";
function __exportSetter(name, newValue) { var isA = Array.isArray;
this[name] = __returnValue.bind(null, newValue); var doc = typeof document < "u" ? document : null;
var txt = (s) => doc.createTextNode(s == null ? "" : String(s));
var toNd = (n) => n?._rt ? n._cnt : n instanceof Node ? n : txt(n);
var Fragment = (p) => p.children;
var val = (v) => isF(v) ? v() : v;
var aEff = null;
var aOwn = null;
var isFlushing = 0;
var bDepth = 0;
var eQ = new Set;
var MOUNTED = new WeakMap;
var SVG_NS = "http://www.w3.org/2000/svg";
var XLINK = "http://www.w3.org/1999/xlink";
var SVG_TAGS = new Set("svg,path,circle,rect,line,polyline,polygon,g,defs,text,textPath,tspan,use,symbol,image,marker,ellipse".split(","));
var DANG_ATTR = new Set(["src", "href", "formaction", "action", "background", "code", "archive"]);
var clr = (s) => {
if (s) {
s.forEach((f) => f());
s.clear();
} }
var __export = (target, all) => { };
for (var name in all) var dispose = (e) => {
__defProp(target, name, { if (!e || e._x)
get: all[name], return;
enumerable: true, e._x = 1;
configurable: true, let st = [e], c;
set: __exportSetter.bind(all, name) while (c = st.pop()) {
}); clr(c._c);
}; if (c._ch) {
c._ch.forEach((x) => st.push(x));
// src/sigpro.js c._ch.clear();
var exports_sigpro = {};
__export(exports_sigpro, {
watch: () => watch,
val: () => val,
render: () => render,
onUnmount: () => onUnmount,
mount: () => mount,
isO: () => isO,
isF: () => isF,
isA: () => isA,
h: () => h,
each: () => each,
batch: () => batch,
SigPro: () => SigPro,
Fragment: () => Fragment,
$: () => $
});
var isF = (f) => typeof f == "function";
var isO = (o) => o && typeof o == "object";
var isA = Array.isArray;
var doc = typeof document < "u" ? document : null;
var txt = (s) => doc.createTextNode(s == null ? "" : String(s));
var toNd = (n) => n?._rt ? n._cnt : n instanceof Node ? n : txt(n);
var Fragment = (p) => p.children;
var val = (v) => isF(v) ? v() : v;
var aEff = null;
var aOwn = null;
var isFlushing = 0;
var bDepth = 0;
var eQ = new Set;
var MOUNTED = new WeakMap;
var SVG_NS = "http://www.w3.org/2000/svg";
var XLINK = "http://www.w3.org/1999/xlink";
var SVG_TAGS = new Set("svg,path,circle,rect,line,polyline,polygon,g,defs,text,textPath,tspan,use,symbol,image,marker,ellipse".split(","));
var DANG_ATTR = new Set(["src", "href", "formaction", "action", "background", "code", "archive"]);
var clr = (s) => {
if (s) {
s.forEach((f) => f());
s.clear();
} }
}; if (c._d) {
var dispose = (e) => { c._d.forEach((d) => d.delete(c));
if (!e || e._x) c._d.clear();
}
}
};
var onUnmount = (f) => aOwn && (aOwn._c ||= new Set).add(f);
var untrack = (f) => {
let p = aEff;
aEff = null;
try {
return f();
} finally {
aEff = p;
}
};
var createEffect = (f, isC = 0) => {
const e = () => {
if (e._x)
return; return;
e._x = 1; if (e._d)
let st = [e], c; e._d.forEach((s) => s.delete(e));
while (c = st.pop()) { clr(e._c);
clr(c._c); let pE = aEff, pO = aOwn;
if (c._ch) { aEff = aOwn = e;
c._ch.forEach((x) => st.push(x));
c._ch.clear();
}
if (c._d) {
c._d.forEach((d) => d.delete(c));
c._d.clear();
}
}
};
var onUnmount = (f) => aOwn && (aOwn._c ||= new Set).add(f);
var untrack = (f) => {
let p = aEff;
aEff = null;
try { try {
return f(); return e._res = f();
} catch (err) {
console.error("[SigPro]", err);
} finally { } finally {
aEff = p; aEff = pE;
aOwn = pO;
} }
}; };
var createEffect = (f, isC = 0) => { e._d = e._c = e._ch = null;
const e = () => { e._x = 0;
if (e._x) e._iC = isC;
return; e._dp = aEff ? aEff._dp + 1 : 0;
if (e._d) e._m = [];
e._d.forEach((s) => s.delete(e)); e._p = aOwn;
clr(e._c); if (aOwn)
let pE = aEff, pO = aOwn; (aOwn._ch ||= new Set).add(e);
aEff = aOwn = e; return e;
try { };
return e._res = f(); var flush = () => {
} catch (err) { if (isFlushing)
console.error("[SigPro]", err); return;
} finally { isFlushing = 1;
aEff = pE; let q = [...eQ].sort((a, b) => a._dp - b._dp);
aOwn = pO; eQ.clear();
for (let e of q)
if (!e._x)
e();
isFlushing = 0;
};
var batch = (f) => {
bDepth++;
try {
return f();
} finally {
if (!--bDepth && eQ.size && !isFlushing)
flush();
}
};
var trkUpd = (s, trg = 0) => {
if (!trg && aEff && !aEff._x) {
s.add(aEff);
(aEff._d ||= new Set).add(s);
} else if (trg && s.size) {
let q = 0;
for (let e of s) {
if (e === aEff || e._x)
continue;
if (e._iC) {
e._dt = 1;
if (e._sb)
trkUpd(e._sb, 1);
} else {
eQ.add(e);
q = 1;
} }
};
e._d = e._c = e._ch = null;
e._x = 0;
e._iC = isC;
e._dp = aEff ? aEff._dp + 1 : 0;
e._m = [];
e._p = aOwn;
if (aOwn)
(aOwn._ch ||= new Set).add(e);
return e;
};
var flush = () => {
if (isFlushing)
return;
isFlushing = 1;
let q = [...eQ].sort((a, b) => a._dp - b._dp);
eQ.clear();
for (let e of q)
if (!e._x)
e();
isFlushing = 0;
};
var batch = (f) => {
bDepth++;
try {
return f();
} finally {
if (!--bDepth && eQ.size && !isFlushing)
flush();
} }
}; if (q && !isFlushing && !bDepth)
var trkUpd = (s, trg = 0) => { queueMicrotask(flush);
if (!trg && aEff && !aEff._x) { }
s.add(aEff); };
(aEff._d ||= new Set).add(s); var $ = (v, k = null) => {
} else if (trg && s.size) { let s = new Set;
let q = 0; if (isF(v)) {
for (let e of s) { let c, cp = () => {
if (e === aEff || e._x) if (cp._dt) {
continue; let p = aEff;
if (e._iC) { aEff = cp;
e._dt = 1; try {
if (e._sb) let n = v();
trkUpd(e._sb, 1); if (!Object.is(c, n)) {
} else { c = n;
eQ.add(e); trkUpd(s, 1);
q = 1;
}
}
if (q && !isFlushing && !bDepth)
queueMicrotask(flush);
}
};
var $ = (v, k = null) => {
let s = new Set;
if (isF(v)) {
let c, cp = () => {
if (cp._dt) {
let p = aEff;
aEff = cp;
try {
let n = v();
if (!Object.is(c, n)) {
c = n;
trkUpd(s, 1);
}
} finally {
aEff = p;
} }
cp._dt = 0; } finally {
} aEff = p;
trkUpd(s);
return c;
};
cp._iC = cp._dt = 1;
cp._sb = s;
cp._d = null;
cp._x = 0;
return cp;
}
if (k)
try {
v = JSON.parse(localStorage.getItem(k)) ?? v;
} catch (e) {}
return (...a) => {
if (a.length) {
let n = isF(a[0]) ? a[0](v) : a[0];
if (!Object.is(v, n)) {
v = n;
if (k)
localStorage.setItem(k, JSON.stringify(v));
trkUpd(s, 1);
} }
cp._dt = 0;
} }
trkUpd(s); trkUpd(s);
return v; return c;
}; };
cp._iC = cp._dt = 1;
cp._sb = s;
cp._d = null;
cp._x = 0;
return cp;
}
if (k)
try {
v = JSON.parse(localStorage.getItem(k)) ?? v;
} catch (e) {}
return (...a) => {
if (a.length) {
let n = isF(a[0]) ? a[0](v) : a[0];
if (!Object.is(v, n)) {
v = n;
if (k)
localStorage.setItem(k, JSON.stringify(v));
trkUpd(s, 1);
}
}
trkUpd(s);
return v;
}; };
var watch = (src, cb) => { };
let e = createEffect(cb ? () => { var watch = (src, cb) => {
let v = isA(src) ? src.map((s) => s()) : src(); let e = createEffect(cb ? () => {
untrack(() => cb(v)); let v = isA(src) ? src.map((s) => s()) : src();
} : src); untrack(() => cb(v));
} : src);
e();
return () => dispose(e);
};
var clnNd = (n) => {
if (!n)
return;
clr(n._c);
if (n._oE)
dispose(n._oE);
if (n.childNodes)
n.childNodes.forEach(clnNd);
};
var valAtt = (k, v) => v == null || v === false ? null : (DANG_ATTR.has(k) || k.startsWith("on")) && /^\s*(javascript|data|vbscript):/i.test(String(v)) ? "#" : v;
var h = (tag, prp = {}, ch = []) => {
if (prp instanceof Node || isA(prp) || !isO(prp)) {
ch = prp;
prp = {};
}
if (isF(tag)) {
let e = createEffect(() => e._res = tag(prp, { children: ch, emit: (ev, ...a) => prp[`on${ev[0].toUpperCase()}${ev.slice(1)}`]?.(...a) }));
e(); e();
return () => dispose(e); if (e._res == null)
}; return null;
var clnNd = (n) => { let nd = e._res instanceof Node || isA(e._res) && e._res.every((n) => n instanceof Node) ? e._res : txt(e._res);
if (!n) let att = (n) => {
return; if (isO(n) && !n._rt) {
clr(n._c); n._m = e._m || [];
if (n._oE) n._c = e._c || new Set;
dispose(n._oE); n._oE = e;
if (n.childNodes)
n.childNodes.forEach(clnNd);
};
var valAtt = (k, v) => v == null || v === false ? null : (DANG_ATTR.has(k) || k.startsWith("on")) && /^\s*(javascript|data|vbscript):/i.test(String(v)) ? "#" : v;
var h = (tag, prp = {}, ch = []) => {
if (prp instanceof Node || isA(prp) || !isO(prp)) {
ch = prp;
prp = {};
}
if (isF(tag)) {
let e = createEffect(() => e._res = tag(prp, { children: ch, emit: (ev, ...a) => prp[`on${ev[0].toUpperCase()}${ev.slice(1)}`]?.(...a) }));
e();
if (e._res == null)
return null;
let nd = e._res instanceof Node || isA(e._res) && e._res.every((n) => n instanceof Node) ? e._res : txt(e._res);
let att = (n) => {
if (isO(n) && !n._rt) {
n._m = e._m || [];
n._c = e._c || new Set;
n._oE = e;
}
};
isA(nd) ? nd.forEach(att) : att(nd);
return nd;
}
let isS = SVG_TAGS.has(tag), el = isS ? doc.createElementNS(SVG_NS, tag) : doc.createElement(tag);
el._c = new Set;
for (let k in prp) {
let v = prp[k];
if (k === "ref") {
isF(v) ? v(el) : v.current = el;
continue;
}
if (isS && k.startsWith("xlink:")) {
let cv = valAtt(k.slice(6), v);
cv == null ? el.removeAttributeNS(XLINK, k.slice(6)) : el.setAttributeNS(XLINK, k.slice(6), cv);
continue;
}
if (k.startsWith("on")) {
let ev = k.slice(2).toLowerCase();
el.addEventListener(ev, v);
let off = () => el.removeEventListener(ev, v);
el._c.add(off);
onUnmount(off);
} else if (isF(v)) {
let e = createEffect(() => {
let r = valAtt(k, v());
if (k === "class")
el.className = r || "";
else if (r == null)
el.removeAttribute(k);
else if (k === "style" && typeof r == "string")
el.setAttribute("style", r);
else if (k in el && !isS)
el[k] = r;
else
el.setAttribute(k, r === true ? "" : r);
});
e();
el._c.add(() => dispose(e));
onUnmount(() => dispose(e));
if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && (k === "value" || k === "checked")) {
el.addEventListener(k === "checked" ? "change" : "input", (ev) => v(ev.target[k]));
}
} else {
let r = valAtt(k, v);
if (r != null) {
if (k === "style" && typeof r == "string")
el.setAttribute("style", r);
else if (k in el && !isS)
el[k] = r;
else
el.setAttribute(k, r === true ? "" : r);
}
}
}
const app = (c) => {
if (isA(c))
return c.forEach(app);
if (isF(c)) {
let anc = txt(""), cur = [];
el.appendChild(anc);
let e = createEffect(() => {
let r = c(), nxt = (isA(r) ? r : [r]).map(toNd), ref = anc;
cur.forEach((n) => {
n._rt ? n._del() : clnNd(n);
if (n.parentNode)
n.remove();
});
for (let i = nxt.length - 1;i >= 0; i--) {
let nd = nxt[i];
if (nd.parentNode !== ref.parentNode)
ref.parentNode?.insertBefore(nd, ref);
if (nd._m)
nd._m.forEach((f) => f());
ref = nd;
}
cur = nxt;
});
e();
el._c.add(() => dispose(e));
onUnmount(() => dispose(e));
} else {
let nd = toNd(c);
el.appendChild(nd);
if (nd._m)
nd._m.forEach((f) => f());
} }
}; };
app(ch); isA(nd) ? nd.forEach(att) : att(nd);
return el; return nd;
}; }
var render = (rFn) => { let isS = SVG_TAGS.has(tag), el = isS ? doc.createElementNS(SVG_NS, tag) : doc.createElement(tag);
let c = new Set, pO = aOwn, pE = aEff, cnt = doc.createElement("div"); el._c = new Set;
cnt.style.display = "contents"; for (let k in prp) {
cnt.setAttribute("role", "presentation"); let v = prp[k];
aOwn = { _c: c }; if (k === "ref") {
aEff = null; isF(v) ? v(el) : v.current = el;
const pRes = (r) => { continue;
if (!r)
return;
if (r._rt) {
c.add(r._del);
cnt.appendChild(r._cnt);
} else if (isA(r))
r.forEach(pRes);
else
cnt.appendChild(r instanceof Node ? r : txt(r));
};
try {
pRes(rFn({ onCleanup: (f) => c.add(f) }));
} finally {
aOwn = pO;
aEff = pE;
} }
return { _rt: 1, _cnt: cnt, _del: () => { if (isS && k.startsWith("xlink:")) {
clr(c); let cv = valAtt(k.slice(6), v);
clnNd(cnt); cv == null ? el.removeAttributeNS(XLINK, k.slice(6)) : el.setAttributeNS(XLINK, k.slice(6), cv);
cnt.remove(); continue;
} }; }
}; if (k.startsWith("on")) {
var when = (c, Y, N = null) => { let ev = k.slice(2).toLowerCase();
let anc = txt(""), rt = h("div", { style: "display:contents" }, [anc]), v; el.addEventListener(ev, v);
watch(() => !!val(c), (s) => { let off = () => el.removeEventListener(ev, v);
if (v) { el._c.add(off);
v._del(); onUnmount(off);
v = null; } else if (isF(v)) {
} let e = createEffect(() => {
let ct = s ? Y : N; let r = valAtt(k, v());
if (ct) { if (k === "class")
v = render(() => val(ct)); el.className = r || "";
rt.insertBefore(v._cnt, anc); else if (r == null)
} el.removeAttribute(k);
}); else if (k === "style" && typeof r == "string")
onUnmount(() => v?._del()); el.setAttribute("style", r);
return rt; else if (k in el && !isS)
}; el[k] = r;
var each = (s, fn, kF) => {
let anc = txt(""), rt = h("div", { style: "display:contents" }, [anc]), cch = new Map;
watch(() => val(s) || [], (it) => {
let nCc = new Map, nOd = [];
for (let i = 0, l = (it || []).length;i < l; i++) {
let t = it[i], k = kF ? t?.[kF] ?? i : t?.id ?? i, v = cch.get(k);
if (!v)
v = render(() => fn(t, i));
else else
cch.delete(k); el.setAttribute(k, r === true ? "" : r);
nCc.set(k, v);
nOd.push(v);
}
cch.forEach((v) => v._del());
let ref = anc;
for (let i = nOd.length - 1;i >= 0; i--) {
let nd = nOd[i]._cnt;
if (nd.nextSibling !== ref)
rt.insertBefore(nd, ref);
ref = nd;
}
cch = nCc;
});
return rt;
};
var mount = (c, tgt) => {
let t = typeof tgt == "string" ? doc.querySelector(tgt) : tgt;
if (!t)
return;
if (MOUNTED.has(t))
MOUNTED.get(t)._del();
let i = render(isF(c) ? c : () => c);
t.replaceChildren(i._cnt);
MOUNTED.set(t, i);
return i;
};
var SigPro = { $, watch, batch, h, Fragment, render, mount, when, each, onUnmount, val, isA, isF, isO };
if (typeof window !== "undefined") {
window.SigPro = SigPro;
"a abbr article aside audio b blockquote br button canvas caption cite code col colgroup datalist dd del details dfn dialog div dl dt em embed fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 header hr i iframe img input ins kbd label legend li main mark meter nav object ol optgroup option output p picture pre progress section select slot small source span strong sub summary sup svg table tbody td template textarea tfoot th thead time tr u ul video".split(" ").forEach((t) => window[t] = (p, c) => h(t, p, c));
}
// src/sigpro.utils.js
var exports_sigpro_utils = {};
__export(exports_sigpro_utils, {
t: () => t,
setLocale: () => setLocale,
router: () => router,
db: () => db,
addLang: () => addLang
});
var router = (routes) => {
const getHash = () => window.location.hash.slice(1) || "/";
const path = $(getHash());
const handler = () => path(getHash());
window.addEventListener("hashchange", handler);
const hook = h("div", { class: "router-hook" });
let currentView = null;
watch([path], () => {
const cur = path();
const route = routes.find((r) => {
const p1 = r.path.split("/").filter(Boolean);
const p2 = cur.split("/").filter(Boolean);
return p1.length === p2.length && p1.every((p, i) => p[0] === ":" || p === p2[i]);
}) || routes.find((r) => r.path === "*");
if (route) {
currentView?.destroy();
const params = {};
route.path.split("/").filter(Boolean).forEach((p, i) => {
if (p[0] === ":")
params[p.slice(1)] = cur.split("/").filter(Boolean)[i];
});
router.params(params);
currentView = render(() => isF(route.component) ? route.component(params) : route.component);
hook.replaceChildren(currentView.container);
}
});
hook.destroy = () => {
window.removeEventListener("hashchange", handler);
currentView?.destroy();
};
return hook;
};
router.params = $({});
router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
router.back = () => window.history.back();
router.path = () => window.location.hash.replace(/^#/, "") || "/";
var db = async (url, data = {}, loading = null) => {
if (loading)
loading(true);
try {
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
credentials: "include"
}); });
if (!res.ok) { e();
const errorText = await res.text(); el._c.add(() => dispose(e));
throw new Error(`Error ${res.status}: ${errorText}`); onUnmount(() => dispose(e));
if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && (k === "value" || k === "checked")) {
el.addEventListener(k === "checked" ? "change" : "input", (ev) => v(ev.target[k]));
}
} else {
let r = valAtt(k, v);
if (r != null) {
if (k === "style" && typeof r == "string")
el.setAttribute("style", r);
else if (k in el && !isS)
el[k] = r;
else
el.setAttribute(k, r === true ? "" : r);
} }
return await res.json();
} finally {
if (loading)
loading(false);
} }
};
var currentLocale = $("en");
var translations = {};
var addLang = (obj) => {
for (const locale of Object.keys(obj)) {
if (!translations[locale])
translations[locale] = {};
Object.assign(translations[locale], obj[locale]);
}
};
var setLocale = (locale) => {
if (locale && translations[locale]) {
currentLocale(locale);
}
};
var t = (key) => {
return () => translations[currentLocale()]?.[key] ?? key;
};
// src/build_umd.js
if (typeof window !== "undefined") {
const SigPro2 = { ...exports_sigpro, ...exports_sigpro_utils };
window.SigPro = SigPro2;
Object.assign(window, SigPro2);
} }
})(); const app = (c) => {
if (isA(c))
return c.forEach(app);
if (isF(c)) {
let anc = txt(""), cur = [];
el.appendChild(anc);
let e = createEffect(() => {
let r = c(), nxt = (isA(r) ? r : [r]).map(toNd), ref = anc;
cur.forEach((n) => {
n._rt ? n._del() : clnNd(n);
if (n.parentNode)
n.remove();
});
for (let i = nxt.length - 1;i >= 0; i--) {
let nd = nxt[i];
if (nd.parentNode !== ref.parentNode)
ref.parentNode?.insertBefore(nd, ref);
if (nd._m)
nd._m.forEach((f) => f());
ref = nd;
}
cur = nxt;
});
e();
el._c.add(() => dispose(e));
onUnmount(() => dispose(e));
} else {
let nd = toNd(c);
el.appendChild(nd);
if (nd._m)
nd._m.forEach((f) => f());
}
};
app(ch);
return el;
};
var render = (rFn) => {
let c = new Set, pO = aOwn, pE = aEff, cnt = doc.createElement("div");
cnt.style.display = "contents";
cnt.setAttribute("role", "presentation");
aOwn = { _c: c };
aEff = null;
const pRes = (r) => {
if (!r)
return;
if (r._rt) {
c.add(r._del);
cnt.appendChild(r._cnt);
} else if (isA(r))
r.forEach(pRes);
else
cnt.appendChild(r instanceof Node ? r : txt(r));
};
try {
pRes(rFn({ onCleanup: (f) => c.add(f) }));
} finally {
aOwn = pO;
aEff = pE;
}
return { _rt: 1, _cnt: cnt, _del: () => {
clr(c);
clnNd(cnt);
cnt.remove();
} };
};
var when = (c, Y, N = null) => {
let anc = txt(""), rt = h("div", { style: "display:contents" }, [anc]), v;
watch(() => !!val(c), (s) => {
if (v) {
v._del();
v = null;
}
let ct = s ? Y : N;
if (ct) {
v = render(() => val(ct));
rt.insertBefore(v._cnt, anc);
}
});
onUnmount(() => v?._del());
return rt;
};
var each = (s, fn, kF) => {
let anc = txt(""), rt = h("div", { style: "display:contents" }, [anc]), cch = new Map;
watch(() => val(s) || [], (it) => {
let nCc = new Map, nOd = [];
for (let i = 0, l = (it || []).length;i < l; i++) {
let t = it[i], k = kF ? t?.[kF] ?? i : t?.id ?? i, v = cch.get(k);
if (!v)
v = render(() => fn(t, i));
else
cch.delete(k);
nCc.set(k, v);
nOd.push(v);
}
cch.forEach((v) => v._del());
let ref = anc;
for (let i = nOd.length - 1;i >= 0; i--) {
let nd = nOd[i]._cnt;
if (nd.nextSibling !== ref)
rt.insertBefore(nd, ref);
ref = nd;
}
cch = nCc;
});
return rt;
};
var mount = (c, tgt) => {
let t = typeof tgt == "string" ? doc.querySelector(tgt) : tgt;
if (!t)
return;
if (MOUNTED.has(t))
MOUNTED.get(t)._del();
let i = render(isF(c) ? c : () => c);
t.replaceChildren(i._cnt);
MOUNTED.set(t, i);
return i;
};
var SigPro = { $, watch, batch, h, Fragment, render, mount, when, each, onUnmount, val, isA, isF, isO };
if (typeof window !== "undefined") {
window.SigPro = SigPro;
"a abbr article aside audio b blockquote br button canvas caption cite code col colgroup datalist dd del details dfn dialog div dl dt em embed fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 header hr i iframe img input ins kbd label legend li main mark meter nav object ol optgroup option output p picture pre progress section select slot small source span strong sub summary sup svg table tbody td template textarea tfoot th thead time tr u ul video".split(" ").forEach((t) => window[t] = (p, c) => h(t, p, c));
}
export {
watch,
val,
render,
onUnmount,
mount,
isO,
isF,
isA,
h,
each,
batch,
SigPro,
Fragment,
$
};

View File

@@ -1,76 +1,74 @@
(() => { // src/convert.js
// src/convert.js import { $ } from "./sigpro.js";
var { $, div, h1, label, textarea, button, span } = window; function html2sigpro(h) {
function html2sigpro(h) { const B = new Set(["allowfullscreen", "async", "autofocus", "autoplay", "checked", "controls", "default", "defer", "disabled", "formnovalidate", "hidden", "ismap", "itemscope", "loop", "multiple", "muted", "nomodule", "novalidate", "open", "playsinline", "readonly", "required", "reversed", "selected", "truespeed"]), esc = (v) => v.replace(/"/g, "\\\""), bP = (el) => {
const B = new Set(["allowfullscreen", "async", "autofocus", "autoplay", "checked", "controls", "default", "defer", "disabled", "formnovalidate", "hidden", "ismap", "itemscope", "loop", "multiple", "muted", "nomodule", "novalidate", "open", "playsinline", "readonly", "required", "reversed", "selected", "truespeed"]), esc = (v) => v.replace(/"/g, "\\\""), bP = (el) => { let a = [...el.attributes].map(({ name: n, value: v }) => /^on/i.test(n) ? `${n}: (e) => { ${v.replace(/\s+/g, " ").trim()} }` : B.has(n.toLowerCase()) && (!v || v == n) ? `${n}: true` : `${n}: "${esc(v)}"`);
let a = [...el.attributes].map(({ name: n, value: v }) => /^on/i.test(n) ? `${n}: (e) => { ${v.replace(/\s+/g, " ").trim()} }` : B.has(n.toLowerCase()) && (!v || v == n) ? `${n}: true` : `${n}: "${esc(v)}"`); return a.length ? `{ ${a.join(", ")} }` : "";
return a.length ? `{ ${a.join(", ")} }` : ""; }, cN = (n, d = 0) => {
}, cN = (n, d = 0) => { let s = " ".repeat(d);
let s = " ".repeat(d); if (n.nodeType == 3) {
if (n.nodeType == 3) { let t = n.textContent;
let t = n.textContent; return t.trim() ? `${s}"${esc(t)}"` : "";
return t.trim() ? `${s}"${esc(t)}"` : ""; }
} if (n.nodeType == 1) {
if (n.nodeType == 1) { let t = n.tagName.toLowerCase(), p = bP(n), c = [...n.childNodes].map((i) => cN(i, d + 1)).filter(Boolean);
let t = n.tagName.toLowerCase(), p = bP(n), c = [...n.childNodes].map((i) => cN(i, d + 1)).filter(Boolean); if (!c.length)
if (!c.length) return `${s}${t}(${p})`;
return `${s}${t}(${p})`; if (c.length == 1 && !c[0].includes(`
if (c.length == 1 && !c[0].includes(`
`)) `))
return `${s}${t}(${p ? p + ", " : ""}${c[0].trim()})`; return `${s}${t}(${p ? p + ", " : ""}${c[0].trim()})`;
return `${s}${t}(${p ? p + ", " : ""}[ return `${s}${t}(${p ? p + ", " : ""}[
${c.join(`, ${c.join(`,
`)} `)}
${s}])`; ${s}])`;
} }
return ""; return "";
}, r = [...new DOMParser().parseFromString(h, "text/html").body.childNodes].map((n) => cN(n)).filter(Boolean); }, r = [...new DOMParser().parseFromString(h, "text/html").body.childNodes].map((n) => cN(n)).filter(Boolean);
return r.length == 1 ? r[0].trim() : `[ return r.length == 1 ? r[0].trim() : `[
${r.join(`, ${r.join(`,
`)} `)}
]`; ]`;
} }
var converter = () => { var converter = () => {
const inH = $(""); const inH = $("");
const setInH = (v) => inH(v); const setInH = (v) => inH(v);
const outS = $(""); const outS = $("");
const setOutS = (v) => outS(v); const setOutS = (v) => outS(v);
cnv = () => { const cnv = () => {
try { try {
setOutS(html2sigpro(inH())); setOutS(html2sigpro(inH()));
} catch (e) { } catch (e) {
setOutS("Error: " + e.message); setOutS("Error: " + e.message);
}
}, txS = "width:100%;height:200px;padding:10px;border:1px solid #ccc;border-radius:4px;font-family:monospace;font-size:14px;box-sizing:border-box;resize:vertical", btS = "padding:8px 16px;border:none;border-radius:4px;cursor:pointer;margin-right:8px;font-size:14px";
return div({ style: "max-width:900px;margin:20px auto;font-family:sans-serif" }, [
h1("HTML → SigPro"),
label({ style: "display:block;font-weight:700" }, "HTML:"),
textarea({
style: txS,
placeholder: "HTML...",
value: inH,
oninput: (e) => {
setInH(e.target.value);
cnv();
} }
}, txS = "width:100%;height:200px;padding:10px;border:1px solid #ccc;border-radius:4px;font-family:monospace;font-size:14px;box-sizing:border-box;resize:vertical", btS = "padding:8px 16px;border:none;border-radius:4px;cursor:pointer;margin-right:8px;font-size:14px"; }),
return div({ style: "max-width:900px;margin:20px auto;font-family:sans-serif" }, [ div({ style: "margin:10px 0" }, [
h1("HTML → SigPro"), button({ style: btS + ";background:#3b82f6;color:#fff", onclick: cnv }, "Convert"),
label({ style: "display:block;font-weight:700" }, "HTML:"), button({ style: btS + ";background:#d1d5db", onclick: () => {
textarea({ setInH("");
style: txS, setOutS("");
placeholder: "HTML...", } }, "Clear")
value: inH, ]),
oninput: (e) => { div({ style: "display:flex;justify-content:space-between;align-items:center;margin-bottom:5px" }, [
setInH(e.target.value); span({ style: "font-weight:700" }, "Out:"),
cnv(); button({ style: btS + ";background:#10b981;color:#fff", onclick: () => {
} navigator.clipboard.writeText(outS());
}), alert("Copied!");
div({ style: "margin:10px 0" }, [ } }, "Copy")
button({ style: btS + ";background:#3b82f6;color:#fff", onclick: cnv }, "Convert"), ]),
button({ style: btS + ";background:#d1d5db", onclick: () => { textarea({ style: txS + ";background:#f9fafb", readonly: true, value: outS, placeholder: "Result..." })
setInH(""); ]);
setOutS(""); };
} }, "Clear") window.html2sigpro = html2sigpro;
]), window.converter = converter;
div({ style: "display:flex;justify-content:space-between;align-items:center;margin-bottom:5px" }, [
span({ style: "font-weight:700" }, "Out:"),
button({ style: btS + ";background:#10b981;color:#fff", onclick: () => {
navigator.clipboard.writeText(outS());
alert("Copied!");
} }, "Copy")
]),
textarea({ style: txS + ";background:#f9fafb", readonly: true, value: outS, placeholder: "Result..." })
]);
};
window.html2sigpro = html2sigpro;
window.converter = converter;
})();

View File

@@ -64,8 +64,13 @@
}; };
</script> </script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/search.min.js"></script> <script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/search.min.js"></script>
<script src="./sigpro.js"></script> <script type="module">
<script src="./convert.js"></script> import * as SigPro from "./sigpro.js";
Object.assign(window, SigPro);
import("./convert.js").then(() => {
console.log("SigPro y Convert cargados correctamente.");
});
</script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/docsify.min.js"></script> <script src="//cdn.jsdelivr.net/npm/docsify/lib/docsify.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-copy-code/dist/docsify-copy-code.min.js"></script> <script src="//cdn.jsdelivr.net/npm/docsify-copy-code/dist/docsify-copy-code.min.js"></script>
</body> </body>

View File

@@ -1,503 +1,395 @@
(() => { // src/sigpro.js
var __defProp = Object.defineProperty; var isF = (f) => typeof f == "function";
var __returnValue = (v) => v; var isO = (o) => o && typeof o == "object";
function __exportSetter(name, newValue) { var isA = Array.isArray;
this[name] = __returnValue.bind(null, newValue); var doc = typeof document < "u" ? document : null;
var txt = (s) => doc.createTextNode(s == null ? "" : String(s));
var toNd = (n) => n?._rt ? n._cnt : n instanceof Node ? n : txt(n);
var Fragment = (p) => p.children;
var val = (v) => isF(v) ? v() : v;
var aEff = null;
var aOwn = null;
var isFlushing = 0;
var bDepth = 0;
var eQ = new Set;
var MOUNTED = new WeakMap;
var SVG_NS = "http://www.w3.org/2000/svg";
var XLINK = "http://www.w3.org/1999/xlink";
var SVG_TAGS = new Set("svg,path,circle,rect,line,polyline,polygon,g,defs,text,textPath,tspan,use,symbol,image,marker,ellipse".split(","));
var DANG_ATTR = new Set(["src", "href", "formaction", "action", "background", "code", "archive"]);
var clr = (s) => {
if (s) {
s.forEach((f) => f());
s.clear();
} }
var __export = (target, all) => { };
for (var name in all) var dispose = (e) => {
__defProp(target, name, { if (!e || e._x)
get: all[name], return;
enumerable: true, e._x = 1;
configurable: true, let st = [e], c;
set: __exportSetter.bind(all, name) while (c = st.pop()) {
}); clr(c._c);
}; if (c._ch) {
c._ch.forEach((x) => st.push(x));
// src/sigpro.js c._ch.clear();
var exports_sigpro = {};
__export(exports_sigpro, {
watch: () => watch,
val: () => val,
render: () => render,
onUnmount: () => onUnmount,
mount: () => mount,
isO: () => isO,
isF: () => isF,
isA: () => isA,
h: () => h,
each: () => each,
batch: () => batch,
SigPro: () => SigPro,
Fragment: () => Fragment,
$: () => $
});
var isF = (f) => typeof f == "function";
var isO = (o) => o && typeof o == "object";
var isA = Array.isArray;
var doc = typeof document < "u" ? document : null;
var txt = (s) => doc.createTextNode(s == null ? "" : String(s));
var toNd = (n) => n?._rt ? n._cnt : n instanceof Node ? n : txt(n);
var Fragment = (p) => p.children;
var val = (v) => isF(v) ? v() : v;
var aEff = null;
var aOwn = null;
var isFlushing = 0;
var bDepth = 0;
var eQ = new Set;
var MOUNTED = new WeakMap;
var SVG_NS = "http://www.w3.org/2000/svg";
var XLINK = "http://www.w3.org/1999/xlink";
var SVG_TAGS = new Set("svg,path,circle,rect,line,polyline,polygon,g,defs,text,textPath,tspan,use,symbol,image,marker,ellipse".split(","));
var DANG_ATTR = new Set(["src", "href", "formaction", "action", "background", "code", "archive"]);
var clr = (s) => {
if (s) {
s.forEach((f) => f());
s.clear();
} }
}; if (c._d) {
var dispose = (e) => { c._d.forEach((d) => d.delete(c));
if (!e || e._x) c._d.clear();
}
}
};
var onUnmount = (f) => aOwn && (aOwn._c ||= new Set).add(f);
var untrack = (f) => {
let p = aEff;
aEff = null;
try {
return f();
} finally {
aEff = p;
}
};
var createEffect = (f, isC = 0) => {
const e = () => {
if (e._x)
return; return;
e._x = 1; if (e._d)
let st = [e], c; e._d.forEach((s) => s.delete(e));
while (c = st.pop()) { clr(e._c);
clr(c._c); let pE = aEff, pO = aOwn;
if (c._ch) { aEff = aOwn = e;
c._ch.forEach((x) => st.push(x));
c._ch.clear();
}
if (c._d) {
c._d.forEach((d) => d.delete(c));
c._d.clear();
}
}
};
var onUnmount = (f) => aOwn && (aOwn._c ||= new Set).add(f);
var untrack = (f) => {
let p = aEff;
aEff = null;
try { try {
return f(); return e._res = f();
} catch (err) {
console.error("[SigPro]", err);
} finally { } finally {
aEff = p; aEff = pE;
aOwn = pO;
} }
}; };
var createEffect = (f, isC = 0) => { e._d = e._c = e._ch = null;
const e = () => { e._x = 0;
if (e._x) e._iC = isC;
return; e._dp = aEff ? aEff._dp + 1 : 0;
if (e._d) e._m = [];
e._d.forEach((s) => s.delete(e)); e._p = aOwn;
clr(e._c); if (aOwn)
let pE = aEff, pO = aOwn; (aOwn._ch ||= new Set).add(e);
aEff = aOwn = e; return e;
try { };
return e._res = f(); var flush = () => {
} catch (err) { if (isFlushing)
console.error("[SigPro]", err); return;
} finally { isFlushing = 1;
aEff = pE; let q = [...eQ].sort((a, b) => a._dp - b._dp);
aOwn = pO; eQ.clear();
for (let e of q)
if (!e._x)
e();
isFlushing = 0;
};
var batch = (f) => {
bDepth++;
try {
return f();
} finally {
if (!--bDepth && eQ.size && !isFlushing)
flush();
}
};
var trkUpd = (s, trg = 0) => {
if (!trg && aEff && !aEff._x) {
s.add(aEff);
(aEff._d ||= new Set).add(s);
} else if (trg && s.size) {
let q = 0;
for (let e of s) {
if (e === aEff || e._x)
continue;
if (e._iC) {
e._dt = 1;
if (e._sb)
trkUpd(e._sb, 1);
} else {
eQ.add(e);
q = 1;
} }
};
e._d = e._c = e._ch = null;
e._x = 0;
e._iC = isC;
e._dp = aEff ? aEff._dp + 1 : 0;
e._m = [];
e._p = aOwn;
if (aOwn)
(aOwn._ch ||= new Set).add(e);
return e;
};
var flush = () => {
if (isFlushing)
return;
isFlushing = 1;
let q = [...eQ].sort((a, b) => a._dp - b._dp);
eQ.clear();
for (let e of q)
if (!e._x)
e();
isFlushing = 0;
};
var batch = (f) => {
bDepth++;
try {
return f();
} finally {
if (!--bDepth && eQ.size && !isFlushing)
flush();
} }
}; if (q && !isFlushing && !bDepth)
var trkUpd = (s, trg = 0) => { queueMicrotask(flush);
if (!trg && aEff && !aEff._x) { }
s.add(aEff); };
(aEff._d ||= new Set).add(s); var $ = (v, k = null) => {
} else if (trg && s.size) { let s = new Set;
let q = 0; if (isF(v)) {
for (let e of s) { let c, cp = () => {
if (e === aEff || e._x) if (cp._dt) {
continue; let p = aEff;
if (e._iC) { aEff = cp;
e._dt = 1; try {
if (e._sb) let n = v();
trkUpd(e._sb, 1); if (!Object.is(c, n)) {
} else { c = n;
eQ.add(e); trkUpd(s, 1);
q = 1;
}
}
if (q && !isFlushing && !bDepth)
queueMicrotask(flush);
}
};
var $ = (v, k = null) => {
let s = new Set;
if (isF(v)) {
let c, cp = () => {
if (cp._dt) {
let p = aEff;
aEff = cp;
try {
let n = v();
if (!Object.is(c, n)) {
c = n;
trkUpd(s, 1);
}
} finally {
aEff = p;
} }
cp._dt = 0; } finally {
} aEff = p;
trkUpd(s);
return c;
};
cp._iC = cp._dt = 1;
cp._sb = s;
cp._d = null;
cp._x = 0;
return cp;
}
if (k)
try {
v = JSON.parse(localStorage.getItem(k)) ?? v;
} catch (e) {}
return (...a) => {
if (a.length) {
let n = isF(a[0]) ? a[0](v) : a[0];
if (!Object.is(v, n)) {
v = n;
if (k)
localStorage.setItem(k, JSON.stringify(v));
trkUpd(s, 1);
} }
cp._dt = 0;
} }
trkUpd(s); trkUpd(s);
return v; return c;
}; };
cp._iC = cp._dt = 1;
cp._sb = s;
cp._d = null;
cp._x = 0;
return cp;
}
if (k)
try {
v = JSON.parse(localStorage.getItem(k)) ?? v;
} catch (e) {}
return (...a) => {
if (a.length) {
let n = isF(a[0]) ? a[0](v) : a[0];
if (!Object.is(v, n)) {
v = n;
if (k)
localStorage.setItem(k, JSON.stringify(v));
trkUpd(s, 1);
}
}
trkUpd(s);
return v;
}; };
var watch = (src, cb) => { };
let e = createEffect(cb ? () => { var watch = (src, cb) => {
let v = isA(src) ? src.map((s) => s()) : src(); let e = createEffect(cb ? () => {
untrack(() => cb(v)); let v = isA(src) ? src.map((s) => s()) : src();
} : src); untrack(() => cb(v));
} : src);
e();
return () => dispose(e);
};
var clnNd = (n) => {
if (!n)
return;
clr(n._c);
if (n._oE)
dispose(n._oE);
if (n.childNodes)
n.childNodes.forEach(clnNd);
};
var valAtt = (k, v) => v == null || v === false ? null : (DANG_ATTR.has(k) || k.startsWith("on")) && /^\s*(javascript|data|vbscript):/i.test(String(v)) ? "#" : v;
var h = (tag, prp = {}, ch = []) => {
if (prp instanceof Node || isA(prp) || !isO(prp)) {
ch = prp;
prp = {};
}
if (isF(tag)) {
let e = createEffect(() => e._res = tag(prp, { children: ch, emit: (ev, ...a) => prp[`on${ev[0].toUpperCase()}${ev.slice(1)}`]?.(...a) }));
e(); e();
return () => dispose(e); if (e._res == null)
}; return null;
var clnNd = (n) => { let nd = e._res instanceof Node || isA(e._res) && e._res.every((n) => n instanceof Node) ? e._res : txt(e._res);
if (!n) let att = (n) => {
return; if (isO(n) && !n._rt) {
clr(n._c); n._m = e._m || [];
if (n._oE) n._c = e._c || new Set;
dispose(n._oE); n._oE = e;
if (n.childNodes)
n.childNodes.forEach(clnNd);
};
var valAtt = (k, v) => v == null || v === false ? null : (DANG_ATTR.has(k) || k.startsWith("on")) && /^\s*(javascript|data|vbscript):/i.test(String(v)) ? "#" : v;
var h = (tag, prp = {}, ch = []) => {
if (prp instanceof Node || isA(prp) || !isO(prp)) {
ch = prp;
prp = {};
}
if (isF(tag)) {
let e = createEffect(() => e._res = tag(prp, { children: ch, emit: (ev, ...a) => prp[`on${ev[0].toUpperCase()}${ev.slice(1)}`]?.(...a) }));
e();
if (e._res == null)
return null;
let nd = e._res instanceof Node || isA(e._res) && e._res.every((n) => n instanceof Node) ? e._res : txt(e._res);
let att = (n) => {
if (isO(n) && !n._rt) {
n._m = e._m || [];
n._c = e._c || new Set;
n._oE = e;
}
};
isA(nd) ? nd.forEach(att) : att(nd);
return nd;
}
let isS = SVG_TAGS.has(tag), el = isS ? doc.createElementNS(SVG_NS, tag) : doc.createElement(tag);
el._c = new Set;
for (let k in prp) {
let v = prp[k];
if (k === "ref") {
isF(v) ? v(el) : v.current = el;
continue;
}
if (isS && k.startsWith("xlink:")) {
let cv = valAtt(k.slice(6), v);
cv == null ? el.removeAttributeNS(XLINK, k.slice(6)) : el.setAttributeNS(XLINK, k.slice(6), cv);
continue;
}
if (k.startsWith("on")) {
let ev = k.slice(2).toLowerCase();
el.addEventListener(ev, v);
let off = () => el.removeEventListener(ev, v);
el._c.add(off);
onUnmount(off);
} else if (isF(v)) {
let e = createEffect(() => {
let r = valAtt(k, v());
if (k === "class")
el.className = r || "";
else if (r == null)
el.removeAttribute(k);
else if (k === "style" && typeof r == "string")
el.setAttribute("style", r);
else if (k in el && !isS)
el[k] = r;
else
el.setAttribute(k, r === true ? "" : r);
});
e();
el._c.add(() => dispose(e));
onUnmount(() => dispose(e));
if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && (k === "value" || k === "checked")) {
el.addEventListener(k === "checked" ? "change" : "input", (ev) => v(ev.target[k]));
}
} else {
let r = valAtt(k, v);
if (r != null) {
if (k === "style" && typeof r == "string")
el.setAttribute("style", r);
else if (k in el && !isS)
el[k] = r;
else
el.setAttribute(k, r === true ? "" : r);
}
}
}
const app = (c) => {
if (isA(c))
return c.forEach(app);
if (isF(c)) {
let anc = txt(""), cur = [];
el.appendChild(anc);
let e = createEffect(() => {
let r = c(), nxt = (isA(r) ? r : [r]).map(toNd), ref = anc;
cur.forEach((n) => {
n._rt ? n._del() : clnNd(n);
if (n.parentNode)
n.remove();
});
for (let i = nxt.length - 1;i >= 0; i--) {
let nd = nxt[i];
if (nd.parentNode !== ref.parentNode)
ref.parentNode?.insertBefore(nd, ref);
if (nd._m)
nd._m.forEach((f) => f());
ref = nd;
}
cur = nxt;
});
e();
el._c.add(() => dispose(e));
onUnmount(() => dispose(e));
} else {
let nd = toNd(c);
el.appendChild(nd);
if (nd._m)
nd._m.forEach((f) => f());
} }
}; };
app(ch); isA(nd) ? nd.forEach(att) : att(nd);
return el; return nd;
}; }
var render = (rFn) => { let isS = SVG_TAGS.has(tag), el = isS ? doc.createElementNS(SVG_NS, tag) : doc.createElement(tag);
let c = new Set, pO = aOwn, pE = aEff, cnt = doc.createElement("div"); el._c = new Set;
cnt.style.display = "contents"; for (let k in prp) {
cnt.setAttribute("role", "presentation"); let v = prp[k];
aOwn = { _c: c }; if (k === "ref") {
aEff = null; isF(v) ? v(el) : v.current = el;
const pRes = (r) => { continue;
if (!r)
return;
if (r._rt) {
c.add(r._del);
cnt.appendChild(r._cnt);
} else if (isA(r))
r.forEach(pRes);
else
cnt.appendChild(r instanceof Node ? r : txt(r));
};
try {
pRes(rFn({ onCleanup: (f) => c.add(f) }));
} finally {
aOwn = pO;
aEff = pE;
} }
return { _rt: 1, _cnt: cnt, _del: () => { if (isS && k.startsWith("xlink:")) {
clr(c); let cv = valAtt(k.slice(6), v);
clnNd(cnt); cv == null ? el.removeAttributeNS(XLINK, k.slice(6)) : el.setAttributeNS(XLINK, k.slice(6), cv);
cnt.remove(); continue;
} }; }
}; if (k.startsWith("on")) {
var when = (c, Y, N = null) => { let ev = k.slice(2).toLowerCase();
let anc = txt(""), rt = h("div", { style: "display:contents" }, [anc]), v; el.addEventListener(ev, v);
watch(() => !!val(c), (s) => { let off = () => el.removeEventListener(ev, v);
if (v) { el._c.add(off);
v._del(); onUnmount(off);
v = null; } else if (isF(v)) {
} let e = createEffect(() => {
let ct = s ? Y : N; let r = valAtt(k, v());
if (ct) { if (k === "class")
v = render(() => val(ct)); el.className = r || "";
rt.insertBefore(v._cnt, anc); else if (r == null)
} el.removeAttribute(k);
}); else if (k === "style" && typeof r == "string")
onUnmount(() => v?._del()); el.setAttribute("style", r);
return rt; else if (k in el && !isS)
}; el[k] = r;
var each = (s, fn, kF) => {
let anc = txt(""), rt = h("div", { style: "display:contents" }, [anc]), cch = new Map;
watch(() => val(s) || [], (it) => {
let nCc = new Map, nOd = [];
for (let i = 0, l = (it || []).length;i < l; i++) {
let t = it[i], k = kF ? t?.[kF] ?? i : t?.id ?? i, v = cch.get(k);
if (!v)
v = render(() => fn(t, i));
else else
cch.delete(k); el.setAttribute(k, r === true ? "" : r);
nCc.set(k, v);
nOd.push(v);
}
cch.forEach((v) => v._del());
let ref = anc;
for (let i = nOd.length - 1;i >= 0; i--) {
let nd = nOd[i]._cnt;
if (nd.nextSibling !== ref)
rt.insertBefore(nd, ref);
ref = nd;
}
cch = nCc;
});
return rt;
};
var mount = (c, tgt) => {
let t = typeof tgt == "string" ? doc.querySelector(tgt) : tgt;
if (!t)
return;
if (MOUNTED.has(t))
MOUNTED.get(t)._del();
let i = render(isF(c) ? c : () => c);
t.replaceChildren(i._cnt);
MOUNTED.set(t, i);
return i;
};
var SigPro = { $, watch, batch, h, Fragment, render, mount, when, each, onUnmount, val, isA, isF, isO };
if (typeof window !== "undefined") {
window.SigPro = SigPro;
"a abbr article aside audio b blockquote br button canvas caption cite code col colgroup datalist dd del details dfn dialog div dl dt em embed fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 header hr i iframe img input ins kbd label legend li main mark meter nav object ol optgroup option output p picture pre progress section select slot small source span strong sub summary sup svg table tbody td template textarea tfoot th thead time tr u ul video".split(" ").forEach((t) => window[t] = (p, c) => h(t, p, c));
}
// src/sigpro.utils.js
var exports_sigpro_utils = {};
__export(exports_sigpro_utils, {
t: () => t,
setLocale: () => setLocale,
router: () => router,
db: () => db,
addLang: () => addLang
});
var router = (routes) => {
const getHash = () => window.location.hash.slice(1) || "/";
const path = $(getHash());
const handler = () => path(getHash());
window.addEventListener("hashchange", handler);
const hook = h("div", { class: "router-hook" });
let currentView = null;
watch([path], () => {
const cur = path();
const route = routes.find((r) => {
const p1 = r.path.split("/").filter(Boolean);
const p2 = cur.split("/").filter(Boolean);
return p1.length === p2.length && p1.every((p, i) => p[0] === ":" || p === p2[i]);
}) || routes.find((r) => r.path === "*");
if (route) {
currentView?.destroy();
const params = {};
route.path.split("/").filter(Boolean).forEach((p, i) => {
if (p[0] === ":")
params[p.slice(1)] = cur.split("/").filter(Boolean)[i];
});
router.params(params);
currentView = render(() => isF(route.component) ? route.component(params) : route.component);
hook.replaceChildren(currentView.container);
}
});
hook.destroy = () => {
window.removeEventListener("hashchange", handler);
currentView?.destroy();
};
return hook;
};
router.params = $({});
router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
router.back = () => window.history.back();
router.path = () => window.location.hash.replace(/^#/, "") || "/";
var db = async (url, data = {}, loading = null) => {
if (loading)
loading(true);
try {
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
credentials: "include"
}); });
if (!res.ok) { e();
const errorText = await res.text(); el._c.add(() => dispose(e));
throw new Error(`Error ${res.status}: ${errorText}`); onUnmount(() => dispose(e));
if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && (k === "value" || k === "checked")) {
el.addEventListener(k === "checked" ? "change" : "input", (ev) => v(ev.target[k]));
}
} else {
let r = valAtt(k, v);
if (r != null) {
if (k === "style" && typeof r == "string")
el.setAttribute("style", r);
else if (k in el && !isS)
el[k] = r;
else
el.setAttribute(k, r === true ? "" : r);
} }
return await res.json();
} finally {
if (loading)
loading(false);
} }
};
var currentLocale = $("en");
var translations = {};
var addLang = (obj) => {
for (const locale of Object.keys(obj)) {
if (!translations[locale])
translations[locale] = {};
Object.assign(translations[locale], obj[locale]);
}
};
var setLocale = (locale) => {
if (locale && translations[locale]) {
currentLocale(locale);
}
};
var t = (key) => {
return () => translations[currentLocale()]?.[key] ?? key;
};
// src/build_umd.js
if (typeof window !== "undefined") {
const SigPro2 = { ...exports_sigpro, ...exports_sigpro_utils };
window.SigPro = SigPro2;
Object.assign(window, SigPro2);
} }
})(); const app = (c) => {
if (isA(c))
return c.forEach(app);
if (isF(c)) {
let anc = txt(""), cur = [];
el.appendChild(anc);
let e = createEffect(() => {
let r = c(), nxt = (isA(r) ? r : [r]).map(toNd), ref = anc;
cur.forEach((n) => {
n._rt ? n._del() : clnNd(n);
if (n.parentNode)
n.remove();
});
for (let i = nxt.length - 1;i >= 0; i--) {
let nd = nxt[i];
if (nd.parentNode !== ref.parentNode)
ref.parentNode?.insertBefore(nd, ref);
if (nd._m)
nd._m.forEach((f) => f());
ref = nd;
}
cur = nxt;
});
e();
el._c.add(() => dispose(e));
onUnmount(() => dispose(e));
} else {
let nd = toNd(c);
el.appendChild(nd);
if (nd._m)
nd._m.forEach((f) => f());
}
};
app(ch);
return el;
};
var render = (rFn) => {
let c = new Set, pO = aOwn, pE = aEff, cnt = doc.createElement("div");
cnt.style.display = "contents";
cnt.setAttribute("role", "presentation");
aOwn = { _c: c };
aEff = null;
const pRes = (r) => {
if (!r)
return;
if (r._rt) {
c.add(r._del);
cnt.appendChild(r._cnt);
} else if (isA(r))
r.forEach(pRes);
else
cnt.appendChild(r instanceof Node ? r : txt(r));
};
try {
pRes(rFn({ onCleanup: (f) => c.add(f) }));
} finally {
aOwn = pO;
aEff = pE;
}
return { _rt: 1, _cnt: cnt, _del: () => {
clr(c);
clnNd(cnt);
cnt.remove();
} };
};
var when = (c, Y, N = null) => {
let anc = txt(""), rt = h("div", { style: "display:contents" }, [anc]), v;
watch(() => !!val(c), (s) => {
if (v) {
v._del();
v = null;
}
let ct = s ? Y : N;
if (ct) {
v = render(() => val(ct));
rt.insertBefore(v._cnt, anc);
}
});
onUnmount(() => v?._del());
return rt;
};
var each = (s, fn, kF) => {
let anc = txt(""), rt = h("div", { style: "display:contents" }, [anc]), cch = new Map;
watch(() => val(s) || [], (it) => {
let nCc = new Map, nOd = [];
for (let i = 0, l = (it || []).length;i < l; i++) {
let t = it[i], k = kF ? t?.[kF] ?? i : t?.id ?? i, v = cch.get(k);
if (!v)
v = render(() => fn(t, i));
else
cch.delete(k);
nCc.set(k, v);
nOd.push(v);
}
cch.forEach((v) => v._del());
let ref = anc;
for (let i = nOd.length - 1;i >= 0; i--) {
let nd = nOd[i]._cnt;
if (nd.nextSibling !== ref)
rt.insertBefore(nd, ref);
ref = nd;
}
cch = nCc;
});
return rt;
};
var mount = (c, tgt) => {
let t = typeof tgt == "string" ? doc.querySelector(tgt) : tgt;
if (!t)
return;
if (MOUNTED.has(t))
MOUNTED.get(t)._del();
let i = render(isF(c) ? c : () => c);
t.replaceChildren(i._cnt);
MOUNTED.set(t, i);
return i;
};
var SigPro = { $, watch, batch, h, Fragment, render, mount, when, each, onUnmount, val, isA, isF, isO };
if (typeof window !== "undefined") {
window.SigPro = SigPro;
"a abbr article aside audio b blockquote br button canvas caption cite code col colgroup datalist dd del details dfn dialog div dl dt em embed fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 header hr i iframe img input ins kbd label legend li main mark meter nav object ol optgroup option output p picture pre progress section select slot small source span strong sub summary sup svg table tbody td template textarea tfoot th thead time tr u ul video".split(" ").forEach((t) => window[t] = (p, c) => h(t, p, c));
}
export {
watch,
val,
render,
onUnmount,
mount,
isO,
isF,
isA,
h,
each,
batch,
SigPro,
Fragment,
$
};

View File

@@ -8,15 +8,15 @@
"email": "sigpro@natxocc.com", "email": "sigpro@natxocc.com",
"url": "https://sigpro.natxocc.com" "url": "https://sigpro.natxocc.com"
}, },
"main": "./dist/sigpro.esm.js", "main": "./dist/sigpro.js",
"module": "./dist/sigpro.esm.js", "module": "./dist/sigpro.js",
"unpkg": "./dist/sigpro.js", "unpkg": "./dist/sigpro.js",
"jsdelivr": "./dist/sigpro.js", "jsdelivr": "./dist/sigpro.js",
"types": "./sigpro.d.ts", "types": "./sigpro.d.ts",
"exports": { "exports": {
".": { ".": {
"types": "./sigpro.d.ts", "types": "./sigpro.d.ts",
"import": "./dist/sigpro.esm.js", "import": "./dist/sigpro.js",
"default": "./dist/sigpro.js" "default": "./dist/sigpro.js"
}, },
"./utils": "./dist/sigpro.utils.js", "./utils": "./dist/sigpro.utils.js",
@@ -41,28 +41,15 @@
"del": "bun pm cache rm && rm -f bun.lockb && rm -f bun.lock", "del": "bun pm cache rm && rm -f bun.lockb && rm -f bun.lock",
"clean": "rm -rf dist", "clean": "rm -rf dist",
"prebuild": "npm run clean", "prebuild": "npm run clean",
"build:convert": "bun build ./src/convert.js --bundle --outfile=./docs/convert.js --format=iife", "build:core": "bun build ./src/sigpro.js --bundle --outfile=./dist/sigpro.js --format=esm",
"build:iife": "bun build ./src/build_umd.js --bundle --outfile=./dist/sigpro.js --format=iife --global-name=SigPro", "build:utils": "bun build ./src/sigpro.utils.js --bundle --outfile=./dist/sigpro.utils.js --format=esm --external ./src/sigpro.js",
"build:esm": "bun build ./src/sigpro.js --bundle --outfile=./dist/sigpro.esm.js --format=esm", "build:vite": "bun build ./src/sigpro.vite.js --bundle --outfile=./dist/sigpro.vite.js --format=esm --external fs --external path",
"build:utils": "bun build ./src/sigpro.utils.js --bundle --outfile=./dist/sigpro.utils.js --format=esm --external './src/sigpro.js'", "build:convert": "bun build ./src/convert.js --bundle --outfile=./docs/convert.js --format=esm --external ./src/sigpro.js",
"build:vite": "bun build ./src/sigpro.vite.js --bundle --outfile=./dist/sigpro.vite.js --format=esm --external:fs --external:path",
"build:copy": "cp ./dist/sigpro.js ./docs/sigpro.js", "build:copy": "cp ./dist/sigpro.js ./docs/sigpro.js",
"build": "bun run build:iife && bun run build:esm && bun run build:utils && bun run build:vite && bun run build:convert && bun run build:copy", "build": "bun run build:core && bun run build:utils && bun run build:vite && bun run build:convert && bun run build:copy",
"docs": "bun x serve docs" "docs": "bun x serve docs"
}, },
"keywords": [ "keywords": [
"signals", "signals", "reactivity", "reactive", "pure", "vanilla", "js", "ui", "dom", "state", "frontend", "spa", "lightweight", "sigpro"
"reactivity",
"reactive",
"pure",
"vanilla",
"js",
"ui",
"dom",
"state",
"frontend",
"spa",
"lightweight",
"sigpro"
] ]
} }

View File

@@ -1,4 +1,4 @@
const { $, div, h1, label, textarea, button, span } = window; import { $ } from "./sigpro.js";
function html2sigpro(h) { function html2sigpro(h) {
const B = new Set(['allowfullscreen', 'async', 'autofocus', 'autoplay', 'checked', 'controls', 'default', 'defer', 'disabled', 'formnovalidate', 'hidden', 'ismap', 'itemscope', 'loop', 'multiple', 'muted', 'nomodule', 'novalidate', 'open', 'playsinline', 'readonly', 'required', 'reversed', 'selected', 'truespeed']), const B = new Set(['allowfullscreen', 'async', 'autofocus', 'autoplay', 'checked', 'controls', 'default', 'defer', 'disabled', 'formnovalidate', 'hidden', 'ismap', 'itemscope', 'loop', 'multiple', 'muted', 'nomodule', 'novalidate', 'open', 'playsinline', 'readonly', 'required', 'reversed', 'selected', 'truespeed']),
@@ -34,7 +34,7 @@ const converter = () => {
const setInH = (v) => inH(v); const setInH = (v) => inH(v);
const outS = $(''); const outS = $('');
const setOutS = (v) => outS(v); const setOutS = (v) => outS(v);
cnv = () => { try { setOutS(html2sigpro(inH())) } catch (e) { setOutS('Error: ' + e.message) } }, const cnv = () => { try { setOutS(html2sigpro(inH())) } catch (e) { setOutS('Error: ' + e.message) } },
txS = "width:100%;height:200px;padding:10px;border:1px solid #ccc;border-radius:4px;font-family:monospace;font-size:14px;box-sizing:border-box;resize:vertical", txS = "width:100%;height:200px;padding:10px;border:1px solid #ccc;border-radius:4px;font-family:monospace;font-size:14px;box-sizing:border-box;resize:vertical",
btS = "padding:8px 16px;border:none;border-radius:4px;cursor:pointer;margin-right:8px;font-size:14px"; btS = "padding:8px 16px;border:none;border-radius:4px;cursor:pointer;margin-right:8px;font-size:14px";