diff --git a/dist/sigpro.esm.js b/dist/sigpro.esm.js index 0acd119..d313c44 100644 --- a/dist/sigpro.esm.js +++ b/dist/sigpro.esm.js @@ -12,6 +12,9 @@ var effectQueue = new Set; var proxyCache = new WeakMap; var ITER = Symbol("iter"); var MOUNTED_NODES = new WeakMap; +var SVG_NS = "http://www.w3.org/2000/svg"; +var XLINK_NS = "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 dispose = (eff) => { if (!eff || eff._disposed) return; @@ -149,9 +152,6 @@ var $ = (val, key = null) => { computed._dirty = true; computed._deps = null; computed._disposed = false; - computed.stop = () => {}; - if (activeOwner) - onUnmount(computed.stop); return computed; } if (key) @@ -287,12 +287,10 @@ var h = (tag, props = {}, children = []) => { isArr(node) ? node.forEach(attach) : attach(node); return node; } - const isSVG = /^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(tag); - const el = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag); + const isSVG = SVG_TAGS.has(tag); + const el = isSVG ? doc.createElementNS(SVG_NS, tag) : doc.createElement(tag); el._cleanups = new Set; - for (let k in props) { - if (!props.hasOwnProperty(k)) - continue; + for (const k of Object.keys(props)) { let v = props[k]; if (k === "ref") { isFunc(v) ? v(el) : v.current = el; @@ -300,8 +298,7 @@ var h = (tag, props = {}, children = []) => { } if (isSVG && k.startsWith("xlink:")) { const cleanVal = validateAttr(k.slice(6), v); - let lnk = "http://www.w3.org/1999/xlink"; - cleanVal == null ? el.removeAttributeNS(lnk, k.slice(6)) : el.setAttributeNS(lnk, k.slice(6), cleanVal); + cleanVal == null ? el.removeAttributeNS(XLINK_NS, k.slice(6)) : el.setAttributeNS(XLINK_NS, k.slice(6), cleanVal); continue; } if (k.startsWith("on")) { diff --git a/dist/sigpro.esm.min.js b/dist/sigpro.esm.min.js index 39bd637..104715e 100644 --- a/dist/sigpro.esm.min.js +++ b/dist/sigpro.esm.min.js @@ -1 +1 @@ -var y=(e)=>typeof e==="function",D=(e)=>e&&typeof e==="object",b=Array.isArray,g=typeof document<"u"?document:null,L=(e)=>e?._isRuntime?e.container:e instanceof Node?e:g.createTextNode(e==null?"":String(e)),p=null,_=null,x=!1,O=0,R=new Set,U=new WeakMap,$=Symbol("iter"),k=new WeakMap,E=(e)=>{if(!e||e._disposed)return;e._disposed=!0;let o=[e];while(o.length){let n=o.pop();if(n._cleanups)n._cleanups.forEach((r)=>r()),n._cleanups.clear();if(n._children)n._children.forEach((r)=>o.push(r)),n._children.clear();if(n._deps)n._deps.forEach((r)=>r.delete(n)),n._deps.clear()}},S=(e)=>{if(_)(_._cleanups||=new Set).add(e)},V=(e)=>{let o=p;p=null;try{return e()}finally{p=o}},T=(e,o=!1)=>{let n=()=>{if(n._disposed)return;if(n._deps)n._deps.forEach((c)=>c.delete(n));if(n._cleanups)n._cleanups.forEach((c)=>c()),n._cleanups.clear();let r=p,s=_;p=_=n;try{return n._result=e()}catch(c){console.error("[SigPro]",c)}finally{p=r,_=s}};if(n._deps=n._cleanups=n._children=null,n._disposed=!1,n._isComputed=o,n._depth=p?p._depth+1:0,n._mounts=[],n._parent=_,_)(_._children||=new Set).add(n);return n},I=()=>{if(x)return;x=!0;let e=Array.from(R).sort((o,n)=>o._depth-n._depth);R.clear();for(let o of e)if(!o._disposed)o();x=!1},F=(e)=>{O++;try{return e()}finally{if(O--,O===0&&R.size>0&&!x)I()}},w=(e,o=!1)=>{if(!o&&p&&!p._disposed)e.add(p),(p._deps||=new Set).add(e);else if(o&&e.size>0){let n=!1;for(let r of e){if(r===p||r._disposed)continue;if(r._isComputed){if(r._dirty=!0,r._subs)w(r._subs,!0)}else R.add(r),n=!0}if(n&&!x&&O===0)queueMicrotask(I)}},N=(e,o=null)=>{let n=new Set;if(y(e)){let r,s=()=>{if(s._dirty){let c=p;p=s;try{let t=e();if(!Object.is(r,t))r=t,w(n,!0)}finally{p=c}s._dirty=!1}return w(n),r};if(s._isComputed=!0,s._subs=n,s._dirty=!0,s._deps=null,s._disposed=!1,s.stop=()=>{},_)S(s.stop);return s}if(o)try{e=JSON.parse(localStorage.getItem(o))??e}catch(r){}return(...r)=>{if(r.length){let s=y(r[0])?r[0](e):r[0];if(!Object.is(e,s)){if(e=s,o)localStorage.setItem(o,JSON.stringify(e));w(n,!0)}}return w(n),e}},M=(e)=>{if(!D(e))return e;let o=U.get(e);if(o)return o;let n=new Map,r=(c)=>{let t=n.get(c);if(!t)n.set(c,t=new Set);return t},s=new Proxy(e,{get(c,t,i){if(typeof t!=="symbol")w(r(t));return M(Reflect.get(c,t,i))},set(c,t,i,l){let a=Reflect.has(c,t),f=Reflect.get(c,t,l),u=Reflect.set(c,t,i,l);if(u&&!Object.is(f,i)){if(w(r(t),!0),!a)w(r($),!0)}return u},deleteProperty(c,t){let i=Reflect.deleteProperty(c,t);if(i)w(r(t),!0),w(r($),!0);return i},ownKeys(c){return w(r($)),Reflect.ownKeys(c)}});return U.set(e,s),s},C=(e,o)=>{if(o===void 0){let r=T(e);return r(),()=>E(r)}let n=T(()=>{let r=Array.isArray(e)?e.map((s)=>s()):e();V(()=>o(r))});return n(),()=>E(n)},P=(e)=>{if(!e)return;if(e._cleanups)e._cleanups.forEach((o)=>o()),e._cleanups.clear();if(e._ownerEffect)E(e._ownerEffect);if(e.childNodes)e.childNodes.forEach((o)=>P(o))},W=/^\s*(javascript|data|vbscript):/i,G=new Set(["src","href","formaction","action","background","code","archive"]),J=(e)=>G.has(e)||e.startsWith("on"),B=(e,o)=>{if(o==null||o===!1)return null;if(J(e)){let n=String(o);if(W.test(n))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${e}`),"#"}return o},A=(e,o={},n=[])=>{if(o instanceof Node||b(o)||!D(o))n=o,o={};if(y(e)){let t=T(()=>{let f=e(o,{children:n,emit:(u,...h)=>o[`on${u[0].toUpperCase()}${u.slice(1)}`]?.(...h)});return t._result=f,f});t();let i=t._result;if(i==null)return null;let l=i instanceof Node||b(i)&&i.every((f)=>f instanceof Node)?i:g.createTextNode(String(i)),a=(f)=>{if(D(f)&&!f._isRuntime)f._mounts=t._mounts||[],f._cleanups=t._cleanups||new Set,f._ownerEffect=t};return b(l)?l.forEach(a):a(l),l}let r=/^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(e),s=r?g.createElementNS("http://www.w3.org/2000/svg",e):g.createElement(e);s._cleanups=new Set;for(let t in o){if(!o.hasOwnProperty(t))continue;let i=o[t];if(t==="ref"){y(i)?i(s):i.current=s;continue}if(r&&t.startsWith("xlink:")){let l=B(t.slice(6),i),a="http://www.w3.org/1999/xlink";l==null?s.removeAttributeNS(a,t.slice(6)):s.setAttributeNS(a,t.slice(6),l);continue}if(t.startsWith("on")){let l=t.slice(2).toLowerCase();s.addEventListener(l,i);let a=()=>s.removeEventListener(l,i);s._cleanups.add(a),S(a)}else if(y(i)){let l=T(()=>{let a=B(t,i());if(t==="class")s.className=a||"";else if(a==null)s.removeAttribute(t);else if(t in s&&!r)s[t]=a;else s.setAttribute(t,a===!0?"":a)});if(l(),s._cleanups.add(()=>E(l)),S(()=>E(l)),/^(INPUT|TEXTAREA|SELECT)$/.test(s.tagName)&&(t==="value"||t==="checked")){let a=t==="checked"?"change":"input";s.addEventListener(a,(f)=>i(f.target[t]))}}else{let l=B(t,i);if(l!=null)if(t in s&&!r)s[t]=l;else s.setAttribute(t,l===!0?"":l)}}let c=(t)=>{if(b(t))return t.forEach(c);if(y(t)){let i=g.createTextNode("");s.appendChild(i);let l=[],a=T(()=>{let f=t(),u=(b(f)?f:[f]).map(L);l.forEach((d)=>{if(d._isRuntime)d.destroy();else P(d);if(d.parentNode)d.remove()});let h=i;for(let d=u.length-1;d>=0;d--){let m=u[d];if(m.parentNode!==h.parentNode)h.parentNode?.insertBefore(m,h);if(m._mounts)m._mounts.forEach((q)=>q());h=m}l=u});a(),s._cleanups.add(()=>E(a)),S(()=>E(a))}else{let i=L(t);if(s.appendChild(i),i._mounts)i._mounts.forEach((l)=>l())}};return c(n),s},j=(e)=>{let o=new Set,n=_,r=p,s=g.createElement("div");s.style.display="contents",s.setAttribute("role","presentation"),_={_cleanups:o},p=null;let c=(t)=>{if(!t)return;if(t._isRuntime)o.add(t.destroy),s.appendChild(t.container);else if(b(t))t.forEach(c);else s.appendChild(t instanceof Node?t:g.createTextNode(String(t==null?"":t)))};try{c(e({onCleanup:(t)=>o.add(t)}))}finally{_=n,p=r}return{_isRuntime:!0,container:s,destroy:()=>{o.forEach((t)=>t()),P(s),s.remove()}}},z=(e,o,n=null)=>{let r=g.createTextNode(""),s=A("div",{style:"display:contents"},[r]),c=null;return C(()=>!!(y(e)?e():e),(t)=>{if(c)c.destroy(),c=null;let i=t?o:n;if(i)c=j(()=>y(i)?i():i),s.insertBefore(c.container,r)}),S(()=>c?.destroy()),s},K=({name:e,duration:o=200,scale:n,slide:r,rotate:s,blur:c},t)=>{let i=typeof t==="function"?t():t;if(!(i instanceof Node))return i;if(e)return i.style.animation=`${e}-in ${o}ms`,i;let l=n||r||s||c,a=[n?"scale(0.95)":"",r?"translateY(-10px)":"",s?"rotate(-2deg)":""].filter(Boolean).join(" ");if(i.style.transition=`all ${o}ms ease`,i.style.opacity="0",l)i.style.transform=a;if(c)i.style.filter="blur(4px)";return requestAnimationFrame(()=>{if(i.style.opacity="1",l)i.style.transform="none";if(c)i.style.filter="none"}),i},Q=(e,o,n)=>{let r=g.createTextNode(""),s=A("div",{style:"display:contents"},[r]),c=new Map;return C(()=>(y(e)?e():e)||[],(t)=>{let i=new Map,l=[],a=t||[];for(let u=0;uo(h,u));else c.delete(d);i.set(d,m),l.push(m)}c.forEach((u)=>u.destroy());let f=r;for(let u=l.length-1;u>=0;u--){let d=l[u].container;if(d.nextSibling!==f)s.insertBefore(d,f);f=d}c=i}),s},v=(e)=>{let o=()=>window.location.hash.slice(1)||"/",n=N(o()),r=()=>n(o());window.addEventListener("hashchange",r),S(()=>window.removeEventListener("hashchange",r));let s=A("div",{class:"router-hook"}),c=null;return C([n],()=>{let t=n(),i=e.find((l)=>{let a=l.path.split("/").filter(Boolean),f=t.split("/").filter(Boolean);return a.length===f.length&&a.every((u,h)=>u[0]===":"||u===f[h])})||e.find((l)=>l.path==="*");if(i){c?.destroy();let l={};i.path.split("/").filter(Boolean).forEach((a,f)=>{if(a[0]===":")l[a.slice(1)]=t.split("/").filter(Boolean)[f]}),v.params(l),c=j(()=>y(i.component)?i.component(l):i.component),s.replaceChildren(c.container)}}),s};v.params=N({});v.to=(e)=>window.location.hash=e.replace(/^#?\/?/,"#/");v.back=()=>window.history.back();v.path=()=>window.location.hash.replace(/^#/,"")||"/";var X=({url:e,method:o="GET",headers:n={}})=>{let r=N(!1),s=N(null),c=N(null),t=null,i=null;return{run:async(f=null)=>{t?.abort(),clearTimeout(i),t=new AbortController,i=setTimeout(()=>t.abort(),1e4),r(!0),s(null);try{let u=f instanceof FormData,h=await fetch(e,{method:o,headers:u?n:{"Content-Type":"application/json",...n},body:u?f:f?JSON.stringify(f):void 0,signal:t.signal}),d=await h.text(),m=d?JSON.parse(d):null;if(!h.ok)throw Error(m?.message||h.statusText);return c(m),m}catch(u){if(u.name!=="AbortError")s(u.message);throw u}finally{r(!1),clearTimeout(i),t=null,i=null}},abort:()=>t?.abort(),loading:r,error:s,data:c}},H=(e,o)=>{let n=typeof o==="string"?g.querySelector(o):o;if(!n)return;if(k.has(n))k.get(n).destroy();let r=j(y(e)?e:()=>e);return n.replaceChildren(r.container),k.set(n,r),r},Y=Object.freeze({$:N,$$:M,watch:C,h:A,when:z,each:Q,fx:K,router:v,req:X,mount:H,batch:F}),Z=()=>{if(typeof window<"u")Object.assign(window,Y),"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((e)=>{window[e]=(o,n)=>A(e,o,n)}),console.log("SigPro DX installed.")};if(typeof import.meta>"u"&&typeof window<"u")Z();export{z as when,C as watch,Z as sigpro,v as router,X as req,H as mount,A as h,K as fx,Q as each,F as batch,M as $$,N as $}; +var y=(e)=>typeof e==="function",D=(e)=>e&&typeof e==="object",b=Array.isArray,g=typeof document<"u"?document:null,P=(e)=>e?._isRuntime?e.container:e instanceof Node?e:g.createTextNode(e==null?"":String(e)),p=null,_=null,v=!1,O=0,R=new Set,I=new WeakMap,k=Symbol("iter"),$=new WeakMap,q="http://www.w3.org/2000/svg",U="http://www.w3.org/1999/xlink",F=new Set("svg,path,circle,rect,line,polyline,polygon,g,defs,text,textPath,tspan,use,symbol,image,marker,ellipse".split(",")),E=(e)=>{if(!e||e._disposed)return;e._disposed=!0;let o=[e];while(o.length){let n=o.pop();if(n._cleanups)n._cleanups.forEach((r)=>r()),n._cleanups.clear();if(n._children)n._children.forEach((r)=>o.push(r)),n._children.clear();if(n._deps)n._deps.forEach((r)=>r.delete(n)),n._deps.clear()}},x=(e)=>{if(_)(_._cleanups||=new Set).add(e)},W=(e)=>{let o=p;p=null;try{return e()}finally{p=o}},T=(e,o=!1)=>{let n=()=>{if(n._disposed)return;if(n._deps)n._deps.forEach((c)=>c.delete(n));if(n._cleanups)n._cleanups.forEach((c)=>c()),n._cleanups.clear();let r=p,s=_;p=_=n;try{return n._result=e()}catch(c){console.error("[SigPro]",c)}finally{p=r,_=s}};if(n._deps=n._cleanups=n._children=null,n._disposed=!1,n._isComputed=o,n._depth=p?p._depth+1:0,n._mounts=[],n._parent=_,_)(_._children||=new Set).add(n);return n},V=()=>{if(v)return;v=!0;let e=Array.from(R).sort((o,n)=>o._depth-n._depth);R.clear();for(let o of e)if(!o._disposed)o();v=!1},J=(e)=>{O++;try{return e()}finally{if(O--,O===0&&R.size>0&&!v)V()}},w=(e,o=!1)=>{if(!o&&p&&!p._disposed)e.add(p),(p._deps||=new Set).add(e);else if(o&&e.size>0){let n=!1;for(let r of e){if(r===p||r._disposed)continue;if(r._isComputed){if(r._dirty=!0,r._subs)w(r._subs,!0)}else R.add(r),n=!0}if(n&&!v&&O===0)queueMicrotask(V)}},S=(e,o=null)=>{let n=new Set;if(y(e)){let r,s=()=>{if(s._dirty){let c=p;p=s;try{let t=e();if(!Object.is(r,t))r=t,w(n,!0)}finally{p=c}s._dirty=!1}return w(n),r};return s._isComputed=!0,s._subs=n,s._dirty=!0,s._deps=null,s._disposed=!1,s}if(o)try{e=JSON.parse(localStorage.getItem(o))??e}catch(r){}return(...r)=>{if(r.length){let s=y(r[0])?r[0](e):r[0];if(!Object.is(e,s)){if(e=s,o)localStorage.setItem(o,JSON.stringify(e));w(n,!0)}}return w(n),e}},G=(e)=>{if(!D(e))return e;let o=I.get(e);if(o)return o;let n=new Map,r=(c)=>{let t=n.get(c);if(!t)n.set(c,t=new Set);return t},s=new Proxy(e,{get(c,t,i){if(typeof t!=="symbol")w(r(t));return G(Reflect.get(c,t,i))},set(c,t,i,l){let u=Reflect.has(c,t),a=Reflect.get(c,t,l),f=Reflect.set(c,t,i,l);if(f&&!Object.is(a,i)){if(w(r(t),!0),!u)w(r(k),!0)}return f},deleteProperty(c,t){let i=Reflect.deleteProperty(c,t);if(i)w(r(t),!0),w(r(k),!0);return i},ownKeys(c){return w(r(k)),Reflect.ownKeys(c)}});return I.set(e,s),s},C=(e,o)=>{if(o===void 0){let r=T(e);return r(),()=>E(r)}let n=T(()=>{let r=Array.isArray(e)?e.map((s)=>s()):e();W(()=>o(r))});return n(),()=>E(n)},L=(e)=>{if(!e)return;if(e._cleanups)e._cleanups.forEach((o)=>o()),e._cleanups.clear();if(e._ownerEffect)E(e._ownerEffect);if(e.childNodes)e.childNodes.forEach((o)=>L(o))},K=/^\s*(javascript|data|vbscript):/i,z=new Set(["src","href","formaction","action","background","code","archive"]),X=(e)=>z.has(e)||e.startsWith("on"),B=(e,o)=>{if(o==null||o===!1)return null;if(X(e)){let n=String(o);if(K.test(n))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${e}`),"#"}return o},A=(e,o={},n=[])=>{if(o instanceof Node||b(o)||!D(o))n=o,o={};if(y(e)){let t=T(()=>{let a=e(o,{children:n,emit:(f,...h)=>o[`on${f[0].toUpperCase()}${f.slice(1)}`]?.(...h)});return t._result=a,a});t();let i=t._result;if(i==null)return null;let l=i instanceof Node||b(i)&&i.every((a)=>a instanceof Node)?i:g.createTextNode(String(i)),u=(a)=>{if(D(a)&&!a._isRuntime)a._mounts=t._mounts||[],a._cleanups=t._cleanups||new Set,a._ownerEffect=t};return b(l)?l.forEach(u):u(l),l}let r=F.has(e),s=r?g.createElementNS(q,e):g.createElement(e);s._cleanups=new Set;for(let t of Object.keys(o)){let i=o[t];if(t==="ref"){y(i)?i(s):i.current=s;continue}if(r&&t.startsWith("xlink:")){let l=B(t.slice(6),i);l==null?s.removeAttributeNS(U,t.slice(6)):s.setAttributeNS(U,t.slice(6),l);continue}if(t.startsWith("on")){let l=t.slice(2).toLowerCase();s.addEventListener(l,i);let u=()=>s.removeEventListener(l,i);s._cleanups.add(u),x(u)}else if(y(i)){let l=T(()=>{let u=B(t,i());if(t==="class")s.className=u||"";else if(u==null)s.removeAttribute(t);else if(t in s&&!r)s[t]=u;else s.setAttribute(t,u===!0?"":u)});if(l(),s._cleanups.add(()=>E(l)),x(()=>E(l)),/^(INPUT|TEXTAREA|SELECT)$/.test(s.tagName)&&(t==="value"||t==="checked")){let u=t==="checked"?"change":"input";s.addEventListener(u,(a)=>i(a.target[t]))}}else{let l=B(t,i);if(l!=null)if(t in s&&!r)s[t]=l;else s.setAttribute(t,l===!0?"":l)}}let c=(t)=>{if(b(t))return t.forEach(c);if(y(t)){let i=g.createTextNode("");s.appendChild(i);let l=[],u=T(()=>{let a=t(),f=(b(a)?a:[a]).map(P);l.forEach((d)=>{if(d._isRuntime)d.destroy();else L(d);if(d.parentNode)d.remove()});let h=i;for(let d=f.length-1;d>=0;d--){let m=f[d];if(m.parentNode!==h.parentNode)h.parentNode?.insertBefore(m,h);if(m._mounts)m._mounts.forEach((M)=>M());h=m}l=f});u(),s._cleanups.add(()=>E(u)),x(()=>E(u))}else{let i=P(t);if(s.appendChild(i),i._mounts)i._mounts.forEach((l)=>l())}};return c(n),s},j=(e)=>{let o=new Set,n=_,r=p,s=g.createElement("div");s.style.display="contents",s.setAttribute("role","presentation"),_={_cleanups:o},p=null;let c=(t)=>{if(!t)return;if(t._isRuntime)o.add(t.destroy),s.appendChild(t.container);else if(b(t))t.forEach(c);else s.appendChild(t instanceof Node?t:g.createTextNode(String(t==null?"":t)))};try{c(e({onCleanup:(t)=>o.add(t)}))}finally{_=n,p=r}return{_isRuntime:!0,container:s,destroy:()=>{o.forEach((t)=>t()),L(s),s.remove()}}},Q=(e,o,n=null)=>{let r=g.createTextNode(""),s=A("div",{style:"display:contents"},[r]),c=null;return C(()=>!!(y(e)?e():e),(t)=>{if(c)c.destroy(),c=null;let i=t?o:n;if(i)c=j(()=>y(i)?i():i),s.insertBefore(c.container,r)}),x(()=>c?.destroy()),s},H=({name:e,duration:o=200,scale:n,slide:r,rotate:s,blur:c},t)=>{let i=typeof t==="function"?t():t;if(!(i instanceof Node))return i;if(e)return i.style.animation=`${e}-in ${o}ms`,i;let l=n||r||s||c,u=[n?"scale(0.95)":"",r?"translateY(-10px)":"",s?"rotate(-2deg)":""].filter(Boolean).join(" ");if(i.style.transition=`all ${o}ms ease`,i.style.opacity="0",l)i.style.transform=u;if(c)i.style.filter="blur(4px)";return requestAnimationFrame(()=>{if(i.style.opacity="1",l)i.style.transform="none";if(c)i.style.filter="none"}),i},Y=(e,o,n)=>{let r=g.createTextNode(""),s=A("div",{style:"display:contents"},[r]),c=new Map;return C(()=>(y(e)?e():e)||[],(t)=>{let i=new Map,l=[],u=t||[];for(let f=0;fo(h,f));else c.delete(d);i.set(d,m),l.push(m)}c.forEach((f)=>f.destroy());let a=r;for(let f=l.length-1;f>=0;f--){let d=l[f].container;if(d.nextSibling!==a)s.insertBefore(d,a);a=d}c=i}),s},N=(e)=>{let o=()=>window.location.hash.slice(1)||"/",n=S(o()),r=()=>n(o());window.addEventListener("hashchange",r),x(()=>window.removeEventListener("hashchange",r));let s=A("div",{class:"router-hook"}),c=null;return C([n],()=>{let t=n(),i=e.find((l)=>{let u=l.path.split("/").filter(Boolean),a=t.split("/").filter(Boolean);return u.length===a.length&&u.every((f,h)=>f[0]===":"||f===a[h])})||e.find((l)=>l.path==="*");if(i){c?.destroy();let l={};i.path.split("/").filter(Boolean).forEach((u,a)=>{if(u[0]===":")l[u.slice(1)]=t.split("/").filter(Boolean)[a]}),N.params(l),c=j(()=>y(i.component)?i.component(l):i.component),s.replaceChildren(c.container)}}),s};N.params=S({});N.to=(e)=>window.location.hash=e.replace(/^#?\/?/,"#/");N.back=()=>window.history.back();N.path=()=>window.location.hash.replace(/^#/,"")||"/";var Z=({url:e,method:o="GET",headers:n={}})=>{let r=S(!1),s=S(null),c=S(null),t=null,i=null;return{run:async(a=null)=>{t?.abort(),clearTimeout(i),t=new AbortController,i=setTimeout(()=>t.abort(),1e4),r(!0),s(null);try{let f=a instanceof FormData,h=await fetch(e,{method:o,headers:f?n:{"Content-Type":"application/json",...n},body:f?a:a?JSON.stringify(a):void 0,signal:t.signal}),d=await h.text(),m=d?JSON.parse(d):null;if(!h.ok)throw Error(m?.message||h.statusText);return c(m),m}catch(f){if(f.name!=="AbortError")s(f.message);throw f}finally{r(!1),clearTimeout(i),t=null,i=null}},abort:()=>t?.abort(),loading:r,error:s,data:c}},ee=(e,o)=>{let n=typeof o==="string"?g.querySelector(o):o;if(!n)return;if($.has(n))$.get(n).destroy();let r=j(y(e)?e:()=>e);return n.replaceChildren(r.container),$.set(n,r),r},te=Object.freeze({$:S,$$:G,watch:C,h:A,when:Q,each:Y,fx:H,router:N,req:Z,mount:ee,batch:J}),ne=()=>{if(typeof window<"u")Object.assign(window,te),"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((e)=>{window[e]=(o,n)=>A(e,o,n)}),console.log("SigPro DX installed.")};if(typeof import.meta>"u"&&typeof window<"u")ne();export{Q as when,C as watch,ne as sigpro,N as router,Z as req,ee as mount,A as h,H as fx,Y as each,J as batch,G as $$,S as $}; diff --git a/dist/sigpro.js b/dist/sigpro.js index 6d02f8e..85b62a5 100644 --- a/dist/sigpro.js +++ b/dist/sigpro.js @@ -68,6 +68,9 @@ var proxyCache = new WeakMap; var ITER = Symbol("iter"); var MOUNTED_NODES = new WeakMap; + var SVG_NS = "http://www.w3.org/2000/svg"; + var XLINK_NS = "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 dispose = (eff) => { if (!eff || eff._disposed) return; @@ -205,9 +208,6 @@ computed._dirty = true; computed._deps = null; computed._disposed = false; - computed.stop = () => {}; - if (activeOwner) - onUnmount(computed.stop); return computed; } if (key) @@ -343,12 +343,10 @@ isArr(node) ? node.forEach(attach) : attach(node); return node; } - const isSVG = /^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(tag); - const el = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag); + const isSVG = SVG_TAGS.has(tag); + const el = isSVG ? doc.createElementNS(SVG_NS, tag) : doc.createElement(tag); el._cleanups = new Set; - for (let k in props) { - if (!props.hasOwnProperty(k)) - continue; + for (const k of Object.keys(props)) { let v = props[k]; if (k === "ref") { isFunc(v) ? v(el) : v.current = el; @@ -356,8 +354,7 @@ } if (isSVG && k.startsWith("xlink:")) { const cleanVal = validateAttr(k.slice(6), v); - let lnk = "http://www.w3.org/1999/xlink"; - cleanVal == null ? el.removeAttributeNS(lnk, k.slice(6)) : el.setAttributeNS(lnk, k.slice(6), cleanVal); + cleanVal == null ? el.removeAttributeNS(XLINK_NS, k.slice(6)) : el.setAttributeNS(XLINK_NS, k.slice(6), cleanVal); continue; } if (k.startsWith("on")) { diff --git a/dist/sigpro.min.js b/dist/sigpro.min.js index 134032b..05e4a3a 100644 --- a/dist/sigpro.min.js +++ b/dist/sigpro.min.js @@ -1 +1 @@ -(()=>{var{defineProperty:$,getOwnPropertyNames:H,getOwnPropertyDescriptor:Y}=Object,Z=Object.prototype.hasOwnProperty;function ee(e){return this[e]}var te=(e)=>{var o=(I??=new WeakMap).get(e),n;if(o)return o;if(o=$({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function"){for(var s of H(e))if(!Z.call(o,s))$(o,s,{get:ee.bind(e,s),enumerable:!(n=Y(e,s))||n.enumerable})}return I.set(e,o),o},I;var ne=(e)=>e;function oe(e,o){this[e]=ne.bind(null,o)}var se=(e,o)=>{for(var n in o)$(e,n,{get:o[n],enumerable:!0,configurable:!0,set:oe.bind(o,n)})};var fe={};se(fe,{when:()=>W,watch:()=>O,sigpro:()=>Q,router:()=>S,req:()=>z,mount:()=>K,h:()=>x,fx:()=>G,each:()=>J,batch:()=>F,$$:()=>L,$:()=>b});var y=(e)=>typeof e==="function",P=(e)=>e&&typeof e==="object",N=Array.isArray,g=typeof document<"u"?document:null,M=(e)=>e?._isRuntime?e.container:e instanceof Node?e:g.createTextNode(e==null?"":String(e)),p=null,_=null,T=!1,R=0,C=new Set,q=new WeakMap,k=Symbol("iter"),B=new WeakMap,E=(e)=>{if(!e||e._disposed)return;e._disposed=!0;let o=[e];while(o.length){let n=o.pop();if(n._cleanups)n._cleanups.forEach((s)=>s()),n._cleanups.clear();if(n._children)n._children.forEach((s)=>o.push(s)),n._children.clear();if(n._deps)n._deps.forEach((s)=>s.delete(n)),n._deps.clear()}},v=(e)=>{if(_)(_._cleanups||=new Set).add(e)},re=(e)=>{let o=p;p=null;try{return e()}finally{p=o}},A=(e,o=!1)=>{let n=()=>{if(n._disposed)return;if(n._deps)n._deps.forEach((c)=>c.delete(n));if(n._cleanups)n._cleanups.forEach((c)=>c()),n._cleanups.clear();let s=p,r=_;p=_=n;try{return n._result=e()}catch(c){console.error("[SigPro]",c)}finally{p=s,_=r}};if(n._deps=n._cleanups=n._children=null,n._disposed=!1,n._isComputed=o,n._depth=p?p._depth+1:0,n._mounts=[],n._parent=_,_)(_._children||=new Set).add(n);return n},V=()=>{if(T)return;T=!0;let e=Array.from(C).sort((o,n)=>o._depth-n._depth);C.clear();for(let o of e)if(!o._disposed)o();T=!1},F=(e)=>{R++;try{return e()}finally{if(R--,R===0&&C.size>0&&!T)V()}},w=(e,o=!1)=>{if(!o&&p&&!p._disposed)e.add(p),(p._deps||=new Set).add(e);else if(o&&e.size>0){let n=!1;for(let s of e){if(s===p||s._disposed)continue;if(s._isComputed){if(s._dirty=!0,s._subs)w(s._subs,!0)}else C.add(s),n=!0}if(n&&!T&&R===0)queueMicrotask(V)}},b=(e,o=null)=>{let n=new Set;if(y(e)){let s,r=()=>{if(r._dirty){let c=p;p=r;try{let t=e();if(!Object.is(s,t))s=t,w(n,!0)}finally{p=c}r._dirty=!1}return w(n),s};if(r._isComputed=!0,r._subs=n,r._dirty=!0,r._deps=null,r._disposed=!1,r.stop=()=>{},_)v(r.stop);return r}if(o)try{e=JSON.parse(localStorage.getItem(o))??e}catch(s){}return(...s)=>{if(s.length){let r=y(s[0])?s[0](e):s[0];if(!Object.is(e,r)){if(e=r,o)localStorage.setItem(o,JSON.stringify(e));w(n,!0)}}return w(n),e}},L=(e)=>{if(!P(e))return e;let o=q.get(e);if(o)return o;let n=new Map,s=(c)=>{let t=n.get(c);if(!t)n.set(c,t=new Set);return t},r=new Proxy(e,{get(c,t,i){if(typeof t!=="symbol")w(s(t));return L(Reflect.get(c,t,i))},set(c,t,i,l){let a=Reflect.has(c,t),f=Reflect.get(c,t,l),u=Reflect.set(c,t,i,l);if(u&&!Object.is(f,i)){if(w(s(t),!0),!a)w(s(k),!0)}return u},deleteProperty(c,t){let i=Reflect.deleteProperty(c,t);if(i)w(s(t),!0),w(s(k),!0);return i},ownKeys(c){return w(s(k)),Reflect.ownKeys(c)}});return q.set(e,r),r},O=(e,o)=>{if(o===void 0){let s=A(e);return s(),()=>E(s)}let n=A(()=>{let s=Array.isArray(e)?e.map((r)=>r()):e();re(()=>o(s))});return n(),()=>E(n)},U=(e)=>{if(!e)return;if(e._cleanups)e._cleanups.forEach((o)=>o()),e._cleanups.clear();if(e._ownerEffect)E(e._ownerEffect);if(e.childNodes)e.childNodes.forEach((o)=>U(o))},ie=/^\s*(javascript|data|vbscript):/i,ce=new Set(["src","href","formaction","action","background","code","archive"]),le=(e)=>ce.has(e)||e.startsWith("on"),D=(e,o)=>{if(o==null||o===!1)return null;if(le(e)){let n=String(o);if(ie.test(n))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${e}`),"#"}return o},x=(e,o={},n=[])=>{if(o instanceof Node||N(o)||!P(o))n=o,o={};if(y(e)){let t=A(()=>{let f=e(o,{children:n,emit:(u,...h)=>o[`on${u[0].toUpperCase()}${u.slice(1)}`]?.(...h)});return t._result=f,f});t();let i=t._result;if(i==null)return null;let l=i instanceof Node||N(i)&&i.every((f)=>f instanceof Node)?i:g.createTextNode(String(i)),a=(f)=>{if(P(f)&&!f._isRuntime)f._mounts=t._mounts||[],f._cleanups=t._cleanups||new Set,f._ownerEffect=t};return N(l)?l.forEach(a):a(l),l}let s=/^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(e),r=s?g.createElementNS("http://www.w3.org/2000/svg",e):g.createElement(e);r._cleanups=new Set;for(let t in o){if(!o.hasOwnProperty(t))continue;let i=o[t];if(t==="ref"){y(i)?i(r):i.current=r;continue}if(s&&t.startsWith("xlink:")){let l=D(t.slice(6),i),a="http://www.w3.org/1999/xlink";l==null?r.removeAttributeNS(a,t.slice(6)):r.setAttributeNS(a,t.slice(6),l);continue}if(t.startsWith("on")){let l=t.slice(2).toLowerCase();r.addEventListener(l,i);let a=()=>r.removeEventListener(l,i);r._cleanups.add(a),v(a)}else if(y(i)){let l=A(()=>{let a=D(t,i());if(t==="class")r.className=a||"";else if(a==null)r.removeAttribute(t);else if(t in r&&!s)r[t]=a;else r.setAttribute(t,a===!0?"":a)});if(l(),r._cleanups.add(()=>E(l)),v(()=>E(l)),/^(INPUT|TEXTAREA|SELECT)$/.test(r.tagName)&&(t==="value"||t==="checked")){let a=t==="checked"?"change":"input";r.addEventListener(a,(f)=>i(f.target[t]))}}else{let l=D(t,i);if(l!=null)if(t in r&&!s)r[t]=l;else r.setAttribute(t,l===!0?"":l)}}let c=(t)=>{if(N(t))return t.forEach(c);if(y(t)){let i=g.createTextNode("");r.appendChild(i);let l=[],a=A(()=>{let f=t(),u=(N(f)?f:[f]).map(M);l.forEach((d)=>{if(d._isRuntime)d.destroy();else U(d);if(d.parentNode)d.remove()});let h=i;for(let d=u.length-1;d>=0;d--){let m=u[d];if(m.parentNode!==h.parentNode)h.parentNode?.insertBefore(m,h);if(m._mounts)m._mounts.forEach((X)=>X());h=m}l=u});a(),r._cleanups.add(()=>E(a)),v(()=>E(a))}else{let i=M(t);if(r.appendChild(i),i._mounts)i._mounts.forEach((l)=>l())}};return c(n),r},j=(e)=>{let o=new Set,n=_,s=p,r=g.createElement("div");r.style.display="contents",r.setAttribute("role","presentation"),_={_cleanups:o},p=null;let c=(t)=>{if(!t)return;if(t._isRuntime)o.add(t.destroy),r.appendChild(t.container);else if(N(t))t.forEach(c);else r.appendChild(t instanceof Node?t:g.createTextNode(String(t==null?"":t)))};try{c(e({onCleanup:(t)=>o.add(t)}))}finally{_=n,p=s}return{_isRuntime:!0,container:r,destroy:()=>{o.forEach((t)=>t()),U(r),r.remove()}}},W=(e,o,n=null)=>{let s=g.createTextNode(""),r=x("div",{style:"display:contents"},[s]),c=null;return O(()=>!!(y(e)?e():e),(t)=>{if(c)c.destroy(),c=null;let i=t?o:n;if(i)c=j(()=>y(i)?i():i),r.insertBefore(c.container,s)}),v(()=>c?.destroy()),r},G=({name:e,duration:o=200,scale:n,slide:s,rotate:r,blur:c},t)=>{let i=typeof t==="function"?t():t;if(!(i instanceof Node))return i;if(e)return i.style.animation=`${e}-in ${o}ms`,i;let l=n||s||r||c,a=[n?"scale(0.95)":"",s?"translateY(-10px)":"",r?"rotate(-2deg)":""].filter(Boolean).join(" ");if(i.style.transition=`all ${o}ms ease`,i.style.opacity="0",l)i.style.transform=a;if(c)i.style.filter="blur(4px)";return requestAnimationFrame(()=>{if(i.style.opacity="1",l)i.style.transform="none";if(c)i.style.filter="none"}),i},J=(e,o,n)=>{let s=g.createTextNode(""),r=x("div",{style:"display:contents"},[s]),c=new Map;return O(()=>(y(e)?e():e)||[],(t)=>{let i=new Map,l=[],a=t||[];for(let u=0;uo(h,u));else c.delete(d);i.set(d,m),l.push(m)}c.forEach((u)=>u.destroy());let f=s;for(let u=l.length-1;u>=0;u--){let d=l[u].container;if(d.nextSibling!==f)r.insertBefore(d,f);f=d}c=i}),r},S=(e)=>{let o=()=>window.location.hash.slice(1)||"/",n=b(o()),s=()=>n(o());window.addEventListener("hashchange",s),v(()=>window.removeEventListener("hashchange",s));let r=x("div",{class:"router-hook"}),c=null;return O([n],()=>{let t=n(),i=e.find((l)=>{let a=l.path.split("/").filter(Boolean),f=t.split("/").filter(Boolean);return a.length===f.length&&a.every((u,h)=>u[0]===":"||u===f[h])})||e.find((l)=>l.path==="*");if(i){c?.destroy();let l={};i.path.split("/").filter(Boolean).forEach((a,f)=>{if(a[0]===":")l[a.slice(1)]=t.split("/").filter(Boolean)[f]}),S.params(l),c=j(()=>y(i.component)?i.component(l):i.component),r.replaceChildren(c.container)}}),r};S.params=b({});S.to=(e)=>window.location.hash=e.replace(/^#?\/?/,"#/");S.back=()=>window.history.back();S.path=()=>window.location.hash.replace(/^#/,"")||"/";var z=({url:e,method:o="GET",headers:n={}})=>{let s=b(!1),r=b(null),c=b(null),t=null,i=null;return{run:async(f=null)=>{t?.abort(),clearTimeout(i),t=new AbortController,i=setTimeout(()=>t.abort(),1e4),s(!0),r(null);try{let u=f instanceof FormData,h=await fetch(e,{method:o,headers:u?n:{"Content-Type":"application/json",...n},body:u?f:f?JSON.stringify(f):void 0,signal:t.signal}),d=await h.text(),m=d?JSON.parse(d):null;if(!h.ok)throw Error(m?.message||h.statusText);return c(m),m}catch(u){if(u.name!=="AbortError")r(u.message);throw u}finally{s(!1),clearTimeout(i),t=null,i=null}},abort:()=>t?.abort(),loading:s,error:r,data:c}},K=(e,o)=>{let n=typeof o==="string"?g.querySelector(o):o;if(!n)return;if(B.has(n))B.get(n).destroy();let s=j(y(e)?e:()=>e);return n.replaceChildren(s.container),B.set(n,s),s},ae=Object.freeze({$:b,$$:L,watch:O,h:x,when:W,each:J,fx:G,router:S,req:z,mount:K,batch:F}),Q=()=>{if(typeof window<"u")Object.assign(window,ae),"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((e)=>{window[e]=(o,n)=>x(e,o,n)}),console.log("SigPro DX installed.")};if(typeof import.meta>"u"&&typeof window<"u")Q();})(); +(()=>{var{defineProperty:k,getOwnPropertyNames:Y,getOwnPropertyDescriptor:Z}=Object,ee=Object.prototype.hasOwnProperty;function te(e){return this[e]}var ne=(e)=>{var o=(U??=new WeakMap).get(e),n;if(o)return o;if(o=k({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function"){for(var s of Y(e))if(!ee.call(o,s))k(o,s,{get:te.bind(e,s),enumerable:!(n=Z(e,s))||n.enumerable})}return U.set(e,o),o},U;var oe=(e)=>e;function se(e,o){this[e]=oe.bind(null,o)}var re=(e,o)=>{for(var n in o)k(e,n,{get:o[n],enumerable:!0,configurable:!0,set:se.bind(o,n)})};var pe={};re(pe,{when:()=>W,watch:()=>O,sigpro:()=>Q,router:()=>S,req:()=>z,mount:()=>X,h:()=>v,fx:()=>J,each:()=>K,batch:()=>F,$$:()=>P,$:()=>b});var y=(e)=>typeof e==="function",L=(e)=>e&&typeof e==="object",N=Array.isArray,g=typeof document<"u"?document:null,V=(e)=>e?._isRuntime?e.container:e instanceof Node?e:g.createTextNode(e==null?"":String(e)),p=null,_=null,x=!1,R=0,C=new Set,G=new WeakMap,$=Symbol("iter"),B=new WeakMap,ie="http://www.w3.org/2000/svg",M="http://www.w3.org/1999/xlink",ce=new Set("svg,path,circle,rect,line,polyline,polygon,g,defs,text,textPath,tspan,use,symbol,image,marker,ellipse".split(",")),E=(e)=>{if(!e||e._disposed)return;e._disposed=!0;let o=[e];while(o.length){let n=o.pop();if(n._cleanups)n._cleanups.forEach((s)=>s()),n._cleanups.clear();if(n._children)n._children.forEach((s)=>o.push(s)),n._children.clear();if(n._deps)n._deps.forEach((s)=>s.delete(n)),n._deps.clear()}},T=(e)=>{if(_)(_._cleanups||=new Set).add(e)},le=(e)=>{let o=p;p=null;try{return e()}finally{p=o}},A=(e,o=!1)=>{let n=()=>{if(n._disposed)return;if(n._deps)n._deps.forEach((c)=>c.delete(n));if(n._cleanups)n._cleanups.forEach((c)=>c()),n._cleanups.clear();let s=p,r=_;p=_=n;try{return n._result=e()}catch(c){console.error("[SigPro]",c)}finally{p=s,_=r}};if(n._deps=n._cleanups=n._children=null,n._disposed=!1,n._isComputed=o,n._depth=p?p._depth+1:0,n._mounts=[],n._parent=_,_)(_._children||=new Set).add(n);return n},q=()=>{if(x)return;x=!0;let e=Array.from(C).sort((o,n)=>o._depth-n._depth);C.clear();for(let o of e)if(!o._disposed)o();x=!1},F=(e)=>{R++;try{return e()}finally{if(R--,R===0&&C.size>0&&!x)q()}},w=(e,o=!1)=>{if(!o&&p&&!p._disposed)e.add(p),(p._deps||=new Set).add(e);else if(o&&e.size>0){let n=!1;for(let s of e){if(s===p||s._disposed)continue;if(s._isComputed){if(s._dirty=!0,s._subs)w(s._subs,!0)}else C.add(s),n=!0}if(n&&!x&&R===0)queueMicrotask(q)}},b=(e,o=null)=>{let n=new Set;if(y(e)){let s,r=()=>{if(r._dirty){let c=p;p=r;try{let t=e();if(!Object.is(s,t))s=t,w(n,!0)}finally{p=c}r._dirty=!1}return w(n),s};return r._isComputed=!0,r._subs=n,r._dirty=!0,r._deps=null,r._disposed=!1,r}if(o)try{e=JSON.parse(localStorage.getItem(o))??e}catch(s){}return(...s)=>{if(s.length){let r=y(s[0])?s[0](e):s[0];if(!Object.is(e,r)){if(e=r,o)localStorage.setItem(o,JSON.stringify(e));w(n,!0)}}return w(n),e}},P=(e)=>{if(!L(e))return e;let o=G.get(e);if(o)return o;let n=new Map,s=(c)=>{let t=n.get(c);if(!t)n.set(c,t=new Set);return t},r=new Proxy(e,{get(c,t,i){if(typeof t!=="symbol")w(s(t));return P(Reflect.get(c,t,i))},set(c,t,i,l){let u=Reflect.has(c,t),a=Reflect.get(c,t,l),f=Reflect.set(c,t,i,l);if(f&&!Object.is(a,i)){if(w(s(t),!0),!u)w(s($),!0)}return f},deleteProperty(c,t){let i=Reflect.deleteProperty(c,t);if(i)w(s(t),!0),w(s($),!0);return i},ownKeys(c){return w(s($)),Reflect.ownKeys(c)}});return G.set(e,r),r},O=(e,o)=>{if(o===void 0){let s=A(e);return s(),()=>E(s)}let n=A(()=>{let s=Array.isArray(e)?e.map((r)=>r()):e();le(()=>o(s))});return n(),()=>E(n)},I=(e)=>{if(!e)return;if(e._cleanups)e._cleanups.forEach((o)=>o()),e._cleanups.clear();if(e._ownerEffect)E(e._ownerEffect);if(e.childNodes)e.childNodes.forEach((o)=>I(o))},ae=/^\s*(javascript|data|vbscript):/i,fe=new Set(["src","href","formaction","action","background","code","archive"]),ue=(e)=>fe.has(e)||e.startsWith("on"),D=(e,o)=>{if(o==null||o===!1)return null;if(ue(e)){let n=String(o);if(ae.test(n))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${e}`),"#"}return o},v=(e,o={},n=[])=>{if(o instanceof Node||N(o)||!L(o))n=o,o={};if(y(e)){let t=A(()=>{let a=e(o,{children:n,emit:(f,...h)=>o[`on${f[0].toUpperCase()}${f.slice(1)}`]?.(...h)});return t._result=a,a});t();let i=t._result;if(i==null)return null;let l=i instanceof Node||N(i)&&i.every((a)=>a instanceof Node)?i:g.createTextNode(String(i)),u=(a)=>{if(L(a)&&!a._isRuntime)a._mounts=t._mounts||[],a._cleanups=t._cleanups||new Set,a._ownerEffect=t};return N(l)?l.forEach(u):u(l),l}let s=ce.has(e),r=s?g.createElementNS(ie,e):g.createElement(e);r._cleanups=new Set;for(let t of Object.keys(o)){let i=o[t];if(t==="ref"){y(i)?i(r):i.current=r;continue}if(s&&t.startsWith("xlink:")){let l=D(t.slice(6),i);l==null?r.removeAttributeNS(M,t.slice(6)):r.setAttributeNS(M,t.slice(6),l);continue}if(t.startsWith("on")){let l=t.slice(2).toLowerCase();r.addEventListener(l,i);let u=()=>r.removeEventListener(l,i);r._cleanups.add(u),T(u)}else if(y(i)){let l=A(()=>{let u=D(t,i());if(t==="class")r.className=u||"";else if(u==null)r.removeAttribute(t);else if(t in r&&!s)r[t]=u;else r.setAttribute(t,u===!0?"":u)});if(l(),r._cleanups.add(()=>E(l)),T(()=>E(l)),/^(INPUT|TEXTAREA|SELECT)$/.test(r.tagName)&&(t==="value"||t==="checked")){let u=t==="checked"?"change":"input";r.addEventListener(u,(a)=>i(a.target[t]))}}else{let l=D(t,i);if(l!=null)if(t in r&&!s)r[t]=l;else r.setAttribute(t,l===!0?"":l)}}let c=(t)=>{if(N(t))return t.forEach(c);if(y(t)){let i=g.createTextNode("");r.appendChild(i);let l=[],u=A(()=>{let a=t(),f=(N(a)?a:[a]).map(V);l.forEach((d)=>{if(d._isRuntime)d.destroy();else I(d);if(d.parentNode)d.remove()});let h=i;for(let d=f.length-1;d>=0;d--){let m=f[d];if(m.parentNode!==h.parentNode)h.parentNode?.insertBefore(m,h);if(m._mounts)m._mounts.forEach((H)=>H());h=m}l=f});u(),r._cleanups.add(()=>E(u)),T(()=>E(u))}else{let i=V(t);if(r.appendChild(i),i._mounts)i._mounts.forEach((l)=>l())}};return c(n),r},j=(e)=>{let o=new Set,n=_,s=p,r=g.createElement("div");r.style.display="contents",r.setAttribute("role","presentation"),_={_cleanups:o},p=null;let c=(t)=>{if(!t)return;if(t._isRuntime)o.add(t.destroy),r.appendChild(t.container);else if(N(t))t.forEach(c);else r.appendChild(t instanceof Node?t:g.createTextNode(String(t==null?"":t)))};try{c(e({onCleanup:(t)=>o.add(t)}))}finally{_=n,p=s}return{_isRuntime:!0,container:r,destroy:()=>{o.forEach((t)=>t()),I(r),r.remove()}}},W=(e,o,n=null)=>{let s=g.createTextNode(""),r=v("div",{style:"display:contents"},[s]),c=null;return O(()=>!!(y(e)?e():e),(t)=>{if(c)c.destroy(),c=null;let i=t?o:n;if(i)c=j(()=>y(i)?i():i),r.insertBefore(c.container,s)}),T(()=>c?.destroy()),r},J=({name:e,duration:o=200,scale:n,slide:s,rotate:r,blur:c},t)=>{let i=typeof t==="function"?t():t;if(!(i instanceof Node))return i;if(e)return i.style.animation=`${e}-in ${o}ms`,i;let l=n||s||r||c,u=[n?"scale(0.95)":"",s?"translateY(-10px)":"",r?"rotate(-2deg)":""].filter(Boolean).join(" ");if(i.style.transition=`all ${o}ms ease`,i.style.opacity="0",l)i.style.transform=u;if(c)i.style.filter="blur(4px)";return requestAnimationFrame(()=>{if(i.style.opacity="1",l)i.style.transform="none";if(c)i.style.filter="none"}),i},K=(e,o,n)=>{let s=g.createTextNode(""),r=v("div",{style:"display:contents"},[s]),c=new Map;return O(()=>(y(e)?e():e)||[],(t)=>{let i=new Map,l=[],u=t||[];for(let f=0;fo(h,f));else c.delete(d);i.set(d,m),l.push(m)}c.forEach((f)=>f.destroy());let a=s;for(let f=l.length-1;f>=0;f--){let d=l[f].container;if(d.nextSibling!==a)r.insertBefore(d,a);a=d}c=i}),r},S=(e)=>{let o=()=>window.location.hash.slice(1)||"/",n=b(o()),s=()=>n(o());window.addEventListener("hashchange",s),T(()=>window.removeEventListener("hashchange",s));let r=v("div",{class:"router-hook"}),c=null;return O([n],()=>{let t=n(),i=e.find((l)=>{let u=l.path.split("/").filter(Boolean),a=t.split("/").filter(Boolean);return u.length===a.length&&u.every((f,h)=>f[0]===":"||f===a[h])})||e.find((l)=>l.path==="*");if(i){c?.destroy();let l={};i.path.split("/").filter(Boolean).forEach((u,a)=>{if(u[0]===":")l[u.slice(1)]=t.split("/").filter(Boolean)[a]}),S.params(l),c=j(()=>y(i.component)?i.component(l):i.component),r.replaceChildren(c.container)}}),r};S.params=b({});S.to=(e)=>window.location.hash=e.replace(/^#?\/?/,"#/");S.back=()=>window.history.back();S.path=()=>window.location.hash.replace(/^#/,"")||"/";var z=({url:e,method:o="GET",headers:n={}})=>{let s=b(!1),r=b(null),c=b(null),t=null,i=null;return{run:async(a=null)=>{t?.abort(),clearTimeout(i),t=new AbortController,i=setTimeout(()=>t.abort(),1e4),s(!0),r(null);try{let f=a instanceof FormData,h=await fetch(e,{method:o,headers:f?n:{"Content-Type":"application/json",...n},body:f?a:a?JSON.stringify(a):void 0,signal:t.signal}),d=await h.text(),m=d?JSON.parse(d):null;if(!h.ok)throw Error(m?.message||h.statusText);return c(m),m}catch(f){if(f.name!=="AbortError")r(f.message);throw f}finally{s(!1),clearTimeout(i),t=null,i=null}},abort:()=>t?.abort(),loading:s,error:r,data:c}},X=(e,o)=>{let n=typeof o==="string"?g.querySelector(o):o;if(!n)return;if(B.has(n))B.get(n).destroy();let s=j(y(e)?e:()=>e);return n.replaceChildren(s.container),B.set(n,s),s},de=Object.freeze({$:b,$$:P,watch:O,h:v,when:W,each:K,fx:J,router:S,req:z,mount:X,batch:F}),Q=()=>{if(typeof window<"u")Object.assign(window,de),"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((e)=>{window[e]=(o,n)=>v(e,o,n)}),console.log("SigPro DX installed.")};if(typeof import.meta>"u"&&typeof window<"u")Q();})(); diff --git a/docs/sigpro.js b/docs/sigpro.js index 6d02f8e..85b62a5 100644 --- a/docs/sigpro.js +++ b/docs/sigpro.js @@ -68,6 +68,9 @@ var proxyCache = new WeakMap; var ITER = Symbol("iter"); var MOUNTED_NODES = new WeakMap; + var SVG_NS = "http://www.w3.org/2000/svg"; + var XLINK_NS = "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 dispose = (eff) => { if (!eff || eff._disposed) return; @@ -205,9 +208,6 @@ computed._dirty = true; computed._deps = null; computed._disposed = false; - computed.stop = () => {}; - if (activeOwner) - onUnmount(computed.stop); return computed; } if (key) @@ -343,12 +343,10 @@ isArr(node) ? node.forEach(attach) : attach(node); return node; } - const isSVG = /^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(tag); - const el = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag); + const isSVG = SVG_TAGS.has(tag); + const el = isSVG ? doc.createElementNS(SVG_NS, tag) : doc.createElement(tag); el._cleanups = new Set; - for (let k in props) { - if (!props.hasOwnProperty(k)) - continue; + for (const k of Object.keys(props)) { let v = props[k]; if (k === "ref") { isFunc(v) ? v(el) : v.current = el; @@ -356,8 +354,7 @@ } if (isSVG && k.startsWith("xlink:")) { const cleanVal = validateAttr(k.slice(6), v); - let lnk = "http://www.w3.org/1999/xlink"; - cleanVal == null ? el.removeAttributeNS(lnk, k.slice(6)) : el.setAttributeNS(lnk, k.slice(6), cleanVal); + cleanVal == null ? el.removeAttributeNS(XLINK_NS, k.slice(6)) : el.setAttributeNS(XLINK_NS, k.slice(6), cleanVal); continue; } if (k.startsWith("on")) { diff --git a/package.json b/package.json index 6e3751a..2d36cce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sigpro", - "version": "1.2.21", + "version": "1.2.22", "type": "module", "license": "MIT", "main": "./dist/sigpro.esm.min.js", diff --git a/sigpro.js b/sigpro.js index 5f31cb3..8c8ea72 100644 --- a/sigpro.js +++ b/sigpro.js @@ -13,6 +13,10 @@ const proxyCache = new WeakMap() const ITER = Symbol('iter') const MOUNTED_NODES = new WeakMap() +const SVG_NS = "http://www.w3.org/2000/svg" +const XLINK_NS = "http://www.w3.org/1999/xlink" +const SVG_TAGS = new Set("svg,path,circle,rect,line,polyline,polygon,g,defs,text,textPath,tspan,use,symbol,image,marker,ellipse".split(",")) + const dispose = eff => { if (!eff || eff._disposed) return eff._disposed = true @@ -97,8 +101,8 @@ const batch = fn => { const trackUpdate = (subs, trigger = false) => { if (!trigger && activeEffect && !activeEffect._disposed) { - subs.add(activeEffect) - ; (activeEffect._deps ||= new Set()).add(subs) + subs.add(activeEffect); + (activeEffect._deps ||= new Set()).add(subs) } else if (trigger && subs.size > 0) { let hasQueue = false for (const e of subs) { @@ -142,8 +146,6 @@ const $ = (val, key = null) => { computed._dirty = true computed._deps = null computed._disposed = false - computed.stop = () => { } - if (activeOwner) onUnmount(computed.stop) return computed } if (key) try { val = JSON.parse(localStorage.getItem(key)) ?? val } catch (e) { } @@ -281,24 +283,23 @@ const h = (tag, props = {}, children = []) => { isArr(node) ? node.forEach(attach) : attach(node) return node } - const isSVG = /^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(tag); - const el = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag) + + const isSVG = SVG_TAGS.has(tag) + const el = isSVG ? doc.createElementNS(SVG_NS, tag) : doc.createElement(tag) el._cleanups = new Set() - for (let k in props) { - if (!props.hasOwnProperty(k)) continue + for (const k of Object.keys(props)) { let v = props[k] if (k === "ref") { isFunc(v) ? v(el) : (v.current = el) continue } if (isSVG && k.startsWith("xlink:")) { - const cleanVal = validateAttr(k.slice(6), v); - let lnk = "http://www.w3.org/1999/xlink" + const cleanVal = validateAttr(k.slice(6), v) cleanVal == null - ? el.removeAttributeNS(lnk, k.slice(6)) - : el.setAttributeNS(lnk, k.slice(6), cleanVal); - continue; + ? el.removeAttributeNS(XLINK_NS, k.slice(6)) + : el.setAttributeNS(XLINK_NS, k.slice(6), cleanVal) + continue } if (k.startsWith("on")) { const ev = k.slice(2).toLowerCase()