SigPro 1.2.1

This commit is contained in:
2026-04-14 15:01:26 +02:00
parent 45b34c9668
commit 0ae2d56c37

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
@@ -106,7 +106,6 @@ const trackUpdate = (subs, trigger = false) => {
; (activeEffect._deps ||= new Set()).add(subs) ; (activeEffect._deps ||= new Set()).add(subs)
} else if (trigger && subs.size > 0) { } else if (trigger && subs.size > 0) {
let hasQueue = false let hasQueue = false
// Optimización: for...of evita el overhead de crear callbacks
for (const e of subs) { for (const e of subs) {
if (e === activeEffect || e._disposed) continue if (e === activeEffect || e._disposed) continue
if (e._isComputed) { if (e._isComputed) {
@@ -188,9 +187,7 @@ const $$ = (target) => {
proxy = new Proxy(target, { proxy = new Proxy(target, {
get(t, k, receiver) { get(t, k, receiver) {
// Ignoramos symbols internos de JS para evitar fugas/ciclos
if (typeof k !== 'symbol') trackUpdate(getSubs(k)) if (typeof k !== 'symbol') trackUpdate(getSubs(k))
// Reflect y receiver preservan el 'this' si el target tiene getters
return $$(Reflect.get(t, k, receiver)) return $$(Reflect.get(t, k, receiver))
}, },
set(t, k, v, receiver) { set(t, k, v, receiver) {
@@ -506,20 +503,18 @@ const Anim = (show, render, { enter, leave } = {}) => {
const wrap = Tag('div', { style: 'display:contents' }) const wrap = Tag('div', { style: 'display:contents' })
let view = null let view = null
const wait = (el, callback) => { const wait = (el, cb) => {
let done = false let done = false
const finish = () => !done && (done = true, callback()) const finish = () => !done && (done = true, cb())
if (!el) return finish() if (!el) return finish()
;['transitionend', 'animationend'].forEach(ev => el.addEventListener(ev, finish, { once: true })) 'transitionend animationend'.split(' ').map(e => el.addEventListener(e, finish, { once: true }))
setTimeout(finish, 500) setTimeout(finish, 500)
} }
Watch(show, on => { Watch(show, on => {
if (on && !view) { if (on && !view) {
view = Render(render) const el = (view = Render(render)).container.firstChild
const el = view.container.firstChild
wrap.appendChild(view.container) wrap.appendChild(view.container)
if (enter && el) { if (enter && el) {
el.classList.add(enter); el.clientTop el.classList.add(enter); el.clientTop
el.classList.add(enter + '-active') el.classList.add(enter + '-active')
@@ -527,12 +522,8 @@ const Anim = (show, render, { enter, leave } = {}) => {
} }
} else if (!on && view) { } else if (!on && view) {
const el = view.container.firstChild const el = view.container.firstChild
const destroy = () => { view?.destroy(); view = null } const del = () => (view?.destroy(), view = null)
leave && el ? (el.classList.add(leave), wait(el, del)) : del()
if (leave && el) {
el.classList.add(leave)
wait(el, destroy)
} else destroy()
} }
}) })