Include Anim()

This commit is contained in:
2026-04-14 13:10:45 +02:00
parent f6677ad6b3
commit ad486c9a23
6 changed files with 216 additions and 86 deletions

68
dist/sigpro-ui.esm.js vendored
View File

@@ -119,11 +119,11 @@ var trackUpdate = (subs, trigger = false) => {
if (!trigger && activeEffect && !activeEffect._disposed) { if (!trigger && activeEffect && !activeEffect._disposed) {
subs.add(activeEffect); subs.add(activeEffect);
(activeEffect._deps ||= new Set).add(subs); (activeEffect._deps ||= new Set).add(subs);
} else if (trigger) { } else if (trigger && subs.size > 0) {
let hasQueue = false; let hasQueue = false;
subs.forEach((e) => { for (const e of subs) {
if (e === activeEffect || e._disposed) if (e === activeEffect || e._disposed)
return; continue;
if (e._isComputed) { if (e._isComputed) {
e._dirty = true; e._dirty = true;
if (e._subs) if (e._subs)
@@ -132,7 +132,7 @@ var trackUpdate = (subs, trigger = false) => {
effectQueue.add(e); effectQueue.add(e);
hasQueue = true; hasQueue = true;
} }
}); }
if (hasQueue && !isFlushing && batchDepth === 0) if (hasQueue && !isFlushing && batchDepth === 0)
queueMicrotask(flush); queueMicrotask(flush);
} }
@@ -200,8 +200,9 @@ var $2 = (val, key = null) => {
var $$ = (target) => { var $$ = (target) => {
if (!isObj(target)) if (!isObj(target))
return target; return target;
if (proxyCache.has(target)) let proxy = proxyCache.get(target);
return proxyCache.get(target); if (proxy)
return proxy;
const subsMap = new Map; const subsMap = new Map;
const getSubs = (k) => { const getSubs = (k) => {
let s = subsMap.get(k); let s = subsMap.get(k);
@@ -209,28 +210,30 @@ var $$ = (target) => {
subsMap.set(k, s = new Set); subsMap.set(k, s = new Set);
return s; return s;
}; };
const proxy = new Proxy(target, { proxy = new Proxy(target, {
get(t, k) { get(t, k, receiver) {
if (typeof k !== "symbol")
trackUpdate(getSubs(k)); trackUpdate(getSubs(k));
return $$(t[k]); return $$(Reflect.get(t, k, receiver));
}, },
set(t, k, v) { set(t, k, v, receiver) {
const isNew = !(k in t); const isNew = !Reflect.has(t, k);
if (!Object.is(t[k], v)) { const oldV = Reflect.get(t, k, receiver);
t[k] = v; const result = Reflect.set(t, k, v, receiver);
if (result && !Object.is(oldV, v)) {
trackUpdate(getSubs(k), true); trackUpdate(getSubs(k), true);
if (isNew) if (isNew)
trackUpdate(getSubs(ITER), true); trackUpdate(getSubs(ITER), true);
} }
return true; return result;
}, },
deleteProperty(t, k) { deleteProperty(t, k) {
const res = Reflect.deleteProperty(t, k); const result = Reflect.deleteProperty(t, k);
if (res) { if (result) {
trackUpdate(getSubs(k), true); trackUpdate(getSubs(k), true);
trackUpdate(getSubs(ITER), true); trackUpdate(getSubs(ITER), true);
} }
return res; return result;
}, },
ownKeys(t) { ownKeys(t) {
trackUpdate(getSubs(ITER)); trackUpdate(getSubs(ITER));
@@ -517,6 +520,35 @@ Router.params = $2({});
Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/"); Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
Router.back = () => window.history.back(); Router.back = () => window.history.back();
Router.path = () => window.location.hash.replace(/^#/, "") || "/"; Router.path = () => window.location.hash.replace(/^#/, "") || "/";
var Anim = (show, render, { enter, leave } = {}) => {
const wrap = Tag2("div", { style: "display:contents" });
let view = null;
const wait = (el, cb) => {
let done = false;
const finish = () => !done && (done = true, cb());
if (!el)
return finish();
"transitionend animationend".split(" ").map((e) => el.addEventListener(e, finish, { once: true }));
setTimeout(finish, 500);
};
Watch2(show, (on) => {
if (on && !view) {
const el = (view = Render(render)).container.firstChild;
wrap.appendChild(view.container);
if (enter && el) {
el.classList.add(enter);
el.clientTop;
el.classList.add(enter + "-active");
wait(el, () => el.classList.remove(enter, enter + "-active"));
}
} else if (!on && view) {
const el = view.container.firstChild;
const del = () => (view?.destroy(), view = null);
leave && el ? (el.classList.add(leave), wait(el, del)) : del();
}
});
return onUnmount(() => view?.destroy()), wrap;
};
var Mount2 = (comp, target) => { var Mount2 = (comp, target) => {
const t = typeof target === "string" ? doc.querySelector(target) : target; const t = typeof target === "string" ? doc.querySelector(target) : target;
if (!t) if (!t)
@@ -528,7 +560,7 @@ var Mount2 = (comp, target) => {
MOUNTED_NODES.set(t, inst); MOUNTED_NODES.set(t, inst);
return inst; return inst;
}; };
var SigPro = Object.freeze({ $: $2, $$, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, Batch }); var SigPro = Object.freeze({ $: $2, $$, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, Anim, Batch });
if (typeof window !== "undefined") { if (typeof window !== "undefined") {
Object.assign(window, SigPro); 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)); "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));

File diff suppressed because one or more lines are too long

68
dist/sigpro-ui.js vendored
View File

@@ -185,11 +185,11 @@
if (!trigger && activeEffect && !activeEffect._disposed) { if (!trigger && activeEffect && !activeEffect._disposed) {
subs.add(activeEffect); subs.add(activeEffect);
(activeEffect._deps ||= new Set).add(subs); (activeEffect._deps ||= new Set).add(subs);
} else if (trigger) { } else if (trigger && subs.size > 0) {
let hasQueue = false; let hasQueue = false;
subs.forEach((e) => { for (const e of subs) {
if (e === activeEffect || e._disposed) if (e === activeEffect || e._disposed)
return; continue;
if (e._isComputed) { if (e._isComputed) {
e._dirty = true; e._dirty = true;
if (e._subs) if (e._subs)
@@ -198,7 +198,7 @@
effectQueue.add(e); effectQueue.add(e);
hasQueue = true; hasQueue = true;
} }
}); }
if (hasQueue && !isFlushing && batchDepth === 0) if (hasQueue && !isFlushing && batchDepth === 0)
queueMicrotask(flush); queueMicrotask(flush);
} }
@@ -266,8 +266,9 @@
var $$ = (target) => { var $$ = (target) => {
if (!isObj(target)) if (!isObj(target))
return target; return target;
if (proxyCache.has(target)) let proxy = proxyCache.get(target);
return proxyCache.get(target); if (proxy)
return proxy;
const subsMap = new Map; const subsMap = new Map;
const getSubs = (k) => { const getSubs = (k) => {
let s = subsMap.get(k); let s = subsMap.get(k);
@@ -275,28 +276,30 @@
subsMap.set(k, s = new Set); subsMap.set(k, s = new Set);
return s; return s;
}; };
const proxy = new Proxy(target, { proxy = new Proxy(target, {
get(t, k) { get(t, k, receiver) {
if (typeof k !== "symbol")
trackUpdate(getSubs(k)); trackUpdate(getSubs(k));
return $$(t[k]); return $$(Reflect.get(t, k, receiver));
}, },
set(t, k, v) { set(t, k, v, receiver) {
const isNew = !(k in t); const isNew = !Reflect.has(t, k);
if (!Object.is(t[k], v)) { const oldV = Reflect.get(t, k, receiver);
t[k] = v; const result = Reflect.set(t, k, v, receiver);
if (result && !Object.is(oldV, v)) {
trackUpdate(getSubs(k), true); trackUpdate(getSubs(k), true);
if (isNew) if (isNew)
trackUpdate(getSubs(ITER), true); trackUpdate(getSubs(ITER), true);
} }
return true; return result;
}, },
deleteProperty(t, k) { deleteProperty(t, k) {
const res = Reflect.deleteProperty(t, k); const result = Reflect.deleteProperty(t, k);
if (res) { if (result) {
trackUpdate(getSubs(k), true); trackUpdate(getSubs(k), true);
trackUpdate(getSubs(ITER), true); trackUpdate(getSubs(ITER), true);
} }
return res; return result;
}, },
ownKeys(t) { ownKeys(t) {
trackUpdate(getSubs(ITER)); trackUpdate(getSubs(ITER));
@@ -583,6 +586,35 @@
Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/"); Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
Router.back = () => window.history.back(); Router.back = () => window.history.back();
Router.path = () => window.location.hash.replace(/^#/, "") || "/"; Router.path = () => window.location.hash.replace(/^#/, "") || "/";
var Anim = (show, render, { enter, leave } = {}) => {
const wrap = Tag2("div", { style: "display:contents" });
let view = null;
const wait = (el, cb) => {
let done = false;
const finish = () => !done && (done = true, cb());
if (!el)
return finish();
"transitionend animationend".split(" ").map((e) => el.addEventListener(e, finish, { once: true }));
setTimeout(finish, 500);
};
Watch2(show, (on) => {
if (on && !view) {
const el = (view = Render(render)).container.firstChild;
wrap.appendChild(view.container);
if (enter && el) {
el.classList.add(enter);
el.clientTop;
el.classList.add(enter + "-active");
wait(el, () => el.classList.remove(enter, enter + "-active"));
}
} else if (!on && view) {
const el = view.container.firstChild;
const del = () => (view?.destroy(), view = null);
leave && el ? (el.classList.add(leave), wait(el, del)) : del();
}
});
return onUnmount(() => view?.destroy()), wrap;
};
var Mount2 = (comp, target) => { var Mount2 = (comp, target) => {
const t = typeof target === "string" ? doc.querySelector(target) : target; const t = typeof target === "string" ? doc.querySelector(target) : target;
if (!t) if (!t)
@@ -594,7 +626,7 @@
MOUNTED_NODES.set(t, inst); MOUNTED_NODES.set(t, inst);
return inst; return inst;
}; };
var SigPro = Object.freeze({ $: $2, $$, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, Batch }); var SigPro = Object.freeze({ $: $2, $$, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, Anim, Batch });
if (typeof window !== "undefined") { if (typeof window !== "undefined") {
Object.assign(window, SigPro); 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)); "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));

File diff suppressed because one or more lines are too long

68
docs/sigpro-ui.min.js vendored
View File

@@ -185,11 +185,11 @@
if (!trigger && activeEffect && !activeEffect._disposed) { if (!trigger && activeEffect && !activeEffect._disposed) {
subs.add(activeEffect); subs.add(activeEffect);
(activeEffect._deps ||= new Set).add(subs); (activeEffect._deps ||= new Set).add(subs);
} else if (trigger) { } else if (trigger && subs.size > 0) {
let hasQueue = false; let hasQueue = false;
subs.forEach((e) => { for (const e of subs) {
if (e === activeEffect || e._disposed) if (e === activeEffect || e._disposed)
return; continue;
if (e._isComputed) { if (e._isComputed) {
e._dirty = true; e._dirty = true;
if (e._subs) if (e._subs)
@@ -198,7 +198,7 @@
effectQueue.add(e); effectQueue.add(e);
hasQueue = true; hasQueue = true;
} }
}); }
if (hasQueue && !isFlushing && batchDepth === 0) if (hasQueue && !isFlushing && batchDepth === 0)
queueMicrotask(flush); queueMicrotask(flush);
} }
@@ -266,8 +266,9 @@
var $$ = (target) => { var $$ = (target) => {
if (!isObj(target)) if (!isObj(target))
return target; return target;
if (proxyCache.has(target)) let proxy = proxyCache.get(target);
return proxyCache.get(target); if (proxy)
return proxy;
const subsMap = new Map; const subsMap = new Map;
const getSubs = (k) => { const getSubs = (k) => {
let s = subsMap.get(k); let s = subsMap.get(k);
@@ -275,28 +276,30 @@
subsMap.set(k, s = new Set); subsMap.set(k, s = new Set);
return s; return s;
}; };
const proxy = new Proxy(target, { proxy = new Proxy(target, {
get(t, k) { get(t, k, receiver) {
if (typeof k !== "symbol")
trackUpdate(getSubs(k)); trackUpdate(getSubs(k));
return $$(t[k]); return $$(Reflect.get(t, k, receiver));
}, },
set(t, k, v) { set(t, k, v, receiver) {
const isNew = !(k in t); const isNew = !Reflect.has(t, k);
if (!Object.is(t[k], v)) { const oldV = Reflect.get(t, k, receiver);
t[k] = v; const result = Reflect.set(t, k, v, receiver);
if (result && !Object.is(oldV, v)) {
trackUpdate(getSubs(k), true); trackUpdate(getSubs(k), true);
if (isNew) if (isNew)
trackUpdate(getSubs(ITER), true); trackUpdate(getSubs(ITER), true);
} }
return true; return result;
}, },
deleteProperty(t, k) { deleteProperty(t, k) {
const res = Reflect.deleteProperty(t, k); const result = Reflect.deleteProperty(t, k);
if (res) { if (result) {
trackUpdate(getSubs(k), true); trackUpdate(getSubs(k), true);
trackUpdate(getSubs(ITER), true); trackUpdate(getSubs(ITER), true);
} }
return res; return result;
}, },
ownKeys(t) { ownKeys(t) {
trackUpdate(getSubs(ITER)); trackUpdate(getSubs(ITER));
@@ -583,6 +586,35 @@
Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/"); Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/");
Router.back = () => window.history.back(); Router.back = () => window.history.back();
Router.path = () => window.location.hash.replace(/^#/, "") || "/"; Router.path = () => window.location.hash.replace(/^#/, "") || "/";
var Anim = (show, render, { enter, leave } = {}) => {
const wrap = Tag2("div", { style: "display:contents" });
let view = null;
const wait = (el, cb) => {
let done = false;
const finish = () => !done && (done = true, cb());
if (!el)
return finish();
"transitionend animationend".split(" ").map((e) => el.addEventListener(e, finish, { once: true }));
setTimeout(finish, 500);
};
Watch2(show, (on) => {
if (on && !view) {
const el = (view = Render(render)).container.firstChild;
wrap.appendChild(view.container);
if (enter && el) {
el.classList.add(enter);
el.clientTop;
el.classList.add(enter + "-active");
wait(el, () => el.classList.remove(enter, enter + "-active"));
}
} else if (!on && view) {
const el = view.container.firstChild;
const del = () => (view?.destroy(), view = null);
leave && el ? (el.classList.add(leave), wait(el, del)) : del();
}
});
return onUnmount(() => view?.destroy()), wrap;
};
var Mount2 = (comp, target) => { var Mount2 = (comp, target) => {
const t = typeof target === "string" ? doc.querySelector(target) : target; const t = typeof target === "string" ? doc.querySelector(target) : target;
if (!t) if (!t)
@@ -594,7 +626,7 @@
MOUNTED_NODES.set(t, inst); MOUNTED_NODES.set(t, inst);
return inst; return inst;
}; };
var SigPro = Object.freeze({ $: $2, $$, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, Batch }); var SigPro = Object.freeze({ $: $2, $$, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, Anim, Batch });
if (typeof window !== "undefined") { if (typeof window !== "undefined") {
Object.assign(window, SigPro); 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)); "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));

View File

@@ -1,4 +1,4 @@
// sigpro 1.2.0 // sigpro 1.2.1
const isFunc = f => typeof f === "function" const isFunc = f => typeof f === "function"
const isObj = o => o && typeof o === "object" const isObj = o => o && typeof o === "object"
const isArr = Array.isArray const isArr = Array.isArray
@@ -104,10 +104,10 @@ const trackUpdate = (subs, trigger = false) => {
if (!trigger && activeEffect && !activeEffect._disposed) { if (!trigger && activeEffect && !activeEffect._disposed) {
subs.add(activeEffect) subs.add(activeEffect)
; (activeEffect._deps ||= new Set()).add(subs) ; (activeEffect._deps ||= new Set()).add(subs)
} else if (trigger) { } else if (trigger && subs.size > 0) {
let hasQueue = false let hasQueue = false
subs.forEach(e => { for (const e of subs) {
if (e === activeEffect || e._disposed) return if (e === activeEffect || e._disposed) continue
if (e._isComputed) { if (e._isComputed) {
e._dirty = true e._dirty = true
if (e._subs) trackUpdate(e._subs, true) if (e._subs) trackUpdate(e._subs, true)
@@ -115,7 +115,7 @@ const trackUpdate = (subs, trigger = false) => {
effectQueue.add(e) effectQueue.add(e)
hasQueue = true hasQueue = true
} }
}) }
if (hasQueue && !isFlushing && batchDepth === 0) queueMicrotask(flush) if (hasQueue && !isFlushing && batchDepth === 0) queueMicrotask(flush)
} }
} }
@@ -175,36 +175,39 @@ const $ = (val, key = null) => {
const $$ = (target) => { const $$ = (target) => {
if (!isObj(target)) return target if (!isObj(target)) return target
if (proxyCache.has(target)) return proxyCache.get(target) let proxy = proxyCache.get(target)
if (proxy) return proxy
const subsMap = new Map() const subsMap = new Map()
const getSubs = (k) => { const getSubs = (k) => {
let s = subsMap.get(k) let s = subsMap.get(k)
if (!s) subsMap.set(k, s = new Set()) if (!s) subsMap.set(k, (s = new Set()))
return s return s
} }
const proxy = new Proxy(target, { proxy = new Proxy(target, {
get(t, k) { get(t, k, receiver) {
trackUpdate(getSubs(k)) if (typeof k !== 'symbol') trackUpdate(getSubs(k))
return $$(t[k]) return $$(Reflect.get(t, k, receiver))
}, },
set(t, k, v) { set(t, k, v, receiver) {
const isNew = !(k in t) const isNew = !Reflect.has(t, k)
if (!Object.is(t[k], v)) { const oldV = Reflect.get(t, k, receiver)
t[k] = v const result = Reflect.set(t, k, v, receiver)
if (result && !Object.is(oldV, v)) {
trackUpdate(getSubs(k), true) trackUpdate(getSubs(k), true)
if (isNew) trackUpdate(getSubs(ITER), true) if (isNew) trackUpdate(getSubs(ITER), true)
} }
return true return result
}, },
deleteProperty(t, k) { deleteProperty(t, k) {
const res = Reflect.deleteProperty(t, k) const result = Reflect.deleteProperty(t, k)
if (res) { if (result) {
trackUpdate(getSubs(k), true) trackUpdate(getSubs(k), true)
trackUpdate(getSubs(ITER), true) trackUpdate(getSubs(ITER), true)
} }
return res return result
}, },
ownKeys(t) { ownKeys(t) {
trackUpdate(getSubs(ITER)) trackUpdate(getSubs(ITER))
@@ -496,6 +499,37 @@ Router.to = p => window.location.hash = p.replace(/^#?\/?/, "#/")
Router.back = () => window.history.back() Router.back = () => window.history.back()
Router.path = () => window.location.hash.replace(/^#/, "") || "/" Router.path = () => window.location.hash.replace(/^#/, "") || "/"
const Anim = (show, render, { enter, leave } = {}) => {
const wrap = Tag('div', { style: 'display:contents' })
let view = null
const wait = (el, cb) => {
let done = false
const finish = () => !done && (done = true, cb())
if (!el) return finish()
'transitionend animationend'.split(' ').map(e => el.addEventListener(e, finish, { once: true }))
setTimeout(finish, 500)
}
Watch(show, on => {
if (on && !view) {
const el = (view = Render(render)).container.firstChild
wrap.appendChild(view.container)
if (enter && el) {
el.classList.add(enter); el.clientTop
el.classList.add(enter + '-active')
wait(el, () => el.classList.remove(enter, enter + '-active'))
}
} else if (!on && view) {
const el = view.container.firstChild
const del = () => (view?.destroy(), view = null)
leave && el ? (el.classList.add(leave), wait(el, del)) : del()
}
})
return onUnmount(() => view?.destroy()), wrap
}
const Mount = (comp, target) => { const Mount = (comp, target) => {
const t = typeof target === "string" ? doc.querySelector(target) : target const t = typeof target === "string" ? doc.querySelector(target) : target
if (!t) return if (!t) return
@@ -506,7 +540,7 @@ const Mount = (comp, target) => {
return inst return inst
} }
const SigPro = Object.freeze({ $, $$, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, Batch }) const SigPro = Object.freeze({ $, $$, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, Anim, Batch })
if (typeof window !== "undefined") { if (typeof window !== "undefined") {
Object.assign(window, SigPro) Object.assign(window, SigPro)
@@ -514,5 +548,5 @@ if (typeof window !== "undefined") {
.split(" ").forEach(t => window[t[0].toUpperCase() + t.slice(1)] = (p, c) => SigPro.Tag(t, p, c)) .split(" ").forEach(t => window[t[0].toUpperCase() + t.slice(1)] = (p, c) => SigPro.Tag(t, p, c))
} }
export { $, $$, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, Batch } export { $, $$, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, Anim, Batch }
export default SigPro export default SigPro