From 8b2e67b3b035c4bdaf6656dcfa8316ee42f362d8 Mon Sep 17 00:00:00 2001 From: natxocc Date: Sun, 10 May 2026 01:33:44 +0200 Subject: [PATCH] remove IIFE --- dist/sigpro.esm.js | 395 --------------------- dist/sigpro.js | 850 ++++++++++++++++++++------------------------- docs/convert.js | 134 ++++--- docs/index.html | 9 +- docs/sigpro.js | 850 ++++++++++++++++++++------------------------- package.json | 33 +- src/convert.js | 4 +- 7 files changed, 827 insertions(+), 1448 deletions(-) delete mode 100644 dist/sigpro.esm.js diff --git a/dist/sigpro.esm.js b/dist/sigpro.esm.js deleted file mode 100644 index 26623bb..0000000 --- a/dist/sigpro.esm.js +++ /dev/null @@ -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, - $ -}; diff --git a/dist/sigpro.js b/dist/sigpro.js index fdc635e..26623bb 100644 --- a/dist/sigpro.js +++ b/dist/sigpro.js @@ -1,503 +1,395 @@ -(() => { - var __defProp = Object.defineProperty; - var __returnValue = (v) => v; - function __exportSetter(name, newValue) { - this[name] = __returnValue.bind(null, newValue); +// 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 __export = (target, all) => { - for (var name in all) - __defProp(target, name, { - get: all[name], - enumerable: true, - configurable: true, - set: __exportSetter.bind(all, name) - }); - }; - - // src/sigpro.js - 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(); +}; +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(); } - }; - var dispose = (e) => { - if (!e || e._x) + 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; - 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; + if (e._d) + e._d.forEach((s) => s.delete(e)); + clr(e._c); + let pE = aEff, pO = aOwn; + aEff = aOwn = e; try { - return f(); + return e._res = f(); + } catch (err) { + console.error("[SigPro]", err); } finally { - aEff = p; + aEff = pE; + aOwn = pO; } }; - 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; } - }; - 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; + 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); } - 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); + } finally { + aEff = p; } + cp._dt = 0; } 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 ? () => { - let v = isA(src) ? src.map((s) => s()) : src(); - untrack(() => cb(v)); - } : src); +}; +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(); - 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()); + 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; } }; - 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; + 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; } - 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)); + 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 - 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)); - } - - // 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" + el.setAttribute(k, r === true ? "" : r); }); - if (!res.ok) { - const errorText = await res.text(); - throw new Error(`Error ${res.status}: ${errorText}`); + 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); } - 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, + $ +}; diff --git a/docs/convert.js b/docs/convert.js index 37942a7..8377249 100644 --- a/docs/convert.js +++ b/docs/convert.js @@ -1,76 +1,74 @@ -(() => { - // src/convert.js - var { $, div, h1, label, textarea, button, span } = window; - 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) => { - 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(", ")} }` : ""; - }, cN = (n, d = 0) => { - let s = " ".repeat(d); - if (n.nodeType == 3) { - let t = n.textContent; - return t.trim() ? `${s}"${esc(t)}"` : ""; - } - if (n.nodeType == 1) { - let t = n.tagName.toLowerCase(), p = bP(n), c = [...n.childNodes].map((i) => cN(i, d + 1)).filter(Boolean); - if (!c.length) - return `${s}${t}(${p})`; - if (c.length == 1 && !c[0].includes(` +// src/convert.js +import { $ } from "./sigpro.js"; +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) => { + 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(", ")} }` : ""; + }, cN = (n, d = 0) => { + let s = " ".repeat(d); + if (n.nodeType == 3) { + let t = n.textContent; + return t.trim() ? `${s}"${esc(t)}"` : ""; + } + if (n.nodeType == 1) { + let t = n.tagName.toLowerCase(), p = bP(n), c = [...n.childNodes].map((i) => cN(i, d + 1)).filter(Boolean); + if (!c.length) + return `${s}${t}(${p})`; + if (c.length == 1 && !c[0].includes(` `)) - return `${s}${t}(${p ? p + ", " : ""}${c[0].trim()})`; - return `${s}${t}(${p ? p + ", " : ""}[ + return `${s}${t}(${p ? p + ", " : ""}${c[0].trim()})`; + return `${s}${t}(${p ? p + ", " : ""}[ ${c.join(`, `)} ${s}])`; - } - return ""; - }, r = [...new DOMParser().parseFromString(h, "text/html").body.childNodes].map((n) => cN(n)).filter(Boolean); - return r.length == 1 ? r[0].trim() : `[ + } + return ""; + }, r = [...new DOMParser().parseFromString(h, "text/html").body.childNodes].map((n) => cN(n)).filter(Boolean); + return r.length == 1 ? r[0].trim() : `[ ${r.join(`, `)} ]`; - } - var converter = () => { - const inH = $(""); - const setInH = (v) => inH(v); - const outS = $(""); - const setOutS = (v) => outS(v); - cnv = () => { - try { - setOutS(html2sigpro(inH())); - } catch (e) { - setOutS("Error: " + e.message); +} +var converter = () => { + const inH = $(""); + const setInH = (v) => inH(v); + const outS = $(""); + const setOutS = (v) => outS(v); + 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", 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" }, [ - 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(); - } - }), - div({ style: "margin:10px 0" }, [ - button({ style: btS + ";background:#3b82f6;color:#fff", onclick: cnv }, "Convert"), - button({ style: btS + ";background:#d1d5db", onclick: () => { - setInH(""); - setOutS(""); - } }, "Clear") - ]), - 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; -})(); + }), + div({ style: "margin:10px 0" }, [ + button({ style: btS + ";background:#3b82f6;color:#fff", onclick: cnv }, "Convert"), + button({ style: btS + ";background:#d1d5db", onclick: () => { + setInH(""); + setOutS(""); + } }, "Clear") + ]), + 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; diff --git a/docs/index.html b/docs/index.html index 2ac02fb..3dde2ca 100644 --- a/docs/index.html +++ b/docs/index.html @@ -64,8 +64,13 @@ }; - - + diff --git a/docs/sigpro.js b/docs/sigpro.js index fdc635e..26623bb 100644 --- a/docs/sigpro.js +++ b/docs/sigpro.js @@ -1,503 +1,395 @@ -(() => { - var __defProp = Object.defineProperty; - var __returnValue = (v) => v; - function __exportSetter(name, newValue) { - this[name] = __returnValue.bind(null, newValue); +// 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 __export = (target, all) => { - for (var name in all) - __defProp(target, name, { - get: all[name], - enumerable: true, - configurable: true, - set: __exportSetter.bind(all, name) - }); - }; - - // src/sigpro.js - 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(); +}; +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(); } - }; - var dispose = (e) => { - if (!e || e._x) + 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; - 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; + if (e._d) + e._d.forEach((s) => s.delete(e)); + clr(e._c); + let pE = aEff, pO = aOwn; + aEff = aOwn = e; try { - return f(); + return e._res = f(); + } catch (err) { + console.error("[SigPro]", err); } finally { - aEff = p; + aEff = pE; + aOwn = pO; } }; - 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; } - }; - 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; + 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); } - 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); + } finally { + aEff = p; } + cp._dt = 0; } 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 ? () => { - let v = isA(src) ? src.map((s) => s()) : src(); - untrack(() => cb(v)); - } : src); +}; +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(); - 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()); + 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; } }; - 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; + 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; } - 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)); + 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 - 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)); - } - - // 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" + el.setAttribute(k, r === true ? "" : r); }); - if (!res.ok) { - const errorText = await res.text(); - throw new Error(`Error ${res.status}: ${errorText}`); + 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); } - 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, + $ +}; diff --git a/package.json b/package.json index 1234788..afc91cc 100644 --- a/package.json +++ b/package.json @@ -8,15 +8,15 @@ "email": "sigpro@natxocc.com", "url": "https://sigpro.natxocc.com" }, - "main": "./dist/sigpro.esm.js", - "module": "./dist/sigpro.esm.js", + "main": "./dist/sigpro.js", + "module": "./dist/sigpro.js", "unpkg": "./dist/sigpro.js", "jsdelivr": "./dist/sigpro.js", "types": "./sigpro.d.ts", "exports": { ".": { "types": "./sigpro.d.ts", - "import": "./dist/sigpro.esm.js", + "import": "./dist/sigpro.js", "default": "./dist/sigpro.js" }, "./utils": "./dist/sigpro.utils.js", @@ -41,28 +41,15 @@ "del": "bun pm cache rm && rm -f bun.lockb && rm -f bun.lock", "clean": "rm -rf dist", "prebuild": "npm run clean", - "build:convert": "bun build ./src/convert.js --bundle --outfile=./docs/convert.js --format=iife", - "build:iife": "bun build ./src/build_umd.js --bundle --outfile=./dist/sigpro.js --format=iife --global-name=SigPro", - "build:esm": "bun build ./src/sigpro.js --bundle --outfile=./dist/sigpro.esm.js --format=esm", - "build:utils": "bun build ./src/sigpro.utils.js --bundle --outfile=./dist/sigpro.utils.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:core": "bun build ./src/sigpro.js --bundle --outfile=./dist/sigpro.js --format=esm", + "build:utils": "bun build ./src/sigpro.utils.js --bundle --outfile=./dist/sigpro.utils.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:convert": "bun build ./src/convert.js --bundle --outfile=./docs/convert.js --format=esm --external ./src/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" }, "keywords": [ - "signals", - "reactivity", - "reactive", - "pure", - "vanilla", - "js", - "ui", - "dom", - "state", - "frontend", - "spa", - "lightweight", - "sigpro" + "signals", "reactivity", "reactive", "pure", "vanilla", "js", "ui", "dom", "state", "frontend", "spa", "lightweight", "sigpro" ] -} +} \ No newline at end of file diff --git a/src/convert.js b/src/convert.js index c3739dd..a64b6fe 100644 --- a/src/convert.js +++ b/src/convert.js @@ -1,4 +1,4 @@ -const { $, div, h1, label, textarea, button, span } = window; +import { $ } from "./sigpro.js"; 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']), @@ -34,7 +34,7 @@ const converter = () => { const setInH = (v) => inH(v); const outS = $(''); 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", btS = "padding:8px 16px;border:none;border-radius:4px;cursor:pointer;margin-right:8px;font-size:14px";