This commit is contained in:
2026-04-14 00:05:16 +02:00
parent a29963563e
commit f6677ad6b3
6 changed files with 311 additions and 206 deletions

101
dist/sigpro-ui.js vendored
View File

@@ -84,7 +84,10 @@
var activeEffect = null;
var activeOwner = null;
var isFlushing = false;
var batchDepth = 0;
var effectQueue = new Set;
var proxyCache = new WeakMap;
var ITER = Symbol("iter");
var MOUNTED_NODES = new WeakMap;
var dispose = (eff) => {
if (!eff || eff._disposed)
@@ -115,16 +118,6 @@
if (activeOwner)
(activeOwner._cleanups ||= new Set).add(fn);
};
var set = (signal, path, value) => {
if (value === undefined)
return signal(isFunc(path) ? path(signal()) : path);
const keys = path.split("."), root = { ...signal() };
let acc = root, k;
for (k of keys.slice(0, -1))
acc = acc[k] = { ...acc[k] || {} };
acc[keys.at(-1)] = value;
signal(root);
};
var untrack = (fn) => {
const p = activeEffect;
activeEffect = null;
@@ -177,6 +170,17 @@
e();
isFlushing = false;
};
var Batch = (fn) => {
batchDepth++;
try {
return fn();
} finally {
batchDepth--;
if (batchDepth === 0 && effectQueue.size > 0 && !isFlushing) {
flush();
}
}
};
var trackUpdate = (subs, trigger = false) => {
if (!trigger && activeEffect && !activeEffect._disposed) {
subs.add(activeEffect);
@@ -195,7 +199,7 @@
hasQueue = true;
}
});
if (hasQueue && !isFlushing)
if (hasQueue && !isFlushing && batchDepth === 0)
queueMicrotask(flush);
}
};
@@ -259,6 +263,49 @@
return val;
};
};
var $$ = (target) => {
if (!isObj(target))
return target;
if (proxyCache.has(target))
return proxyCache.get(target);
const subsMap = new Map;
const getSubs = (k) => {
let s = subsMap.get(k);
if (!s)
subsMap.set(k, s = new Set);
return s;
};
const proxy = new Proxy(target, {
get(t, k) {
trackUpdate(getSubs(k));
return $$(t[k]);
},
set(t, k, v) {
const isNew = !(k in t);
if (!Object.is(t[k], v)) {
t[k] = v;
trackUpdate(getSubs(k), true);
if (isNew)
trackUpdate(getSubs(ITER), true);
}
return true;
},
deleteProperty(t, k) {
const res = Reflect.deleteProperty(t, k);
if (res) {
trackUpdate(getSubs(k), true);
trackUpdate(getSubs(ITER), true);
}
return res;
},
ownKeys(t) {
trackUpdate(getSubs(ITER));
return Reflect.ownKeys(t);
}
});
proxyCache.set(target, proxy);
return proxy;
};
var Watch2 = (sources, cb) => {
if (cb === undefined) {
const effect2 = createEffect(sources);
@@ -453,42 +500,22 @@
}
};
};
var If2 = (cond, ifYes, ifNot = null, trans = null) => {
var If2 = (cond, ifYes, ifNot = null) => {
const anchor = doc.createTextNode("");
const root = Tag2("div", { style: "display:contents" }, [anchor]);
let currentView = null;
let last = null;
let exitPromise = null;
Watch2(() => !!(isFunc(cond) ? cond() : cond), (show) => {
if (show === last)
return;
last = show;
const disposeView = () => {
if (currentView) {
currentView.destroy();
currentView = null;
}
};
if (currentView && !show && trans?.out) {
if (exitPromise && exitPromise.cancel)
exitPromise.cancel();
const anim = trans.out(currentView.container, disposeView);
exitPromise = anim;
if (anim && anim.finished)
anim.finished.then(disposeView);
else
disposeView();
} else {
disposeView();
if (currentView) {
currentView.destroy();
currentView = null;
}
const content = show ? ifYes : ifNot;
if (content) {
currentView = Render(() => isFunc(content) ? content() : content);
root.insertBefore(currentView.container, anchor);
if (trans?.in)
trans.in(currentView.container);
}
});
onUnmount(() => currentView?.destroy());
return root;
};
var For2 = (src, itemFn, keyFn) => {
@@ -567,7 +594,7 @@
MOUNTED_NODES.set(t, inst);
return inst;
};
var SigPro = Object.freeze({ $: $2, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, set });
var SigPro = Object.freeze({ $: $2, $$, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, Batch });
if (typeof window !== "undefined") {
Object.assign(window, SigPro);
"div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((t) => window[t[0].toUpperCase() + t.slice(1)] = (p, c) => SigPro.Tag(t, p, c));