sprae 12.4.0 → 12.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core.js +5 -1
- package/dist/sprae.js +3 -3
- package/dist/sprae.js.map +3 -3
- package/dist/sprae.umd.js +3 -3
- package/dist/sprae.umd.js.map +3 -3
- package/package.json +3 -2
- package/readme.md +2 -2
- package/sprae.js +0 -7
- package/types/core.d.ts.map +1 -1
- package/types/sprae.d.ts.map +1 -1
package/core.js
CHANGED
|
@@ -106,7 +106,11 @@ const elHint = (el) => {
|
|
|
106
106
|
const err = (e, expr) => {
|
|
107
107
|
let msg = `∴ ${e}`
|
|
108
108
|
if (currentEl) msg += `\n in ${elHint(currentEl)}`
|
|
109
|
-
if (currentDir && expr)
|
|
109
|
+
if (currentDir && expr) {
|
|
110
|
+
// Truncate long expressions
|
|
111
|
+
const display = expr.length > 100 ? expr.slice(0, 80) + `… (${expr.length} chars)` : expr
|
|
112
|
+
msg += `\n ${currentDir}="${display}"`
|
|
113
|
+
}
|
|
110
114
|
console.error(msg)
|
|
111
115
|
}
|
|
112
116
|
|
package/dist/sprae.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
2
|
-
in ${Ke(U)}`),Q&&t
|
|
3
|
-
${Q}="${t}"`),console.error(r)},Ie=(e=document.body,t)=>{if(e[p])return Object.assign(e[p],t);t=H(t||{});let r=[],o=[];e[z]=()=>!o&&(o=r.map(s=>s())),e[K]=()=>(o?.map(s=>s()),o=null),e[y]||(e[y]=()=>(e[K](),e[K]=e[z]=e[y]=e[B]=e[p]=null));let n=e[B]=s=>{let i=s.attributes,a;if(i)for(let c=0;c<i.length;){let{name:l,value:f}=i[c];if(l.startsWith(G)){if(s.removeAttribute(l),Q=l,U=s,r.push(a=ce(s,l.slice(G.length),f,t)),o.push(a()),p in s)return}else c++}if(s.firstChild!==void 0){let c=s.firstChild,l;for(;c;)l=c.nextSibling,c.nodeType==1&&n(c),c=l}else for(let c of s.childNodes)c.nodeType==1&&n(c)};return n(e),e[p]===void 0&&(e[p]=t),t},ce,le,m=e=>{let t=ae[e=e.trim()];if(t)return t;try{t=le(e||"undefined")}catch(r){Z(r,e)}return ae[e]=function(r,o,n){try{let s=t?.call(this,r);return o?s?.then?(s.then(i=>n=o(i)).catch(i=>Z(i,e)),()=>typeof n=="function"&&n()):o(s):s}catch(s){Z(s,e)}}},ae={},Y=e=>(e.compile&&(le=e.compile),e.prefix&&(G=e.prefix),e.signal&&(x=e.signal),e.effect&&(I=e.effect),e.computed&&(J=e.computed),e.batch&&(R=e.batch),e.untracked&&(M=e.untracked),e.dir&&(ce=e.dir)),_=(e,t)=>{for(;t.length;){let[r,...o]=t.pop().split("-"),n=D[r],s;if(n&&(s=n(e,...o))!==e){for(let i in e)s[i]??(s[i]=e[i]);e=s}}return e},C=e=>{if(!e.nodeType)return e;let t=e.content.cloneNode(!0),r=[...e.attributes],o=document.createTextNode(""),n=(t.append(o),[...t.childNodes]);return{childNodes:n,content:t,remove:()=>t.append(...n),replaceWith(s){s!==o&&(o.before(s),t.append(...n))},attributes:r,removeAttribute(s){r.splice(r.findIndex(i=>i.name===s),1)}}},ue=e=>e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(t,r)=>(r?"-":"")+t.toLowerCase()),S=(e,t,r)=>r==null||r===!1?e.removeAttribute(t):e.setAttribute(t,r===!0?"":r),v=(e,t=[])=>e?typeof e=="string"?e:(Array.isArray(e)?e.map(v):Object.entries(e).reduce((r,[o,n])=>n?[...r,o]:r,[])).join(" "):"",$=(e,t)=>{let r=0,o,n=typeof t=="function"?t:t?i=>setTimeout(i,t):queueMicrotask,s=i=>{o=i,r++||(e(o),n((a=r>1)=>(r=0,a&&s(o))))};return s},de=(e,t,r)=>{let o=typeof t=="function"?t:t?n=>setTimeout(n,t):queueMicrotask;return r?(n=>s=>!n&&(e(s),n=1,o(()=>n=0)))():((n=0)=>(s,i=++n)=>o(()=>i==n&&e(s)))()},u=Ie;var w=Symbol("signals"),N=Symbol("change"),te=Symbol("set"),ee=!0,E=(e,t)=>{if(!e||e[Symbol.toStringTag]||e[w])return e;if(e.constructor!==Object)return Array.isArray(e)?Re(e):e;let r=Object.keys(e).length,o={},n=new Proxy(Object.assign(o,{[N]:x(r),[w]:o}),{get:(i,a)=>a in o?o[a]?o[a].valueOf():o[a]:t?t[a]:typeof globalThis[a]=="function"&&!globalThis[a].prototype?globalThis[a].bind(globalThis):globalThis[a],set:(i,a,c)=>a in o?(pe(o,a,c),1):(ee=!1,t&&a in t?t[a]=c:(X(o,a,c),o[N].value=++r),ee=!0,1),deleteProperty:(i,a)=>(a in o&&(a[0]!="_"&&o[a]?.[Symbol.dispose]?.(),delete o[a],o[N].value=--r),1),ownKeys:()=>(o[N].value,Reflect.ownKeys(o)),has:(i,a)=>a in o?!0:t?a in t:ee}),s=Object.getOwnPropertyDescriptors(e);for(let i in e)s[i]?.get?(o[i]=J(s[i].get.bind(n)))[te]=s[i].set?.bind(n):X(o,i,e[i]);return n},Re=(e,t=globalThis)=>{let r=Array(e.length).fill(null),o=!1,n=a=>function(){return o=!0,a.apply(this,arguments)},s=x(e.length),i=new Proxy(Object.assign(r,{[N]:s,[w]:r,push:n(r.push),pop:n(r.pop),shift:n(r.shift),unshift:n(r.unshift),splice:n(r.splice)}),{get(a,c){return c==="length"?o?(o=!1,r.length):s.value:typeof c=="symbol"||isNaN(c)?r[c]?.valueOf()??t[c]:(r[c]??(r[c]=x(E(e[c])))).valueOf()},set(a,c,l){if(c==="length"){for(let f=l;f<r.length;f++)delete i[f];s.value=r.length=l}else c>=r.length?(X(r,c,l),i.length=+c+1):r[c]?pe(r,c,l):X(r,c,l);return 1},deleteProperty:(a,c)=>(r[c]?.[Symbol.dispose]?.(),delete r[c],1)});return i},X=(e,t,r)=>e[t]=t[0]=="_"||r?.peek?r:x(E(r)),pe=(e,t,r,o,n)=>t[0]==="_"?e[t]=r:r!==(n=(o=e[t]).peek())&&(o[te]?o[te](r):Array.isArray(r)&&Array.isArray(n)?N in n?M(()=>R(()=>{for(let s=0;s<r.length;s++)n[s]=r[s];n.length=r.length})):o.value=r:o.value=E(r)),H=E;var re={};Pe(re,{batch:()=>He,computed:()=>Fe,effect:()=>he,signal:()=>me,untracked:()=>Ve});var j,fe=0,W,me=(e,t,r=new Set,o=()=>t.value)=>t={get value(){return j?.deps.add(r.add(j)),e},set value(n){if(n!==e){e=n;for(let s of r)W?W.add(s):s()}},peek(){return e},toJSON:o,toString:o,valueOf:o},he=(e,t,r,o)=>(r=n=>{let s=t;if(t=null,s?.call?.(),n=j,j=r,fe++>10)throw"Cycle detected";try{t=e()}finally{j=n,fe--}},r.fn=e,o=r.deps=new Set,r(),n=>{t?.call?.();for(n of o)n.delete(r);o.clear()}),Fe=(e,t=me(),r,o,n=()=>r.value)=>r={get value(){return o||(o=he(()=>t.value=e())),t.value},peek:t.peek,toJSON:n,toString:n,valueOf:n},He=(e,t=!W,r)=>{W??(W=new Set);try{e()}finally{if(t){[W,r]=[null,W];for(let o of r)o()}}},Ve=(e,t,r)=>(t=j,j=null,r=e(),j=t,r);var ye=(e,t)=>{var s;let r,o,n;return e._holder?u(o=e,t):(e[s=p]??(e[s]=null),o=e.content?C(e):e,e.replaceWith(r=document.createTextNode("")),o._holder=r._holder=r,r._clauses=[o._clause=[o,!1]],r.update=$(()=>{let i=r._clauses.find(([,a])=>a);i!=n&&(n?.[0].remove(),n?.[0][K]?.(),(n=i)&&(r.before(n[0].content||n[0]),n[0][p]?n[0][z]?.():(delete n[0][p],u(n[0],t))))})),i=>{o._clause[1]=i,o._holder.update()}};var ge=e=>{let t,r=e;for(t=e.content?C(e):e;r&&!(t._holder=r._holder);)r=r.previousSibling;return e.remove(),e[p]=null,t._holder._clauses.push(t._clause=[t,!0]),t._holder.update};var be=e=>(e.content&&e.replaceWith(e=C(e).childNodes[0]),t=>(t=typeof t=="function"?t(e.textContent):t,e.textContent=t??""));var xe=(e,t,r,o)=>{let n=new Set,s;return o.includes(".")&&(e=_({target:e},o.split(".").slice(1)).target??e),i=>{s=new Set,i&&v(typeof i=="function"?i(e.className):i).split(" ").map(a=>a&&s.add(a));for(let a of n)s.has(a)?s.delete(a):e.classList.remove(a);for(let a of n=s)e.classList.add(a)}};var _e=(e,t,r,o)=>{let n;return o.includes(".")&&(e=_({target:e},o.split(".").slice(1)).target??e),s=>{if(n||(n=e.getAttribute("style")),s=typeof s=="function"?s(e.style):s,typeof s=="string")S(e,"style",n+"; "+s);else{n&&S(e,"style",n);for(let i in s)i[0]=="-"?e.style.setProperty(i,s[i]):i[0]>"A"&&(e.style[i]=s[i])}}};var Se=()=>e=>typeof e=="function"&&e();var oe=(e,t=m(`${e}=__`))=>(r,o)=>{r.__=o,t(r),delete r.__},we=(e,t,r)=>{try{let o=oe(r),n=e.type==="checkbox"?()=>o(t,e.checked):e.type==="select-multiple"?()=>o(t,[...e.selectedOptions].map(s=>s.value)):()=>o(t,e.selectedIndex<0?null:isNaN(e.valueAsNumber)?e.value:e.valueAsNumber);e.oninput=e.onchange=n,e.type?.startsWith("select")&&(new MutationObserver(n).observe(e,{childList:!0,subtree:!0,attributes:!0}),u(e,t)),m(r)(t)??n()}catch{}return e.type==="text"||e.type===""||e.tagName==="TEXTAREA"?(o,n,s)=>(n=e.selectionStart,s=e.selectionEnd,e.setAttribute("value",e.value=o??""),n&&e.setSelectionRange(n,s)):e.type==="checkbox"?o=>(e.checked=o,S(e,"checked",o)):e.type==="radio"?o=>e.value===o&&(e.checked=o,S(e,"checked",o)):e.type==="select-one"?o=>{for(let n of e.options)n.value==o?n.setAttribute("selected",""):n.removeAttribute("selected");e.value=o}:e.type==="select-multiple"?o=>{for(let n of e.options)n.removeAttribute("selected");for(let n of o)e.querySelector(`[value="${n}"]`).setAttribute("selected","")}:o=>e.value=o};var Ae=(e,t,r)=>{let o=m(r)(t);if(typeof o=="function")return{[Symbol.dispose]:o(e)};oe(r)(t,e)};var Ne=(e,t)=>{let r=e[p]=E({},t),o=!1;return n=>{if(n=typeof n=="function"?n(r):n,n!==r)for(let s in n){let i=typeof n[s]=="function"?n[s].bind(r):n[s];s in r[w]?r[s]=i:r[w][s]=s[0]=="_"||i?.peek?i:x(E(i))}return!o&&(o=!0,delete e[p],M(()=>u(e,r)))}};var Oe=(e,t,r)=>{let[o,n]=r.split(/\bin|of\b/),[s,i="$"]=o.trim().replace(/\(|\)/g,"").split(/\s*,\s*/),a=document.createTextNode(""),c,l,f,O=0,A=$(()=>{var T,h;let d=0,k=f,g=k.length;if(c&&!c[N]){for(let L of c[w]||[])L[Symbol.dispose]();c=null,O=0}if(g<O)c.length=g;else{if(!c)c=k;else for(;d<O;)c[d]=k[d++];let P=g-d>1?document.createDocumentFragment():null,ie=P?[]:null;for(;d<g;d++){c[d]=k[d];let q=d,b=e.content?C(e):e.cloneNode(!0),V=b.content||b;if(P)P.appendChild(V),ie.push([b,q]);else{a.before(V);let Me=Object.create(t,{[s]:{get:()=>c[q]},[i]:{value:l?l[q]:q}});u(b,Me)}let qe=((h=c[T=w]||(c[T]=[]))[d]||(h[d]={}))[Symbol.dispose];c[w][d][Symbol.dispose]=()=>{qe?.(),b[Symbol.dispose]?.(),b.remove()}}if(P){a.before(P);for(let[q,b]of ie){let V=Object.create(t,{[s]:{get:()=>c[b]},[i]:{value:l?l[b]:b}});u(q,V)}}}O=g});return e.replaceWith(a),e[p]=null,Object.assign(d=>(l=null,typeof d=="number"?f=Array.from({length:d},(k,g)=>g+1):d?.constructor===Object?(l=Object.keys(d),f=Object.values(d)):f=d||[],I(()=>{f[N]?.value,A()})),{eval:m(n)})};var Te=(e,t,r,o)=>n=>S(e,o,typeof n=="function"?n(e.getAttribute(o)):n);var Ce=e=>t=>{for(let r in t)S(e,ue(r),t[r])};var je=(e,t,r,o)=>{let[n,...s]=o.slice(2).split("."),i=m(r).bind(e),a=_(Object.assign(c=>i(t,l=>typeof l=="function"?l(c):l),{target:e}),s);return a.target.addEventListener(n,a,a),{[Symbol.dispose](){a.target.removeEventListener(n,a)}}};var ke=(e,t,r,o)=>{let n,s,i=o.split("..").map((a,c,{length:l})=>a.split(":").reduce((f,O)=>{let[A,...d]=O.slice(2).split("."),k=m(r).bind(e),g=(h,L)=>n=typeof h=="function"?h(L):h,T=_(Object.assign(h=>(c?g(n,h):k(t,L=>g(L,h)),s(),s=i[(c+1)%l]()),{target:e}),d);return h=>(h=f?.(),T.target.addEventListener(A,T,T),()=>(h?.(),T.target.removeEventListener(A,T)))},null));return s=i[0](),{[Symbol.dispose](){s?.()}}};var De=(e,t)=>{if(e.content){let r=document.createTextNode(""),o=document.createTextNode(""),n=document.createRange();return e.replaceWith(r,o),s=>{if(s=typeof s=="function"?s(""):s,n.setStartAfter(r),n.setEndBefore(o),n.deleteContents(),s!=null&&s!==""){let i=n.createContextualFragment(s);u(i,t),n.insertNode(i)}}}return r=>(r=typeof r=="function"?r(e.innerHTML):r,e.innerHTML=r??"",u(e,t),e[y])};var $e=(e,t,r)=>{let o=document.createComment(":portal"),n=null;return e.before(o),s=>{let i=e.getRootNode(),a=typeof s=="string"?i.querySelector?.(s)||document.querySelector(s):s instanceof Element?s:s?document.body:null;a!==n&&(a?a.appendChild(e):o.after(e),n=a)}};var Ee=e=>t=>e.hidden=!!t;Object.assign(F,{_:(e,t,r,o)=>(o.startsWith("on")?je:Te)(e,t,r,o),"":Ce,class:xe,text:be,html:De,style:_e,fx:Se,value:we,ref:Ae,scope:Ne,if:ye,else:ge,each:Oe,portal:$e,hidden:Ee});var ze=(e,t,r,o)=>{let[n,...s]=t.split("."),i=F[n]||F._;return()=>{let a=i(e,o,r,t);if(!a?.call)return a?.[y];let c=_(Object.assign($(()=>l.value++),{target:e}),s),l=x(0),f=0,O=a.eval??m(r).bind(e),A,d=()=>(typeof A=="function"&&A(),A=null);return o=e[p]??o,I(()=>(l.value==f?c():(f=l.value,A=O(o,a)),d))}},Be=e=>e?typeof e=="number"?e:(([,t,r]=e.match(/^(\d+)(ms|s|m)?$/)||[])=>(t=+t,r==="s"?t*1e3:r==="m"?t*6e4:t))():0,ne=e=>e==="idle"?requestIdleCallback:e==="raf"?requestAnimationFrame:!e||e==="tick"?queueMicrotask:t=>setTimeout(t,Be(e));Object.assign(D,{debounce:(e,t,r)=>de(e,ne(t==="immediate"?r:t),t==="immediate"||r==="immediate"),throttle:(e,t)=>$(e,ne(t)),delay:(e,t)=>((r=ne(t))=>o=>r(()=>e(o)))(),tick:e=>(console.warn("Deprecated"),t=>queueMicrotask(()=>e(t))),raf:e=>(console.warn("Deprecated"),t=>requestAnimationFrame(()=>e(t))),once:(e,t,r)=>(r=o=>!t&&(t=1,e(o)),r.once=!0,r),window:e=>(e.target=e.target.ownerDocument.defaultView,e),document:e=>(e.target=e.target.ownerDocument,e),root:e=>(e.target=e.target.ownerDocument.documentElement,e),body:e=>(e.target=e.target.ownerDocument.body,e),parent:e=>(e.target=e.target.parentNode,e),self:e=>t=>t.target===e.target&&e(t),away:e=>Object.assign(t=>!e.target.contains(t.target)&&t.target.isConnected&&e(t),{target:e.target.ownerDocument}),prevent:e=>t=>(t?.preventDefault(),e(t)),stop:(e,t)=>r=>(t?.[0]==="i"?r?.stopImmediatePropagation():r?.stopPropagation(),e(r)),immediate:e=>(console.warn("Deprecated"),t=>(t?.stopImmediatePropagation(),e(t))),passive:e=>(e.passive=!0,e),capture:e=>(e.capture=!0,e)});D.outside=D.away;var se={ctrl:e=>e.ctrlKey||e.key==="Control"||e.key==="Ctrl",shift:e=>e.shiftKey||e.key==="Shift",alt:e=>e.altKey||e.key==="Alt",meta:e=>e.metaKey||e.key==="Meta",cmd:e=>e.metaKey||e.key==="Command",arrow:e=>e.key.startsWith("Arrow"),enter:e=>e.key==="Enter",esc:e=>e.key.startsWith("Esc"),tab:e=>e.key==="Tab",space:e=>e.key==="\xA0"||e.key==="Space"||e.key===" ",delete:e=>e.key==="Delete"||e.key==="Backspace",digit:e=>/^\d$/.test(e.key),letter:e=>/^\p{L}$/gu.test(e.key),char:e=>/^\S$/.test(e.key)},Le=(e,t)=>se[e]?.(t)||t.key.toLowerCase()===e||t.keyCode==e;for(let e in se)D[e]=(t,r,o)=>n=>se[e](n)&&(!r||Le(r,n))&&(!o||Le(o,n))&&t(n);var Je=e=>{for(let t=0,r=0;r<e.length;r++)if(e[r]=="{")t++;else if(e[r]=="}")t--;else if(e[r]==";"&&!t)return!0;return!1};Y({compile:e=>(/^(if|let|const)\b/.test(e)||Je(e)||(e=`return ${e}`),/\bawait\s/.test(e)&&(e=`return (async()=>{${e}})()`),u.constructor(`with(arguments[0]){${e}}`)),dir:(e,t,r,o)=>t.includes("..")?()=>ke(e,o,r,t)[y]:t.split(":").reduce((n,s)=>{let i=ze(e,s,r,o);return n?(a,c)=>(a=n(),c=i(),()=>{a(),c()}):i},null),...re});u.use=Y;u.store=H;u.directive=F;u.modifier=D;u.dispose=e=>e[y]?.();var ar=u.start=(e=document.body,t)=>{let r=H(t);return u(e,r),new MutationObserver(n=>{for(let s of n){for(let i of s.addedNodes)i.nodeType===1&&i[p]===void 0&&e.contains(i)&&e[B](i);for(let i of s.removedNodes)i.nodeType===1&&i[y]?.()}}).observe(e,{childList:!0,subtree:!0}),r};u.version="12.4.0";var cr=u.dispose,lr=u;export{R as batch,J as computed,de as debounce,lr as default,cr as dispose,I as effect,x as signal,u as sprae,ar as start,H as store,$ as throttle,M as untracked,Y as use};
|
|
1
|
+
var qe=Object.defineProperty;var Pe=(e,t)=>{for(var r in t)qe(e,r,{get:t[r],enumerable:!0})};var y=Symbol.dispose||(Symbol.dispose=Symbol("dispose")),f=Symbol("state"),B=Symbol("on"),K=Symbol("off"),F=Symbol("init"),G=":",x,I,J,R=e=>e(),W=R,H={},$={},Q=null,U=null,Ke=e=>{if(!e?.tagName)return"";let t=e.tagName.toLowerCase();return e.id?t+="#"+e.id:e.className&&(t+="."+e.className.split(" ")[0]),`<${t}>`},Z=(e,t)=>{let r=`\u2234 ${e}`;if(U&&(r+=`
|
|
2
|
+
in ${Ke(U)}`),Q&&t){let o=t.length>100?t.slice(0,80)+`\u2026 (${t.length} chars)`:t;r+=`
|
|
3
|
+
${Q}="${o}"`}console.error(r)},Ie=(e=document.body,t)=>{if(e[f])return Object.assign(e[f],t);t=V(t||{});let r=[],o=[];e[B]=()=>!o&&(o=r.map(s=>s())),e[K]=()=>(o?.map(s=>s()),o=null),e[y]||(e[y]=()=>(e[K](),e[K]=e[B]=e[y]=e[F]=e[f]=null));let n=e[F]=s=>{let i=s.attributes,a;if(i)for(let l=0;l<i.length;){let{name:c,value:p}=i[l];if(c.startsWith(G)){if(s.removeAttribute(c),Q=c,U=s,r.push(a=le(s,c.slice(G.length),p,t)),o.push(a()),f in s)return}else l++}if(s.firstChild!==void 0){let l=s.firstChild,c;for(;l;)c=l.nextSibling,l.nodeType==1&&n(l),l=c}else for(let l of s.childNodes)l.nodeType==1&&n(l)};return n(e),e[f]===void 0&&(e[f]=t),t},le,ce,m=e=>{let t=ae[e=e.trim()];if(t)return t;try{t=ce(e||"undefined")}catch(r){Z(r,e)}return ae[e]=function(r,o,n){try{let s=t?.call(this,r);return o?s?.then?(s.then(i=>n=o(i)).catch(i=>Z(i,e)),()=>typeof n=="function"&&n()):o(s):s}catch(s){Z(s,e)}}},ae={},Y=e=>(e.compile&&(ce=e.compile),e.prefix&&(G=e.prefix),e.signal&&(x=e.signal),e.effect&&(I=e.effect),e.computed&&(J=e.computed),e.batch&&(R=e.batch),e.untracked&&(W=e.untracked),e.dir&&(le=e.dir)),_=(e,t)=>{for(;t.length;){let[r,...o]=t.pop().split("-"),n=$[r],s;if(n&&(s=n(e,...o))!==e){for(let i in e)s[i]??(s[i]=e[i]);e=s}}return e},C=e=>{if(!e.nodeType)return e;let t=e.content.cloneNode(!0),r=[...e.attributes],o=document.createTextNode(""),n=(t.append(o),[...t.childNodes]);return{childNodes:n,content:t,remove:()=>t.append(...n),replaceWith(s){s!==o&&(o.before(s),t.append(...n))},attributes:r,removeAttribute(s){r.splice(r.findIndex(i=>i.name===s),1)}}},ue=e=>e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(t,r)=>(r?"-":"")+t.toLowerCase()),S=(e,t,r)=>r==null||r===!1?e.removeAttribute(t):e.setAttribute(t,r===!0?"":r),v=(e,t=[])=>e?typeof e=="string"?e:(Array.isArray(e)?e.map(v):Object.entries(e).reduce((r,[o,n])=>n?[...r,o]:r,[])).join(" "):"",E=(e,t)=>{let r=0,o,n=typeof t=="function"?t:t?i=>setTimeout(i,t):queueMicrotask,s=i=>{o=i,r++||(e(o),n((a=r>1)=>(r=0,a&&s(o))))};return s},de=(e,t,r)=>{let o=typeof t=="function"?t:t?n=>setTimeout(n,t):queueMicrotask;return r?(n=>s=>!n&&(e(s),n=1,o(()=>n=0)))():((n=0)=>(s,i=++n)=>o(()=>i==n&&e(s)))()},u=Ie;var w=Symbol("signals"),A=Symbol("change"),te=Symbol("set"),ee=!0,L=(e,t)=>{if(!e||e[Symbol.toStringTag]||e[w])return e;if(e.constructor!==Object)return Array.isArray(e)?Re(e):e;let r=Object.keys(e).length,o={},n=new Proxy(Object.assign(o,{[A]:x(r),[w]:o}),{get:(i,a)=>a in o?o[a]?o[a].valueOf():o[a]:t?t[a]:typeof globalThis[a]=="function"&&!globalThis[a].prototype?globalThis[a].bind(globalThis):globalThis[a],set:(i,a,l)=>a in o?(fe(o,a,l),1):(ee=!1,t&&a in t?t[a]=l:(X(o,a,l),o[A].value=++r),ee=!0,1),deleteProperty:(i,a)=>(a in o&&(a[0]!="_"&&o[a]?.[Symbol.dispose]?.(),delete o[a],o[A].value=--r),1),ownKeys:()=>(o[A].value,Reflect.ownKeys(o)),has:(i,a)=>a in o?!0:t?a in t:ee}),s=Object.getOwnPropertyDescriptors(e);for(let i in e)s[i]?.get?(o[i]=J(s[i].get.bind(n)))[te]=s[i].set?.bind(n):X(o,i,e[i]);return n},Re=(e,t=globalThis)=>{let r=Array(e.length).fill(null),o=!1,n=a=>function(){return o=!0,a.apply(this,arguments)},s=x(e.length),i=new Proxy(Object.assign(r,{[A]:s,[w]:r,push:n(r.push),pop:n(r.pop),shift:n(r.shift),unshift:n(r.unshift),splice:n(r.splice)}),{get(a,l){return l==="length"?o?(o=!1,r.length):s.value:typeof l=="symbol"||isNaN(l)?r[l]?.valueOf()??t[l]:(r[l]??(r[l]=x(L(e[l])))).valueOf()},set(a,l,c){if(l==="length"){for(let p=c;p<r.length;p++)delete i[p];s.value=r.length=c}else l>=r.length?(X(r,l,c),i.length=+l+1):r[l]?fe(r,l,c):X(r,l,c);return 1},deleteProperty:(a,l)=>(r[l]?.[Symbol.dispose]?.(),delete r[l],1)});return i},X=(e,t,r)=>e[t]=t[0]=="_"||r?.peek?r:x(L(r)),fe=(e,t,r,o,n)=>t[0]==="_"?e[t]=r:r!==(n=(o=e[t]).peek())&&(o[te]?o[te](r):Array.isArray(r)&&Array.isArray(n)?A in n?W(()=>R(()=>{for(let s=0;s<r.length;s++)n[s]=r[s];n.length=r.length})):o.value=r:o.value=L(r)),V=L;var re={};Pe(re,{batch:()=>Ve,computed:()=>He,effect:()=>he,signal:()=>me,untracked:()=>ze});var j,pe=0,q,me=(e,t,r=new Set,o=()=>t.value)=>t={get value(){return j?.deps.add(r.add(j)),e},set value(n){if(n!==e){e=n;for(let s of r)q?q.add(s):s()}},peek(){return e},toJSON:o,toString:o,valueOf:o},he=(e,t,r,o)=>(r=n=>{let s=t;if(t=null,s?.call?.(),n=j,j=r,pe++>10)throw"Cycle detected";try{t=e()}finally{j=n,pe--}},r.fn=e,o=r.deps=new Set,r(),n=>{t?.call?.();for(n of o)n.delete(r);o.clear()}),He=(e,t=me(),r,o,n=()=>r.value)=>r={get value(){return o||(o=he(()=>t.value=e())),t.value},peek:t.peek,toJSON:n,toString:n,valueOf:n},Ve=(e,t=!q,r)=>{q??(q=new Set);try{e()}finally{if(t){[q,r]=[null,q];for(let o of r)o()}}},ze=(e,t,r)=>(t=j,j=null,r=e(),j=t,r);var ye=(e,t)=>{var s;let r,o,n;return e._holder?u(o=e,t):(e[s=f]??(e[s]=null),o=e.content?C(e):e,e.replaceWith(r=document.createTextNode("")),o._holder=r._holder=r,r._clauses=[o._clause=[o,!1]],r.update=E(()=>{let i=r._clauses.find(([,a])=>a);i!=n&&(n?.[0].remove(),n?.[0][K]?.(),(n=i)&&(r.before(n[0].content||n[0]),n[0][f]?n[0][B]?.():(delete n[0][f],u(n[0],t))))})),i=>{o._clause[1]=i,o._holder.update()}};var ge=e=>{let t,r=e;for(t=e.content?C(e):e;r&&!(t._holder=r._holder);)r=r.previousSibling;return e.remove(),e[f]=null,t._holder._clauses.push(t._clause=[t,!0]),t._holder.update};var be=e=>(e.content&&e.replaceWith(e=C(e).childNodes[0]),t=>(t=typeof t=="function"?t(e.textContent):t,e.textContent=t??""));var xe=(e,t,r,o)=>{let n=new Set,s;return o.includes(".")&&(e=_({target:e},o.split(".").slice(1)).target??e),i=>{s=new Set,i&&v(typeof i=="function"?i(e.className):i).split(" ").map(a=>a&&s.add(a));for(let a of n)s.has(a)?s.delete(a):e.classList.remove(a);for(let a of n=s)e.classList.add(a)}};var _e=(e,t,r,o)=>{let n;return o.includes(".")&&(e=_({target:e},o.split(".").slice(1)).target??e),s=>{if(n||(n=e.getAttribute("style")),s=typeof s=="function"?s(e.style):s,typeof s=="string")S(e,"style",n+"; "+s);else{n&&S(e,"style",n);for(let i in s)i[0]=="-"?e.style.setProperty(i,s[i]):i[0]>"A"&&(e.style[i]=s[i])}}};var Se=()=>e=>typeof e=="function"&&e();var oe=(e,t=m(`${e}=__`))=>(r,o)=>{r.__=o,t(r),delete r.__},we=(e,t,r)=>{try{let o=oe(r),n=e.type==="checkbox"?()=>o(t,e.checked):e.type==="select-multiple"?()=>o(t,[...e.selectedOptions].map(s=>s.value)):()=>o(t,e.selectedIndex<0?null:isNaN(e.valueAsNumber)?e.value:e.valueAsNumber);e.oninput=e.onchange=n,e.type?.startsWith("select")&&(new MutationObserver(n).observe(e,{childList:!0,subtree:!0,attributes:!0}),u(e,t)),m(r)(t)??n()}catch{}return e.type==="text"||e.type===""||e.tagName==="TEXTAREA"?(o,n,s)=>(n=e.selectionStart,s=e.selectionEnd,e.setAttribute("value",e.value=o??""),n&&e.setSelectionRange(n,s)):e.type==="checkbox"?o=>(e.checked=o,S(e,"checked",o)):e.type==="radio"?o=>e.value===o&&(e.checked=o,S(e,"checked",o)):e.type==="select-one"?o=>{for(let n of e.options)n.value==o?n.setAttribute("selected",""):n.removeAttribute("selected");e.value=o}:e.type==="select-multiple"?o=>{for(let n of e.options)n.removeAttribute("selected");for(let n of o)e.querySelector(`[value="${n}"]`).setAttribute("selected","")}:o=>e.value=o};var Ne=(e,t,r)=>{let o=m(r)(t);if(typeof o=="function")return{[Symbol.dispose]:o(e)};oe(r)(t,e)};var Ae=(e,t)=>{let r=e[f]=L({},t),o=!1;return n=>{if(n=typeof n=="function"?n(r):n,n!==r)for(let s in n){let i=typeof n[s]=="function"?n[s].bind(r):n[s];s in r[w]?r[s]=i:r[w][s]=s[0]=="_"||i?.peek?i:x(L(i))}return!o&&(o=!0,delete e[f],W(()=>u(e,r)))}};var Oe=(e,t,r)=>{let[o,n]=r.split(/\bin|of\b/),[s,i="$"]=o.trim().replace(/\(|\)/g,"").split(/\s*,\s*/),a=document.createTextNode(""),l,c,p,O=0,N=E(()=>{var T,h;let d=0,k=p,g=k.length;if(l&&!l[A]){for(let D of l[w]||[])D[Symbol.dispose]();l=null,O=0}if(g<O)l.length=g;else{if(!l)l=k;else for(;d<O;)l[d]=k[d++];let P=g-d>1?document.createDocumentFragment():null,ie=P?[]:null;for(;d<g;d++){l[d]=k[d];let M=d,b=e.content?C(e):e.cloneNode(!0),z=b.content||b;if(P)P.appendChild(z),ie.push([b,M]);else{a.before(z);let We=Object.create(t,{[s]:{get:()=>l[M]},[i]:{value:c?c[M]:M}});u(b,We)}let Me=((h=l[T=w]||(l[T]=[]))[d]||(h[d]={}))[Symbol.dispose];l[w][d][Symbol.dispose]=()=>{Me?.(),b[Symbol.dispose]?.(),b.remove()}}if(P){a.before(P);for(let[M,b]of ie){let z=Object.create(t,{[s]:{get:()=>l[b]},[i]:{value:c?c[b]:b}});u(M,z)}}}O=g});return e.replaceWith(a),e[f]=null,Object.assign(d=>(c=null,typeof d=="number"?p=Array.from({length:d},(k,g)=>g+1):d?.constructor===Object?(c=Object.keys(d),p=Object.values(d)):p=d||[],I(()=>{p[A]?.value,N()})),{eval:m(n)})};var Te=(e,t,r,o)=>n=>S(e,o,typeof n=="function"?n(e.getAttribute(o)):n);var Ce=e=>t=>{for(let r in t)S(e,ue(r),t[r])};var je=(e,t,r,o)=>{let[n,...s]=o.slice(2).split("."),i=m(r).bind(e),a=_(Object.assign(l=>i(t,c=>typeof c=="function"?c(l):c),{target:e}),s);return a.target.addEventListener(n,a,a),{[Symbol.dispose](){a.target.removeEventListener(n,a)}}};var ke=(e,t,r,o)=>{let n,s,i=o.split("..").map((a,l,{length:c})=>a.split(":").reduce((p,O)=>{let[N,...d]=O.slice(2).split("."),k=m(r).bind(e),g=(h,D)=>n=typeof h=="function"?h(D):h,T=_(Object.assign(h=>(l?g(n,h):k(t,D=>g(D,h)),s(),s=i[(l+1)%c]()),{target:e}),d);return h=>(h=p?.(),T.target.addEventListener(N,T,T),()=>(h?.(),T.target.removeEventListener(N,T)))},null));return s=i[0](),{[Symbol.dispose](){s?.()}}};var $e=(e,t)=>{if(e.content){let r=document.createTextNode(""),o=document.createTextNode(""),n=document.createRange();return e.replaceWith(r,o),s=>{if(s=typeof s=="function"?s(""):s,n.setStartAfter(r),n.setEndBefore(o),n.deleteContents(),s!=null&&s!==""){let i=n.createContextualFragment(s);u(i,t),n.insertNode(i)}}}return r=>(r=typeof r=="function"?r(e.innerHTML):r,e.innerHTML=r??"",u(e,t),e[y])};var Ee=(e,t,r)=>{let o=document.createComment(":portal"),n=null;return e.before(o),s=>{let i=e.getRootNode(),a=typeof s=="string"?i.querySelector?.(s)||document.querySelector(s):s instanceof Element?s:s?document.body:null;a!==n&&(a?a.appendChild(e):o.after(e),n=a)}};var Le=e=>t=>e.hidden=!!t;Object.assign(H,{_:(e,t,r,o)=>(o.startsWith("on")?je:Te)(e,t,r,o),"":Ce,class:xe,text:be,html:$e,style:_e,fx:Se,value:we,ref:Ne,scope:Ae,if:ye,else:ge,each:Oe,portal:Ee,hidden:Le});var Be=(e,t,r,o)=>{let[n,...s]=t.split("."),i=H[n]||H._;return()=>{let a=i(e,o,r,t);if(!a?.call)return a?.[y];let l=_(Object.assign(E(()=>c.value++),{target:e}),s),c=x(0),p=0,O=a.eval??m(r).bind(e),N,d=()=>(typeof N=="function"&&N(),N=null);return o=e[f]??o,I(()=>(c.value==p?l():(p=c.value,N=O(o,a)),d))}},Fe=e=>e?typeof e=="number"?e:(([,t,r]=e.match(/^(\d+)(ms|s|m)?$/)||[])=>(t=+t,r==="s"?t*1e3:r==="m"?t*6e4:t))():0,ne=e=>e==="idle"?requestIdleCallback:e==="raf"?requestAnimationFrame:!e||e==="tick"?queueMicrotask:t=>setTimeout(t,Fe(e));Object.assign($,{debounce:(e,t,r)=>de(e,ne(t==="immediate"?r:t),t==="immediate"||r==="immediate"),throttle:(e,t)=>E(e,ne(t)),delay:(e,t)=>((r=ne(t))=>o=>r(()=>e(o)))(),once:(e,t,r)=>(r=o=>!t&&(t=1,e(o)),r.once=!0,r),window:e=>(e.target=e.target.ownerDocument.defaultView,e),document:e=>(e.target=e.target.ownerDocument,e),root:e=>(e.target=e.target.ownerDocument.documentElement,e),body:e=>(e.target=e.target.ownerDocument.body,e),parent:e=>(e.target=e.target.parentNode,e),self:e=>t=>t.target===e.target&&e(t),away:e=>Object.assign(t=>!e.target.contains(t.target)&&t.target.isConnected&&e(t),{target:e.target.ownerDocument}),prevent:e=>t=>(t?.preventDefault(),e(t)),stop:(e,t)=>r=>(t?.[0]==="i"?r?.stopImmediatePropagation():r?.stopPropagation(),e(r)),passive:e=>(e.passive=!0,e),capture:e=>(e.capture=!0,e)});$.outside=$.away;var se={ctrl:e=>e.ctrlKey||e.key==="Control"||e.key==="Ctrl",shift:e=>e.shiftKey||e.key==="Shift",alt:e=>e.altKey||e.key==="Alt",meta:e=>e.metaKey||e.key==="Meta",cmd:e=>e.metaKey||e.key==="Command",arrow:e=>e.key.startsWith("Arrow"),enter:e=>e.key==="Enter",esc:e=>e.key.startsWith("Esc"),tab:e=>e.key==="Tab",space:e=>e.key==="\xA0"||e.key==="Space"||e.key===" ",delete:e=>e.key==="Delete"||e.key==="Backspace",digit:e=>/^\d$/.test(e.key),letter:e=>/^\p{L}$/gu.test(e.key),char:e=>/^\S$/.test(e.key)},De=(e,t)=>se[e]?.(t)||t.key.toLowerCase()===e||t.keyCode==e;for(let e in se)$[e]=(t,r,o)=>n=>se[e](n)&&(!r||De(r,n))&&(!o||De(o,n))&&t(n);var Je=e=>{for(let t=0,r=0;r<e.length;r++)if(e[r]=="{")t++;else if(e[r]=="}")t--;else if(e[r]==";"&&!t)return!0;return!1};Y({compile:e=>(/^(if|let|const)\b/.test(e)||Je(e)||(e=`return ${e}`),/\bawait\s/.test(e)&&(e=`return (async()=>{${e}})()`),u.constructor(`with(arguments[0]){${e}}`)),dir:(e,t,r,o)=>t.includes("..")?()=>ke(e,o,r,t)[y]:t.split(":").reduce((n,s)=>{let i=Be(e,s,r,o);return n?(a,l)=>(a=n(),l=i(),()=>{a(),l()}):i},null),...re});u.use=Y;u.store=V;u.directive=H;u.modifier=$;u.dispose=e=>e[y]?.();var ar=u.start=(e=document.body,t)=>{let r=V(t);return u(e,r),new MutationObserver(n=>{for(let s of n){for(let i of s.addedNodes)i.nodeType===1&&i[f]===void 0&&e.contains(i)&&e[F](i);for(let i of s.removedNodes)i.nodeType===1&&i[y]?.()}}).observe(e,{childList:!0,subtree:!0}),r};u.version="12.4.1";var lr=u.dispose,cr=u;export{R as batch,J as computed,de as debounce,cr as default,lr as dispose,I as effect,x as signal,u as sprae,ar as start,V as store,E as throttle,W as untracked,Y as use};
|
package/dist/sprae.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../core.js", "../store.js", "../signal.js", "../directive/if.js", "../directive/else.js", "../directive/text.js", "../directive/class.js", "../directive/style.js", "../directive/fx.js", "../directive/value.js", "../directive/ref.js", "../directive/scope.js", "../directive/each.js", "../directive/_.js", "../directive/spread.js", "../directive/event.js", "../directive/sequence.js", "../directive/html.js", "../directive/portal.js", "../directive/hidden.js", "../sprae.js"],
|
|
4
|
-
"sourcesContent": ["import store, { _change, _signals } from \"./store.js\";\n\n/** Symbol for disposal (using standard Symbol.dispose if available) */\nexport const _dispose = (Symbol.dispose ||= Symbol(\"dispose\"))\n\n/** Symbol for accessing element's reactive state */\nexport const _state = Symbol(\"state\")\n\n/** Symbol for enabling element effects */\nexport const _on = Symbol('on')\n\n/** Symbol for disabling element effects */\nexport const _off = Symbol('off')\n\n/** Symbol for adding child to element */\nexport const _add = Symbol('init')\n\n/** Directive prefix (default: ':') */\nexport let prefix = ':';\n\n/**\n * A reactive signal containing a value.\n * @template T\n * @typedef {Object} Signal\n * @property {T} value - Current value (reading subscribes, writing notifies)\n * @property {() => T} peek - Read without subscribing\n * @property {() => T} valueOf - Get value for coercion\n * @property {() => T} toJSON - Get value for JSON serialization\n * @property {() => string} toString - Get value as string\n */\n\n/**\n * Internal effect function type.\n * @typedef {Object} EffectFn\n * @property {Set<Set<EffectFn>>} deps - Dependency sets\n * @property {() => void} fn - Original function\n */\n\n/**\n * Creates a reactive signal.\n * @template T\n * @type {<T>(value: T) => Signal<T>}\n */\nexport let signal;\n\n/**\n * Creates a reactive effect that re-runs when dependencies change.\n * @type {(fn: () => void | (() => void)) => () => void}\n */\nexport let effect;\n\n/**\n * Creates a computed signal derived from other signals.\n * @template T\n * @type {<T>(fn: () => T) => Signal<T>}\n */\nexport let computed;\n\n/**\n * Batches multiple signal updates into a single notification.\n * @template T\n * @type {<T>(fn: () => T) => T}\n */\nexport let batch = (fn) => fn();\n\n/**\n * Runs a function without tracking signal dependencies.\n * @template T\n * @type {<T>(fn: () => T) => T}\n */\nexport let untracked = batch;\n\n/**\n * Registry of directive handlers.\n * @type {Record<string, DirectiveHandler>}\n */\nexport let directive = {};\n\n/**\n * Registry of modifier functions.\n * @type {Record<string, ModifierHandler>}\n */\nexport let modifier = {}\n\nlet currentDir = null;\nlet currentEl = null;\n\n/**\n * Formats element for error message (minimal context).\n * @param {Element} [el] - Element to format\n * @returns {string} Element hint like \"<div#id.class>\"\n */\nconst elHint = (el) => {\n if (!el?.tagName) return ''\n let hint = el.tagName.toLowerCase()\n if (el.id) hint += '#' + el.id\n else if (el.className) hint += '.' + el.className.split(' ')[0]\n return `<${hint}>`\n}\n\n/**\n * Reports an error with context.\n * @param {Error|string} e - Error to report\n * @param {string} [expr] - Expression that caused error\n */\nconst err = (e, expr) => {\n let msg = `\u2234 ${e}`\n if (currentEl) msg += `\\n in ${elHint(currentEl)}`\n if (currentDir && expr) msg += `\\n ${currentDir}=\"${expr}\"`\n console.error(msg)\n}\n\n/**\n * @callback DirectiveHandler\n * @param {Element} el - Target element\n * @param {Object} state - Reactive state object\n * @param {string} expr - Expression string\n * @param {string} [name] - Directive name with modifiers\n * @returns {((value: any) => void | (() => void)) | { [Symbol.dispose]: () => void } | void}\n */\n\n/**\n * @callback ModifierHandler\n * @param {Function} fn - Function to modify\n * @param {...string} args - Modifier arguments (from dash-separated values)\n * @returns {Function}\n */\n\n/**\n * @typedef {Object} SpraeState\n * @property {Record<string, Signal>} [_signals] - Internal signals map\n */\n\n/**\n * Applies directives to an HTML element and manages its reactive state.\n *\n * @param {Element} [el=document.body] - The target HTML element to apply directives to.\n * @param {Object} [state] - Initial state values to populate the element's reactive state.\n * @returns {SpraeState & Object} The reactive state object associated with the element.\n */\nconst sprae = (el = document.body, state) => {\n // repeated call can be caused by eg. :each with new objects with old keys\n if (el[_state]) return Object.assign(el[_state], state)\n\n // console.group('sprae', el)\n\n // take over existing state instead of creating a clone\n state = store(state || {})\n\n let fx = [], offs = []\n\n // on/off all effects\n // we don't call prevOn as convention: everything defined before :else :if won't be disabled by :if\n // imagine <x :onx=\"...\" :if=\"...\"/> - when :if is false, it disables directives after :if (calls _off) but ignores :onx\n el[_on] = () => (!offs && (offs = fx.map(fn => fn())))\n el[_off] = () => (offs?.map(off => off()), offs = null)\n\n // destroy\n el[_dispose] ||= () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_add] = el[_state] = null)\n\n const add = el[_add] = (el) => {\n let _attrs = el.attributes, start;\n\n // we iterate live collection (subsprae can init args)\n if (_attrs) for (let i = 0; i < _attrs.length;) {\n let { name, value } = _attrs[i]\n\n if (name.startsWith(prefix)) {\n el.removeAttribute(name)\n\n currentDir = name;\n currentEl = el;\n\n // directive initializer can be redefined\n fx.push(start = dir(el, name.slice(prefix.length), value, state)), offs.push(start())\n\n // stop after subsprae like :each, :if, :scope etc.\n if (_state in el) return\n } else i++\n }\n\n // :if and :each replace element with text node, which tweaks .children length, but .childNodes length persists\n // real DOM: firstChild/nextSibling avoids array copy; frag.childNodes is already snapshot array\n if (el.firstChild !== undefined) {\n let child = el.firstChild, next\n while (child) (next = child.nextSibling, child.nodeType == 1 && add(child), child = next)\n }\n else for (let child of el.childNodes) child.nodeType == 1 && add(child)\n };\n\n add(el);\n\n // if element was spraed by inline :with/:if/:each/etc instruction (meaning it has state placeholder) - skip, otherwise save _state\n if (el[_state] === undefined) el[_state] = state\n\n // console.groupEnd()\n\n return state;\n}\n\n// directive initializer\n/** @type {(el: Element, name: string, expr: string, state: Object) => () => (() => void) | void} */\nexport let dir\n\n/**\n * Compiles an expression string into an evaluator function.\n * @type {(expr: string) => (state: Object) => any}\n */\nexport let compile\n\n/**\n * Parses an expression into an evaluator function, caching the result for reuse.\n *\n * @param {string} expr - The expression to parse and compile into a function.\n * @returns {(state: Object, cb?: (value: any) => any) => any} The compiled evaluator function for the expression.\n */\nexport const parse = (expr) => {\n let fn = cache[expr=expr.trim()]\n if (fn) return fn\n\n // static time errors\n try {\n fn = compile(expr || 'undefined')\n // Object.defineProperty(fn, \"name\", { value: `\u2234 ${expr}` })\n } catch (e) { err(e, expr) }\n\n // run time errors\n return cache[expr] = function (state, cb, _out) {\n try {\n let result = fn?.call(this, state)\n // if cb is given (to handle async/await exprs, usually directive update) - call it with result and return a cleanup function\n if (cb) return result?.then\n ? (result.then(v => _out = cb(v)).catch(e => err(e, expr)), () => typeof _out === 'function' && _out())\n : cb(result)\n else return result\n } catch (e) {\n err(e, expr)\n }\n }\n}\nconst cache = {};\n\n\n/**\n * @typedef {Object} SpraeConfig\n * @property {(expr: string) => (state: Object) => any} [compile] - Custom expression compiler\n * @property {string} [prefix] - Directive prefix (default: ':')\n * @property {<T>(value: T) => Signal<T>} [signal] - Signal factory\n * @property {(fn: () => void | (() => void)) => () => void} [effect] - Effect factory\n * @property {<T>(fn: () => T) => Signal<T>} [computed] - Computed factory\n * @property {<T>(fn: () => T) => T} [batch] - Batch function\n * @property {<T>(fn: () => T) => T} [untracked] - Untracked function\n * @property {(el: Element, name: string, expr: string, state: Object) => () => (() => void) | void} [dir] - Directive initializer\n */\n\n/**\n * Configure sprae with custom signals, compiler, or prefix.\n * @param {SpraeConfig} config - Configuration options\n * @returns {void}\n */\nexport const use = (config) => (\n config.compile && (compile = config.compile),\n config.prefix && (prefix = config.prefix),\n config.signal && (signal = config.signal),\n config.effect && (effect = config.effect),\n config.computed && (computed = config.computed),\n config.batch && (batch = config.batch),\n config.untracked && (untracked = config.untracked),\n config.dir && (dir = config.dir)\n)\n\n/**\n * Applies modifiers to a function.\n * @param {Function & { target?: Element }} fn - Function to decorate\n * @param {string[]} mods - Modifier names with arguments (e.g., ['throttle-500', 'prevent'])\n * @returns {Function} Decorated function\n */\nexport const decorate = (fn, mods) => {\n while (mods.length) {\n let [name, ...params] = mods.pop().split('-'), mod = modifier[name], wrapFn\n if (mod) {\n if ((wrapFn = mod(fn, ...params)) !== fn) {\n for (let k in fn) wrapFn[k] ??= fn[k];\n fn = wrapFn\n }\n }\n }\n return fn\n}\n\n/**\n * @typedef {Object} FragmentLike\n * @property {Node[]} childNodes - Child nodes of the fragment\n * @property {DocumentFragment} content - The document fragment content\n * @property {() => void} remove - Remove the fragment from DOM\n * @property {(el: Node) => void} replaceWith - Replace the fragment with an element\n * @property {Attr[]} attributes - Attributes from the original template\n * @property {(name: string) => void} removeAttribute - Remove an attribute\n */\n\n/**\n * Creates a fragment holder from a template element with minimal API surface.\n * @param {HTMLTemplateElement | FragmentLike} tpl - Template element or existing fragment\n * @returns {FragmentLike} Fragment-like object\n */\nexport const frag = (tpl) => {\n if (!tpl.nodeType) return tpl // existing tpl\n\n let content = tpl.content.cloneNode(true), // document fragment holder of content\n attributes = [...tpl.attributes],\n ref = document.createTextNode(''),\n // ensure at least one node\n childNodes = (content.append(ref), [...content.childNodes])\n\n return {\n childNodes,\n content,\n remove: () => content.append(...childNodes),\n replaceWith(el) {\n if (el === ref) return\n ref.before(el)\n content.append(...childNodes)\n },\n attributes,\n removeAttribute(name) { attributes.splice(attributes.findIndex(a => a.name === name), 1) },\n }\n}\n\n/**\n * Converts camelCase to kebab-case.\n * @param {string} str - String to convert\n * @returns {string} Kebab-case string\n */\nexport const dashcase = (str) => str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());\n\n/**\n * Sets or removes an attribute on an element.\n * @param {Element} el - Target element\n * @param {string} name - Attribute name\n * @param {string | boolean | null | undefined} v - Attribute value (null/false removes, true sets empty)\n * @returns {void}\n */\nexport const attr = (el, name, v) => (v == null || v === false) ? el.removeAttribute(name) : el.setAttribute(name, v === true ? \"\" : v);\n\n/**\n * Converts class input to className string (like clsx/classnames).\n * @param {string | string[] | Record<string, boolean> | null | undefined} c - Class input\n * @returns {string} Space-separated class string\n */\nexport const clsx = (c, _out = []) => !c ? '' : typeof c === 'string' ? c : (\n Array.isArray(c) ? c.map(clsx) :\n Object.entries(c).reduce((s, [k, v]) => !v ? s : [...s, k], [])\n).join(' ')\n\n/**\n * Throttles a function to run at most once per tick (or custom scheduler).\n * Fires on leading edge, then on trailing edge if called during throttle.\n * @template {Function} T\n * @param {T} fn - Function to throttle\n * @param {number|Function} [ms] - Delay in ms or scheduler function (default: microtask)\n * @returns {T} Throttled function\n */\nexport const throttle = (fn, ms) => {\n let _planned = 0, arg, schedule = typeof ms === 'function' ? ms : ms ? (fn) => setTimeout(fn, ms) : queueMicrotask;\n const throttled = (e) => {\n arg = e\n if (!_planned++) fn(arg), schedule((_dirty = _planned > 1) => (\n _planned = 0, _dirty && throttled(arg)\n ));\n }\n return throttled;\n}\n\n/**\n * Debounces a function to run after a delay since the last call.\n * @template {Function} T\n * @param {T} fn - Function to debounce\n * @param {number|Function} [ms] - Delay in ms or scheduler function (default: microtask)\n * @param {boolean} [immediate=false] - Fire on leading edge instead of trailing\n * @returns {T} Debounced function\n */\nexport const debounce = (fn, ms, immediate) => {\n let schedule = typeof ms === 'function' ? ms : ms ? (fn) => setTimeout(fn, ms) : queueMicrotask;\n return immediate\n ? ((_blocked) => (arg) => !_blocked && (fn(arg), _blocked = 1, schedule(() => _blocked = 0)))()\n : ((_count = 0) => (arg, _c = ++_count) => schedule(() => _c == _count && fn(arg)))()\n}\n\n/**\n * Parses time string to milliseconds. Supports: 100, 100ms, 1s, 1m\n * @param {string|number} t - Time value\n * @returns {number} Milliseconds\n */\nexport * from './store.js';\n\nexport default sprae\n", "/**\n * @fileoverview Signals-powered reactive proxy store\n * @module sprae/store\n */\n\nimport { signal, computed, batch, untracked } from './core.js'\n\n/** Symbol for accessing the internal signals map */\nexport const _signals = Symbol('signals')\n\n/** Symbol for the change signal that tracks object keys or array length */\nexport const _change = Symbol('change')\n\n/** Symbol for stashed setter on computed values */\nexport const _set = Symbol('set')\n\n// a hack to simulate sandbox for `with` in evaluator\nlet sandbox = true\n\n/**\n * Reactive store with signals backing.\n * @template T\n * @typedef {T & { [_signals]: Record<string | symbol, import('./core.js').Signal<any>> }} ReactiveStore\n */\n\n/**\n * Creates a reactive proxy store from an object or array.\n * Properties become signals for fine-grained reactivity.\n * Supports nested objects, arrays, computed getters, and methods.\n *\n * @template {Object} T\n * @param {T} values - Initial values object\n * @param {Object} [parent] - Parent scope for inheritance\n * @returns {ReactiveStore<T>} Reactive proxy store\n *\n * @example\n * const state = store({ count: 0, get doubled() { return this.count * 2 } })\n * state.count = 5 // triggers updates\n * state.doubled // 10 (computed)\n */\nexport const store = (values, parent) => {\n if (!values) return values\n\n // ignore globals\n // FIXME: handle via has trap\n if (values[Symbol.toStringTag]) return values;\n\n // bypass existing store\n if (values[_signals]) return values\n\n // non-objects: for array redirect to list\n if (values.constructor !== Object) return Array.isArray(values) ? list(values) : values\n\n // _change stores total number of keys to track new props\n let keyCount = Object.keys(values).length,\n signals = {}\n\n // proxy conducts prop access to signals\n let state = new Proxy(Object.assign(signals, {\n [_change]: signal(keyCount),\n [_signals]: signals\n }), {\n get: (_, k) => {\n if (k in signals) return (signals[k] ? signals[k].valueOf() : signals[k])\n return parent ? parent[k] : (typeof globalThis[k] === 'function' && !globalThis[k].prototype ? globalThis[k].bind(globalThis) : globalThis[k])\n },\n\n set: (_, k, v) => {\n // console.group('SET', k, v)\n if (k in signals) return set(signals, k, v), 1\n\n // turn off sandbox to check if parents have the prop - we don't want to create new prop in global scope\n sandbox = false\n\n // write transparency for parent scope, unlike prototype chain\n // if prop is defined in parent scope (except global) - write there\n if (parent && k in parent) {\n parent[k] = v\n }\n // else create in current scope\n else {\n create(signals, k, v)\n signals[_change].value = ++keyCount\n }\n\n sandbox = true\n\n // console.groupEnd()\n // bump length for new signal\n return 1\n },\n\n // FIXME: try to avild calling Symbol.dispose here. Maybe _delete method?\n deleteProperty: (_, k) => {\n k in signals && (k[0] != '_' && signals[k]?.[Symbol.dispose]?.(), delete signals[k], signals[_change].value = --keyCount)\n return 1\n },\n\n // subscribe to length when spreading\n ownKeys: () => (signals[_change].value, Reflect.ownKeys(signals)),\n\n // sandbox prevents writing to global\n has: (_, k) => {\n if (k in signals) return true\n if (parent) return k in parent\n return sandbox\n }\n })\n\n // init signals for values\n const descs = Object.getOwnPropertyDescriptors(values)\n\n for (let k in values) {\n // getter turns into computed\n if (descs[k]?.get)\n // stash setter\n (signals[k] = computed(descs[k].get.bind(state)))[_set] = descs[k].set?.bind(state);\n\n // init blank signal - make sure we don't take prototype one\n else create(signals, k, values[k])\n }\n\n return state\n}\n\n/**\n * Creates a reactive array store with lazy signal initialization.\n * Arrays can be large, so signals are created on-demand.\n * @param {any[]} values - Initial array values\n * @param {Object} [parent=globalThis] - Parent scope\n * @returns {ReactiveStore<any[]>} Reactive array proxy\n */\nconst list = (values, parent = globalThis) => {\n\n // gotta fill with null since proto methods like .reduce may fail\n let signals = Array(values.length).fill(null),\n\n // if .length was accessed from mutator (.push/etc) method\n isMut = false,\n\n // since array mutator methods read .length internally only once, we disable it on the moment of call, allowing rest of operations to be reactive\n mut = fn => function () { isMut = true; return fn.apply(this, arguments); },\n\n length = signal(values.length),\n\n // proxy passes prop access to signals\n state = new Proxy(\n Object.assign(signals, {\n [_change]: length,\n [_signals]: signals,\n // patch mutators\n push: mut(signals.push),\n pop: mut(signals.pop),\n shift: mut(signals.shift),\n unshift: mut(signals.unshift),\n splice: mut(signals.splice),\n }),\n {\n get(_, k) {\n // console.log('GET', k, isMut)\n\n // if .length is read within mutators - peek signal to avoid recursive subscription\n // we need to ignore it only once and keep for the rest of the mutator call\n if (k === 'length') return isMut ? (isMut = false, signals.length) : length.value;\n\n // non-numeric\n if (typeof k === 'symbol' || isNaN(k)) return signals[k]?.valueOf() ?? parent[k];\n\n // create signal (lazy)\n // NOTE: if you decide to unlazy values, think about large arrays - init upfront can be costly\n return (signals[k] ??= signal(store(values[k]))).valueOf()\n },\n\n set(_, k, v) {\n // console.log('SET', k, v)\n\n // .length\n if (k === 'length') {\n // force cleaning up tail\n for (let i = v; i < signals.length; i++) delete state[i]\n // .length = N directly\n length.value = signals.length = v;\n }\n\n // force changing length, if eg. a=[]; a[1]=1 - need to come after setting the item\n else if (k >= signals.length) create(signals, k, v), state.length = +k + 1\n\n // existing signal\n else signals[k] ? set(signals, k, v) : create(signals, k, v)\n\n return 1\n },\n\n // dispose notifies any signal deps, like :each\n deleteProperty: (_, k) => (signals[k]?.[Symbol.dispose]?.(), delete signals[k], 1),\n })\n\n return state\n}\n\n/**\n * Creates a signal for a property value.\n * Skips wrapping for untracked props (underscore prefix) and existing signals.\n * @param {Object} signals - Signals storage object\n * @param {string} k - Property key\n * @param {any} v - Property value\n */\nconst create = (signals, k, v) => (signals[k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n\n/**\n * Updates a signal value, handling arrays specially for efficient patching.\n * @param {Object} signals - Signals storage object\n * @param {string} k - Property key\n * @param {any} v - New value\n */\nconst set = (signals, k, v, _s, _v) => {\n // skip unchanged (although can be handled by last condition - we skip a few checks this way)\n return k[0] === '_' ? (signals[k] = v) :\n (v !== (_v = (_s = signals[k]).peek())) && (\n // stashed _set for value with getter/setter\n _s[_set] ? _s[_set](v) :\n // patch array\n Array.isArray(v) && Array.isArray(_v) ?\n // if we update plain array (stored in signal) - take over value instead\n // since input value can be store, we have to make sure we don't subscribe to its length or values\n // FIXME: generalize to objects\n _change in _v ?\n untracked(() => batch(() => {\n for (let i = 0; i < v.length; i++) _v[i] = v[i]\n _v.length = v.length // forces deleting tail signals\n })) :\n (_s.value = v) :\n // .x = y\n (_s.value = store(v))\n )\n}\n\n\n// make sure state contains first element of path, eg. `a` from `a.b[c]`\n// NOTE: we don't need since we force proxy sandbox\n// export const ensure = (state, expr, _name = expr.match(/^\\w+(?=\\s*(?:\\.|\\[|$))/)) => _name && (state[_signals][_name[0]] ??= null)\n\nexport default store\n", "/**\n * @fileoverview Minimal signals implementation (preact-signals compatible)\n * @module sprae/signal\n */\n\n/** @type {import('./core.js').EffectFn | null} */\nlet current\n\nlet depth = 0\n\n/** @type {Set<import('./core.js').EffectFn> | null} */\nlet batched;\n\n/**\n * Creates a reactive signal.\n * @template T\n * @param {T} v - Initial value\n * @returns {import('./core.js').Signal<T>}\n */\nexport const signal = (v, _s, _obs = new Set, _v = () => _s.value) => (\n _s = {\n get value() {\n current?.deps.add(_obs.add(current));\n return v\n },\n set value(val) {\n if (val === v) return\n v = val;\n for (let sub of _obs) batched ? batched.add(sub) : sub(); // notify effects\n },\n peek() { return v },\n toJSON: _v, toString: _v, valueOf: _v\n }\n)\n\n/**\n * Creates a reactive effect that re-runs when dependencies change.\n * @param {() => void | (() => void)} fn - Effect function, may return cleanup\n * @returns {() => void} Dispose function\n */\nexport const effect = (fn, _teardown, _fx, _deps) => (\n _fx = (prev) => {\n let tmp = _teardown;\n _teardown = null; // we null _teardown to avoid repeated call in case of recursive update\n tmp?.call?.();\n prev = current, current = _fx\n if (depth++ > 10) throw 'Cycle detected';\n try { _teardown = fn() } finally { current = prev; depth-- }\n },\n _fx.fn = fn,\n _deps = _fx.deps = new Set(),\n\n _fx(),\n (dep) => { _teardown?.call?.(); for (dep of _deps) dep.delete(_fx); _deps.clear() }\n)\n\n/**\n * Creates a computed signal derived from other signals.\n * @template T\n * @param {() => T} fn - Computation function\n * @returns {import('./core.js').Signal<T>}\n */\nexport const computed = (fn, _s = signal(), _c, _e, _v = () => _c.value) => (\n _c = {\n get value() {\n _e ||= effect(() => _s.value = fn());\n return _s.value\n },\n peek: _s.peek,\n toJSON: _v, toString: _v, valueOf: _v\n }\n)\n\n/**\n * Batches multiple signal updates into a single notification.\n * @template T\n * @param {() => T} fn - Function containing updates\n * @returns {T}\n */\nexport const batch = (fn, _first = !batched, _list) => {\n batched ??= new Set;\n try { fn(); }\n finally { if (_first) { [batched, _list] = [null, batched]; for (const fx of _list) fx(); } }\n}\n\n/**\n * Runs a function without tracking dependencies.\n * @template T\n * @param {() => T} fn - Function to run untracked\n * @returns {T}\n */\nexport const untracked = (fn, _prev, _v) => (_prev = current, current = null, _v = fn(), current = _prev, _v)\n\n", "import sprae, { throttle, _on, _off, _state, frag } from '../core.js';\n\n/**\n * Conditional directive - shows/hides element based on condition.\n * Works with :else and :else :if for branching.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @param {Object} state - State object\n * @returns {(value: any) => void} Update function\n */\nexport default (el, state) => {\n let _holder, _el, _match\n\n // new element :if\n if (!el._holder) {\n // mark el as fake-spraed to delay init, since we sprae rest when branch matches, both :if and :else :if\n el[_state] ??= null\n\n _el = el.content ? frag(el) : el\n\n el.replaceWith(_holder = document.createTextNode(''))\n _el._holder = _holder._holder = _holder\n\n\n _holder._clauses = [_el._clause = [_el, false]]\n\n _holder.update = throttle(() => {\n let match = _holder._clauses.find(([, s]) => s)\n\n if (match != _match) {\n _match?.[0].remove()\n _match?.[0][_off]?.()\n if (_match = match) {\n _holder.before(_match[0].content || _match[0])\n // there's no :else after :if, so lazy-sprae here doesn't risk adding own destructor to own list of destructors\n !_match[0][_state] ? (delete _match[0][_state], sprae(_match[0], state)) : _match[0][_on]?.()\n }\n }\n })\n }\n // :else :if needs to be spraed all over to have clean list of offable effects\n else sprae(_el = el, state)\n\n // :else may have children to init which is called after :if\n // or preact can schedule :else after :if, so we ensure order of call by next tick\n return value => {\n _el._clause[1] = value\n _el._holder.update()\n }\n}\n", "import { _on, _off, _state, frag } from '../core.js';\n\n/**\n * Else directive - conditional branch following :if.\n * Can be used as `:else` or `:else :if=\"condition\"`.\n * @param {Element | HTMLTemplateElement} el - Element with directive\n * @returns {() => void} Update function\n */\nexport default (el) => {\n let _el, _prev = el\n\n _el = el.content ? frag(el) : el\n\n // find holder\n while (_prev && !(_el._holder = _prev._holder)) _prev = _prev.previousSibling\n\n el.remove()\n el[_state] = null // mark as fake-spraed to stop further init, to lazy-sprae when branch matches\n\n _el._holder._clauses.push(_el._clause = [_el, true])\n\n return _el._holder.update\n}\n", "import { frag } from \"../core.js\"\n\n/**\n * Text directive - sets textContent reactively.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @returns {(v: any) => void} Update function\n */\nexport default el => (\n // <template :text=\"a\"/> or previously initialized template\n el.content && el.replaceWith(el = frag(el).childNodes[0]),\n v => (v = typeof v === 'function' ? v(el.textContent) : v, el.textContent = v == null ? \"\" : v)\n)\n", "import { clsx, decorate } from \"../core.js\";\n\n/**\n * Class directive - manages CSS classes reactively.\n * Supports strings, arrays, and objects (like clsx/classnames).\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Directive name with modifiers\n * @returns {(v: string | string[] | Record<string, boolean>) => void} Update function\n */\nexport default (el, st, ex, name) => {\n let _cur = new Set, _new\n\n // redefine target, if modifiers have one\n name.includes('.') && (el = decorate({target:el}, name.split('.').slice(1)).target ?? el)\n\n return (v) => {\n _new = new Set\n if (v) clsx(typeof v === 'function' ? v(el.className) : v).split(' ').map(c => c && _new.add(c))\n for (let c of _cur) if (_new.has(c)) _new.delete(c); else el.classList.remove(c);\n for (let c of _cur = _new) el.classList.add(c)\n }\n}\n", "import { attr, decorate } from \"../core.js\";\n\n/**\n * Style directive - sets inline styles reactively.\n * Accepts string or object. Preserves static styles.\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Directive name with modifiers\n * @returns {(v: string | Record<string, string> | ((style: CSSStyleDeclaration) => any)) => void} Update function\n */\nexport default (el, st, ex, name) => {\n let _static;\n\n // redefine target, if modifiers have one\n if (name.includes('.')) el = decorate({target:el}, name.split('.').slice(1)).target ?? el;\n\n return v => {\n if (!_static) { _static = el.getAttribute(\"style\") }\n v = typeof v === \"function\" ? v(el.style) : v\n if (typeof v === \"string\") attr(el, \"style\", _static + '; ' + v);\n else {\n if (_static) attr(el, \"style\", _static);\n // NOTE: we skip names not starting with a letter - eg. el.style stores properties as { 0: --x } or JSDOM has _pfx\n for (let k in v) k[0] == '-' ? el.style.setProperty(k, v[k]) : k[0] > 'A' && (el.style[k] = v[k])\n }\n }\n}\n", "/**\n * Effect directive - runs side effects.\n * Calls function result if expression evaluates to a function.\n * @returns {(fn: any) => any} Update function\n */\nexport default () => (fn) => typeof fn === 'function' && fn()\n", "import sprae, { attr, parse, _state } from \"../core.js\";\n\n/**\n * Creates a setter function for two-way binding.\n * @param {string} expr - Expression to assign to\n * @returns {(target: Object, value: any) => void} Setter function\n */\nexport const setter = (expr, _set = parse(`${expr}=__`)) => (target, value) => {\n target.__ = value; _set(target), delete target.__\n}\n\n/**\n * Value directive - two-way binding for form elements.\n * Supports text, checkbox, radio, select, and textarea.\n * @param {HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement} el - Form element\n * @param {Object} state - State object\n * @param {string} expr - Bound expression\n * @returns {(value: any) => void} Update function\n */\nexport default (el, state, expr) => {\n // bind back to value, but some values can be not bindable, eg. `:value=\"7\"`\n try {\n const set = setter(expr)\n const handleChange = el.type === 'checkbox' ? () => set(state, el.checked) :\n el.type === 'select-multiple' ? () => set(state, [...el.selectedOptions].map(o => o.value)) :\n () => set(state, el.selectedIndex < 0 ? null : isNaN(el.valueAsNumber) ? el.value : el.valueAsNumber);\n\n el.oninput = el.onchange = handleChange; // hope user doesn't redefine these manually via `.oninput = somethingElse` - it saves 5 loc vs addEventListener\n\n if (el.type?.startsWith('select')) {\n // select element also must observe any added/removed options or changed values (outside of sprae)\n new MutationObserver(handleChange).observe(el, { childList: true, subtree: true, attributes: true });\n\n // select options must be initialized before calling an update\n sprae(el, state)\n }\n\n // initial state value - setter has already cached it, so parse is fast\n parse(expr)(state) ?? handleChange()\n } catch { }\n\n return (el.type === \"text\" || el.type === \"\" || el.tagName === \"TEXTAREA\") ?\n (value, _from, _to) => (\n // we retain selection in input\n (_from = el.selectionStart),\n (_to = el.selectionEnd),\n el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)),\n _from && el.setSelectionRange(_from, _to)\n ) :\n (el.type === \"checkbox\") ?\n (value) => (el.checked = value, attr(el, \"checked\", value)) :\n (el.type === 'radio') ? (value) => (\n el.value === value && ((el.checked = value), attr(el, 'checked', value))\n ) :\n (el.type === \"select-one\") ?\n (value) => {\n for (let o of el.options)\n o.value == value ? o.setAttribute(\"selected\", '') : o.removeAttribute(\"selected\");\n el.value = value;\n } :\n (el.type === 'select-multiple') ? (value) => {\n for (let o of el.options) o.removeAttribute('selected')\n for (let v of value) el.querySelector(`[value=\"${v}\"]`).setAttribute('selected', '')\n } :\n (value) => (el.value = value);\n}\n", "import { parse } from \"../core.js\"\nimport { setter } from \"./value.js\"\n\n/**\n * Ref directive - stores element reference in state.\n * If expression is a function, calls it with element (returns dispose).\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Variable name or function expression\n * @returns {{ [Symbol.dispose]: () => void } | void} Disposal object or void\n */\nexport default (el, state, expr) => {\n let fn = parse(expr)(state)\n\n if (typeof fn == 'function') return {[Symbol.dispose]:fn(el)}\n\n // NOTE: we have to set element statically (outside of effect) to avoid parasitic sub - multiple els with same :ref can cause recursion (eg. :each :ref=\"x\")\n // Object.defineProperty(state, expr, { value: el, configurable: true })\n setter(expr)(state, el)\n}\n", "import sprae, { store, untracked, _state, _signals, signal } from '../core.js'\n\n/**\n * Scope directive - creates a child scope with local state.\n * Properties merge into a new scope inheriting from parent.\n * @param {Element} el - Target element\n * @param {Object} rootState - Parent state object\n * @returns {(values: Object | ((state: Object) => Object)) => void | boolean} Update function\n */\nexport default (el, rootState) => {\n // 0 run pre-creates state to provide scope for the first effect - it can write vars in it, so we should already have it\n // el[_state] even replaces own :scope effect state\n let state = el[_state] = store({}, rootState), init = false;\n\n // 1st run spraes subtree with values from scope, it can be postponed by modifiers (we isolate reads from parent effect)\n // 2nd+ runs update subscope\n return values => {\n values = typeof values === 'function' ? values(state) : values;\n\n // we bind to subscope to alleviate friction using scope method directly\n // also returned props should force-create signals in subscope, not overwriting parent\n if (values !== state) {\n for (let k in values) {\n // _add forces new prop, instead of checking parent\n let v = typeof values[k] === 'function' ? values[k].bind(state) : values[k]\n // update\n if (k in state[_signals]) state[k] = v\n // create\n else (state[_signals][k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n }\n }\n\n // Object.assign(subscope, call(values, subscope))\n return !init && (init = true, delete el[_state], untracked(() => sprae(el, state)))\n }\n}\n", "import sprae, { store, parse, _state, effect, _change, _signals, frag, throttle, debounce } from \"../core.js\";\n\n/**\n * Each directive - renders list items from array/object/number.\n * Syntax: `:each=\"item in items\"` or `:each=\"(item, idx) of items\"`\n * @param {HTMLTemplateElement | Element} tpl - Template element\n * @param {Object} state - State object\n * @param {string} expr - Iterator expression\n * @returns {{ eval: Function, [Symbol.dispose]: () => void }} Directive result\n */\nexport default (tpl, state, expr) => {\n const [lhs, rhs] = expr.split(/\\bin|of\\b/)\n\n let [itemVar, idxVar = \"$\"] = lhs.trim().replace(/\\(|\\)/g, '').split(/\\s*,\\s*/);\n\n // we need :if to be able to replace holder instead of tpl for :if :each case\n let holder = document.createTextNode(\"\");\n\n // we re-create items any time new items are produced\n let cur, keys, items, prevl = 0\n\n let update = throttle(() => {\n let i = 0, newItems = items, newl = newItems.length\n\n // plain array update, not store (signal with array) - updates full list\n if (cur && !cur[_change]) {\n for (let s of cur[_signals] || []) s[Symbol.dispose]()\n cur = null, prevl = 0\n }\n\n\n // delete\n if (newl < prevl) cur.length = newl\n\n // update, append, init\n else {\n // init\n if (!cur) cur = newItems\n // update\n else while (i < prevl) cur[i] = newItems[i++]\n\n // batch append using DocumentFragment for efficiency\n let batchSize = newl - i\n let batch = batchSize > 1 ? document.createDocumentFragment() : null\n let pending = batch ? [] : null\n\n // append\n for (; i < newl; i++) {\n cur[i] = newItems[i]\n\n let idx = i\n let el = tpl.content ? frag(tpl) : tpl.cloneNode(true);\n // el.content is DocumentFragment for frag() output, el itself for cloneNode\n let insertNode = el.content || el\n\n // collect for batch insert\n if (batch) {\n batch.appendChild(insertNode)\n pending.push([ el, idx ])\n } else {\n holder.before(insertNode)\n let subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n sprae(el, subscope)\n }\n\n // signal/holder disposal removes element\n let _prev = ((cur[_signals] ||= [])[i] ||= {})[Symbol.dispose]\n cur[_signals][i][Symbol.dispose] = () => {\n _prev?.(), el[Symbol.dispose]?.(), el.remove()\n };\n }\n\n // batch insert all at once, then sprae\n if (batch) {\n holder.before(batch)\n for (let [el, idx] of pending) {\n let subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n sprae(el, subscope)\n }\n }\n }\n\n prevl = newl\n })\n\n tpl.replaceWith(holder);\n tpl[_state] = null // mark as fake-spraed, to preserve :-attribs for template\n\n return Object.assign(value => {\n // resolve new items\n keys = null\n if (typeof value === \"number\") items = Array.from({ length: value }, (_, i) => i + 1)\n else if (value?.constructor === Object) keys = Object.keys(value), items = Object.values(value)\n else items = value || []\n\n // whenever list changes, we rebind internal change effect\n return effect(() => {\n // subscribe to items change (.length) - we do it every time (not just in update) since preact signals unsubscribes unused signals\n items[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n update()\n })\n }, {eval:parse(rhs)})\n}\n", "import { attr } from \"../core.js\";\n\n/**\n * Default attribute directive - sets any attribute value.\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Attribute name\n * @returns {(v: any) => void} Update function\n */\nexport default (el, st, ex, name) => v => attr(el, name, typeof v === 'function' ? v(el.getAttribute(name)) : v)\n", "import { attr, dashcase } from \"../core.js\";\n\n/**\n * Spread directive - sets multiple attributes from object.\n * Keys are converted from camelCase to kebab-case.\n * @param {Element} target - Target element\n * @returns {(value: Record<string, any>) => void} Update function\n */\nexport default (target) => value => { for (let key in value) attr(target, dashcase(key), value[key]) }\n", "import { parse, decorate } from \"../core.js\"\n\n/**\n * Event directive - attaches event listeners with modifiers.\n * Syntax: `:onclick=\"handler\"` or `:onclick.prevent.stop=\"handler\"`\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Handler expression\n * @param {string} name - Event name with modifiers (e.g., 'onclick.prevent')\n * @returns {{ [Symbol.dispose]: () => void }} Disposal object\n */\nexport default (el, state, expr, name) => {\n // wrap inline cb into function\n // if (!/^(?:[\\w$]+|\\([^()]*\\))\\s*=>/.test(expr) && !/^function\\b/.test(expr)) expr = `()=>{${expr}}`;\n\n const [type, ...mods] = name.slice(2).split('.'),\n evaluate = parse(expr).bind(el),\n trigger = decorate(Object.assign(e => evaluate(state, (fn) => typeof fn === 'function' ? fn(e) : fn), { target: el }), mods);\n\n trigger.target.addEventListener(type, trigger, trigger)\n return {\n [Symbol.dispose]() {\n trigger.target.removeEventListener(type, trigger)\n }\n }\n}\n", "import { _dispose, parse, decorate } from \"../core.js\"\n\n/**\n * Sequence directive - chains event handlers.\n * Syntax: `:onclick..keyup.enter=\"handler\"` - click triggers, then waits for Enter.\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Handler expression\n * @param {string} names - Chained event names separated by `..`\n * @returns {{ [Symbol.dispose]: () => void }} Disposal object\n */\nexport default (el, state, expr, names) => {\n let cur, // current step callback\n off // current step disposal\n\n let steps = names.split('..').map((step, i, { length }) => step.split(':').reduce(\n (prev, str) => {\n const [name, ...mods] = str.slice(2).split('.')\n\n const evaluate = parse(expr).bind(el)\n\n const next = (fn, e) => cur = typeof fn === 'function' ? fn(e) : fn\n const trigger = decorate(Object.assign(\n e => (!i ? evaluate(state, (fn) => next(fn, e)) : next(cur, e), off(), off = steps[(i + 1) % length]()),\n { target: el }\n ), mods)\n\n\n return (_poff) => (\n _poff = prev?.(),\n trigger.target.addEventListener(name, trigger, trigger),\n () => (_poff?.(), trigger.target.removeEventListener(name, trigger))\n )\n }, null)\n )\n\n off = steps[0]()\n\n return {\n [Symbol.dispose]() {\n off?.()\n }\n }\n}\n", "import sprae, { _dispose } from \"../core.js\"\n\n/**\n * HTML directive - sets innerHTML and initializes nested directives.\n * Supports templates for fragment insertion.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @param {Object} state - State object\n * @returns {(v: string | ((html: string) => string)) => void | (() => void)} Update function\n */\nexport default (el, state) => {\n // <template :html=\"a\"/> - fragment case: use placeholder + range\n if (el.content) {\n let start = document.createTextNode(''),\n end = document.createTextNode(''),\n range = document.createRange()\n el.replaceWith(start, end)\n return v => {\n v = typeof v === 'function' ? v('') : v\n range.setStartAfter(start)\n range.setEndBefore(end)\n range.deleteContents()\n if (v != null && v !== '') {\n let frag = range.createContextualFragment(v)\n sprae(frag, state)\n range.insertNode(frag)\n }\n }\n }\n return v => (v = typeof v === 'function' ? v(el.innerHTML) : v, el.innerHTML = v == null ? \"\" : v, sprae(el, state), el[_dispose])\n}\n", "/**\n * Portal directive - teleports element to another container.\n * Value can be selector string, element, or falsy to return home.\n * @param {Element} el - Element to teleport\n * @param {Object} state - State object\n * @param {string} expr - Expression\n * @returns {(value: string | Element | null | false) => void} Update function\n */\nexport default (el, state, expr) => {\n const comment = document.createComment(':portal')\n let currentTarget = null\n\n // Insert placeholder before element\n el.before(comment)\n\n return (value) => {\n // Resolve target: selector string, element, or null/false to return home\n // For selectors, first try within the same root, then document\n const root = el.getRootNode()\n const target = typeof value === 'string'\n ? (root.querySelector?.(value) || document.querySelector(value))\n : value instanceof Element ? value\n : value ? document.body : null\n\n // No change needed\n if (target === currentTarget) return\n\n if (target) {\n // Move to target\n target.appendChild(el)\n } else {\n // Return home (after placeholder)\n comment.after(el)\n }\n\n currentTarget = target\n }\n}\n", "/**\n * Hidden directive - toggles the hidden attribute.\n * @param {Element} el - Target element\n * @returns {(value: any) => boolean} Update function\n */\nexport default (el) => (value) => el.hidden = !!value\n", "/**\n * @fileoverview Sprae - lightweight reactive HTML templating library\n * @module sprae\n */\n\nimport store from \"./store.js\";\nimport { batch, computed, effect, signal, untracked } from './core.js';\nimport * as signals from './signal.js';\nimport sprae, { use, decorate, directive, modifier, parse, throttle, debounce, _off, _state, _on, _dispose, _add } from './core.js';\n\nimport _if from \"./directive/if.js\";\nimport _else from \"./directive/else.js\";\nimport _text from \"./directive/text.js\";\nimport _class from \"./directive/class.js\";\nimport _style from \"./directive/style.js\";\nimport _fx from \"./directive/fx.js\";\nimport _value from \"./directive/value.js\";\nimport _ref from \"./directive/ref.js\";\nimport _scope from \"./directive/scope.js\";\nimport _each from \"./directive/each.js\";\nimport _default from \"./directive/_.js\";\nimport _spread from \"./directive/spread.js\";\nimport _event from \"./directive/event.js\";\nimport _seq from \"./directive/sequence.js\";\nimport _html from \"./directive/html.js\";\nimport _portal from \"./directive/portal.js\";\nimport _hidden from \"./directive/hidden.js\";\n\n\nObject.assign(directive, {\n _: (el, state, expr, name) => (name.startsWith('on') ? _event : _default)(el, state, expr, name),\n '': _spread,\n class: _class,\n text: _text,\n html: _html,\n style: _style,\n fx: _fx,\n value: _value,\n ref: _ref,\n scope: _scope,\n if: _if,\n else: _else,\n each: _each,\n portal: _portal,\n hidden: _hidden\n})\n\n\n/**\n * Directive initializer with modifiers support.\n * @param {Element} target - Target element\n * @param {string} name - Directive name with modifiers (e.g., 'onclick.throttle-500')\n * @param {string} expr - Expression string\n * @param {Object} state - Reactive state object\n * @returns {() => (() => void) | void} Initializer function that returns a disposer\n */\nconst dir = (target, name, expr, state) => {\n let [dirName, ...mods] = name.split('.'), create = directive[dirName] || directive._\n\n return () => {\n let update = create(target, state, expr, name)\n\n if (!update?.call) return update?.[_dispose]\n\n // throttle prevents multiple updates within one tick as well as isolates stack for each update\n let trigger = decorate(Object.assign(throttle(() => change.value++), { target }), mods),\n change = signal(0), // signal authorized to trigger effect: 0 = init; >0 = trigger\n count = 0, // called effect count\n evaluate = update.eval ?? parse(expr).bind(target),\n _out, out = () => (typeof _out === 'function' && _out(), _out=null) // effect trigger and invoke may happen in the same tick, so it will be effect-within-effect call - we need to store output of evaluate to return from trigger effect\n\n state = target[_state] ?? state\n\n return effect(() => (\n // if planned count is same as actual count - plan new update, else update right away\n change.value == count ? (trigger()) : (count = change.value, _out = evaluate(state, update)),\n out\n ))\n }\n}\n\n// Parses time string to ms: 100, 100ms, 1s, 1m\nconst parseTime = (t) => !t ? 0 : typeof t === 'number' ? t :\n (([, n, u] = t.match(/^(\\d+)(ms|s|m)?$/) || []) => (n = +n, u === 's' ? n * 1000 : u === 'm' ? n * 60000 : n))()\n\n// Creates scheduler from time/keyword (idle, raf, tick, or ms)\nconst scheduler = (t) =>\n t === 'idle' ? requestIdleCallback :\n t === 'raf' ? requestAnimationFrame :\n !t || t === 'tick' ? queueMicrotask :\n (fn) => setTimeout(fn, parseTime(t))\n\n// Built-in modifiers for timing, targeting, and event handling\nObject.assign(modifier, {\n /**\n * Delays callback by interval since last call (trailing edge).\n * Supports: tick (default), raf, idle, N, Nms, Ns, Nm. Add -immediate for leading edge.\n * Examples: .debounce, .debounce-100, .debounce-1s, .debounce-raf, .debounce-idle, .debounce-100-immediate\n */\n debounce: (fn, a, b) => debounce(fn, scheduler(a === 'immediate' ? b : a), a === 'immediate' || b === 'immediate'),\n /**\n * Limits callback rate to interval (leading + trailing edges).\n * Supports: tick (default), raf, idle, N, Nms, Ns, Nm.\n * Examples: .throttle, .throttle-100, .throttle-1s, .throttle-raf, .throttle-idle\n */\n throttle: (fn, a) => throttle(fn, scheduler(a)),\n /** Runs callback after delay. Supports: tick (default), raf, idle, N, Nms, Ns, Nm. */\n delay: (fn, a) => ((sched = scheduler(a)) => (e) => sched(() => fn(e)))(),\n\n /** @deprecated Use .delay instead */\n tick: (fn) => (console.warn('Deprecated'), (e) => (queueMicrotask(() => fn(e)))),\n /** @deprecated Use .throttle-raf instead */\n raf: (fn) => (console.warn('Deprecated'), (e) => requestAnimationFrame(() => fn(e))),\n\n /** Calls handler only once. */\n once: (fn, _done, _fn) => (_fn = (e) => !_done && (_done = 1, fn(e)), _fn.once = true, _fn),\n\n /** Attaches event listener to window. */\n window: fn => (fn.target = fn.target.ownerDocument.defaultView, fn),\n /** Attaches event listener to document. */\n document: fn => (fn.target = fn.target.ownerDocument, fn),\n /** Attaches event listener to document root element (<html>). */\n root: fn => (fn.target = fn.target.ownerDocument.documentElement, fn),\n /** Attaches event listener to body. */\n body: fn => (fn.target = fn.target.ownerDocument.body, fn),\n /** Attaches event listener to parent element. */\n parent: fn => (fn.target = fn.target.parentNode, fn),\n /** Triggers only when event target is the element itself. */\n self: (fn) => (e) => (e.target === fn.target && fn(e)),\n /** Triggers when click is outside the element. */\n away: (fn) => Object.assign((e) => (!fn.target.contains(e.target) && e.target.isConnected && fn(e)), {target: fn.target.ownerDocument}),\n\n /** Calls preventDefault() before handler. */\n prevent: (fn) => (e) => (e?.preventDefault(), fn(e)),\n /** Calls stopPropagation() or stopImmediatePropagation() (with -immediate). */\n stop: (fn, _how) => (e) => (_how?.[0] === 'i' ? e?.stopImmediatePropagation() : e?.stopPropagation(), fn(e)),\n /** @deprecated Use .stop-immediate instead */\n immediate: (fn) => (console.warn('Deprecated'), (e) => (e?.stopImmediatePropagation(), fn(e))),\n /** Sets passive option for event listener. */\n passive: fn => (fn.passive = true, fn),\n /** Sets capture option for event listener. */\n capture: fn => (fn.capture = true, fn),\n})\n/** Alias for .away modifier */\nmodifier.outside = modifier.away\n\n/**\n * Key testers for keyboard event modifiers.\n * @type {Record<string, (e: KeyboardEvent) => boolean>}\n */\nconst keys = {\n ctrl: e => e.ctrlKey || e.key === \"Control\" || e.key === \"Ctrl\",\n shift: e => e.shiftKey || e.key === \"Shift\",\n alt: e => e.altKey || e.key === \"Alt\",\n meta: e => e.metaKey || e.key === \"Meta\",\n cmd: e => e.metaKey || e.key === \"Command\",\n arrow: e => e.key.startsWith(\"Arrow\"),\n enter: e => e.key === \"Enter\",\n esc: e => e.key.startsWith(\"Esc\"),\n tab: e => e.key === \"Tab\",\n space: e => e.key === \"\u00A0\" || e.key === \"Space\" || e.key === \" \",\n delete: e => e.key === \"Delete\" || e.key === \"Backspace\",\n digit: e => /^\\d$/.test(e.key),\n letter: e => /^\\p{L}$/gu.test(e.key),\n char: e => /^\\S$/.test(e.key),\n};\n\n// match key by name, or by e.key (case-insensitive), or by keyCode (digits)\nconst keyMatch = (k, e) => keys[k]?.(e) || e.key.toLowerCase() === k || e.keyCode == k\n\n// Augment modifiers with key testers (e.g., .enter, .ctrl, .ctrl-a, .ctrl-65)\nfor (let k in keys) modifier[k] = (fn, a, b) => (e) => keys[k](e) && (!a || keyMatch(a, e)) && (!b || keyMatch(b, e)) && fn(e)\n\n\n// Checks for first-level semicolons (statement vs expression)\nconst hasSemi = s => {\n for (let d=0,i=0;i<s.length;i++) {\n if (s[i]=='{') d++\n else if (s[i]=='}') d--\n else if (s[i]==';' && !d) return true\n }\n return false\n}\n\n// Configure sprae with default compiler and signals\nuse({\n\n// Default compiler wraps expression for new Function\n compile: expr => {\n // if, const, let - no return\n if (/^(if|let|const)\\b/.test(expr));\n // first-level semicolons - no return\n else if (hasSemi(expr));\n else expr = `return ${expr}`\n // async expression\n if (/\\bawait\\s/.test(expr)) expr = `return (async()=>{${expr}})()`\n return sprae.constructor(`with(arguments[0]){${expr}}`)\n },\n dir: (el, name, expr, state) => {\n // sequences shortcut\n if (name.includes('..')) return () => _seq(el, state, expr, name)[_dispose]\n return name.split(':').reduce((prev, str) => {\n let start = dir(el, str, expr, state)\n return !prev ? start : (p, s) => (p = prev(), s = start(), () => { p(); s() })\n }, null)\n },\n ...signals\n})\n\n\n// Expose for runtime configuration\nsprae.use = use\nsprae.store = store\nsprae.directive = directive\nsprae.modifier = modifier\n\n/**\n * Disposes a spraed element, cleaning up all effects and state.\n * @param {Element} el - Element to dispose\n */\nsprae.dispose = (el) => el[_dispose]?.()\n\n\n/**\n * Auto-initializes sprae on dynamically added elements.\n * Uses MutationObserver to detect new DOM nodes and apply directives.\n *\n * @param {Element} [root=document.body] - Root element to observe\n * @param {Object} [values] - Initial state values\n * @returns {Object} The reactive state object\n *\n * @example\n * ```js\n * // Auto-init on page load\n * sprae.start(document.body, { count: 0 })\n * ```\n */\nconst start = sprae.start = (root = document.body, values) => {\n const state = store(values)\n sprae(root, state);\n const mo = new MutationObserver(mutations => {\n for (const m of mutations) {\n for (const el of m.addedNodes) {\n // el can be spraed or removed by subsprae (like within :each/:if)\n if (el.nodeType === 1 && el[_state] === undefined && root.contains(el)) {\n // even if element has no spraeable attrs, some of its children can have\n root[_add](el)\n }\n }\n for (const el of m.removedNodes) el.nodeType === 1 && el[_dispose]?.()\n }\n });\n mo.observe(root, { childList: true, subtree: true });\n return state\n}\n\n\n/** Package version (injected by bundler) */\nsprae.version = \"12.4.0\"\n\nconst dispose = sprae.dispose\n\nexport default sprae\nexport { sprae, store, signal, effect, computed, batch, untracked, start, use, throttle, debounce, dispose }\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["_dispose", "_state", "_on", "_off", "_add", "prefix", "signal", "effect", "computed", "batch", "fn", "untracked", "directive", "modifier", "currentDir", "currentEl", "elHint", "el", "hint", "err", "expr", "msg", "sprae", "state", "store_default", "fx", "offs", "off", "add", "_attrs", "start", "i", "name", "value", "dir", "child", "next", "compile", "parse", "cache", "e", "cb", "_out", "result", "v", "use", "config", "decorate", "mods", "params", "mod", "wrapFn", "k", "frag", "tpl", "content", "attributes", "ref", "childNodes", "a", "dashcase", "str", "match", "attr", "clsx", "c", "s", "throttle", "ms", "_planned", "arg", "schedule", "throttled", "_dirty", "debounce", "immediate", "_blocked", "_count", "_c", "core_default", "_signals", "_change", "_set", "sandbox", "store", "values", "parent", "list", "keyCount", "signals", "state", "signal", "_", "k", "v", "set", "create", "descs", "computed", "isMut", "mut", "fn", "length", "i", "_s", "_v", "untracked", "batch", "store_default", "signal_exports", "__export", "batch", "computed", "effect", "signal", "untracked", "current", "depth", "batched", "v", "_s", "_obs", "_v", "val", "sub", "fn", "_teardown", "_fx", "_deps", "prev", "tmp", "dep", "_c", "_e", "_first", "_list", "fx", "_prev", "if_default", "el", "state", "_a", "_holder", "_el", "_match", "core_default", "_state", "frag", "throttle", "match", "s", "_off", "_on", "value", "else_default", "el", "_el", "_prev", "frag", "_state", "text_default", "el", "frag", "v", "class_default", "el", "st", "ex", "name", "_cur", "_new", "decorate", "v", "clsx", "c", "style_default", "el", "st", "ex", "name", "_static", "decorate", "v", "attr", "k", "fx_default", "fn", "setter", "expr", "_set", "parse", "target", "value", "value_default", "el", "state", "set", "handleChange", "o", "core_default", "_from", "_to", "attr", "v", "ref_default", "el", "state", "expr", "fn", "parse", "setter", "scope_default", "el", "rootState", "state", "_state", "store", "init", "values", "k", "v", "_signals", "signal", "untracked", "core_default", "each_default", "tpl", "state", "expr", "lhs", "rhs", "itemVar", "idxVar", "holder", "cur", "keys", "items", "prevl", "update", "throttle", "_a", "_b", "i", "newItems", "newl", "_change", "s", "_signals", "batch", "pending", "idx", "el", "frag", "insertNode", "subscope", "core_default", "_prev", "_state", "value", "_", "effect", "parse", "__default", "el", "st", "ex", "name", "v", "attr", "spread_default", "target", "value", "key", "attr", "dashcase", "event_default", "el", "state", "expr", "name", "type", "mods", "evaluate", "parse", "trigger", "decorate", "e", "fn", "sequence_default", "el", "state", "expr", "names", "cur", "off", "steps", "step", "i", "length", "prev", "str", "name", "mods", "evaluate", "parse", "next", "fn", "e", "trigger", "decorate", "_poff", "html_default", "el", "state", "start", "end", "range", "v", "frag", "core_default", "_dispose", "portal_default", "el", "state", "expr", "comment", "currentTarget", "value", "root", "target", "hidden_default", "el", "value", "directive", "el", "state", "expr", "name", "event_default", "__default", "spread_default", "class_default", "text_default", "html_default", "style_default", "fx_default", "value_default", "ref_default", "scope_default", "if_default", "else_default", "each_default", "portal_default", "hidden_default", "dir", "target", "dirName", "mods", "create", "update", "_dispose", "trigger", "decorate", "throttle", "change", "signal", "count", "evaluate", "parse", "_out", "out", "_state", "effect", "parseTime", "t", "n", "u", "scheduler", "fn", "modifier", "a", "b", "debounce", "sched", "e", "_done", "_fn", "_how", "keys", "keyMatch", "k", "hasSemi", "s", "d", "i", "use", "core_default", "sequence_default", "prev", "str", "start", "p", "signal_exports", "store_default", "root", "values", "mutations", "m", "_add", "dispose", "sprae_default"]
|
|
4
|
+
"sourcesContent": ["import store, { _change, _signals } from \"./store.js\";\n\n/** Symbol for disposal (using standard Symbol.dispose if available) */\nexport const _dispose = (Symbol.dispose ||= Symbol(\"dispose\"))\n\n/** Symbol for accessing element's reactive state */\nexport const _state = Symbol(\"state\")\n\n/** Symbol for enabling element effects */\nexport const _on = Symbol('on')\n\n/** Symbol for disabling element effects */\nexport const _off = Symbol('off')\n\n/** Symbol for adding child to element */\nexport const _add = Symbol('init')\n\n/** Directive prefix (default: ':') */\nexport let prefix = ':';\n\n/**\n * A reactive signal containing a value.\n * @template T\n * @typedef {Object} Signal\n * @property {T} value - Current value (reading subscribes, writing notifies)\n * @property {() => T} peek - Read without subscribing\n * @property {() => T} valueOf - Get value for coercion\n * @property {() => T} toJSON - Get value for JSON serialization\n * @property {() => string} toString - Get value as string\n */\n\n/**\n * Internal effect function type.\n * @typedef {Object} EffectFn\n * @property {Set<Set<EffectFn>>} deps - Dependency sets\n * @property {() => void} fn - Original function\n */\n\n/**\n * Creates a reactive signal.\n * @template T\n * @type {<T>(value: T) => Signal<T>}\n */\nexport let signal;\n\n/**\n * Creates a reactive effect that re-runs when dependencies change.\n * @type {(fn: () => void | (() => void)) => () => void}\n */\nexport let effect;\n\n/**\n * Creates a computed signal derived from other signals.\n * @template T\n * @type {<T>(fn: () => T) => Signal<T>}\n */\nexport let computed;\n\n/**\n * Batches multiple signal updates into a single notification.\n * @template T\n * @type {<T>(fn: () => T) => T}\n */\nexport let batch = (fn) => fn();\n\n/**\n * Runs a function without tracking signal dependencies.\n * @template T\n * @type {<T>(fn: () => T) => T}\n */\nexport let untracked = batch;\n\n/**\n * Registry of directive handlers.\n * @type {Record<string, DirectiveHandler>}\n */\nexport let directive = {};\n\n/**\n * Registry of modifier functions.\n * @type {Record<string, ModifierHandler>}\n */\nexport let modifier = {}\n\nlet currentDir = null;\nlet currentEl = null;\n\n/**\n * Formats element for error message (minimal context).\n * @param {Element} [el] - Element to format\n * @returns {string} Element hint like \"<div#id.class>\"\n */\nconst elHint = (el) => {\n if (!el?.tagName) return ''\n let hint = el.tagName.toLowerCase()\n if (el.id) hint += '#' + el.id\n else if (el.className) hint += '.' + el.className.split(' ')[0]\n return `<${hint}>`\n}\n\n/**\n * Reports an error with context.\n * @param {Error|string} e - Error to report\n * @param {string} [expr] - Expression that caused error\n */\nconst err = (e, expr) => {\n let msg = `\u2234 ${e}`\n if (currentEl) msg += `\\n in ${elHint(currentEl)}`\n if (currentDir && expr) {\n // Truncate long expressions\n const display = expr.length > 100 ? expr.slice(0, 80) + `\u2026 (${expr.length} chars)` : expr\n msg += `\\n ${currentDir}=\"${display}\"`\n }\n console.error(msg)\n}\n\n/**\n * @callback DirectiveHandler\n * @param {Element} el - Target element\n * @param {Object} state - Reactive state object\n * @param {string} expr - Expression string\n * @param {string} [name] - Directive name with modifiers\n * @returns {((value: any) => void | (() => void)) | { [Symbol.dispose]: () => void } | void}\n */\n\n/**\n * @callback ModifierHandler\n * @param {Function} fn - Function to modify\n * @param {...string} args - Modifier arguments (from dash-separated values)\n * @returns {Function}\n */\n\n/**\n * @typedef {Object} SpraeState\n * @property {Record<string, Signal>} [_signals] - Internal signals map\n */\n\n/**\n * Applies directives to an HTML element and manages its reactive state.\n *\n * @param {Element} [el=document.body] - The target HTML element to apply directives to.\n * @param {Object} [state] - Initial state values to populate the element's reactive state.\n * @returns {SpraeState & Object} The reactive state object associated with the element.\n */\nconst sprae = (el = document.body, state) => {\n // repeated call can be caused by eg. :each with new objects with old keys\n if (el[_state]) return Object.assign(el[_state], state)\n\n // console.group('sprae', el)\n\n // take over existing state instead of creating a clone\n state = store(state || {})\n\n let fx = [], offs = []\n\n // on/off all effects\n // we don't call prevOn as convention: everything defined before :else :if won't be disabled by :if\n // imagine <x :onx=\"...\" :if=\"...\"/> - when :if is false, it disables directives after :if (calls _off) but ignores :onx\n el[_on] = () => (!offs && (offs = fx.map(fn => fn())))\n el[_off] = () => (offs?.map(off => off()), offs = null)\n\n // destroy\n el[_dispose] ||= () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_add] = el[_state] = null)\n\n const add = el[_add] = (el) => {\n let _attrs = el.attributes, start;\n\n // we iterate live collection (subsprae can init args)\n if (_attrs) for (let i = 0; i < _attrs.length;) {\n let { name, value } = _attrs[i]\n\n if (name.startsWith(prefix)) {\n el.removeAttribute(name)\n\n currentDir = name;\n currentEl = el;\n\n // directive initializer can be redefined\n fx.push(start = dir(el, name.slice(prefix.length), value, state)), offs.push(start())\n\n // stop after subsprae like :each, :if, :scope etc.\n if (_state in el) return\n } else i++\n }\n\n // :if and :each replace element with text node, which tweaks .children length, but .childNodes length persists\n // real DOM: firstChild/nextSibling avoids array copy; frag.childNodes is already snapshot array\n if (el.firstChild !== undefined) {\n let child = el.firstChild, next\n while (child) (next = child.nextSibling, child.nodeType == 1 && add(child), child = next)\n }\n else for (let child of el.childNodes) child.nodeType == 1 && add(child)\n };\n\n add(el);\n\n // if element was spraed by inline :with/:if/:each/etc instruction (meaning it has state placeholder) - skip, otherwise save _state\n if (el[_state] === undefined) el[_state] = state\n\n // console.groupEnd()\n\n return state;\n}\n\n// directive initializer\n/** @type {(el: Element, name: string, expr: string, state: Object) => () => (() => void) | void} */\nexport let dir\n\n/**\n * Compiles an expression string into an evaluator function.\n * @type {(expr: string) => (state: Object) => any}\n */\nexport let compile\n\n/**\n * Parses an expression into an evaluator function, caching the result for reuse.\n *\n * @param {string} expr - The expression to parse and compile into a function.\n * @returns {(state: Object, cb?: (value: any) => any) => any} The compiled evaluator function for the expression.\n */\nexport const parse = (expr) => {\n let fn = cache[expr=expr.trim()]\n if (fn) return fn\n\n // static time errors\n try {\n fn = compile(expr || 'undefined')\n // Object.defineProperty(fn, \"name\", { value: `\u2234 ${expr}` })\n } catch (e) { err(e, expr) }\n\n // run time errors\n return cache[expr] = function (state, cb, _out) {\n try {\n let result = fn?.call(this, state)\n // if cb is given (to handle async/await exprs, usually directive update) - call it with result and return a cleanup function\n if (cb) return result?.then\n ? (result.then(v => _out = cb(v)).catch(e => err(e, expr)), () => typeof _out === 'function' && _out())\n : cb(result)\n else return result\n } catch (e) {\n err(e, expr)\n }\n }\n}\nconst cache = {};\n\n\n/**\n * @typedef {Object} SpraeConfig\n * @property {(expr: string) => (state: Object) => any} [compile] - Custom expression compiler\n * @property {string} [prefix] - Directive prefix (default: ':')\n * @property {<T>(value: T) => Signal<T>} [signal] - Signal factory\n * @property {(fn: () => void | (() => void)) => () => void} [effect] - Effect factory\n * @property {<T>(fn: () => T) => Signal<T>} [computed] - Computed factory\n * @property {<T>(fn: () => T) => T} [batch] - Batch function\n * @property {<T>(fn: () => T) => T} [untracked] - Untracked function\n * @property {(el: Element, name: string, expr: string, state: Object) => () => (() => void) | void} [dir] - Directive initializer\n */\n\n/**\n * Configure sprae with custom signals, compiler, or prefix.\n * @param {SpraeConfig} config - Configuration options\n * @returns {void}\n */\nexport const use = (config) => (\n config.compile && (compile = config.compile),\n config.prefix && (prefix = config.prefix),\n config.signal && (signal = config.signal),\n config.effect && (effect = config.effect),\n config.computed && (computed = config.computed),\n config.batch && (batch = config.batch),\n config.untracked && (untracked = config.untracked),\n config.dir && (dir = config.dir)\n)\n\n/**\n * Applies modifiers to a function.\n * @param {Function & { target?: Element }} fn - Function to decorate\n * @param {string[]} mods - Modifier names with arguments (e.g., ['throttle-500', 'prevent'])\n * @returns {Function} Decorated function\n */\nexport const decorate = (fn, mods) => {\n while (mods.length) {\n let [name, ...params] = mods.pop().split('-'), mod = modifier[name], wrapFn\n if (mod) {\n if ((wrapFn = mod(fn, ...params)) !== fn) {\n for (let k in fn) wrapFn[k] ??= fn[k];\n fn = wrapFn\n }\n }\n }\n return fn\n}\n\n/**\n * @typedef {Object} FragmentLike\n * @property {Node[]} childNodes - Child nodes of the fragment\n * @property {DocumentFragment} content - The document fragment content\n * @property {() => void} remove - Remove the fragment from DOM\n * @property {(el: Node) => void} replaceWith - Replace the fragment with an element\n * @property {Attr[]} attributes - Attributes from the original template\n * @property {(name: string) => void} removeAttribute - Remove an attribute\n */\n\n/**\n * Creates a fragment holder from a template element with minimal API surface.\n * @param {HTMLTemplateElement | FragmentLike} tpl - Template element or existing fragment\n * @returns {FragmentLike} Fragment-like object\n */\nexport const frag = (tpl) => {\n if (!tpl.nodeType) return tpl // existing tpl\n\n let content = tpl.content.cloneNode(true), // document fragment holder of content\n attributes = [...tpl.attributes],\n ref = document.createTextNode(''),\n // ensure at least one node\n childNodes = (content.append(ref), [...content.childNodes])\n\n return {\n childNodes,\n content,\n remove: () => content.append(...childNodes),\n replaceWith(el) {\n if (el === ref) return\n ref.before(el)\n content.append(...childNodes)\n },\n attributes,\n removeAttribute(name) { attributes.splice(attributes.findIndex(a => a.name === name), 1) },\n }\n}\n\n/**\n * Converts camelCase to kebab-case.\n * @param {string} str - String to convert\n * @returns {string} Kebab-case string\n */\nexport const dashcase = (str) => str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());\n\n/**\n * Sets or removes an attribute on an element.\n * @param {Element} el - Target element\n * @param {string} name - Attribute name\n * @param {string | boolean | null | undefined} v - Attribute value (null/false removes, true sets empty)\n * @returns {void}\n */\nexport const attr = (el, name, v) => (v == null || v === false) ? el.removeAttribute(name) : el.setAttribute(name, v === true ? \"\" : v);\n\n/**\n * Converts class input to className string (like clsx/classnames).\n * @param {string | string[] | Record<string, boolean> | null | undefined} c - Class input\n * @returns {string} Space-separated class string\n */\nexport const clsx = (c, _out = []) => !c ? '' : typeof c === 'string' ? c : (\n Array.isArray(c) ? c.map(clsx) :\n Object.entries(c).reduce((s, [k, v]) => !v ? s : [...s, k], [])\n).join(' ')\n\n/**\n * Throttles a function to run at most once per tick (or custom scheduler).\n * Fires on leading edge, then on trailing edge if called during throttle.\n * @template {Function} T\n * @param {T} fn - Function to throttle\n * @param {number|Function} [ms] - Delay in ms or scheduler function (default: microtask)\n * @returns {T} Throttled function\n */\nexport const throttle = (fn, ms) => {\n let _planned = 0, arg, schedule = typeof ms === 'function' ? ms : ms ? (fn) => setTimeout(fn, ms) : queueMicrotask;\n const throttled = (e) => {\n arg = e\n if (!_planned++) fn(arg), schedule((_dirty = _planned > 1) => (\n _planned = 0, _dirty && throttled(arg)\n ));\n }\n return throttled;\n}\n\n/**\n * Debounces a function to run after a delay since the last call.\n * @template {Function} T\n * @param {T} fn - Function to debounce\n * @param {number|Function} [ms] - Delay in ms or scheduler function (default: microtask)\n * @param {boolean} [immediate=false] - Fire on leading edge instead of trailing\n * @returns {T} Debounced function\n */\nexport const debounce = (fn, ms, immediate) => {\n let schedule = typeof ms === 'function' ? ms : ms ? (fn) => setTimeout(fn, ms) : queueMicrotask;\n return immediate\n ? ((_blocked) => (arg) => !_blocked && (fn(arg), _blocked = 1, schedule(() => _blocked = 0)))()\n : ((_count = 0) => (arg, _c = ++_count) => schedule(() => _c == _count && fn(arg)))()\n}\n\n/**\n * Parses time string to milliseconds. Supports: 100, 100ms, 1s, 1m\n * @param {string|number} t - Time value\n * @returns {number} Milliseconds\n */\nexport * from './store.js';\n\nexport default sprae\n", "/**\n * @fileoverview Signals-powered reactive proxy store\n * @module sprae/store\n */\n\nimport { signal, computed, batch, untracked } from './core.js'\n\n/** Symbol for accessing the internal signals map */\nexport const _signals = Symbol('signals')\n\n/** Symbol for the change signal that tracks object keys or array length */\nexport const _change = Symbol('change')\n\n/** Symbol for stashed setter on computed values */\nexport const _set = Symbol('set')\n\n// a hack to simulate sandbox for `with` in evaluator\nlet sandbox = true\n\n/**\n * Reactive store with signals backing.\n * @template T\n * @typedef {T & { [_signals]: Record<string | symbol, import('./core.js').Signal<any>> }} ReactiveStore\n */\n\n/**\n * Creates a reactive proxy store from an object or array.\n * Properties become signals for fine-grained reactivity.\n * Supports nested objects, arrays, computed getters, and methods.\n *\n * @template {Object} T\n * @param {T} values - Initial values object\n * @param {Object} [parent] - Parent scope for inheritance\n * @returns {ReactiveStore<T>} Reactive proxy store\n *\n * @example\n * const state = store({ count: 0, get doubled() { return this.count * 2 } })\n * state.count = 5 // triggers updates\n * state.doubled // 10 (computed)\n */\nexport const store = (values, parent) => {\n if (!values) return values\n\n // ignore globals\n // FIXME: handle via has trap\n if (values[Symbol.toStringTag]) return values;\n\n // bypass existing store\n if (values[_signals]) return values\n\n // non-objects: for array redirect to list\n if (values.constructor !== Object) return Array.isArray(values) ? list(values) : values\n\n // _change stores total number of keys to track new props\n let keyCount = Object.keys(values).length,\n signals = {}\n\n // proxy conducts prop access to signals\n let state = new Proxy(Object.assign(signals, {\n [_change]: signal(keyCount),\n [_signals]: signals\n }), {\n get: (_, k) => {\n if (k in signals) return (signals[k] ? signals[k].valueOf() : signals[k])\n return parent ? parent[k] : (typeof globalThis[k] === 'function' && !globalThis[k].prototype ? globalThis[k].bind(globalThis) : globalThis[k])\n },\n\n set: (_, k, v) => {\n // console.group('SET', k, v)\n if (k in signals) return set(signals, k, v), 1\n\n // turn off sandbox to check if parents have the prop - we don't want to create new prop in global scope\n sandbox = false\n\n // write transparency for parent scope, unlike prototype chain\n // if prop is defined in parent scope (except global) - write there\n if (parent && k in parent) {\n parent[k] = v\n }\n // else create in current scope\n else {\n create(signals, k, v)\n signals[_change].value = ++keyCount\n }\n\n sandbox = true\n\n // console.groupEnd()\n // bump length for new signal\n return 1\n },\n\n // FIXME: try to avild calling Symbol.dispose here. Maybe _delete method?\n deleteProperty: (_, k) => {\n k in signals && (k[0] != '_' && signals[k]?.[Symbol.dispose]?.(), delete signals[k], signals[_change].value = --keyCount)\n return 1\n },\n\n // subscribe to length when spreading\n ownKeys: () => (signals[_change].value, Reflect.ownKeys(signals)),\n\n // sandbox prevents writing to global\n has: (_, k) => {\n if (k in signals) return true\n if (parent) return k in parent\n return sandbox\n }\n })\n\n // init signals for values\n const descs = Object.getOwnPropertyDescriptors(values)\n\n for (let k in values) {\n // getter turns into computed\n if (descs[k]?.get)\n // stash setter\n (signals[k] = computed(descs[k].get.bind(state)))[_set] = descs[k].set?.bind(state);\n\n // init blank signal - make sure we don't take prototype one\n else create(signals, k, values[k])\n }\n\n return state\n}\n\n/**\n * Creates a reactive array store with lazy signal initialization.\n * Arrays can be large, so signals are created on-demand.\n * @param {any[]} values - Initial array values\n * @param {Object} [parent=globalThis] - Parent scope\n * @returns {ReactiveStore<any[]>} Reactive array proxy\n */\nconst list = (values, parent = globalThis) => {\n\n // gotta fill with null since proto methods like .reduce may fail\n let signals = Array(values.length).fill(null),\n\n // if .length was accessed from mutator (.push/etc) method\n isMut = false,\n\n // since array mutator methods read .length internally only once, we disable it on the moment of call, allowing rest of operations to be reactive\n mut = fn => function () { isMut = true; return fn.apply(this, arguments); },\n\n length = signal(values.length),\n\n // proxy passes prop access to signals\n state = new Proxy(\n Object.assign(signals, {\n [_change]: length,\n [_signals]: signals,\n // patch mutators\n push: mut(signals.push),\n pop: mut(signals.pop),\n shift: mut(signals.shift),\n unshift: mut(signals.unshift),\n splice: mut(signals.splice),\n }),\n {\n get(_, k) {\n // console.log('GET', k, isMut)\n\n // if .length is read within mutators - peek signal to avoid recursive subscription\n // we need to ignore it only once and keep for the rest of the mutator call\n if (k === 'length') return isMut ? (isMut = false, signals.length) : length.value;\n\n // non-numeric\n if (typeof k === 'symbol' || isNaN(k)) return signals[k]?.valueOf() ?? parent[k];\n\n // create signal (lazy)\n // NOTE: if you decide to unlazy values, think about large arrays - init upfront can be costly\n return (signals[k] ??= signal(store(values[k]))).valueOf()\n },\n\n set(_, k, v) {\n // console.log('SET', k, v)\n\n // .length\n if (k === 'length') {\n // force cleaning up tail\n for (let i = v; i < signals.length; i++) delete state[i]\n // .length = N directly\n length.value = signals.length = v;\n }\n\n // force changing length, if eg. a=[]; a[1]=1 - need to come after setting the item\n else if (k >= signals.length) create(signals, k, v), state.length = +k + 1\n\n // existing signal\n else signals[k] ? set(signals, k, v) : create(signals, k, v)\n\n return 1\n },\n\n // dispose notifies any signal deps, like :each\n deleteProperty: (_, k) => (signals[k]?.[Symbol.dispose]?.(), delete signals[k], 1),\n })\n\n return state\n}\n\n/**\n * Creates a signal for a property value.\n * Skips wrapping for untracked props (underscore prefix) and existing signals.\n * @param {Object} signals - Signals storage object\n * @param {string} k - Property key\n * @param {any} v - Property value\n */\nconst create = (signals, k, v) => (signals[k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n\n/**\n * Updates a signal value, handling arrays specially for efficient patching.\n * @param {Object} signals - Signals storage object\n * @param {string} k - Property key\n * @param {any} v - New value\n */\nconst set = (signals, k, v, _s, _v) => {\n // skip unchanged (although can be handled by last condition - we skip a few checks this way)\n return k[0] === '_' ? (signals[k] = v) :\n (v !== (_v = (_s = signals[k]).peek())) && (\n // stashed _set for value with getter/setter\n _s[_set] ? _s[_set](v) :\n // patch array\n Array.isArray(v) && Array.isArray(_v) ?\n // if we update plain array (stored in signal) - take over value instead\n // since input value can be store, we have to make sure we don't subscribe to its length or values\n // FIXME: generalize to objects\n _change in _v ?\n untracked(() => batch(() => {\n for (let i = 0; i < v.length; i++) _v[i] = v[i]\n _v.length = v.length // forces deleting tail signals\n })) :\n (_s.value = v) :\n // .x = y\n (_s.value = store(v))\n )\n}\n\n\n// make sure state contains first element of path, eg. `a` from `a.b[c]`\n// NOTE: we don't need since we force proxy sandbox\n// export const ensure = (state, expr, _name = expr.match(/^\\w+(?=\\s*(?:\\.|\\[|$))/)) => _name && (state[_signals][_name[0]] ??= null)\n\nexport default store\n", "/**\n * @fileoverview Minimal signals implementation (preact-signals compatible)\n * @module sprae/signal\n */\n\n/** @type {import('./core.js').EffectFn | null} */\nlet current\n\nlet depth = 0\n\n/** @type {Set<import('./core.js').EffectFn> | null} */\nlet batched;\n\n/**\n * Creates a reactive signal.\n * @template T\n * @param {T} v - Initial value\n * @returns {import('./core.js').Signal<T>}\n */\nexport const signal = (v, _s, _obs = new Set, _v = () => _s.value) => (\n _s = {\n get value() {\n current?.deps.add(_obs.add(current));\n return v\n },\n set value(val) {\n if (val === v) return\n v = val;\n for (let sub of _obs) batched ? batched.add(sub) : sub(); // notify effects\n },\n peek() { return v },\n toJSON: _v, toString: _v, valueOf: _v\n }\n)\n\n/**\n * Creates a reactive effect that re-runs when dependencies change.\n * @param {() => void | (() => void)} fn - Effect function, may return cleanup\n * @returns {() => void} Dispose function\n */\nexport const effect = (fn, _teardown, _fx, _deps) => (\n _fx = (prev) => {\n let tmp = _teardown;\n _teardown = null; // we null _teardown to avoid repeated call in case of recursive update\n tmp?.call?.();\n prev = current, current = _fx\n if (depth++ > 10) throw 'Cycle detected';\n try { _teardown = fn() } finally { current = prev; depth-- }\n },\n _fx.fn = fn,\n _deps = _fx.deps = new Set(),\n\n _fx(),\n (dep) => { _teardown?.call?.(); for (dep of _deps) dep.delete(_fx); _deps.clear() }\n)\n\n/**\n * Creates a computed signal derived from other signals.\n * @template T\n * @param {() => T} fn - Computation function\n * @returns {import('./core.js').Signal<T>}\n */\nexport const computed = (fn, _s = signal(), _c, _e, _v = () => _c.value) => (\n _c = {\n get value() {\n _e ||= effect(() => _s.value = fn());\n return _s.value\n },\n peek: _s.peek,\n toJSON: _v, toString: _v, valueOf: _v\n }\n)\n\n/**\n * Batches multiple signal updates into a single notification.\n * @template T\n * @param {() => T} fn - Function containing updates\n * @returns {T}\n */\nexport const batch = (fn, _first = !batched, _list) => {\n batched ??= new Set;\n try { fn(); }\n finally { if (_first) { [batched, _list] = [null, batched]; for (const fx of _list) fx(); } }\n}\n\n/**\n * Runs a function without tracking dependencies.\n * @template T\n * @param {() => T} fn - Function to run untracked\n * @returns {T}\n */\nexport const untracked = (fn, _prev, _v) => (_prev = current, current = null, _v = fn(), current = _prev, _v)\n\n", "import sprae, { throttle, _on, _off, _state, frag } from '../core.js';\n\n/**\n * Conditional directive - shows/hides element based on condition.\n * Works with :else and :else :if for branching.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @param {Object} state - State object\n * @returns {(value: any) => void} Update function\n */\nexport default (el, state) => {\n let _holder, _el, _match\n\n // new element :if\n if (!el._holder) {\n // mark el as fake-spraed to delay init, since we sprae rest when branch matches, both :if and :else :if\n el[_state] ??= null\n\n _el = el.content ? frag(el) : el\n\n el.replaceWith(_holder = document.createTextNode(''))\n _el._holder = _holder._holder = _holder\n\n\n _holder._clauses = [_el._clause = [_el, false]]\n\n _holder.update = throttle(() => {\n let match = _holder._clauses.find(([, s]) => s)\n\n if (match != _match) {\n _match?.[0].remove()\n _match?.[0][_off]?.()\n if (_match = match) {\n _holder.before(_match[0].content || _match[0])\n // there's no :else after :if, so lazy-sprae here doesn't risk adding own destructor to own list of destructors\n !_match[0][_state] ? (delete _match[0][_state], sprae(_match[0], state)) : _match[0][_on]?.()\n }\n }\n })\n }\n // :else :if needs to be spraed all over to have clean list of offable effects\n else sprae(_el = el, state)\n\n // :else may have children to init which is called after :if\n // or preact can schedule :else after :if, so we ensure order of call by next tick\n return value => {\n _el._clause[1] = value\n _el._holder.update()\n }\n}\n", "import { _on, _off, _state, frag } from '../core.js';\n\n/**\n * Else directive - conditional branch following :if.\n * Can be used as `:else` or `:else :if=\"condition\"`.\n * @param {Element | HTMLTemplateElement} el - Element with directive\n * @returns {() => void} Update function\n */\nexport default (el) => {\n let _el, _prev = el\n\n _el = el.content ? frag(el) : el\n\n // find holder\n while (_prev && !(_el._holder = _prev._holder)) _prev = _prev.previousSibling\n\n el.remove()\n el[_state] = null // mark as fake-spraed to stop further init, to lazy-sprae when branch matches\n\n _el._holder._clauses.push(_el._clause = [_el, true])\n\n return _el._holder.update\n}\n", "import { frag } from \"../core.js\"\n\n/**\n * Text directive - sets textContent reactively.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @returns {(v: any) => void} Update function\n */\nexport default el => (\n // <template :text=\"a\"/> or previously initialized template\n el.content && el.replaceWith(el = frag(el).childNodes[0]),\n v => (v = typeof v === 'function' ? v(el.textContent) : v, el.textContent = v == null ? \"\" : v)\n)\n", "import { clsx, decorate } from \"../core.js\";\n\n/**\n * Class directive - manages CSS classes reactively.\n * Supports strings, arrays, and objects (like clsx/classnames).\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Directive name with modifiers\n * @returns {(v: string | string[] | Record<string, boolean>) => void} Update function\n */\nexport default (el, st, ex, name) => {\n let _cur = new Set, _new\n\n // redefine target, if modifiers have one\n name.includes('.') && (el = decorate({target:el}, name.split('.').slice(1)).target ?? el)\n\n return (v) => {\n _new = new Set\n if (v) clsx(typeof v === 'function' ? v(el.className) : v).split(' ').map(c => c && _new.add(c))\n for (let c of _cur) if (_new.has(c)) _new.delete(c); else el.classList.remove(c);\n for (let c of _cur = _new) el.classList.add(c)\n }\n}\n", "import { attr, decorate } from \"../core.js\";\n\n/**\n * Style directive - sets inline styles reactively.\n * Accepts string or object. Preserves static styles.\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Directive name with modifiers\n * @returns {(v: string | Record<string, string> | ((style: CSSStyleDeclaration) => any)) => void} Update function\n */\nexport default (el, st, ex, name) => {\n let _static;\n\n // redefine target, if modifiers have one\n if (name.includes('.')) el = decorate({target:el}, name.split('.').slice(1)).target ?? el;\n\n return v => {\n if (!_static) { _static = el.getAttribute(\"style\") }\n v = typeof v === \"function\" ? v(el.style) : v\n if (typeof v === \"string\") attr(el, \"style\", _static + '; ' + v);\n else {\n if (_static) attr(el, \"style\", _static);\n // NOTE: we skip names not starting with a letter - eg. el.style stores properties as { 0: --x } or JSDOM has _pfx\n for (let k in v) k[0] == '-' ? el.style.setProperty(k, v[k]) : k[0] > 'A' && (el.style[k] = v[k])\n }\n }\n}\n", "/**\n * Effect directive - runs side effects.\n * Calls function result if expression evaluates to a function.\n * @returns {(fn: any) => any} Update function\n */\nexport default () => (fn) => typeof fn === 'function' && fn()\n", "import sprae, { attr, parse, _state } from \"../core.js\";\n\n/**\n * Creates a setter function for two-way binding.\n * @param {string} expr - Expression to assign to\n * @returns {(target: Object, value: any) => void} Setter function\n */\nexport const setter = (expr, _set = parse(`${expr}=__`)) => (target, value) => {\n target.__ = value; _set(target), delete target.__\n}\n\n/**\n * Value directive - two-way binding for form elements.\n * Supports text, checkbox, radio, select, and textarea.\n * @param {HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement} el - Form element\n * @param {Object} state - State object\n * @param {string} expr - Bound expression\n * @returns {(value: any) => void} Update function\n */\nexport default (el, state, expr) => {\n // bind back to value, but some values can be not bindable, eg. `:value=\"7\"`\n try {\n const set = setter(expr)\n const handleChange = el.type === 'checkbox' ? () => set(state, el.checked) :\n el.type === 'select-multiple' ? () => set(state, [...el.selectedOptions].map(o => o.value)) :\n () => set(state, el.selectedIndex < 0 ? null : isNaN(el.valueAsNumber) ? el.value : el.valueAsNumber);\n\n el.oninput = el.onchange = handleChange; // hope user doesn't redefine these manually via `.oninput = somethingElse` - it saves 5 loc vs addEventListener\n\n if (el.type?.startsWith('select')) {\n // select element also must observe any added/removed options or changed values (outside of sprae)\n new MutationObserver(handleChange).observe(el, { childList: true, subtree: true, attributes: true });\n\n // select options must be initialized before calling an update\n sprae(el, state)\n }\n\n // initial state value - setter has already cached it, so parse is fast\n parse(expr)(state) ?? handleChange()\n } catch { }\n\n return (el.type === \"text\" || el.type === \"\" || el.tagName === \"TEXTAREA\") ?\n (value, _from, _to) => (\n // we retain selection in input\n (_from = el.selectionStart),\n (_to = el.selectionEnd),\n el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)),\n _from && el.setSelectionRange(_from, _to)\n ) :\n (el.type === \"checkbox\") ?\n (value) => (el.checked = value, attr(el, \"checked\", value)) :\n (el.type === 'radio') ? (value) => (\n el.value === value && ((el.checked = value), attr(el, 'checked', value))\n ) :\n (el.type === \"select-one\") ?\n (value) => {\n for (let o of el.options)\n o.value == value ? o.setAttribute(\"selected\", '') : o.removeAttribute(\"selected\");\n el.value = value;\n } :\n (el.type === 'select-multiple') ? (value) => {\n for (let o of el.options) o.removeAttribute('selected')\n for (let v of value) el.querySelector(`[value=\"${v}\"]`).setAttribute('selected', '')\n } :\n (value) => (el.value = value);\n}\n", "import { parse } from \"../core.js\"\nimport { setter } from \"./value.js\"\n\n/**\n * Ref directive - stores element reference in state.\n * If expression is a function, calls it with element (returns dispose).\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Variable name or function expression\n * @returns {{ [Symbol.dispose]: () => void } | void} Disposal object or void\n */\nexport default (el, state, expr) => {\n let fn = parse(expr)(state)\n\n if (typeof fn == 'function') return {[Symbol.dispose]:fn(el)}\n\n // NOTE: we have to set element statically (outside of effect) to avoid parasitic sub - multiple els with same :ref can cause recursion (eg. :each :ref=\"x\")\n // Object.defineProperty(state, expr, { value: el, configurable: true })\n setter(expr)(state, el)\n}\n", "import sprae, { store, untracked, _state, _signals, signal } from '../core.js'\n\n/**\n * Scope directive - creates a child scope with local state.\n * Properties merge into a new scope inheriting from parent.\n * @param {Element} el - Target element\n * @param {Object} rootState - Parent state object\n * @returns {(values: Object | ((state: Object) => Object)) => void | boolean} Update function\n */\nexport default (el, rootState) => {\n // 0 run pre-creates state to provide scope for the first effect - it can write vars in it, so we should already have it\n // el[_state] even replaces own :scope effect state\n let state = el[_state] = store({}, rootState), init = false;\n\n // 1st run spraes subtree with values from scope, it can be postponed by modifiers (we isolate reads from parent effect)\n // 2nd+ runs update subscope\n return values => {\n values = typeof values === 'function' ? values(state) : values;\n\n // we bind to subscope to alleviate friction using scope method directly\n // also returned props should force-create signals in subscope, not overwriting parent\n if (values !== state) {\n for (let k in values) {\n // _add forces new prop, instead of checking parent\n let v = typeof values[k] === 'function' ? values[k].bind(state) : values[k]\n // update\n if (k in state[_signals]) state[k] = v\n // create\n else (state[_signals][k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n }\n }\n\n // Object.assign(subscope, call(values, subscope))\n return !init && (init = true, delete el[_state], untracked(() => sprae(el, state)))\n }\n}\n", "import sprae, { store, parse, _state, effect, _change, _signals, frag, throttle, debounce } from \"../core.js\";\n\n/**\n * Each directive - renders list items from array/object/number.\n * Syntax: `:each=\"item in items\"` or `:each=\"(item, idx) of items\"`\n * @param {HTMLTemplateElement | Element} tpl - Template element\n * @param {Object} state - State object\n * @param {string} expr - Iterator expression\n * @returns {{ eval: Function, [Symbol.dispose]: () => void }} Directive result\n */\nexport default (tpl, state, expr) => {\n const [lhs, rhs] = expr.split(/\\bin|of\\b/)\n\n let [itemVar, idxVar = \"$\"] = lhs.trim().replace(/\\(|\\)/g, '').split(/\\s*,\\s*/);\n\n // we need :if to be able to replace holder instead of tpl for :if :each case\n let holder = document.createTextNode(\"\");\n\n // we re-create items any time new items are produced\n let cur, keys, items, prevl = 0\n\n let update = throttle(() => {\n let i = 0, newItems = items, newl = newItems.length\n\n // plain array update, not store (signal with array) - updates full list\n if (cur && !cur[_change]) {\n for (let s of cur[_signals] || []) s[Symbol.dispose]()\n cur = null, prevl = 0\n }\n\n\n // delete\n if (newl < prevl) cur.length = newl\n\n // update, append, init\n else {\n // init\n if (!cur) cur = newItems\n // update\n else while (i < prevl) cur[i] = newItems[i++]\n\n // batch append using DocumentFragment for efficiency\n let batchSize = newl - i\n let batch = batchSize > 1 ? document.createDocumentFragment() : null\n let pending = batch ? [] : null\n\n // append\n for (; i < newl; i++) {\n cur[i] = newItems[i]\n\n let idx = i\n let el = tpl.content ? frag(tpl) : tpl.cloneNode(true);\n // el.content is DocumentFragment for frag() output, el itself for cloneNode\n let insertNode = el.content || el\n\n // collect for batch insert\n if (batch) {\n batch.appendChild(insertNode)\n pending.push([ el, idx ])\n } else {\n holder.before(insertNode)\n let subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n sprae(el, subscope)\n }\n\n // signal/holder disposal removes element\n let _prev = ((cur[_signals] ||= [])[i] ||= {})[Symbol.dispose]\n cur[_signals][i][Symbol.dispose] = () => {\n _prev?.(), el[Symbol.dispose]?.(), el.remove()\n };\n }\n\n // batch insert all at once, then sprae\n if (batch) {\n holder.before(batch)\n for (let [el, idx] of pending) {\n let subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n sprae(el, subscope)\n }\n }\n }\n\n prevl = newl\n })\n\n tpl.replaceWith(holder);\n tpl[_state] = null // mark as fake-spraed, to preserve :-attribs for template\n\n return Object.assign(value => {\n // resolve new items\n keys = null\n if (typeof value === \"number\") items = Array.from({ length: value }, (_, i) => i + 1)\n else if (value?.constructor === Object) keys = Object.keys(value), items = Object.values(value)\n else items = value || []\n\n // whenever list changes, we rebind internal change effect\n return effect(() => {\n // subscribe to items change (.length) - we do it every time (not just in update) since preact signals unsubscribes unused signals\n items[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n update()\n })\n }, {eval:parse(rhs)})\n}\n", "import { attr } from \"../core.js\";\n\n/**\n * Default attribute directive - sets any attribute value.\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Attribute name\n * @returns {(v: any) => void} Update function\n */\nexport default (el, st, ex, name) => v => attr(el, name, typeof v === 'function' ? v(el.getAttribute(name)) : v)\n", "import { attr, dashcase } from \"../core.js\";\n\n/**\n * Spread directive - sets multiple attributes from object.\n * Keys are converted from camelCase to kebab-case.\n * @param {Element} target - Target element\n * @returns {(value: Record<string, any>) => void} Update function\n */\nexport default (target) => value => { for (let key in value) attr(target, dashcase(key), value[key]) }\n", "import { parse, decorate } from \"../core.js\"\n\n/**\n * Event directive - attaches event listeners with modifiers.\n * Syntax: `:onclick=\"handler\"` or `:onclick.prevent.stop=\"handler\"`\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Handler expression\n * @param {string} name - Event name with modifiers (e.g., 'onclick.prevent')\n * @returns {{ [Symbol.dispose]: () => void }} Disposal object\n */\nexport default (el, state, expr, name) => {\n // wrap inline cb into function\n // if (!/^(?:[\\w$]+|\\([^()]*\\))\\s*=>/.test(expr) && !/^function\\b/.test(expr)) expr = `()=>{${expr}}`;\n\n const [type, ...mods] = name.slice(2).split('.'),\n evaluate = parse(expr).bind(el),\n trigger = decorate(Object.assign(e => evaluate(state, (fn) => typeof fn === 'function' ? fn(e) : fn), { target: el }), mods);\n\n trigger.target.addEventListener(type, trigger, trigger)\n return {\n [Symbol.dispose]() {\n trigger.target.removeEventListener(type, trigger)\n }\n }\n}\n", "import { _dispose, parse, decorate } from \"../core.js\"\n\n/**\n * Sequence directive - chains event handlers.\n * Syntax: `:onclick..keyup.enter=\"handler\"` - click triggers, then waits for Enter.\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Handler expression\n * @param {string} names - Chained event names separated by `..`\n * @returns {{ [Symbol.dispose]: () => void }} Disposal object\n */\nexport default (el, state, expr, names) => {\n let cur, // current step callback\n off // current step disposal\n\n let steps = names.split('..').map((step, i, { length }) => step.split(':').reduce(\n (prev, str) => {\n const [name, ...mods] = str.slice(2).split('.')\n\n const evaluate = parse(expr).bind(el)\n\n const next = (fn, e) => cur = typeof fn === 'function' ? fn(e) : fn\n const trigger = decorate(Object.assign(\n e => (!i ? evaluate(state, (fn) => next(fn, e)) : next(cur, e), off(), off = steps[(i + 1) % length]()),\n { target: el }\n ), mods)\n\n\n return (_poff) => (\n _poff = prev?.(),\n trigger.target.addEventListener(name, trigger, trigger),\n () => (_poff?.(), trigger.target.removeEventListener(name, trigger))\n )\n }, null)\n )\n\n off = steps[0]()\n\n return {\n [Symbol.dispose]() {\n off?.()\n }\n }\n}\n", "import sprae, { _dispose } from \"../core.js\"\n\n/**\n * HTML directive - sets innerHTML and initializes nested directives.\n * Supports templates for fragment insertion.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @param {Object} state - State object\n * @returns {(v: string | ((html: string) => string)) => void | (() => void)} Update function\n */\nexport default (el, state) => {\n // <template :html=\"a\"/> - fragment case: use placeholder + range\n if (el.content) {\n let start = document.createTextNode(''),\n end = document.createTextNode(''),\n range = document.createRange()\n el.replaceWith(start, end)\n return v => {\n v = typeof v === 'function' ? v('') : v\n range.setStartAfter(start)\n range.setEndBefore(end)\n range.deleteContents()\n if (v != null && v !== '') {\n let frag = range.createContextualFragment(v)\n sprae(frag, state)\n range.insertNode(frag)\n }\n }\n }\n return v => (v = typeof v === 'function' ? v(el.innerHTML) : v, el.innerHTML = v == null ? \"\" : v, sprae(el, state), el[_dispose])\n}\n", "/**\n * Portal directive - teleports element to another container.\n * Value can be selector string, element, or falsy to return home.\n * @param {Element} el - Element to teleport\n * @param {Object} state - State object\n * @param {string} expr - Expression\n * @returns {(value: string | Element | null | false) => void} Update function\n */\nexport default (el, state, expr) => {\n const comment = document.createComment(':portal')\n let currentTarget = null\n\n // Insert placeholder before element\n el.before(comment)\n\n return (value) => {\n // Resolve target: selector string, element, or null/false to return home\n // For selectors, first try within the same root, then document\n const root = el.getRootNode()\n const target = typeof value === 'string'\n ? (root.querySelector?.(value) || document.querySelector(value))\n : value instanceof Element ? value\n : value ? document.body : null\n\n // No change needed\n if (target === currentTarget) return\n\n if (target) {\n // Move to target\n target.appendChild(el)\n } else {\n // Return home (after placeholder)\n comment.after(el)\n }\n\n currentTarget = target\n }\n}\n", "/**\n * Hidden directive - toggles the hidden attribute.\n * @param {Element} el - Target element\n * @returns {(value: any) => boolean} Update function\n */\nexport default (el) => (value) => el.hidden = !!value\n", "/**\n * @fileoverview Sprae - lightweight reactive HTML templating library\n * @module sprae\n */\n\nimport store from \"./store.js\";\nimport { batch, computed, effect, signal, untracked } from './core.js';\nimport * as signals from './signal.js';\nimport sprae, { use, decorate, directive, modifier, parse, throttle, debounce, _off, _state, _on, _dispose, _add } from './core.js';\n\nimport _if from \"./directive/if.js\";\nimport _else from \"./directive/else.js\";\nimport _text from \"./directive/text.js\";\nimport _class from \"./directive/class.js\";\nimport _style from \"./directive/style.js\";\nimport _fx from \"./directive/fx.js\";\nimport _value from \"./directive/value.js\";\nimport _ref from \"./directive/ref.js\";\nimport _scope from \"./directive/scope.js\";\nimport _each from \"./directive/each.js\";\nimport _default from \"./directive/_.js\";\nimport _spread from \"./directive/spread.js\";\nimport _event from \"./directive/event.js\";\nimport _seq from \"./directive/sequence.js\";\nimport _html from \"./directive/html.js\";\nimport _portal from \"./directive/portal.js\";\nimport _hidden from \"./directive/hidden.js\";\n\n\nObject.assign(directive, {\n _: (el, state, expr, name) => (name.startsWith('on') ? _event : _default)(el, state, expr, name),\n '': _spread,\n class: _class,\n text: _text,\n html: _html,\n style: _style,\n fx: _fx,\n value: _value,\n ref: _ref,\n scope: _scope,\n if: _if,\n else: _else,\n each: _each,\n portal: _portal,\n hidden: _hidden\n})\n\n\n/**\n * Directive initializer with modifiers support.\n * @param {Element} target - Target element\n * @param {string} name - Directive name with modifiers (e.g., 'onclick.throttle-500')\n * @param {string} expr - Expression string\n * @param {Object} state - Reactive state object\n * @returns {() => (() => void) | void} Initializer function that returns a disposer\n */\nconst dir = (target, name, expr, state) => {\n let [dirName, ...mods] = name.split('.'), create = directive[dirName] || directive._\n\n return () => {\n let update = create(target, state, expr, name)\n\n if (!update?.call) return update?.[_dispose]\n\n // throttle prevents multiple updates within one tick as well as isolates stack for each update\n let trigger = decorate(Object.assign(throttle(() => change.value++), { target }), mods),\n change = signal(0), // signal authorized to trigger effect: 0 = init; >0 = trigger\n count = 0, // called effect count\n evaluate = update.eval ?? parse(expr).bind(target),\n _out, out = () => (typeof _out === 'function' && _out(), _out=null) // effect trigger and invoke may happen in the same tick, so it will be effect-within-effect call - we need to store output of evaluate to return from trigger effect\n\n state = target[_state] ?? state\n\n return effect(() => (\n // if planned count is same as actual count - plan new update, else update right away\n change.value == count ? (trigger()) : (count = change.value, _out = evaluate(state, update)),\n out\n ))\n }\n}\n\n// Parses time string to ms: 100, 100ms, 1s, 1m\nconst parseTime = (t) => !t ? 0 : typeof t === 'number' ? t :\n (([, n, u] = t.match(/^(\\d+)(ms|s|m)?$/) || []) => (n = +n, u === 's' ? n * 1000 : u === 'm' ? n * 60000 : n))()\n\n// Creates scheduler from time/keyword (idle, raf, tick, or ms)\nconst scheduler = (t) =>\n t === 'idle' ? requestIdleCallback :\n t === 'raf' ? requestAnimationFrame :\n !t || t === 'tick' ? queueMicrotask :\n (fn) => setTimeout(fn, parseTime(t))\n\n// Built-in modifiers for timing, targeting, and event handling\nObject.assign(modifier, {\n /**\n * Delays callback by interval since last call (trailing edge).\n * Supports: tick (default), raf, idle, N, Nms, Ns, Nm. Add -immediate for leading edge.\n * Examples: .debounce, .debounce-100, .debounce-1s, .debounce-raf, .debounce-idle, .debounce-100-immediate\n */\n debounce: (fn, a, b) => debounce(fn, scheduler(a === 'immediate' ? b : a), a === 'immediate' || b === 'immediate'),\n /**\n * Limits callback rate to interval (leading + trailing edges).\n * Supports: tick (default), raf, idle, N, Nms, Ns, Nm.\n * Examples: .throttle, .throttle-100, .throttle-1s, .throttle-raf, .throttle-idle\n */\n throttle: (fn, a) => throttle(fn, scheduler(a)),\n /** Runs callback after delay. Supports: tick (default), raf, idle, N, Nms, Ns, Nm. */\n delay: (fn, a) => ((sched = scheduler(a)) => (e) => sched(() => fn(e)))(),\n\n /** Calls handler only once. */\n once: (fn, _done, _fn) => (_fn = (e) => !_done && (_done = 1, fn(e)), _fn.once = true, _fn),\n\n /** Attaches event listener to window. */\n window: fn => (fn.target = fn.target.ownerDocument.defaultView, fn),\n /** Attaches event listener to document. */\n document: fn => (fn.target = fn.target.ownerDocument, fn),\n /** Attaches event listener to document root element (<html>). */\n root: fn => (fn.target = fn.target.ownerDocument.documentElement, fn),\n /** Attaches event listener to body. */\n body: fn => (fn.target = fn.target.ownerDocument.body, fn),\n /** Attaches event listener to parent element. */\n parent: fn => (fn.target = fn.target.parentNode, fn),\n /** Triggers only when event target is the element itself. */\n self: (fn) => (e) => (e.target === fn.target && fn(e)),\n /** Triggers when click is outside the element. */\n away: (fn) => Object.assign((e) => (!fn.target.contains(e.target) && e.target.isConnected && fn(e)), {target: fn.target.ownerDocument}),\n\n /** Calls preventDefault() before handler. */\n prevent: (fn) => (e) => (e?.preventDefault(), fn(e)),\n /** Calls stopPropagation() or stopImmediatePropagation() (with -immediate). */\n stop: (fn, _how) => (e) => (_how?.[0] === 'i' ? e?.stopImmediatePropagation() : e?.stopPropagation(), fn(e)),\n /** Sets passive option for event listener. */\n passive: fn => (fn.passive = true, fn),\n /** Sets capture option for event listener. */\n capture: fn => (fn.capture = true, fn),\n})\n/** Alias for .away modifier */\nmodifier.outside = modifier.away\n\n/**\n * Key testers for keyboard event modifiers.\n * @type {Record<string, (e: KeyboardEvent) => boolean>}\n */\nconst keys = {\n ctrl: e => e.ctrlKey || e.key === \"Control\" || e.key === \"Ctrl\",\n shift: e => e.shiftKey || e.key === \"Shift\",\n alt: e => e.altKey || e.key === \"Alt\",\n meta: e => e.metaKey || e.key === \"Meta\",\n cmd: e => e.metaKey || e.key === \"Command\",\n arrow: e => e.key.startsWith(\"Arrow\"),\n enter: e => e.key === \"Enter\",\n esc: e => e.key.startsWith(\"Esc\"),\n tab: e => e.key === \"Tab\",\n space: e => e.key === \"\u00A0\" || e.key === \"Space\" || e.key === \" \",\n delete: e => e.key === \"Delete\" || e.key === \"Backspace\",\n digit: e => /^\\d$/.test(e.key),\n letter: e => /^\\p{L}$/gu.test(e.key),\n char: e => /^\\S$/.test(e.key),\n};\n\n// match key by name, or by e.key (case-insensitive), or by keyCode (digits)\nconst keyMatch = (k, e) => keys[k]?.(e) || e.key.toLowerCase() === k || e.keyCode == k\n\n// Augment modifiers with key testers (e.g., .enter, .ctrl, .ctrl-a, .ctrl-65)\nfor (let k in keys) modifier[k] = (fn, a, b) => (e) => keys[k](e) && (!a || keyMatch(a, e)) && (!b || keyMatch(b, e)) && fn(e)\n\n\n// Checks for first-level semicolons (statement vs expression)\nconst hasSemi = s => {\n for (let d=0,i=0;i<s.length;i++) {\n if (s[i]=='{') d++\n else if (s[i]=='}') d--\n else if (s[i]==';' && !d) return true\n }\n return false\n}\n\n// Configure sprae with default compiler and signals\nuse({\n\n// Default compiler wraps expression for new Function\n compile: expr => {\n // if, const, let - no return\n if (/^(if|let|const)\\b/.test(expr));\n // first-level semicolons - no return\n else if (hasSemi(expr));\n else expr = `return ${expr}`\n // async expression\n if (/\\bawait\\s/.test(expr)) expr = `return (async()=>{${expr}})()`\n return sprae.constructor(`with(arguments[0]){${expr}}`)\n },\n dir: (el, name, expr, state) => {\n // sequences shortcut\n if (name.includes('..')) return () => _seq(el, state, expr, name)[_dispose]\n return name.split(':').reduce((prev, str) => {\n let start = dir(el, str, expr, state)\n return !prev ? start : (p, s) => (p = prev(), s = start(), () => { p(); s() })\n }, null)\n },\n ...signals\n})\n\n\n// Expose for runtime configuration\nsprae.use = use\nsprae.store = store\nsprae.directive = directive\nsprae.modifier = modifier\n\n/**\n * Disposes a spraed element, cleaning up all effects and state.\n * @param {Element} el - Element to dispose\n */\nsprae.dispose = (el) => el[_dispose]?.()\n\n\n/**\n * Auto-initializes sprae on dynamically added elements.\n * Uses MutationObserver to detect new DOM nodes and apply directives.\n *\n * @param {Element} [root=document.body] - Root element to observe\n * @param {Object} [values] - Initial state values\n * @returns {Object} The reactive state object\n *\n * @example\n * ```js\n * // Auto-init on page load\n * sprae.start(document.body, { count: 0 })\n * ```\n */\nconst start = sprae.start = (root = document.body, values) => {\n const state = store(values)\n sprae(root, state);\n const mo = new MutationObserver(mutations => {\n for (const m of mutations) {\n for (const el of m.addedNodes) {\n // el can be spraed or removed by subsprae (like within :each/:if)\n if (el.nodeType === 1 && el[_state] === undefined && root.contains(el)) {\n // even if element has no spraeable attrs, some of its children can have\n root[_add](el)\n }\n }\n for (const el of m.removedNodes) el.nodeType === 1 && el[_dispose]?.()\n }\n });\n mo.observe(root, { childList: true, subtree: true });\n return state\n}\n\n\n/** Package version (injected by bundler) */\nsprae.version = \"12.4.1\"\n\nconst dispose = sprae.dispose\n\nexport default sprae\nexport { sprae, store, signal, effect, computed, batch, untracked, start, use, throttle, debounce, dispose }\n"],
|
|
5
|
+
"mappings": "6FAGO,IAAMA,EAAY,OAAO,UAAP,OAAO,QAAY,OAAO,SAAS,GAG/CC,EAAS,OAAO,OAAO,EAGvBC,EAAM,OAAO,IAAI,EAGjBC,EAAO,OAAO,KAAK,EAGnBC,EAAO,OAAO,MAAM,EAGtBC,EAAS,IAyBTC,EAMAC,EAOAC,EAOAC,EAASC,GAAOA,EAAG,EAOnBC,EAAYF,EAMZG,EAAY,CAAC,EAMbC,EAAW,CAAC,EAEnBC,EAAa,KACbC,EAAY,KAOVC,GAAUC,GAAO,CACrB,GAAI,CAACA,GAAI,QAAS,MAAO,GACzB,IAAIC,EAAOD,EAAG,QAAQ,YAAY,EAClC,OAAIA,EAAG,GAAIC,GAAQ,IAAMD,EAAG,GACnBA,EAAG,YAAWC,GAAQ,IAAMD,EAAG,UAAU,MAAM,GAAG,EAAE,CAAC,GACvD,IAAIC,CAAI,GACjB,EAOMC,EAAM,CAAC,EAAGC,IAAS,CACvB,IAAIC,EAAM,UAAK,CAAC,GAEhB,GADIN,IAAWM,GAAO;AAAA,OAAUL,GAAOD,CAAS,CAAC,IAC7CD,GAAcM,EAAM,CAEtB,IAAME,EAAUF,EAAK,OAAS,IAAMA,EAAK,MAAM,EAAG,EAAE,EAAI,WAAMA,EAAK,MAAM,UAAYA,EACrFC,GAAO;AAAA,IAAOP,CAAU,KAAKQ,CAAO,GACtC,CACA,QAAQ,MAAMD,CAAG,CACnB,EA8BME,GAAQ,CAACN,EAAK,SAAS,KAAMO,IAAU,CAE3C,GAAIP,EAAGhB,CAAM,EAAG,OAAO,OAAO,OAAOgB,EAAGhB,CAAM,EAAGuB,CAAK,EAKtDA,EAAQC,EAAMD,GAAS,CAAC,CAAC,EAEzB,IAAIE,EAAK,CAAC,EAAGC,EAAO,CAAC,EAKrBV,EAAGf,CAAG,EAAI,IAAO,CAACyB,IAASA,EAAOD,EAAG,IAAIhB,GAAMA,EAAG,CAAC,GACnDO,EAAGd,CAAI,EAAI,KAAOwB,GAAM,IAAIC,GAAOA,EAAI,CAAC,EAAGD,EAAO,MAGlDV,EAAAjB,KAAAiB,EAAAjB,GAAiB,KAAOiB,EAAGd,CAAI,EAAE,EAAGc,EAAGd,CAAI,EAAIc,EAAGf,CAAG,EAAIe,EAAGjB,CAAQ,EAAIiB,EAAGb,CAAI,EAAIa,EAAGhB,CAAM,EAAI,OAEhG,IAAM4B,EAAMZ,EAAGb,CAAI,EAAKa,GAAO,CAC7B,IAAIa,EAASb,EAAG,WAAYc,EAG5B,GAAID,EAAQ,QAASE,EAAI,EAAGA,EAAIF,EAAO,QAAS,CAC9C,GAAI,CAAE,KAAAG,EAAM,MAAAC,CAAM,EAAIJ,EAAOE,CAAC,EAE9B,GAAIC,EAAK,WAAW5B,CAAM,GAUxB,GATAY,EAAG,gBAAgBgB,CAAI,EAEvBnB,EAAamB,EACblB,EAAYE,EAGZS,EAAG,KAAKK,EAAQI,GAAIlB,EAAIgB,EAAK,MAAM5B,EAAO,MAAM,EAAG6B,EAAOV,CAAK,CAAC,EAAGG,EAAK,KAAKI,EAAM,CAAC,EAGhF9B,KAAUgB,EAAI,YACbe,GACT,CAIA,GAAIf,EAAG,aAAe,OAAW,CAC/B,IAAImB,EAAQnB,EAAG,WAAYoB,EAC3B,KAAOD,GAAQC,EAAOD,EAAM,YAAaA,EAAM,UAAY,GAAKP,EAAIO,CAAK,EAAGA,EAAQC,CACtF,KACK,SAASD,KAASnB,EAAG,WAAYmB,EAAM,UAAY,GAAKP,EAAIO,CAAK,CACxE,EAEA,OAAAP,EAAIZ,CAAE,EAGFA,EAAGhB,CAAM,IAAM,SAAWgB,EAAGhB,CAAM,EAAIuB,GAIpCA,CACT,EAIWW,GAMAG,GAQEC,EAASnB,GAAS,CAC7B,IAAIV,EAAM8B,GAAMpB,EAAKA,EAAK,KAAK,CAAC,EAChC,GAAIV,EAAI,OAAOA,EAGf,GAAI,CACFA,EAAK4B,GAAQlB,GAAQ,WAAW,CAElC,OAASqB,EAAG,CAAEtB,EAAIsB,EAAGrB,CAAI,CAAE,CAG3B,OAAOoB,GAAMpB,CAAI,EAAI,SAAUI,EAAOkB,EAAIC,EAAM,CAC9C,GAAI,CACF,IAAIC,EAASlC,GAAI,KAAK,KAAMc,CAAK,EAEjC,OAAIkB,EAAWE,GAAQ,MAClBA,EAAO,KAAKC,GAAKF,EAAOD,EAAGG,CAAC,CAAC,EAAE,MAAMJ,GAAKtB,EAAIsB,EAAGrB,CAAI,CAAC,EAAG,IAAM,OAAOuB,GAAS,YAAcA,EAAK,GACnGD,EAAGE,CAAM,EACDA,CACd,OAASH,EAAG,CACVtB,EAAIsB,EAAGrB,CAAI,CACb,CACF,CACF,EACMoB,GAAQ,CAAC,EAoBFM,EAAOC,IAClBA,EAAO,UAAYT,GAAUS,EAAO,SACpCA,EAAO,SAAW1C,EAAS0C,EAAO,QAClCA,EAAO,SAAWzC,EAASyC,EAAO,QAClCA,EAAO,SAAWxC,EAASwC,EAAO,QAClCA,EAAO,WAAavC,EAAWuC,EAAO,UACtCA,EAAO,QAAUtC,EAAQsC,EAAO,OAChCA,EAAO,YAAcpC,EAAYoC,EAAO,WACxCA,EAAO,MAAQZ,GAAMY,EAAO,MASjBC,EAAW,CAACtC,EAAIuC,IAAS,CACpC,KAAOA,EAAK,QAAQ,CAClB,GAAI,CAAChB,EAAM,GAAGiB,CAAM,EAAID,EAAK,IAAI,EAAE,MAAM,GAAG,EAAGE,EAAMtC,EAASoB,CAAI,EAAGmB,EACrE,GAAID,IACGC,EAASD,EAAIzC,EAAI,GAAGwC,CAAM,KAAOxC,EAAI,CACxC,QAAS2C,KAAK3C,EAAI0C,EAAAC,KAAAD,EAAAC,GAAc3C,EAAG2C,CAAC,GACpC3C,EAAK0C,CACP,CAEJ,CACA,OAAO1C,CACT,EAiBa4C,EAAQC,GAAQ,CAC3B,GAAI,CAACA,EAAI,SAAU,OAAOA,EAE1B,IAAIC,EAAUD,EAAI,QAAQ,UAAU,EAAI,EACtCE,EAAa,CAAC,GAAGF,EAAI,UAAU,EAC/BG,EAAM,SAAS,eAAe,EAAE,EAEhCC,GAAcH,EAAQ,OAAOE,CAAG,EAAG,CAAC,GAAGF,EAAQ,UAAU,GAE3D,MAAO,CACL,WAAAG,EACA,QAAAH,EACA,OAAQ,IAAMA,EAAQ,OAAO,GAAGG,CAAU,EAC1C,YAAY1C,EAAI,CACVA,IAAOyC,IACXA,EAAI,OAAOzC,CAAE,EACbuC,EAAQ,OAAO,GAAGG,CAAU,EAC9B,EACA,WAAAF,EACA,gBAAgBxB,EAAM,CAAEwB,EAAW,OAAOA,EAAW,UAAUG,GAAKA,EAAE,OAAS3B,CAAI,EAAG,CAAC,CAAE,CAC3F,CACF,EAOa4B,GAAYC,GAAQA,EAAI,QAAQ,mCAAoC,CAACC,EAAO/B,KAAOA,EAAI,IAAM,IAAM+B,EAAM,YAAY,CAAC,EAStHC,EAAO,CAAC/C,EAAIgB,EAAMY,IAAOA,GAAK,MAAQA,IAAM,GAAS5B,EAAG,gBAAgBgB,CAAI,EAAIhB,EAAG,aAAagB,EAAMY,IAAM,GAAO,GAAKA,CAAC,EAOzHoB,EAAO,CAACC,EAAGvB,EAAO,CAAC,IAAOuB,EAAS,OAAOA,GAAM,SAAWA,GACtE,MAAM,QAAQA,CAAC,EAAIA,EAAE,IAAID,CAAI,EAC3B,OAAO,QAAQC,CAAC,EAAE,OAAO,CAACC,EAAG,CAACd,EAAGR,CAAC,IAAOA,EAAQ,CAAC,GAAGsB,EAAGd,CAAC,EAAZc,EAAe,CAAC,CAAC,GAChE,KAAK,GAAG,EAHiC,GAa9BC,EAAW,CAAC1D,EAAI2D,IAAO,CAClC,IAAIC,EAAW,EAAGC,EAAKC,EAAW,OAAOH,GAAO,WAAaA,EAAKA,EAAM3D,GAAO,WAAWA,EAAI2D,CAAE,EAAI,eAC9FI,EAAahC,GAAM,CACvB8B,EAAM9B,EACD6B,MAAY5D,EAAG6D,CAAG,EAAGC,EAAS,CAACE,EAASJ,EAAW,KACtDA,EAAW,EAAGI,GAAUD,EAAUF,CAAG,EACtC,EACH,EACA,OAAOE,CACT,EAUaE,GAAW,CAACjE,EAAI2D,EAAIO,IAAc,CAC7C,IAAIJ,EAAW,OAAOH,GAAO,WAAaA,EAAKA,EAAM3D,GAAO,WAAWA,EAAI2D,CAAE,EAAI,eACjF,OAAOO,GACDC,GAAcN,GAAQ,CAACM,IAAanE,EAAG6D,CAAG,EAAGM,EAAW,EAAGL,EAAS,IAAMK,EAAW,CAAC,IAAI,GAC3F,CAACC,EAAS,IAAM,CAACP,EAAKQ,EAAK,EAAED,IAAWN,EAAS,IAAMO,GAAMD,GAAUpE,EAAG6D,CAAG,CAAC,GAAG,CACxF,EASOS,EAAQzD,GCvYR,IAAM0D,EAAW,OAAO,SAAS,EAG3BC,EAAU,OAAO,QAAQ,EAGzBC,GAAO,OAAO,KAAK,EAG5BC,GAAU,GAuBDC,EAAQ,CAACC,EAAQC,IAAW,CAQvC,GAPI,CAACD,GAIDA,EAAO,OAAO,WAAW,GAGzBA,EAAOL,CAAQ,EAAG,OAAOK,EAG7B,GAAIA,EAAO,cAAgB,OAAQ,OAAO,MAAM,QAAQA,CAAM,EAAIE,GAAKF,CAAM,EAAIA,EAGjF,IAAIG,EAAW,OAAO,KAAKH,CAAM,EAAE,OACjCI,EAAU,CAAC,EAGTC,EAAQ,IAAI,MAAM,OAAO,OAAOD,EAAS,CAC3C,CAACR,CAAO,EAAGU,EAAOH,CAAQ,EAC1B,CAACR,CAAQ,EAAGS,CACd,CAAC,EAAG,CACF,IAAK,CAACG,EAAGC,IACHA,KAAKJ,EAAiBA,EAAQI,CAAC,EAAIJ,EAAQI,CAAC,EAAE,QAAQ,EAAIJ,EAAQI,CAAC,EAChEP,EAASA,EAAOO,CAAC,EAAK,OAAO,WAAWA,CAAC,GAAM,YAAc,CAAC,WAAWA,CAAC,EAAE,UAAY,WAAWA,CAAC,EAAE,KAAK,UAAU,EAAI,WAAWA,CAAC,EAG9I,IAAK,CAACD,EAAGC,EAAGC,IAEND,KAAKJ,GAAgBM,GAAIN,EAASI,EAAGC,CAAC,EAAG,IAG7CX,GAAU,GAING,GAAUO,KAAKP,EACjBA,EAAOO,CAAC,EAAIC,GAIZE,EAAOP,EAASI,EAAGC,CAAC,EACpBL,EAAQR,CAAO,EAAE,MAAQ,EAAEO,GAG7BL,GAAU,GAIH,GAIT,eAAgB,CAACS,EAAGC,KAClBA,KAAKJ,IAAYI,EAAE,CAAC,GAAK,KAAOJ,EAAQI,CAAC,IAAI,OAAO,OAAO,IAAI,EAAG,OAAOJ,EAAQI,CAAC,EAAGJ,EAAQR,CAAO,EAAE,MAAQ,EAAEO,GACzG,GAIT,QAAS,KAAOC,EAAQR,CAAO,EAAE,MAAO,QAAQ,QAAQQ,CAAO,GAG/D,IAAK,CAACG,EAAGC,IACHA,KAAKJ,EAAgB,GACrBH,EAAeO,KAAKP,EACjBH,EAEX,CAAC,EAGKc,EAAQ,OAAO,0BAA0BZ,CAAM,EAErD,QAASQ,KAAKR,EAERY,EAAMJ,CAAC,GAAG,KAEXJ,EAAQI,CAAC,EAAIK,EAASD,EAAMJ,CAAC,EAAE,IAAI,KAAKH,CAAK,CAAC,GAAGR,EAAI,EAAIe,EAAMJ,CAAC,EAAE,KAAK,KAAKH,CAAK,EAG/EM,EAAOP,EAASI,EAAGR,EAAOQ,CAAC,CAAC,EAGnC,OAAOH,CACT,EASMH,GAAO,CAACF,EAAQC,EAAS,aAAe,CAG5C,IAAIG,EAAU,MAAMJ,EAAO,MAAM,EAAE,KAAK,IAAI,EAG1Cc,EAAQ,GAGRC,EAAMC,GAAM,UAAY,CAAE,OAAAF,EAAQ,GAAaE,EAAG,MAAM,KAAM,SAAS,CAAG,EAE1EC,EAASX,EAAON,EAAO,MAAM,EAG7BK,EAAQ,IAAI,MACV,OAAO,OAAOD,EAAS,CACrB,CAACR,CAAO,EAAGqB,EACX,CAACtB,CAAQ,EAAGS,EAEZ,KAAMW,EAAIX,EAAQ,IAAI,EACtB,IAAKW,EAAIX,EAAQ,GAAG,EACpB,MAAOW,EAAIX,EAAQ,KAAK,EACxB,QAASW,EAAIX,EAAQ,OAAO,EAC5B,OAAQW,EAAIX,EAAQ,MAAM,CAC5B,CAAC,EACD,CACE,IAAIG,EAAGC,EAAG,CAKR,OAAIA,IAAM,SAAiBM,GAASA,EAAQ,GAAOV,EAAQ,QAAUa,EAAO,MAGxE,OAAOT,GAAM,UAAY,MAAMA,CAAC,EAAUJ,EAAQI,CAAC,GAAG,QAAQ,GAAKP,EAAOO,CAAC,GAIvEJ,EAAAI,KAAAJ,EAAAI,GAAeF,EAAOP,EAAMC,EAAOQ,CAAC,CAAC,CAAC,IAAG,QAAQ,CAC3D,EAEA,IAAID,EAAGC,EAAGC,EAAG,CAIX,GAAID,IAAM,SAAU,CAElB,QAASU,EAAIT,EAAGS,EAAId,EAAQ,OAAQc,IAAK,OAAOb,EAAMa,CAAC,EAEvDD,EAAO,MAAQb,EAAQ,OAASK,CAClC,MAGSD,GAAKJ,EAAQ,QAAQO,EAAOP,EAASI,EAAGC,CAAC,EAAGJ,EAAM,OAAS,CAACG,EAAI,GAGpEJ,EAAQI,CAAC,EAAIE,GAAIN,EAASI,EAAGC,CAAC,EAAIE,EAAOP,EAASI,EAAGC,CAAC,EAE3D,MAAO,EACT,EAGA,eAAgB,CAACF,EAAGC,KAAOJ,EAAQI,CAAC,IAAI,OAAO,OAAO,IAAI,EAAG,OAAOJ,EAAQI,CAAC,EAAG,EAClF,CAAC,EAEL,OAAOH,CACT,EASMM,EAAS,CAACP,EAASI,EAAGC,IAAOL,EAAQI,CAAC,EAAKA,EAAE,CAAC,GAAK,KAAOC,GAAG,KAAQA,EAAIH,EAAOP,EAAMU,CAAC,CAAC,EAQxFC,GAAM,CAACN,EAASI,EAAGC,EAAGU,EAAIC,IAEvBZ,EAAE,CAAC,IAAM,IAAOJ,EAAQI,CAAC,EAAIC,EACjCA,KAAOW,GAAMD,EAAKf,EAAQI,CAAC,GAAG,KAAK,KAElCW,EAAGtB,EAAI,EAAIsB,EAAGtB,EAAI,EAAEY,CAAC,EAEnB,MAAM,QAAQA,CAAC,GAAK,MAAM,QAAQW,CAAE,EAIlCxB,KAAWwB,EACTC,EAAU,IAAMC,EAAM,IAAM,CAC1B,QAASJ,EAAI,EAAGA,EAAIT,EAAE,OAAQS,IAAKE,EAAGF,CAAC,EAAIT,EAAES,CAAC,EAC9CE,EAAG,OAASX,EAAE,MAChB,CAAC,CAAC,EACDU,EAAG,MAAQV,EAEbU,EAAG,MAAQpB,EAAMU,CAAC,GAStBc,EAAQxB,EClPf,IAAAyB,GAAA,GAAAC,GAAAD,GAAA,WAAAE,GAAA,aAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,cAAAC,KAMA,IAAIC,EAEAC,GAAQ,EAGRC,EAQSJ,GAAS,CAACK,EAAGC,EAAIC,EAAO,IAAI,IAAKC,EAAK,IAAMF,EAAG,QAC1DA,EAAK,CACH,IAAI,OAAQ,CACV,OAAAJ,GAAS,KAAK,IAAIK,EAAK,IAAIL,CAAO,CAAC,EAC5BG,CACT,EACA,IAAI,MAAMI,EAAK,CACb,GAAIA,IAAQJ,EACZ,CAAAA,EAAII,EACJ,QAASC,KAAOH,EAAMH,EAAUA,EAAQ,IAAIM,CAAG,EAAIA,EAAI,EACzD,EACA,MAAO,CAAE,OAAOL,CAAE,EAClB,OAAQG,EAAI,SAAUA,EAAI,QAASA,CACrC,EAQWT,GAAS,CAACY,EAAIC,EAAWC,EAAKC,KACzCD,EAAOE,GAAS,CACd,IAAIC,EAAMJ,EAIV,GAHAA,EAAY,KACZI,GAAK,OAAO,EACZD,EAAOb,EAASA,EAAUW,EACtBV,KAAU,GAAI,KAAM,iBACxB,GAAI,CAAES,EAAYD,EAAG,CAAE,QAAE,CAAUT,EAAUa,EAAMZ,IAAQ,CAC7D,EACAU,EAAI,GAAKF,EACTG,EAAQD,EAAI,KAAO,IAAI,IAEvBA,EAAI,EACHI,GAAQ,CAAEL,GAAW,OAAO,EAAG,IAAKK,KAAOH,EAAOG,EAAI,OAAOJ,CAAG,EAAGC,EAAM,MAAM,CAAE,GASvEhB,GAAW,CAACa,EAAIL,EAAKN,GAAO,EAAGkB,EAAIC,EAAIX,EAAK,IAAMU,EAAG,QAChEA,EAAK,CACH,IAAI,OAAQ,CACV,OAAAC,MAAOpB,GAAO,IAAMO,EAAG,MAAQK,EAAG,CAAC,GAC5BL,EAAG,KACZ,EACA,KAAMA,EAAG,KACT,OAAQE,EAAI,SAAUA,EAAI,QAASA,CACrC,EASWX,GAAQ,CAACc,EAAIS,EAAS,CAAChB,EAASiB,IAAU,CACrDjB,MAAY,IAAI,KAChB,GAAI,CAAEO,EAAG,CAAG,QACZ,CAAU,GAAIS,EAAQ,CAAE,CAAChB,EAASiB,CAAK,EAAI,CAAC,KAAMjB,CAAO,EAAG,QAAWkB,KAAMD,EAAOC,EAAG,CAAG,CAAE,CAC9F,EAQarB,GAAY,CAACU,EAAIY,EAAOf,KAAQe,EAAQrB,EAASA,EAAU,KAAMM,EAAKG,EAAG,EAAGT,EAAUqB,EAAOf,GClF1G,IAAOgB,GAAQ,CAACC,EAAIC,IAAU,CAT9B,IAAAC,EAUE,IAAIC,EAASC,EAAKC,EAGlB,OAAKL,EAAG,QA2BHM,EAAMF,EAAMJ,EAAIC,CAAK,GAzBxBD,EAAAE,EAAGK,KAAHP,EAAAE,GAAe,MAEfE,EAAMJ,EAAG,QAAUQ,EAAKR,CAAE,EAAIA,EAE9BA,EAAG,YAAYG,EAAU,SAAS,eAAe,EAAE,CAAC,EACpDC,EAAI,QAAUD,EAAQ,QAAUA,EAGhCA,EAAQ,SAAW,CAACC,EAAI,QAAU,CAACA,EAAK,EAAK,CAAC,EAE9CD,EAAQ,OAASM,EAAS,IAAM,CAC9B,IAAIC,EAAQP,EAAQ,SAAS,KAAK,CAAC,CAAC,CAAEQ,CAAC,IAAMA,CAAC,EAE1CD,GAASL,IACXA,IAAS,CAAC,EAAE,OAAO,EACnBA,IAAS,CAAC,EAAEO,CAAI,IAAI,GAChBP,EAASK,KACXP,EAAQ,OAAOE,EAAO,CAAC,EAAE,SAAWA,EAAO,CAAC,CAAC,EAE5CA,EAAO,CAAC,EAAEE,CAAM,EAA0DF,EAAO,CAAC,EAAEQ,CAAG,IAAI,GAAtE,OAAOR,EAAO,CAAC,EAAEE,CAAM,EAAGD,EAAMD,EAAO,CAAC,EAAGJ,CAAK,IAG5E,CAAC,GAOIa,GAAS,CACdV,EAAI,QAAQ,CAAC,EAAIU,EACjBV,EAAI,QAAQ,OAAO,CACrB,CACF,ECxCA,IAAOW,GAASC,GAAO,CACrB,IAAIC,EAAKC,EAAQF,EAKjB,IAHAC,EAAMD,EAAG,QAAUG,EAAKH,CAAE,EAAIA,EAGvBE,GAAS,EAAED,EAAI,QAAUC,EAAM,UAAUA,EAAQA,EAAM,gBAE9D,OAAAF,EAAG,OAAO,EACVA,EAAGI,CAAM,EAAI,KAEbH,EAAI,QAAQ,SAAS,KAAKA,EAAI,QAAU,CAACA,EAAK,EAAI,CAAC,EAE5CA,EAAI,QAAQ,MACrB,ECfA,IAAOI,GAAQC,IAEbA,EAAG,SAAWA,EAAG,YAAYA,EAAKC,EAAKD,CAAE,EAAE,WAAW,CAAC,CAAC,EACxDE,IAAMA,EAAI,OAAOA,GAAM,WAAaA,EAAEF,EAAG,WAAW,EAAIE,EAAGF,EAAG,YAAcE,GAAY,KCC1F,IAAOC,GAAQ,CAACC,EAAIC,EAAIC,EAAIC,IAAS,CACnC,IAAIC,EAAO,IAAI,IAAKC,EAGpB,OAAAF,EAAK,SAAS,GAAG,IAAMH,EAAKM,EAAS,CAAC,OAAON,CAAE,EAAGG,EAAK,MAAM,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,QAAUH,GAE9EO,GAAM,CACZF,EAAO,IAAI,IACPE,GAAGC,EAAK,OAAOD,GAAM,WAAaA,EAAEP,EAAG,SAAS,EAAIO,CAAC,EAAE,MAAM,GAAG,EAAE,IAAIE,GAAKA,GAAKJ,EAAK,IAAII,CAAC,CAAC,EAC/F,QAASA,KAAKL,EAAUC,EAAK,IAAII,CAAC,EAAGJ,EAAK,OAAOI,CAAC,EAAQT,EAAG,UAAU,OAAOS,CAAC,EAC/E,QAASA,KAAKL,EAAOC,EAAML,EAAG,UAAU,IAAIS,CAAC,CAC/C,CACF,ECZA,IAAOC,GAAQ,CAACC,EAAIC,EAAIC,EAAIC,IAAS,CACnC,IAAIC,EAGJ,OAAID,EAAK,SAAS,GAAG,IAAGH,EAAKK,EAAS,CAAC,OAAOL,CAAE,EAAGG,EAAK,MAAM,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,QAAUH,GAEhFM,GAAK,CAGV,GAFKF,IAAWA,EAAUJ,EAAG,aAAa,OAAO,GACjDM,EAAI,OAAOA,GAAM,WAAaA,EAAEN,EAAG,KAAK,EAAIM,EACxC,OAAOA,GAAM,SAAUC,EAAKP,EAAI,QAASI,EAAU,KAAOE,CAAC,MAC1D,CACCF,GAASG,EAAKP,EAAI,QAASI,CAAO,EAEtC,QAASI,KAAKF,EAAGE,EAAE,CAAC,GAAK,IAAMR,EAAG,MAAM,YAAYQ,EAAGF,EAAEE,CAAC,CAAC,EAAIA,EAAE,CAAC,EAAI,MAAQR,EAAG,MAAMQ,CAAC,EAAIF,EAAEE,CAAC,EACjG,CACF,CACF,ECtBA,IAAOC,GAAQ,IAAOC,GAAO,OAAOA,GAAO,YAAcA,EAAG,ECErD,IAAMC,GAAS,CAACC,EAAMC,EAAOC,EAAM,GAAGF,CAAI,KAAK,IAAM,CAACG,EAAQC,IAAU,CAC7ED,EAAO,GAAKC,EAAOH,EAAKE,CAAM,EAAG,OAAOA,EAAO,EACjD,EAUOE,GAAQ,CAACC,EAAIC,EAAOP,IAAS,CAElC,GAAI,CACF,IAAMQ,EAAMT,GAAOC,CAAI,EACjBS,EAAeH,EAAG,OAAS,WAAa,IAAME,EAAID,EAAOD,EAAG,OAAO,EACvEA,EAAG,OAAS,kBAAoB,IAAME,EAAID,EAAO,CAAC,GAAGD,EAAG,eAAe,EAAE,IAAII,GAAKA,EAAE,KAAK,CAAC,EACxF,IAAMF,EAAID,EAAOD,EAAG,cAAgB,EAAI,KAAO,MAAMA,EAAG,aAAa,EAAIA,EAAG,MAAQA,EAAG,aAAa,EAExGA,EAAG,QAAUA,EAAG,SAAWG,EAEvBH,EAAG,MAAM,WAAW,QAAQ,IAE9B,IAAI,iBAAiBG,CAAY,EAAE,QAAQH,EAAI,CAAE,UAAW,GAAM,QAAS,GAAM,WAAY,EAAK,CAAC,EAGnGK,EAAML,EAAIC,CAAK,GAIjBL,EAAMF,CAAI,EAAEO,CAAK,GAAKE,EAAa,CACrC,MAAQ,CAAE,CAEV,OAAQH,EAAG,OAAS,QAAUA,EAAG,OAAS,IAAMA,EAAG,UAAY,WAC7D,CAACF,EAAOQ,EAAOC,KAEZD,EAAQN,EAAG,eACXO,EAAMP,EAAG,aACVA,EAAG,aAAa,QAAUA,EAAG,MAAQF,GAAgB,EAAW,EAChEQ,GAASN,EAAG,kBAAkBM,EAAOC,CAAG,GAEzCP,EAAG,OAAS,WACVF,IAAWE,EAAG,QAAUF,EAAOU,EAAKR,EAAI,UAAWF,CAAK,GACxDE,EAAG,OAAS,QAAYF,GACvBE,EAAG,QAAUF,IAAWE,EAAG,QAAUF,EAAQU,EAAKR,EAAI,UAAWF,CAAK,GAErEE,EAAG,OAAS,aACVF,GAAU,CACT,QAASM,KAAKJ,EAAG,QACfI,EAAE,OAASN,EAAQM,EAAE,aAAa,WAAY,EAAE,EAAIA,EAAE,gBAAgB,UAAU,EAClFJ,EAAG,MAAQF,CACb,EACCE,EAAG,OAAS,kBAAsBF,GAAU,CAC3C,QAASM,KAAKJ,EAAG,QAASI,EAAE,gBAAgB,UAAU,EACtD,QAASK,KAAKX,EAAOE,EAAG,cAAc,WAAWS,CAAC,IAAI,EAAE,aAAa,WAAY,EAAE,CACrF,EACGX,GAAWE,EAAG,MAAQF,CACnC,ECtDA,IAAOY,GAAQ,CAACC,EAAIC,EAAOC,IAAS,CAClC,IAAIC,EAAKC,EAAMF,CAAI,EAAED,CAAK,EAE1B,GAAI,OAAOE,GAAM,WAAY,MAAO,CAAC,CAAC,OAAO,OAAO,EAAEA,EAAGH,CAAE,CAAC,EAI5DK,GAAOH,CAAI,EAAED,EAAOD,CAAE,CACxB,ECVA,IAAOM,GAAQ,CAACC,EAAIC,IAAc,CAGhC,IAAIC,EAAQF,EAAGG,CAAM,EAAIC,EAAM,CAAC,EAAGH,CAAS,EAAGI,EAAO,GAItD,OAAOC,GAAU,CAKf,GAJAA,EAAS,OAAOA,GAAW,WAAaA,EAAOJ,CAAK,EAAII,EAIpDA,IAAWJ,EACb,QAASK,KAAKD,EAAQ,CAEpB,IAAIE,EAAI,OAAOF,EAAOC,CAAC,GAAM,WAAaD,EAAOC,CAAC,EAAE,KAAKL,CAAK,EAAII,EAAOC,CAAC,EAEtEA,KAAKL,EAAMO,CAAQ,EAAGP,EAAMK,CAAC,EAAIC,EAE/BN,EAAMO,CAAQ,EAAEF,CAAC,EAAKA,EAAE,CAAC,GAAK,KAAOC,GAAG,KAAQA,EAAIE,EAAON,EAAMI,CAAC,CAAC,CAC3E,CAIF,MAAO,CAACH,IAASA,EAAO,GAAM,OAAOL,EAAGG,CAAM,EAAGQ,EAAU,IAAMC,EAAMZ,EAAIE,CAAK,CAAC,EACnF,CACF,ECzBA,IAAOW,GAAQ,CAACC,EAAKC,EAAOC,IAAS,CACnC,GAAM,CAACC,EAAKC,CAAG,EAAIF,EAAK,MAAM,WAAW,EAErC,CAACG,EAASC,EAAS,GAAG,EAAIH,EAAI,KAAK,EAAE,QAAQ,SAAU,EAAE,EAAE,MAAM,SAAS,EAG1EI,EAAS,SAAS,eAAe,EAAE,EAGnCC,EAAKC,EAAMC,EAAOC,EAAQ,EAE1BC,EAASC,EAAS,IAAM,CArB9B,IAAAC,EAAAC,EAsBI,IAAIC,EAAI,EAAGC,EAAWP,EAAOQ,EAAOD,EAAS,OAG7C,GAAIT,GAAO,CAACA,EAAIW,CAAO,EAAG,CACxB,QAASC,KAAKZ,EAAIa,CAAQ,GAAK,CAAC,EAAGD,EAAE,OAAO,OAAO,EAAE,EACrDZ,EAAM,KAAMG,EAAQ,CACtB,CAIA,GAAIO,EAAOP,EAAOH,EAAI,OAASU,MAG1B,CAEH,GAAI,CAACV,EAAKA,EAAMS,MAEX,MAAOD,EAAIL,GAAOH,EAAIQ,CAAC,EAAIC,EAASD,GAAG,EAI5C,IAAIM,EADYJ,EAAOF,EACC,EAAI,SAAS,uBAAuB,EAAI,KAC5DO,GAAUD,EAAQ,CAAC,EAAI,KAG3B,KAAON,EAAIE,EAAMF,IAAK,CACpBR,EAAIQ,CAAC,EAAIC,EAASD,CAAC,EAEnB,IAAIQ,EAAMR,EACNS,EAAKzB,EAAI,QAAU0B,EAAK1B,CAAG,EAAIA,EAAI,UAAU,EAAI,EAEjD2B,EAAaF,EAAG,SAAWA,EAG/B,GAAIH,EACFA,EAAM,YAAYK,CAAU,EAC5BJ,GAAQ,KAAK,CAAEE,EAAID,CAAI,CAAC,MACnB,CACLjB,EAAO,OAAOoB,CAAU,EACxB,IAAIC,GAAW,OAAO,OAAO3B,EAAO,CAClC,CAACI,CAAO,EAAG,CAAE,IAAK,IAAMG,EAAIgB,CAAG,CAAE,EACjC,CAAClB,CAAM,EAAG,CAAE,MAAOG,EAAOA,EAAKe,CAAG,EAAIA,CAAI,CAC5C,CAAC,EACDK,EAAMJ,EAAIG,EAAQ,CACpB,CAGA,IAAIE,KAAUf,EAAAP,EAAAM,EAAIO,KAAJb,EAAAM,GAAkB,CAAC,IAAnBE,KAAAD,EAAAC,GAA6B,CAAC,IAAG,OAAO,OAAO,EAC7DR,EAAIa,CAAQ,EAAEL,CAAC,EAAE,OAAO,OAAO,EAAI,IAAM,CACvCc,KAAQ,EAAGL,EAAG,OAAO,OAAO,IAAI,EAAGA,EAAG,OAAO,CAC/C,CACF,CAGA,GAAIH,EAAO,CACTf,EAAO,OAAOe,CAAK,EACnB,OAAS,CAACG,EAAID,CAAG,IAAKD,GAAS,CAC7B,IAAIK,EAAW,OAAO,OAAO3B,EAAO,CAClC,CAACI,CAAO,EAAG,CAAE,IAAK,IAAMG,EAAIgB,CAAG,CAAE,EACjC,CAAClB,CAAM,EAAG,CAAE,MAAOG,EAAOA,EAAKe,CAAG,EAAIA,CAAI,CAC5C,CAAC,EACDK,EAAMJ,EAAIG,CAAQ,CACpB,CACF,CACF,CAEAjB,EAAQO,CACV,CAAC,EAED,OAAAlB,EAAI,YAAYO,CAAM,EACtBP,EAAI+B,CAAM,EAAI,KAEP,OAAO,OAAOC,IAEnBvB,EAAO,KACH,OAAOuB,GAAU,SAAUtB,EAAQ,MAAM,KAAK,CAAE,OAAQsB,CAAM,EAAG,CAACC,EAAGjB,IAAMA,EAAI,CAAC,EAC3EgB,GAAO,cAAgB,QAAQvB,EAAO,OAAO,KAAKuB,CAAK,EAAGtB,EAAQ,OAAO,OAAOsB,CAAK,GACzFtB,EAAQsB,GAAS,CAAC,EAGhBE,EAAO,IAAM,CAElBxB,EAAMS,CAAO,GAAG,MAGhBP,EAAO,CACT,CAAC,GACA,CAAC,KAAKuB,EAAM/B,CAAG,CAAC,CAAC,CACtB,ECpGA,IAAOgC,GAAQ,CAACC,EAAIC,EAAIC,EAAIC,IAASC,GAAKC,EAAKL,EAAIG,EAAM,OAAOC,GAAM,WAAaA,EAAEJ,EAAG,aAAaG,CAAI,CAAC,EAAIC,CAAC,ECF/G,IAAOE,GAASC,GAAWC,GAAS,CAAE,QAASC,KAAOD,EAAOE,EAAKH,EAAQI,GAASF,CAAG,EAAGD,EAAMC,CAAG,CAAC,CAAE,ECGrG,IAAOG,GAAQ,CAACC,EAAIC,EAAOC,EAAMC,IAAS,CAIxC,GAAM,CAACC,EAAM,GAAGC,CAAI,EAAIF,EAAK,MAAM,CAAC,EAAE,MAAM,GAAG,EAC7CG,EAAWC,EAAML,CAAI,EAAE,KAAKF,CAAE,EAC9BQ,EAAUC,EAAS,OAAO,OAAOC,GAAKJ,EAASL,EAAQU,GAAO,OAAOA,GAAO,WAAaA,EAAGD,CAAC,EAAIC,CAAE,EAAG,CAAE,OAAQX,CAAG,CAAC,EAAGK,CAAI,EAE7H,OAAAG,EAAQ,OAAO,iBAAiBJ,EAAMI,EAASA,CAAO,EAC/C,CACL,CAAC,OAAO,OAAO,GAAI,CACjBA,EAAQ,OAAO,oBAAoBJ,EAAMI,CAAO,CAClD,CACF,CACF,ECdA,IAAOI,GAAQ,CAACC,EAAIC,EAAOC,EAAMC,IAAU,CACzC,IAAIC,EACFC,EAEEC,EAAQH,EAAM,MAAM,IAAI,EAAE,IAAI,CAACI,EAAMC,EAAG,CAAE,OAAAC,CAAO,IAAMF,EAAK,MAAM,GAAG,EAAE,OACzE,CAACG,EAAMC,IAAQ,CACb,GAAM,CAACC,EAAM,GAAGC,CAAI,EAAIF,EAAI,MAAM,CAAC,EAAE,MAAM,GAAG,EAExCG,EAAWC,EAAMb,CAAI,EAAE,KAAKF,CAAE,EAE9BgB,EAAO,CAACC,EAAIC,IAAMd,EAAM,OAAOa,GAAO,WAAaA,EAAGC,CAAC,EAAID,EAC3DE,EAAUC,EAAS,OAAO,OAC9BF,IAAOV,EAA2CQ,EAAKZ,EAAKc,CAAC,EAAlDJ,EAASb,EAAQgB,GAAOD,EAAKC,EAAIC,CAAC,CAAC,EAAkBb,EAAI,EAAGA,EAAMC,GAAOE,EAAI,GAAKC,CAAM,EAAE,GACrG,CAAE,OAAQT,CAAG,CACf,EAAGa,CAAI,EAGP,OAAQQ,IACNA,EAAQX,IAAO,EACfS,EAAQ,OAAO,iBAAiBP,EAAMO,EAASA,CAAO,EACtD,KAAOE,IAAQ,EAAGF,EAAQ,OAAO,oBAAoBP,EAAMO,CAAO,GAEtE,EAAG,IAAI,CACT,EAEA,OAAAd,EAAMC,EAAM,CAAC,EAAE,EAER,CACL,CAAC,OAAO,OAAO,GAAI,CACjBD,IAAM,CACR,CACF,CACF,EClCA,IAAOiB,GAAQ,CAACC,EAAIC,IAAU,CAE5B,GAAID,EAAG,QAAS,CACd,IAAIE,EAAQ,SAAS,eAAe,EAAE,EAClCC,EAAM,SAAS,eAAe,EAAE,EAChCC,EAAQ,SAAS,YAAY,EACjC,OAAAJ,EAAG,YAAYE,EAAOC,CAAG,EAClBE,GAAK,CAKV,GAJAA,EAAI,OAAOA,GAAM,WAAaA,EAAE,EAAE,EAAIA,EACtCD,EAAM,cAAcF,CAAK,EACzBE,EAAM,aAAaD,CAAG,EACtBC,EAAM,eAAe,EACjBC,GAAK,MAAQA,IAAM,GAAI,CACzB,IAAIC,EAAOF,EAAM,yBAAyBC,CAAC,EAC3CE,EAAMD,EAAML,CAAK,EACjBG,EAAM,WAAWE,CAAI,CACvB,CACF,CACF,CACA,OAAOD,IAAMA,EAAI,OAAOA,GAAM,WAAaA,EAAEL,EAAG,SAAS,EAAIK,EAAGL,EAAG,UAAYK,GAAY,GAAQE,EAAMP,EAAIC,CAAK,EAAGD,EAAGQ,CAAQ,EAClI,ECrBA,IAAOC,GAAQ,CAACC,EAAIC,EAAOC,IAAS,CAClC,IAAMC,EAAU,SAAS,cAAc,SAAS,EAC5CC,EAAgB,KAGpB,OAAAJ,EAAG,OAAOG,CAAO,EAETE,GAAU,CAGhB,IAAMC,EAAON,EAAG,YAAY,EACtBO,EAAS,OAAOF,GAAU,SAC3BC,EAAK,gBAAgBD,CAAK,GAAK,SAAS,cAAcA,CAAK,EAC5DA,aAAiB,QAAUA,EACzBA,EAAQ,SAAS,KAAO,KAG1BE,IAAWH,IAEXG,EAEFA,EAAO,YAAYP,CAAE,EAGrBG,EAAQ,MAAMH,CAAE,EAGlBI,EAAgBG,EAClB,CACF,EChCA,IAAOC,GAASC,GAAQC,GAAUD,EAAG,OAAS,CAAC,CAACC,ECwBhD,OAAO,OAAOC,EAAW,CACvB,EAAG,CAACC,EAAIC,EAAOC,EAAMC,KAAUA,EAAK,WAAW,IAAI,EAAIC,GAASC,IAAUL,EAAIC,EAAOC,EAAMC,CAAI,EAC/F,GAAIG,GACJ,MAAOC,GACP,KAAMC,GACN,KAAMC,GACN,MAAOC,GACP,GAAIC,GACJ,MAAOC,GACP,IAAKC,GACL,MAAOC,GACP,GAAIC,GACJ,KAAMC,GACN,KAAMC,GACN,OAAQC,GACR,OAAQC,EACV,CAAC,EAWD,IAAMC,GAAM,CAACC,EAAQlB,EAAMD,EAAMD,IAAU,CACzC,GAAI,CAACqB,EAAS,GAAGC,CAAI,EAAIpB,EAAK,MAAM,GAAG,EAAGqB,EAASzB,EAAUuB,CAAO,GAAKvB,EAAU,EAEnF,MAAO,IAAM,CACX,IAAI0B,EAASD,EAAOH,EAAQpB,EAAOC,EAAMC,CAAI,EAE7C,GAAI,CAACsB,GAAQ,KAAM,OAAOA,IAASC,CAAQ,EAG3C,IAAIC,EAAUC,EAAS,OAAO,OAAOC,EAAS,IAAMC,EAAO,OAAO,EAAG,CAAE,OAAAT,CAAO,CAAC,EAAGE,CAAI,EACpFO,EAASC,EAAO,CAAC,EACjBC,EAAQ,EACRC,EAAWR,EAAO,MAAQS,EAAMhC,CAAI,EAAE,KAAKmB,CAAM,EACjDc,EAAMC,EAAM,KAAO,OAAOD,GAAS,YAAcA,EAAK,EAAGA,EAAK,MAEhE,OAAAlC,EAASoB,EAAOgB,CAAM,GAAKpC,EAEpBqC,EAAO,KAEZR,EAAO,OAASE,EAASL,EAAQ,GAAMK,EAAQF,EAAO,MAAOK,EAAOF,EAAShC,EAAOwB,CAAM,GAC1FW,EACD,CACH,CACF,EAGMG,GAAaC,GAAOA,EAAQ,OAAOA,GAAM,SAAWA,GACvD,CAAC,CAAC,CAAEC,EAAGC,CAAC,EAAIF,EAAE,MAAM,kBAAkB,GAAK,CAAC,KAAOC,EAAI,CAACA,EAAGC,IAAM,IAAMD,EAAI,IAAOC,IAAM,IAAMD,EAAI,IAAQA,IAAI,EADnF,EAIxBE,GAAaH,GACjBA,IAAM,OAAS,oBACfA,IAAM,MAAQ,sBACd,CAACA,GAAKA,IAAM,OAAS,eACpBI,GAAO,WAAWA,EAAIL,GAAUC,CAAC,CAAC,EAGrC,OAAO,OAAOK,EAAU,CAMtB,SAAU,CAACD,EAAIE,EAAGC,IAAMC,GAASJ,EAAID,GAAUG,IAAM,YAAcC,EAAID,CAAC,EAAGA,IAAM,aAAeC,IAAM,WAAW,EAMjH,SAAU,CAACH,EAAIE,IAAMjB,EAASe,EAAID,GAAUG,CAAC,CAAC,EAE9C,MAAO,CAACF,EAAIE,KAAO,CAACG,EAAQN,GAAUG,CAAC,IAAOI,GAAMD,EAAM,IAAML,EAAGM,CAAC,CAAC,GAAG,EAGxE,KAAM,CAACN,EAAIO,EAAOC,KAASA,EAAOF,GAAM,CAACC,IAAUA,EAAQ,EAAGP,EAAGM,CAAC,GAAIE,EAAI,KAAO,GAAMA,GAGvF,OAAQR,IAAOA,EAAG,OAASA,EAAG,OAAO,cAAc,YAAaA,GAEhE,SAAUA,IAAOA,EAAG,OAASA,EAAG,OAAO,cAAeA,GAEtD,KAAMA,IAAOA,EAAG,OAASA,EAAG,OAAO,cAAc,gBAAiBA,GAElE,KAAMA,IAAOA,EAAG,OAASA,EAAG,OAAO,cAAc,KAAMA,GAEvD,OAAQA,IAAOA,EAAG,OAASA,EAAG,OAAO,WAAYA,GAEjD,KAAOA,GAAQM,GAAOA,EAAE,SAAWN,EAAG,QAAUA,EAAGM,CAAC,EAEpD,KAAON,GAAO,OAAO,OAAQM,GAAO,CAACN,EAAG,OAAO,SAASM,EAAE,MAAM,GAAKA,EAAE,OAAO,aAAeN,EAAGM,CAAC,EAAI,CAAC,OAAQN,EAAG,OAAO,aAAa,CAAC,EAGtI,QAAUA,GAAQM,IAAOA,GAAG,eAAe,EAAGN,EAAGM,CAAC,GAElD,KAAM,CAACN,EAAIS,IAAUH,IAAOG,IAAO,CAAC,IAAM,IAAMH,GAAG,yBAAyB,EAAIA,GAAG,gBAAgB,EAAGN,EAAGM,CAAC,GAE1G,QAASN,IAAOA,EAAG,QAAU,GAAMA,GAEnC,QAASA,IAAOA,EAAG,QAAU,GAAMA,EACrC,CAAC,EAEDC,EAAS,QAAUA,EAAS,KAM5B,IAAMS,GAAO,CACX,KAAM,GAAK,EAAE,SAAW,EAAE,MAAQ,WAAa,EAAE,MAAQ,OACzD,MAAO,GAAK,EAAE,UAAY,EAAE,MAAQ,QACpC,IAAK,GAAK,EAAE,QAAU,EAAE,MAAQ,MAChC,KAAM,GAAK,EAAE,SAAW,EAAE,MAAQ,OAClC,IAAK,GAAK,EAAE,SAAW,EAAE,MAAQ,UACjC,MAAO,GAAK,EAAE,IAAI,WAAW,OAAO,EACpC,MAAO,GAAK,EAAE,MAAQ,QACtB,IAAK,GAAK,EAAE,IAAI,WAAW,KAAK,EAChC,IAAK,GAAK,EAAE,MAAQ,MACpB,MAAO,GAAK,EAAE,MAAQ,QAAO,EAAE,MAAQ,SAAW,EAAE,MAAQ,IAC5D,OAAQ,GAAK,EAAE,MAAQ,UAAY,EAAE,MAAQ,YAC7C,MAAO,GAAK,OAAO,KAAK,EAAE,GAAG,EAC7B,OAAQ,GAAK,YAAY,KAAK,EAAE,GAAG,EACnC,KAAM,GAAK,OAAO,KAAK,EAAE,GAAG,CAC9B,EAGMC,GAAW,CAACC,EAAGN,IAAMI,GAAKE,CAAC,IAAIN,CAAC,GAAKA,EAAE,IAAI,YAAY,IAAMM,GAAKN,EAAE,SAAWM,EAGrF,QAASA,KAAKF,GAAMT,EAASW,CAAC,EAAI,CAACZ,EAAIE,EAAGC,IAAOG,GAAMI,GAAKE,CAAC,EAAEN,CAAC,IAAM,CAACJ,GAAKS,GAAST,EAAGI,CAAC,KAAO,CAACH,GAAKQ,GAASR,EAAGG,CAAC,IAAMN,EAAGM,CAAC,EAI7H,IAAMO,GAAUC,GAAK,CACnB,QAASC,EAAE,EAAEC,EAAE,EAAEA,EAAEF,EAAE,OAAOE,IAC1B,GAAIF,EAAEE,CAAC,GAAG,IAAKD,YACND,EAAEE,CAAC,GAAG,IAAKD,YACXD,EAAEE,CAAC,GAAG,KAAO,CAACD,EAAG,MAAO,GAEnC,MAAO,EACT,EAGAE,EAAI,CAGF,QAAS3D,IAEH,oBAAoB,KAAKA,CAAI,GAExBuD,GAAQvD,CAAI,IAChBA,EAAO,UAAUA,CAAI,IAEtB,YAAY,KAAKA,CAAI,IAAGA,EAAO,qBAAqBA,CAAI,QACrD4D,EAAM,YAAY,sBAAsB5D,CAAI,GAAG,GAExD,IAAK,CAACF,EAAIG,EAAMD,EAAMD,IAEhBE,EAAK,SAAS,IAAI,EAAU,IAAM4D,GAAK/D,EAAIC,EAAOC,EAAMC,CAAI,EAAEuB,CAAQ,EACnEvB,EAAK,MAAM,GAAG,EAAE,OAAO,CAAC6D,EAAMC,IAAQ,CAC3C,IAAIC,EAAQ9C,GAAIpB,EAAIiE,EAAK/D,EAAMD,CAAK,EACpC,OAAQ+D,EAAe,CAACG,EAAGT,KAAOS,EAAIH,EAAK,EAAGN,EAAIQ,EAAM,EAAG,IAAM,CAAEC,EAAE,EAAGT,EAAE,CAAE,GAA7DQ,CACjB,EAAG,IAAI,EAET,GAAGE,EACL,CAAC,EAIDN,EAAM,IAAMD,EACZC,EAAM,MAAQO,EACdP,EAAM,UAAY/D,EAClB+D,EAAM,SAAWjB,EAMjBiB,EAAM,QAAW9D,GAAOA,EAAG0B,CAAQ,IAAI,EAiBvC,IAAMwC,GAAQJ,EAAM,MAAQ,CAACQ,EAAO,SAAS,KAAMC,IAAW,CAC5D,IAAMtE,EAAQoE,EAAME,CAAM,EAC1B,OAAAT,EAAMQ,EAAMrE,CAAK,EACN,IAAI,iBAAiBuE,GAAa,CAC3C,QAAWC,KAAKD,EAAW,CACzB,QAAWxE,KAAMyE,EAAE,WAEbzE,EAAG,WAAa,GAAKA,EAAGqC,CAAM,IAAM,QAAaiC,EAAK,SAAStE,CAAE,GAEnEsE,EAAKI,CAAI,EAAE1E,CAAE,EAGjB,QAAWA,KAAMyE,EAAE,aAAczE,EAAG,WAAa,GAAKA,EAAG0B,CAAQ,IAAI,CACvE,CACF,CAAC,EACE,QAAQ4C,EAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAC5CrE,CACT,EAIA6D,EAAM,QAAU,SAEhB,IAAMa,GAAUb,EAAM,QAEfc,GAAQd",
|
|
6
|
+
"names": ["_dispose", "_state", "_on", "_off", "_add", "prefix", "signal", "effect", "computed", "batch", "fn", "untracked", "directive", "modifier", "currentDir", "currentEl", "elHint", "el", "hint", "err", "expr", "msg", "display", "sprae", "state", "store_default", "fx", "offs", "off", "add", "_attrs", "start", "i", "name", "value", "dir", "child", "next", "compile", "parse", "cache", "e", "cb", "_out", "result", "v", "use", "config", "decorate", "mods", "params", "mod", "wrapFn", "k", "frag", "tpl", "content", "attributes", "ref", "childNodes", "a", "dashcase", "str", "match", "attr", "clsx", "c", "s", "throttle", "ms", "_planned", "arg", "schedule", "throttled", "_dirty", "debounce", "immediate", "_blocked", "_count", "_c", "core_default", "_signals", "_change", "_set", "sandbox", "store", "values", "parent", "list", "keyCount", "signals", "state", "signal", "_", "k", "v", "set", "create", "descs", "computed", "isMut", "mut", "fn", "length", "i", "_s", "_v", "untracked", "batch", "store_default", "signal_exports", "__export", "batch", "computed", "effect", "signal", "untracked", "current", "depth", "batched", "v", "_s", "_obs", "_v", "val", "sub", "fn", "_teardown", "_fx", "_deps", "prev", "tmp", "dep", "_c", "_e", "_first", "_list", "fx", "_prev", "if_default", "el", "state", "_a", "_holder", "_el", "_match", "core_default", "_state", "frag", "throttle", "match", "s", "_off", "_on", "value", "else_default", "el", "_el", "_prev", "frag", "_state", "text_default", "el", "frag", "v", "class_default", "el", "st", "ex", "name", "_cur", "_new", "decorate", "v", "clsx", "c", "style_default", "el", "st", "ex", "name", "_static", "decorate", "v", "attr", "k", "fx_default", "fn", "setter", "expr", "_set", "parse", "target", "value", "value_default", "el", "state", "set", "handleChange", "o", "core_default", "_from", "_to", "attr", "v", "ref_default", "el", "state", "expr", "fn", "parse", "setter", "scope_default", "el", "rootState", "state", "_state", "store", "init", "values", "k", "v", "_signals", "signal", "untracked", "core_default", "each_default", "tpl", "state", "expr", "lhs", "rhs", "itemVar", "idxVar", "holder", "cur", "keys", "items", "prevl", "update", "throttle", "_a", "_b", "i", "newItems", "newl", "_change", "s", "_signals", "batch", "pending", "idx", "el", "frag", "insertNode", "subscope", "core_default", "_prev", "_state", "value", "_", "effect", "parse", "__default", "el", "st", "ex", "name", "v", "attr", "spread_default", "target", "value", "key", "attr", "dashcase", "event_default", "el", "state", "expr", "name", "type", "mods", "evaluate", "parse", "trigger", "decorate", "e", "fn", "sequence_default", "el", "state", "expr", "names", "cur", "off", "steps", "step", "i", "length", "prev", "str", "name", "mods", "evaluate", "parse", "next", "fn", "e", "trigger", "decorate", "_poff", "html_default", "el", "state", "start", "end", "range", "v", "frag", "core_default", "_dispose", "portal_default", "el", "state", "expr", "comment", "currentTarget", "value", "root", "target", "hidden_default", "el", "value", "directive", "el", "state", "expr", "name", "event_default", "__default", "spread_default", "class_default", "text_default", "html_default", "style_default", "fx_default", "value_default", "ref_default", "scope_default", "if_default", "else_default", "each_default", "portal_default", "hidden_default", "dir", "target", "dirName", "mods", "create", "update", "_dispose", "trigger", "decorate", "throttle", "change", "signal", "count", "evaluate", "parse", "_out", "out", "_state", "effect", "parseTime", "t", "n", "u", "scheduler", "fn", "modifier", "a", "b", "debounce", "sched", "e", "_done", "_fn", "_how", "keys", "keyMatch", "k", "hasSemi", "s", "d", "i", "use", "core_default", "sequence_default", "prev", "str", "start", "p", "signal_exports", "store_default", "root", "values", "mutations", "m", "_add", "dispose", "sprae_default"]
|
|
7
7
|
}
|
package/dist/sprae.umd.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(function (g, f) {if ("object" == typeof exports && "object" == typeof module) {module.exports = f();} else if ("function" == typeof define && define.amd) {define("sprae", [], f);} else if ("object" == typeof exports) {exports["sprae"] = f();} else {g["sprae"] = f();}}(typeof self !== 'undefined' ? self : typeof globalThis !== 'undefined' ? globalThis : this, () => {var exports = {};var module = { exports };
|
|
2
|
-
var ee=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var
|
|
3
|
-
in ${yt(ne)}`),oe&&t
|
|
4
|
-
${oe}="${t}"`),console.error(r)},gt=(e=document.body,t)=>{if(e[f])return Object.assign(e[f],t);t=R(t||{});let r=[],o=[];e[G]=()=>!o&&(o=r.map(s=>s())),e[z]=()=>(o?.map(s=>s()),o=null),e[b]||(e[b]=()=>(e[z](),e[z]=e[G]=e[b]=e[Q]=e[f]=null));let n=e[Q]=s=>{let i=s.attributes,a;if(i)for(let c=0;c<i.length;){let{name:l,value:h}=i[c];if(l.startsWith(re)){if(s.removeAttribute(l),oe=l,ne=s,r.push(a=be(s,l.slice(re.length),h,t)),o.push(a()),f in s)return}else c++}if(s.firstChild!==void 0){let c=s.firstChild,l;for(;c;)l=c.nextSibling,c.nodeType==1&&n(c),c=l}else for(let c of s.childNodes)c.nodeType==1&&n(c)};return n(e),e[f]===void 0&&(e[f]=t),t},y=e=>{let t=ge[e=e.trim()];if(t)return t;try{t=xe(e||"undefined")}catch(r){te(r,e)}return ge[e]=function(r,o,n){try{let s=t?.call(this,r);return o?s?.then?(s.then(i=>n=o(i)).catch(i=>te(i,e)),()=>typeof n=="function"&&n()):o(s):s}catch(s){te(s,e)}}},ge={},U=e=>(e.compile&&(xe=e.compile),e.prefix&&(re=e.prefix),e.signal&&(x=e.signal),e.effect&&(K=e.effect),e.computed&&(B=e.computed),e.batch&&(I=e.batch),e.untracked&&(L=e.untracked),e.dir&&(be=e.dir)),w=(e,t)=>{for(;t.length;){let[r,...o]=t.pop().split("-"),n=q[r],s;if(n&&(s=n(e,...o))!==e){for(let i in e)s[i]??(s[i]=e[i]);e=s}}return e},k=e=>{if(!e.nodeType)return e;let t=e.content.cloneNode(!0),r=[...e.attributes],o=document.createTextNode(""),n=(t.append(o),[...t.childNodes]);return{childNodes:n,content:t,remove:()=>t.append(...n),replaceWith(s){s!==o&&(o.before(s),t.append(...n))},attributes:r,removeAttribute(s){r.splice(r.findIndex(i=>i.name===s),1)}}},_e=e=>e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(t,r)=>(r?"-":"")+t.toLowerCase()),A=(e,t,r)=>r==null||r===!1?e.removeAttribute(t):e.setAttribute(t,r===!0?"":r),se=(e,t=[])=>e?typeof e=="string"?e:(Array.isArray(e)?e.map(se):Object.entries(e).reduce((r,[o,n])=>n?[...r,o]:r,[])).join(" "):"",D=(e,t)=>{let r=0,o,n=typeof t=="function"?t:t?i=>setTimeout(i,t):queueMicrotask,s=i=>{o=i,r++||(e(o),n((a=r>1)=>(r=0,a&&s(o))))};return s},ie=(e,t,r)=>{let o=typeof t=="function"?t:t?n=>setTimeout(n,t):queueMicrotask;return r?(n=>s=>!n&&(e(s),n=1,o(()=>n=0)))():((n=0)=>(s,i=++n)=>o(()=>i==n&&e(s)))()},u=gt});var N,T,ce,ae,M,bt,v,Se,R,Y=p(()=>{m();N=Symbol("signals"),T=Symbol("change"),ce=Symbol("set"),ae=!0,M=(e,t)=>{if(!e||e[Symbol.toStringTag]||e[N])return e;if(e.constructor!==Object)return Array.isArray(e)?bt(e):e;let r=Object.keys(e).length,o={},n=new Proxy(Object.assign(o,{[T]:x(r),[N]:o}),{get:(i,a)=>a in o?o[a]?o[a].valueOf():o[a]:t?t[a]:typeof globalThis[a]=="function"&&!globalThis[a].prototype?globalThis[a].bind(globalThis):globalThis[a],set:(i,a,c)=>a in o?(Se(o,a,c),1):(ae=!1,t&&a in t?t[a]=c:(v(o,a,c),o[T].value=++r),ae=!0,1),deleteProperty:(i,a)=>(a in o&&(a[0]!="_"&&o[a]?.[Symbol.dispose]?.(),delete o[a],o[T].value=--r),1),ownKeys:()=>(o[T].value,Reflect.ownKeys(o)),has:(i,a)=>a in o?!0:t?a in t:ae}),s=Object.getOwnPropertyDescriptors(e);for(let i in e)s[i]?.get?(o[i]=B(s[i].get.bind(n)))[ce]=s[i].set?.bind(n):v(o,i,e[i]);return n},bt=(e,t=globalThis)=>{let r=Array(e.length).fill(null),o=!1,n=a=>function(){return o=!0,a.apply(this,arguments)},s=x(e.length),i=new Proxy(Object.assign(r,{[T]:s,[N]:r,push:n(r.push),pop:n(r.pop),shift:n(r.shift),unshift:n(r.unshift),splice:n(r.splice)}),{get(a,c){return c==="length"?o?(o=!1,r.length):s.value:typeof c=="symbol"||isNaN(c)?r[c]?.valueOf()??t[c]:(r[c]??(r[c]=x(M(e[c])))).valueOf()},set(a,c,l){if(c==="length"){for(let h=l;h<r.length;h++)delete i[h];s.value=r.length=l}else c>=r.length?(v(r,c,l),i.length=+c+1):r[c]?Se(r,c,l):v(r,c,l);return 1},deleteProperty:(a,c)=>(r[c]?.[Symbol.dispose]?.(),delete r[c],1)});return i},v=(e,t,r)=>e[t]=t[0]=="_"||r?.peek?r:x(M(r)),Se=(e,t,r,o,n)=>t[0]==="_"?e[t]=r:r!==(n=(o=e[t]).peek())&&(o[ce]?o[ce](r):Array.isArray(r)&&Array.isArray(n)?T in n?L(()=>I(()=>{for(let s=0;s<r.length;s++)n[s]=r[s];n.length=r.length})):o.value=r:o.value=M(r)),R=M});var le={};ye(le,{batch:()=>_t,computed:()=>xt,effect:()=>Ne,signal:()=>Ae,untracked:()=>St});var E,we,F,Ae,Ne,xt,_t,St,Oe=p(()=>{we=0,Ae=(e,t,r=new Set,o=()=>t.value)=>t={get value(){return E?.deps.add(r.add(E)),e},set value(n){if(n!==e){e=n;for(let s of r)F?F.add(s):s()}},peek(){return e},toJSON:o,toString:o,valueOf:o},Ne=(e,t,r,o)=>(r=n=>{let s=t;if(t=null,s?.call?.(),n=E,E=r,we++>10)throw"Cycle detected";try{t=e()}finally{E=n,we--}},r.fn=e,o=r.deps=new Set,r(),n=>{t?.call?.();for(n of o)n.delete(r);o.clear()}),xt=(e,t=Ae(),r,o,n=()=>r.value)=>r={get value(){return o||(o=Ne(()=>t.value=e())),t.value},peek:t.peek,toJSON:n,toString:n,valueOf:n},_t=(e,t=!F,r)=>{F??(F=new Set);try{e()}finally{if(t){[F,r]=[null,F];for(let o of r)o()}}},St=(e,t,r)=>(t=E,E=null,r=e(),E=t,r)});var Te,Ce=p(()=>{m();Te=(e,t)=>{var s;let r,o,n;return e._holder?u(o=e,t):(e[s=f]??(e[s]=null),o=e.content?k(e):e,e.replaceWith(r=document.createTextNode("")),o._holder=r._holder=r,r._clauses=[o._clause=[o,!1]],r.update=D(()=>{let i=r._clauses.find(([,a])=>a);i!=n&&(n?.[0].remove(),n?.[0][z]?.(),(n=i)&&(r.before(n[0].content||n[0]),n[0][f]?n[0][G]?.():(delete n[0][f],u(n[0],t))))})),i=>{o._clause[1]=i,o._holder.update()}}});var je,ke=p(()=>{m();je=e=>{let t,r=e;for(t=e.content?k(e):e;r&&!(t._holder=r._holder);)r=r.previousSibling;return e.remove(),e[f]=null,t._holder._clauses.push(t._clause=[t,!0]),t._holder.update}});var De,Ee=p(()=>{m();De=e=>(e.content&&e.replaceWith(e=k(e).childNodes[0]),t=>(t=typeof t=="function"?t(e.textContent):t,e.textContent=t??""))});var $e,Le=p(()=>{m();$e=(e,t,r,o)=>{let n=new Set,s;return o.includes(".")&&(e=w({target:e},o.split(".").slice(1)).target??e),i=>{s=new Set,i&&se(typeof i=="function"?i(e.className):i).split(" ").map(a=>a&&s.add(a));for(let a of n)s.has(a)?s.delete(a):e.classList.remove(a);for(let a of n=s)e.classList.add(a)}}});var qe,Me=p(()=>{m();qe=(e,t,r,o)=>{let n;return o.includes(".")&&(e=w({target:e},o.split(".").slice(1)).target??e),s=>{if(n||(n=e.getAttribute("style")),s=typeof s=="function"?s(e.style):s,typeof s=="string")A(e,"style",n+"; "+s);else{n&&A(e,"style",n);for(let i in s)i[0]=="-"?e.style.setProperty(i,s[i]):i[0]>"A"&&(e.style[i]=s[i])}}}});var Pe,We=p(()=>{Pe=()=>e=>typeof e=="function"&&e()});var ue,Ke,de=p(()=>{m();ue=(e,t=y(`${e}=__`))=>(r,o)=>{r.__=o,t(r),delete r.__},Ke=(e,t,r)=>{try{let o=ue(r),n=e.type==="checkbox"?()=>o(t,e.checked):e.type==="select-multiple"?()=>o(t,[...e.selectedOptions].map(s=>s.value)):()=>o(t,e.selectedIndex<0?null:isNaN(e.valueAsNumber)?e.value:e.valueAsNumber);e.oninput=e.onchange=n,e.type?.startsWith("select")&&(new MutationObserver(n).observe(e,{childList:!0,subtree:!0,attributes:!0}),u(e,t)),y(r)(t)??n()}catch{}return e.type==="text"||e.type===""||e.tagName==="TEXTAREA"?(o,n,s)=>(n=e.selectionStart,s=e.selectionEnd,e.setAttribute("value",e.value=o??""),n&&e.setSelectionRange(n,s)):e.type==="checkbox"?o=>(e.checked=o,A(e,"checked",o)):e.type==="radio"?o=>e.value===o&&(e.checked=o,A(e,"checked",o)):e.type==="select-one"?o=>{for(let n of e.options)n.value==o?n.setAttribute("selected",""):n.removeAttribute("selected");e.value=o}:e.type==="select-multiple"?o=>{for(let n of e.options)n.removeAttribute("selected");for(let n of o)e.querySelector(`[value="${n}"]`).setAttribute("selected","")}:o=>e.value=o}});var Ie,Re=p(()=>{m();de();Ie=(e,t,r)=>{let o=y(r)(t);if(typeof o=="function")return{[Symbol.dispose]:o(e)};ue(r)(t,e)}});var Fe,He=p(()=>{m();Fe=(e,t)=>{let r=e[f]=M({},t),o=!1;return n=>{if(n=typeof n=="function"?n(r):n,n!==r)for(let s in n){let i=typeof n[s]=="function"?n[s].bind(r):n[s];s in r[N]?r[s]=i:r[N][s]=s[0]=="_"||i?.peek?i:x(M(i))}return!o&&(o=!0,delete e[f],L(()=>u(e,r)))}}});var Ve,ze=p(()=>{m();Ve=(e,t,r)=>{let[o,n]=r.split(/\bin|of\b/),[s,i="$"]=o.trim().replace(/\(|\)/g,"").split(/\s*,\s*/),a=document.createTextNode(""),c,l,h,C=0,O=D(()=>{var j,g;let d=0,$=h,_=$.length;if(c&&!c[T]){for(let P of c[N]||[])P[Symbol.dispose]();c=null,C=0}if(_<C)c.length=_;else{if(!c)c=$;else for(;d<C;)c[d]=$[d++];let V=_-d>1?document.createDocumentFragment():null,he=V?[]:null;for(;d<_;d++){c[d]=$[d];let W=d,S=e.content?k(e):e.cloneNode(!0),Z=S.content||S;if(V)V.appendChild(Z),he.push([S,W]);else{a.before(Z);let ut=Object.create(t,{[s]:{get:()=>c[W]},[i]:{value:l?l[W]:W}});u(S,ut)}let lt=((g=c[j=N]||(c[j]=[]))[d]||(g[d]={}))[Symbol.dispose];c[N][d][Symbol.dispose]=()=>{lt?.(),S[Symbol.dispose]?.(),S.remove()}}if(V){a.before(V);for(let[W,S]of he){let Z=Object.create(t,{[s]:{get:()=>c[S]},[i]:{value:l?l[S]:S}});u(W,Z)}}}C=_});return e.replaceWith(a),e[f]=null,Object.assign(d=>(l=null,typeof d=="number"?h=Array.from({length:d},($,_)=>_+1):d?.constructor===Object?(l=Object.keys(d),h=Object.values(d)):h=d||[],K(()=>{h[T]?.value,O()})),{eval:y(n)})}});var Be,Je=p(()=>{m();Be=(e,t,r,o)=>n=>A(e,o,typeof n=="function"?n(e.getAttribute(o)):n)});var Xe,Ze=p(()=>{m();Xe=e=>t=>{for(let r in t)A(e,_e(r),t[r])}});var Ge,Qe=p(()=>{m();Ge=(e,t,r,o)=>{let[n,...s]=o.slice(2).split("."),i=y(r).bind(e),a=w(Object.assign(c=>i(t,l=>typeof l=="function"?l(c):l),{target:e}),s);return a.target.addEventListener(n,a,a),{[Symbol.dispose](){a.target.removeEventListener(n,a)}}}});var Ue,Ye=p(()=>{m();Ue=(e,t,r,o)=>{let n,s,i=o.split("..").map((a,c,{length:l})=>a.split(":").reduce((h,C)=>{let[O,...d]=C.slice(2).split("."),$=y(r).bind(e),_=(g,P)=>n=typeof g=="function"?g(P):g,j=w(Object.assign(g=>(c?_(n,g):$(t,P=>_(P,g)),s(),s=i[(c+1)%l]()),{target:e}),d);return g=>(g=h?.(),j.target.addEventListener(O,j,j),()=>(g?.(),j.target.removeEventListener(O,j)))},null));return s=i[0](),{[Symbol.dispose](){s?.()}}}});var ve,et=p(()=>{m();ve=(e,t)=>{if(e.content){let r=document.createTextNode(""),o=document.createTextNode(""),n=document.createRange();return e.replaceWith(r,o),s=>{if(s=typeof s=="function"?s(""):s,n.setStartAfter(r),n.setEndBefore(o),n.deleteContents(),s!=null&&s!==""){let i=n.createContextualFragment(s);u(i,t),n.insertNode(i)}}}return r=>(r=typeof r=="function"?r(e.innerHTML):r,e.innerHTML=r??"",u(e,t),e[b])}});var tt,rt=p(()=>{tt=(e,t,r)=>{let o=document.createComment(":portal"),n=null;return e.before(o),s=>{let i=e.getRootNode(),a=typeof s=="string"?i.querySelector?.(s)||document.querySelector(s):s instanceof Element?s:s?document.body:null;a!==n&&(a?a.appendChild(e):o.after(e),n=a)}}});var ot,nt=p(()=>{ot=e=>t=>e.hidden=!!t});var it={};ye(it,{batch:()=>I,computed:()=>B,debounce:()=>ie,default:()=>Ct,dispose:()=>Tt,effect:()=>K,signal:()=>x,sprae:()=>u,start:()=>Ot,store:()=>R,throttle:()=>D,untracked:()=>L,use:()=>U});var wt,At,pe,fe,st,Nt,Ot,Tt,Ct,at=p(()=>{Y();m();Oe();m();Ce();ke();Ee();Le();Me();We();de();Re();He();ze();Je();Ze();Qe();Ye();et();rt();nt();Object.assign(J,{_:(e,t,r,o)=>(o.startsWith("on")?Ge:Be)(e,t,r,o),"":Xe,class:$e,text:De,html:ve,style:qe,fx:Pe,value:Ke,ref:Ie,scope:Fe,if:Te,else:je,each:Ve,portal:tt,hidden:ot});wt=(e,t,r,o)=>{let[n,...s]=t.split("."),i=J[n]||J._;return()=>{let a=i(e,o,r,t);if(!a?.call)return a?.[b];let c=w(Object.assign(D(()=>l.value++),{target:e}),s),l=x(0),h=0,C=a.eval??y(r).bind(e),O,d=()=>(typeof O=="function"&&O(),O=null);return o=e[f]??o,K(()=>(l.value==h?c():(h=l.value,O=C(o,a)),d))}},At=e=>e?typeof e=="number"?e:(([,t,r]=e.match(/^(\d+)(ms|s|m)?$/)||[])=>(t=+t,r==="s"?t*1e3:r==="m"?t*6e4:t))():0,pe=e=>e==="idle"?requestIdleCallback:e==="raf"?requestAnimationFrame:!e||e==="tick"?queueMicrotask:t=>setTimeout(t,At(e));Object.assign(q,{debounce:(e,t,r)=>ie(e,pe(t==="immediate"?r:t),t==="immediate"||r==="immediate"),throttle:(e,t)=>D(e,pe(t)),delay:(e,t)=>((r=pe(t))=>o=>r(()=>e(o)))(),tick:e=>(console.warn("Deprecated"),t=>queueMicrotask(()=>e(t))),raf:e=>(console.warn("Deprecated"),t=>requestAnimationFrame(()=>e(t))),once:(e,t,r)=>(r=o=>!t&&(t=1,e(o)),r.once=!0,r),window:e=>(e.target=e.target.ownerDocument.defaultView,e),document:e=>(e.target=e.target.ownerDocument,e),root:e=>(e.target=e.target.ownerDocument.documentElement,e),body:e=>(e.target=e.target.ownerDocument.body,e),parent:e=>(e.target=e.target.parentNode,e),self:e=>t=>t.target===e.target&&e(t),away:e=>Object.assign(t=>!e.target.contains(t.target)&&t.target.isConnected&&e(t),{target:e.target.ownerDocument}),prevent:e=>t=>(t?.preventDefault(),e(t)),stop:(e,t)=>r=>(t?.[0]==="i"?r?.stopImmediatePropagation():r?.stopPropagation(),e(r)),immediate:e=>(console.warn("Deprecated"),t=>(t?.stopImmediatePropagation(),e(t))),passive:e=>(e.passive=!0,e),capture:e=>(e.capture=!0,e)});q.outside=q.away;fe={ctrl:e=>e.ctrlKey||e.key==="Control"||e.key==="Ctrl",shift:e=>e.shiftKey||e.key==="Shift",alt:e=>e.altKey||e.key==="Alt",meta:e=>e.metaKey||e.key==="Meta",cmd:e=>e.metaKey||e.key==="Command",arrow:e=>e.key.startsWith("Arrow"),enter:e=>e.key==="Enter",esc:e=>e.key.startsWith("Esc"),tab:e=>e.key==="Tab",space:e=>e.key==="\xA0"||e.key==="Space"||e.key===" ",delete:e=>e.key==="Delete"||e.key==="Backspace",digit:e=>/^\d$/.test(e.key),letter:e=>/^\p{L}$/gu.test(e.key),char:e=>/^\S$/.test(e.key)},st=(e,t)=>fe[e]?.(t)||t.key.toLowerCase()===e||t.keyCode==e;for(let e in fe)q[e]=(t,r,o)=>n=>fe[e](n)&&(!r||st(r,n))&&(!o||st(o,n))&&t(n);Nt=e=>{for(let t=0,r=0;r<e.length;r++)if(e[r]=="{")t++;else if(e[r]=="}")t--;else if(e[r]==";"&&!t)return!0;return!1};U({compile:e=>(/^(if|let|const)\b/.test(e)||Nt(e)||(e=`return ${e}`),/\bawait\s/.test(e)&&(e=`return (async()=>{${e}})()`),u.constructor(`with(arguments[0]){${e}}`)),dir:(e,t,r,o)=>t.includes("..")?()=>Ue(e,o,r,t)[b]:t.split(":").reduce((n,s)=>{let i=wt(e,s,r,o);return n?(a,c)=>(a=n(),c=i(),()=>{a(),c()}):i},null),...le});u.use=U;u.store=R;u.directive=J;u.modifier=q;u.dispose=e=>e[b]?.();Ot=u.start=(e=document.body,t)=>{let r=R(t);return u(e,r),new MutationObserver(n=>{for(let s of n){for(let i of s.addedNodes)i.nodeType===1&&i[f]===void 0&&e.contains(i)&&e[Q](i);for(let i of s.removedNodes)i.nodeType===1&&i[b]?.()}}).observe(e,{childList:!0,subtree:!0}),r};u.version="12.4.0";Tt=u.dispose,Ct=u});var me=(at(),ht(it)).default;module.exports=me;var H=document.currentScript,ct=H.getAttribute("prefix")??H.dataset.prefix??H.dataset.spraePrefix,X=H.getAttribute("start")??H.dataset.start??H.dataset.spraeStart;ct&&me.use({prefix:ct});X!=null&&X!=="false"&&(X&&X!=="true"?document.querySelectorAll(X):[document.body||document.documentElement]).forEach(e=>me.start(e));
|
|
2
|
+
var ee=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ft=Object.getOwnPropertyNames;var pt=Object.prototype.hasOwnProperty;var f=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{for(var r in t)ee(e,r,{get:t[r],enumerable:!0})},mt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ft(t))!pt.call(e,n)&&n!==r&&ee(e,n,{get:()=>t[n],enumerable:!(o=dt(t,n))||o.enumerable});return e};var ht=e=>mt(ee({},"__esModule",{value:!0}),e);var b,p,G,B,Q,re,x,K,F,I,D,J,q,oe,ne,yt,te,gt,be,xe,y,ge,U,A,k,_e,w,se,E,ie,u,m=f(()=>{Y();Y();b=Symbol.dispose||(Symbol.dispose=Symbol("dispose")),p=Symbol("state"),G=Symbol("on"),B=Symbol("off"),Q=Symbol("init"),re=":",I=e=>e(),D=I,J={},q={},oe=null,ne=null,yt=e=>{if(!e?.tagName)return"";let t=e.tagName.toLowerCase();return e.id?t+="#"+e.id:e.className&&(t+="."+e.className.split(" ")[0]),`<${t}>`},te=(e,t)=>{let r=`\u2234 ${e}`;if(ne&&(r+=`
|
|
3
|
+
in ${yt(ne)}`),oe&&t){let o=t.length>100?t.slice(0,80)+`\u2026 (${t.length} chars)`:t;r+=`
|
|
4
|
+
${oe}="${o}"`}console.error(r)},gt=(e=document.body,t)=>{if(e[p])return Object.assign(e[p],t);t=R(t||{});let r=[],o=[];e[G]=()=>!o&&(o=r.map(s=>s())),e[B]=()=>(o?.map(s=>s()),o=null),e[b]||(e[b]=()=>(e[B](),e[B]=e[G]=e[b]=e[Q]=e[p]=null));let n=e[Q]=s=>{let i=s.attributes,a;if(i)for(let l=0;l<i.length;){let{name:c,value:h}=i[l];if(c.startsWith(re)){if(s.removeAttribute(c),oe=c,ne=s,r.push(a=be(s,c.slice(re.length),h,t)),o.push(a()),p in s)return}else l++}if(s.firstChild!==void 0){let l=s.firstChild,c;for(;l;)c=l.nextSibling,l.nodeType==1&&n(l),l=c}else for(let l of s.childNodes)l.nodeType==1&&n(l)};return n(e),e[p]===void 0&&(e[p]=t),t},y=e=>{let t=ge[e=e.trim()];if(t)return t;try{t=xe(e||"undefined")}catch(r){te(r,e)}return ge[e]=function(r,o,n){try{let s=t?.call(this,r);return o?s?.then?(s.then(i=>n=o(i)).catch(i=>te(i,e)),()=>typeof n=="function"&&n()):o(s):s}catch(s){te(s,e)}}},ge={},U=e=>(e.compile&&(xe=e.compile),e.prefix&&(re=e.prefix),e.signal&&(x=e.signal),e.effect&&(K=e.effect),e.computed&&(F=e.computed),e.batch&&(I=e.batch),e.untracked&&(D=e.untracked),e.dir&&(be=e.dir)),A=(e,t)=>{for(;t.length;){let[r,...o]=t.pop().split("-"),n=q[r],s;if(n&&(s=n(e,...o))!==e){for(let i in e)s[i]??(s[i]=e[i]);e=s}}return e},k=e=>{if(!e.nodeType)return e;let t=e.content.cloneNode(!0),r=[...e.attributes],o=document.createTextNode(""),n=(t.append(o),[...t.childNodes]);return{childNodes:n,content:t,remove:()=>t.append(...n),replaceWith(s){s!==o&&(o.before(s),t.append(...n))},attributes:r,removeAttribute(s){r.splice(r.findIndex(i=>i.name===s),1)}}},_e=e=>e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(t,r)=>(r?"-":"")+t.toLowerCase()),w=(e,t,r)=>r==null||r===!1?e.removeAttribute(t):e.setAttribute(t,r===!0?"":r),se=(e,t=[])=>e?typeof e=="string"?e:(Array.isArray(e)?e.map(se):Object.entries(e).reduce((r,[o,n])=>n?[...r,o]:r,[])).join(" "):"",E=(e,t)=>{let r=0,o,n=typeof t=="function"?t:t?i=>setTimeout(i,t):queueMicrotask,s=i=>{o=i,r++||(e(o),n((a=r>1)=>(r=0,a&&s(o))))};return s},ie=(e,t,r)=>{let o=typeof t=="function"?t:t?n=>setTimeout(n,t):queueMicrotask;return r?(n=>s=>!n&&(e(s),n=1,o(()=>n=0)))():((n=0)=>(s,i=++n)=>o(()=>i==n&&e(s)))()},u=gt});var N,T,le,ae,M,bt,v,Se,R,Y=f(()=>{m();N=Symbol("signals"),T=Symbol("change"),le=Symbol("set"),ae=!0,M=(e,t)=>{if(!e||e[Symbol.toStringTag]||e[N])return e;if(e.constructor!==Object)return Array.isArray(e)?bt(e):e;let r=Object.keys(e).length,o={},n=new Proxy(Object.assign(o,{[T]:x(r),[N]:o}),{get:(i,a)=>a in o?o[a]?o[a].valueOf():o[a]:t?t[a]:typeof globalThis[a]=="function"&&!globalThis[a].prototype?globalThis[a].bind(globalThis):globalThis[a],set:(i,a,l)=>a in o?(Se(o,a,l),1):(ae=!1,t&&a in t?t[a]=l:(v(o,a,l),o[T].value=++r),ae=!0,1),deleteProperty:(i,a)=>(a in o&&(a[0]!="_"&&o[a]?.[Symbol.dispose]?.(),delete o[a],o[T].value=--r),1),ownKeys:()=>(o[T].value,Reflect.ownKeys(o)),has:(i,a)=>a in o?!0:t?a in t:ae}),s=Object.getOwnPropertyDescriptors(e);for(let i in e)s[i]?.get?(o[i]=F(s[i].get.bind(n)))[le]=s[i].set?.bind(n):v(o,i,e[i]);return n},bt=(e,t=globalThis)=>{let r=Array(e.length).fill(null),o=!1,n=a=>function(){return o=!0,a.apply(this,arguments)},s=x(e.length),i=new Proxy(Object.assign(r,{[T]:s,[N]:r,push:n(r.push),pop:n(r.pop),shift:n(r.shift),unshift:n(r.unshift),splice:n(r.splice)}),{get(a,l){return l==="length"?o?(o=!1,r.length):s.value:typeof l=="symbol"||isNaN(l)?r[l]?.valueOf()??t[l]:(r[l]??(r[l]=x(M(e[l])))).valueOf()},set(a,l,c){if(l==="length"){for(let h=c;h<r.length;h++)delete i[h];s.value=r.length=c}else l>=r.length?(v(r,l,c),i.length=+l+1):r[l]?Se(r,l,c):v(r,l,c);return 1},deleteProperty:(a,l)=>(r[l]?.[Symbol.dispose]?.(),delete r[l],1)});return i},v=(e,t,r)=>e[t]=t[0]=="_"||r?.peek?r:x(M(r)),Se=(e,t,r,o,n)=>t[0]==="_"?e[t]=r:r!==(n=(o=e[t]).peek())&&(o[le]?o[le](r):Array.isArray(r)&&Array.isArray(n)?T in n?D(()=>I(()=>{for(let s=0;s<r.length;s++)n[s]=r[s];n.length=r.length})):o.value=r:o.value=M(r)),R=M});var ce={};ye(ce,{batch:()=>_t,computed:()=>xt,effect:()=>Ne,signal:()=>we,untracked:()=>St});var $,Ae,H,we,Ne,xt,_t,St,Oe=f(()=>{Ae=0,we=(e,t,r=new Set,o=()=>t.value)=>t={get value(){return $?.deps.add(r.add($)),e},set value(n){if(n!==e){e=n;for(let s of r)H?H.add(s):s()}},peek(){return e},toJSON:o,toString:o,valueOf:o},Ne=(e,t,r,o)=>(r=n=>{let s=t;if(t=null,s?.call?.(),n=$,$=r,Ae++>10)throw"Cycle detected";try{t=e()}finally{$=n,Ae--}},r.fn=e,o=r.deps=new Set,r(),n=>{t?.call?.();for(n of o)n.delete(r);o.clear()}),xt=(e,t=we(),r,o,n=()=>r.value)=>r={get value(){return o||(o=Ne(()=>t.value=e())),t.value},peek:t.peek,toJSON:n,toString:n,valueOf:n},_t=(e,t=!H,r)=>{H??(H=new Set);try{e()}finally{if(t){[H,r]=[null,H];for(let o of r)o()}}},St=(e,t,r)=>(t=$,$=null,r=e(),$=t,r)});var Te,Ce=f(()=>{m();Te=(e,t)=>{var s;let r,o,n;return e._holder?u(o=e,t):(e[s=p]??(e[s]=null),o=e.content?k(e):e,e.replaceWith(r=document.createTextNode("")),o._holder=r._holder=r,r._clauses=[o._clause=[o,!1]],r.update=E(()=>{let i=r._clauses.find(([,a])=>a);i!=n&&(n?.[0].remove(),n?.[0][B]?.(),(n=i)&&(r.before(n[0].content||n[0]),n[0][p]?n[0][G]?.():(delete n[0][p],u(n[0],t))))})),i=>{o._clause[1]=i,o._holder.update()}}});var je,ke=f(()=>{m();je=e=>{let t,r=e;for(t=e.content?k(e):e;r&&!(t._holder=r._holder);)r=r.previousSibling;return e.remove(),e[p]=null,t._holder._clauses.push(t._clause=[t,!0]),t._holder.update}});var Ee,$e=f(()=>{m();Ee=e=>(e.content&&e.replaceWith(e=k(e).childNodes[0]),t=>(t=typeof t=="function"?t(e.textContent):t,e.textContent=t??""))});var Le,De=f(()=>{m();Le=(e,t,r,o)=>{let n=new Set,s;return o.includes(".")&&(e=A({target:e},o.split(".").slice(1)).target??e),i=>{s=new Set,i&&se(typeof i=="function"?i(e.className):i).split(" ").map(a=>a&&s.add(a));for(let a of n)s.has(a)?s.delete(a):e.classList.remove(a);for(let a of n=s)e.classList.add(a)}}});var qe,Me=f(()=>{m();qe=(e,t,r,o)=>{let n;return o.includes(".")&&(e=A({target:e},o.split(".").slice(1)).target??e),s=>{if(n||(n=e.getAttribute("style")),s=typeof s=="function"?s(e.style):s,typeof s=="string")w(e,"style",n+"; "+s);else{n&&w(e,"style",n);for(let i in s)i[0]=="-"?e.style.setProperty(i,s[i]):i[0]>"A"&&(e.style[i]=s[i])}}}});var We,Pe=f(()=>{We=()=>e=>typeof e=="function"&&e()});var ue,Ke,de=f(()=>{m();ue=(e,t=y(`${e}=__`))=>(r,o)=>{r.__=o,t(r),delete r.__},Ke=(e,t,r)=>{try{let o=ue(r),n=e.type==="checkbox"?()=>o(t,e.checked):e.type==="select-multiple"?()=>o(t,[...e.selectedOptions].map(s=>s.value)):()=>o(t,e.selectedIndex<0?null:isNaN(e.valueAsNumber)?e.value:e.valueAsNumber);e.oninput=e.onchange=n,e.type?.startsWith("select")&&(new MutationObserver(n).observe(e,{childList:!0,subtree:!0,attributes:!0}),u(e,t)),y(r)(t)??n()}catch{}return e.type==="text"||e.type===""||e.tagName==="TEXTAREA"?(o,n,s)=>(n=e.selectionStart,s=e.selectionEnd,e.setAttribute("value",e.value=o??""),n&&e.setSelectionRange(n,s)):e.type==="checkbox"?o=>(e.checked=o,w(e,"checked",o)):e.type==="radio"?o=>e.value===o&&(e.checked=o,w(e,"checked",o)):e.type==="select-one"?o=>{for(let n of e.options)n.value==o?n.setAttribute("selected",""):n.removeAttribute("selected");e.value=o}:e.type==="select-multiple"?o=>{for(let n of e.options)n.removeAttribute("selected");for(let n of o)e.querySelector(`[value="${n}"]`).setAttribute("selected","")}:o=>e.value=o}});var Ie,Re=f(()=>{m();de();Ie=(e,t,r)=>{let o=y(r)(t);if(typeof o=="function")return{[Symbol.dispose]:o(e)};ue(r)(t,e)}});var He,Ve=f(()=>{m();He=(e,t)=>{let r=e[p]=M({},t),o=!1;return n=>{if(n=typeof n=="function"?n(r):n,n!==r)for(let s in n){let i=typeof n[s]=="function"?n[s].bind(r):n[s];s in r[N]?r[s]=i:r[N][s]=s[0]=="_"||i?.peek?i:x(M(i))}return!o&&(o=!0,delete e[p],D(()=>u(e,r)))}}});var ze,Be=f(()=>{m();ze=(e,t,r)=>{let[o,n]=r.split(/\bin|of\b/),[s,i="$"]=o.trim().replace(/\(|\)/g,"").split(/\s*,\s*/),a=document.createTextNode(""),l,c,h,C=0,O=E(()=>{var j,g;let d=0,L=h,_=L.length;if(l&&!l[T]){for(let W of l[N]||[])W[Symbol.dispose]();l=null,C=0}if(_<C)l.length=_;else{if(!l)l=L;else for(;d<C;)l[d]=L[d++];let z=_-d>1?document.createDocumentFragment():null,he=z?[]:null;for(;d<_;d++){l[d]=L[d];let P=d,S=e.content?k(e):e.cloneNode(!0),Z=S.content||S;if(z)z.appendChild(Z),he.push([S,P]);else{a.before(Z);let ut=Object.create(t,{[s]:{get:()=>l[P]},[i]:{value:c?c[P]:P}});u(S,ut)}let ct=((g=l[j=N]||(l[j]=[]))[d]||(g[d]={}))[Symbol.dispose];l[N][d][Symbol.dispose]=()=>{ct?.(),S[Symbol.dispose]?.(),S.remove()}}if(z){a.before(z);for(let[P,S]of he){let Z=Object.create(t,{[s]:{get:()=>l[S]},[i]:{value:c?c[S]:S}});u(P,Z)}}}C=_});return e.replaceWith(a),e[p]=null,Object.assign(d=>(c=null,typeof d=="number"?h=Array.from({length:d},(L,_)=>_+1):d?.constructor===Object?(c=Object.keys(d),h=Object.values(d)):h=d||[],K(()=>{h[T]?.value,O()})),{eval:y(n)})}});var Fe,Je=f(()=>{m();Fe=(e,t,r,o)=>n=>w(e,o,typeof n=="function"?n(e.getAttribute(o)):n)});var Xe,Ze=f(()=>{m();Xe=e=>t=>{for(let r in t)w(e,_e(r),t[r])}});var Ge,Qe=f(()=>{m();Ge=(e,t,r,o)=>{let[n,...s]=o.slice(2).split("."),i=y(r).bind(e),a=A(Object.assign(l=>i(t,c=>typeof c=="function"?c(l):c),{target:e}),s);return a.target.addEventListener(n,a,a),{[Symbol.dispose](){a.target.removeEventListener(n,a)}}}});var Ue,Ye=f(()=>{m();Ue=(e,t,r,o)=>{let n,s,i=o.split("..").map((a,l,{length:c})=>a.split(":").reduce((h,C)=>{let[O,...d]=C.slice(2).split("."),L=y(r).bind(e),_=(g,W)=>n=typeof g=="function"?g(W):g,j=A(Object.assign(g=>(l?_(n,g):L(t,W=>_(W,g)),s(),s=i[(l+1)%c]()),{target:e}),d);return g=>(g=h?.(),j.target.addEventListener(O,j,j),()=>(g?.(),j.target.removeEventListener(O,j)))},null));return s=i[0](),{[Symbol.dispose](){s?.()}}}});var ve,et=f(()=>{m();ve=(e,t)=>{if(e.content){let r=document.createTextNode(""),o=document.createTextNode(""),n=document.createRange();return e.replaceWith(r,o),s=>{if(s=typeof s=="function"?s(""):s,n.setStartAfter(r),n.setEndBefore(o),n.deleteContents(),s!=null&&s!==""){let i=n.createContextualFragment(s);u(i,t),n.insertNode(i)}}}return r=>(r=typeof r=="function"?r(e.innerHTML):r,e.innerHTML=r??"",u(e,t),e[b])}});var tt,rt=f(()=>{tt=(e,t,r)=>{let o=document.createComment(":portal"),n=null;return e.before(o),s=>{let i=e.getRootNode(),a=typeof s=="string"?i.querySelector?.(s)||document.querySelector(s):s instanceof Element?s:s?document.body:null;a!==n&&(a?a.appendChild(e):o.after(e),n=a)}}});var ot,nt=f(()=>{ot=e=>t=>e.hidden=!!t});var it={};ye(it,{batch:()=>I,computed:()=>F,debounce:()=>ie,default:()=>Ct,dispose:()=>Tt,effect:()=>K,signal:()=>x,sprae:()=>u,start:()=>Ot,store:()=>R,throttle:()=>E,untracked:()=>D,use:()=>U});var At,wt,fe,pe,st,Nt,Ot,Tt,Ct,at=f(()=>{Y();m();Oe();m();Ce();ke();$e();De();Me();Pe();de();Re();Ve();Be();Je();Ze();Qe();Ye();et();rt();nt();Object.assign(J,{_:(e,t,r,o)=>(o.startsWith("on")?Ge:Fe)(e,t,r,o),"":Xe,class:Le,text:Ee,html:ve,style:qe,fx:We,value:Ke,ref:Ie,scope:He,if:Te,else:je,each:ze,portal:tt,hidden:ot});At=(e,t,r,o)=>{let[n,...s]=t.split("."),i=J[n]||J._;return()=>{let a=i(e,o,r,t);if(!a?.call)return a?.[b];let l=A(Object.assign(E(()=>c.value++),{target:e}),s),c=x(0),h=0,C=a.eval??y(r).bind(e),O,d=()=>(typeof O=="function"&&O(),O=null);return o=e[p]??o,K(()=>(c.value==h?l():(h=c.value,O=C(o,a)),d))}},wt=e=>e?typeof e=="number"?e:(([,t,r]=e.match(/^(\d+)(ms|s|m)?$/)||[])=>(t=+t,r==="s"?t*1e3:r==="m"?t*6e4:t))():0,fe=e=>e==="idle"?requestIdleCallback:e==="raf"?requestAnimationFrame:!e||e==="tick"?queueMicrotask:t=>setTimeout(t,wt(e));Object.assign(q,{debounce:(e,t,r)=>ie(e,fe(t==="immediate"?r:t),t==="immediate"||r==="immediate"),throttle:(e,t)=>E(e,fe(t)),delay:(e,t)=>((r=fe(t))=>o=>r(()=>e(o)))(),once:(e,t,r)=>(r=o=>!t&&(t=1,e(o)),r.once=!0,r),window:e=>(e.target=e.target.ownerDocument.defaultView,e),document:e=>(e.target=e.target.ownerDocument,e),root:e=>(e.target=e.target.ownerDocument.documentElement,e),body:e=>(e.target=e.target.ownerDocument.body,e),parent:e=>(e.target=e.target.parentNode,e),self:e=>t=>t.target===e.target&&e(t),away:e=>Object.assign(t=>!e.target.contains(t.target)&&t.target.isConnected&&e(t),{target:e.target.ownerDocument}),prevent:e=>t=>(t?.preventDefault(),e(t)),stop:(e,t)=>r=>(t?.[0]==="i"?r?.stopImmediatePropagation():r?.stopPropagation(),e(r)),passive:e=>(e.passive=!0,e),capture:e=>(e.capture=!0,e)});q.outside=q.away;pe={ctrl:e=>e.ctrlKey||e.key==="Control"||e.key==="Ctrl",shift:e=>e.shiftKey||e.key==="Shift",alt:e=>e.altKey||e.key==="Alt",meta:e=>e.metaKey||e.key==="Meta",cmd:e=>e.metaKey||e.key==="Command",arrow:e=>e.key.startsWith("Arrow"),enter:e=>e.key==="Enter",esc:e=>e.key.startsWith("Esc"),tab:e=>e.key==="Tab",space:e=>e.key==="\xA0"||e.key==="Space"||e.key===" ",delete:e=>e.key==="Delete"||e.key==="Backspace",digit:e=>/^\d$/.test(e.key),letter:e=>/^\p{L}$/gu.test(e.key),char:e=>/^\S$/.test(e.key)},st=(e,t)=>pe[e]?.(t)||t.key.toLowerCase()===e||t.keyCode==e;for(let e in pe)q[e]=(t,r,o)=>n=>pe[e](n)&&(!r||st(r,n))&&(!o||st(o,n))&&t(n);Nt=e=>{for(let t=0,r=0;r<e.length;r++)if(e[r]=="{")t++;else if(e[r]=="}")t--;else if(e[r]==";"&&!t)return!0;return!1};U({compile:e=>(/^(if|let|const)\b/.test(e)||Nt(e)||(e=`return ${e}`),/\bawait\s/.test(e)&&(e=`return (async()=>{${e}})()`),u.constructor(`with(arguments[0]){${e}}`)),dir:(e,t,r,o)=>t.includes("..")?()=>Ue(e,o,r,t)[b]:t.split(":").reduce((n,s)=>{let i=At(e,s,r,o);return n?(a,l)=>(a=n(),l=i(),()=>{a(),l()}):i},null),...ce});u.use=U;u.store=R;u.directive=J;u.modifier=q;u.dispose=e=>e[b]?.();Ot=u.start=(e=document.body,t)=>{let r=R(t);return u(e,r),new MutationObserver(n=>{for(let s of n){for(let i of s.addedNodes)i.nodeType===1&&i[p]===void 0&&e.contains(i)&&e[Q](i);for(let i of s.removedNodes)i.nodeType===1&&i[b]?.()}}).observe(e,{childList:!0,subtree:!0}),r};u.version="12.4.1";Tt=u.dispose,Ct=u});var me=(at(),ht(it)).default;module.exports=me;var V=document.currentScript,lt=V.getAttribute("prefix")??V.dataset.prefix??V.dataset.spraePrefix,X=V.getAttribute("start")??V.dataset.start??V.dataset.spraeStart;lt&&me.use({prefix:lt});X!=null&&X!=="false"&&(X&&X!=="true"?document.querySelectorAll(X):[document.body||document.documentElement]).forEach(e=>me.start(e));
|
|
5
5
|
;if (typeof module.exports == "object" && typeof exports == "object") {
|
|
6
6
|
var __cp = (to, from, except, desc) => {
|
|
7
7
|
if ((from && typeof from === "object") || typeof from === "function") {
|
package/dist/sprae.umd.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../core.js", "../store.js", "../signal.js", "../directive/if.js", "../directive/else.js", "../directive/text.js", "../directive/class.js", "../directive/style.js", "../directive/fx.js", "../directive/value.js", "../directive/ref.js", "../directive/scope.js", "../directive/each.js", "../directive/_.js", "../directive/spread.js", "../directive/event.js", "../directive/sequence.js", "../directive/html.js", "../directive/portal.js", "../directive/hidden.js", "../sprae.js", "<stdin>"],
|
|
4
|
-
"sourcesContent": ["import store, { _change, _signals } from \"./store.js\";\n\n/** Symbol for disposal (using standard Symbol.dispose if available) */\nexport const _dispose = (Symbol.dispose ||= Symbol(\"dispose\"))\n\n/** Symbol for accessing element's reactive state */\nexport const _state = Symbol(\"state\")\n\n/** Symbol for enabling element effects */\nexport const _on = Symbol('on')\n\n/** Symbol for disabling element effects */\nexport const _off = Symbol('off')\n\n/** Symbol for adding child to element */\nexport const _add = Symbol('init')\n\n/** Directive prefix (default: ':') */\nexport let prefix = ':';\n\n/**\n * A reactive signal containing a value.\n * @template T\n * @typedef {Object} Signal\n * @property {T} value - Current value (reading subscribes, writing notifies)\n * @property {() => T} peek - Read without subscribing\n * @property {() => T} valueOf - Get value for coercion\n * @property {() => T} toJSON - Get value for JSON serialization\n * @property {() => string} toString - Get value as string\n */\n\n/**\n * Internal effect function type.\n * @typedef {Object} EffectFn\n * @property {Set<Set<EffectFn>>} deps - Dependency sets\n * @property {() => void} fn - Original function\n */\n\n/**\n * Creates a reactive signal.\n * @template T\n * @type {<T>(value: T) => Signal<T>}\n */\nexport let signal;\n\n/**\n * Creates a reactive effect that re-runs when dependencies change.\n * @type {(fn: () => void | (() => void)) => () => void}\n */\nexport let effect;\n\n/**\n * Creates a computed signal derived from other signals.\n * @template T\n * @type {<T>(fn: () => T) => Signal<T>}\n */\nexport let computed;\n\n/**\n * Batches multiple signal updates into a single notification.\n * @template T\n * @type {<T>(fn: () => T) => T}\n */\nexport let batch = (fn) => fn();\n\n/**\n * Runs a function without tracking signal dependencies.\n * @template T\n * @type {<T>(fn: () => T) => T}\n */\nexport let untracked = batch;\n\n/**\n * Registry of directive handlers.\n * @type {Record<string, DirectiveHandler>}\n */\nexport let directive = {};\n\n/**\n * Registry of modifier functions.\n * @type {Record<string, ModifierHandler>}\n */\nexport let modifier = {}\n\nlet currentDir = null;\nlet currentEl = null;\n\n/**\n * Formats element for error message (minimal context).\n * @param {Element} [el] - Element to format\n * @returns {string} Element hint like \"<div#id.class>\"\n */\nconst elHint = (el) => {\n if (!el?.tagName) return ''\n let hint = el.tagName.toLowerCase()\n if (el.id) hint += '#' + el.id\n else if (el.className) hint += '.' + el.className.split(' ')[0]\n return `<${hint}>`\n}\n\n/**\n * Reports an error with context.\n * @param {Error|string} e - Error to report\n * @param {string} [expr] - Expression that caused error\n */\nconst err = (e, expr) => {\n let msg = `\u2234 ${e}`\n if (currentEl) msg += `\\n in ${elHint(currentEl)}`\n if (currentDir && expr) msg += `\\n ${currentDir}=\"${expr}\"`\n console.error(msg)\n}\n\n/**\n * @callback DirectiveHandler\n * @param {Element} el - Target element\n * @param {Object} state - Reactive state object\n * @param {string} expr - Expression string\n * @param {string} [name] - Directive name with modifiers\n * @returns {((value: any) => void | (() => void)) | { [Symbol.dispose]: () => void } | void}\n */\n\n/**\n * @callback ModifierHandler\n * @param {Function} fn - Function to modify\n * @param {...string} args - Modifier arguments (from dash-separated values)\n * @returns {Function}\n */\n\n/**\n * @typedef {Object} SpraeState\n * @property {Record<string, Signal>} [_signals] - Internal signals map\n */\n\n/**\n * Applies directives to an HTML element and manages its reactive state.\n *\n * @param {Element} [el=document.body] - The target HTML element to apply directives to.\n * @param {Object} [state] - Initial state values to populate the element's reactive state.\n * @returns {SpraeState & Object} The reactive state object associated with the element.\n */\nconst sprae = (el = document.body, state) => {\n // repeated call can be caused by eg. :each with new objects with old keys\n if (el[_state]) return Object.assign(el[_state], state)\n\n // console.group('sprae', el)\n\n // take over existing state instead of creating a clone\n state = store(state || {})\n\n let fx = [], offs = []\n\n // on/off all effects\n // we don't call prevOn as convention: everything defined before :else :if won't be disabled by :if\n // imagine <x :onx=\"...\" :if=\"...\"/> - when :if is false, it disables directives after :if (calls _off) but ignores :onx\n el[_on] = () => (!offs && (offs = fx.map(fn => fn())))\n el[_off] = () => (offs?.map(off => off()), offs = null)\n\n // destroy\n el[_dispose] ||= () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_add] = el[_state] = null)\n\n const add = el[_add] = (el) => {\n let _attrs = el.attributes, start;\n\n // we iterate live collection (subsprae can init args)\n if (_attrs) for (let i = 0; i < _attrs.length;) {\n let { name, value } = _attrs[i]\n\n if (name.startsWith(prefix)) {\n el.removeAttribute(name)\n\n currentDir = name;\n currentEl = el;\n\n // directive initializer can be redefined\n fx.push(start = dir(el, name.slice(prefix.length), value, state)), offs.push(start())\n\n // stop after subsprae like :each, :if, :scope etc.\n if (_state in el) return\n } else i++\n }\n\n // :if and :each replace element with text node, which tweaks .children length, but .childNodes length persists\n // real DOM: firstChild/nextSibling avoids array copy; frag.childNodes is already snapshot array\n if (el.firstChild !== undefined) {\n let child = el.firstChild, next\n while (child) (next = child.nextSibling, child.nodeType == 1 && add(child), child = next)\n }\n else for (let child of el.childNodes) child.nodeType == 1 && add(child)\n };\n\n add(el);\n\n // if element was spraed by inline :with/:if/:each/etc instruction (meaning it has state placeholder) - skip, otherwise save _state\n if (el[_state] === undefined) el[_state] = state\n\n // console.groupEnd()\n\n return state;\n}\n\n// directive initializer\n/** @type {(el: Element, name: string, expr: string, state: Object) => () => (() => void) | void} */\nexport let dir\n\n/**\n * Compiles an expression string into an evaluator function.\n * @type {(expr: string) => (state: Object) => any}\n */\nexport let compile\n\n/**\n * Parses an expression into an evaluator function, caching the result for reuse.\n *\n * @param {string} expr - The expression to parse and compile into a function.\n * @returns {(state: Object, cb?: (value: any) => any) => any} The compiled evaluator function for the expression.\n */\nexport const parse = (expr) => {\n let fn = cache[expr=expr.trim()]\n if (fn) return fn\n\n // static time errors\n try {\n fn = compile(expr || 'undefined')\n // Object.defineProperty(fn, \"name\", { value: `\u2234 ${expr}` })\n } catch (e) { err(e, expr) }\n\n // run time errors\n return cache[expr] = function (state, cb, _out) {\n try {\n let result = fn?.call(this, state)\n // if cb is given (to handle async/await exprs, usually directive update) - call it with result and return a cleanup function\n if (cb) return result?.then\n ? (result.then(v => _out = cb(v)).catch(e => err(e, expr)), () => typeof _out === 'function' && _out())\n : cb(result)\n else return result\n } catch (e) {\n err(e, expr)\n }\n }\n}\nconst cache = {};\n\n\n/**\n * @typedef {Object} SpraeConfig\n * @property {(expr: string) => (state: Object) => any} [compile] - Custom expression compiler\n * @property {string} [prefix] - Directive prefix (default: ':')\n * @property {<T>(value: T) => Signal<T>} [signal] - Signal factory\n * @property {(fn: () => void | (() => void)) => () => void} [effect] - Effect factory\n * @property {<T>(fn: () => T) => Signal<T>} [computed] - Computed factory\n * @property {<T>(fn: () => T) => T} [batch] - Batch function\n * @property {<T>(fn: () => T) => T} [untracked] - Untracked function\n * @property {(el: Element, name: string, expr: string, state: Object) => () => (() => void) | void} [dir] - Directive initializer\n */\n\n/**\n * Configure sprae with custom signals, compiler, or prefix.\n * @param {SpraeConfig} config - Configuration options\n * @returns {void}\n */\nexport const use = (config) => (\n config.compile && (compile = config.compile),\n config.prefix && (prefix = config.prefix),\n config.signal && (signal = config.signal),\n config.effect && (effect = config.effect),\n config.computed && (computed = config.computed),\n config.batch && (batch = config.batch),\n config.untracked && (untracked = config.untracked),\n config.dir && (dir = config.dir)\n)\n\n/**\n * Applies modifiers to a function.\n * @param {Function & { target?: Element }} fn - Function to decorate\n * @param {string[]} mods - Modifier names with arguments (e.g., ['throttle-500', 'prevent'])\n * @returns {Function} Decorated function\n */\nexport const decorate = (fn, mods) => {\n while (mods.length) {\n let [name, ...params] = mods.pop().split('-'), mod = modifier[name], wrapFn\n if (mod) {\n if ((wrapFn = mod(fn, ...params)) !== fn) {\n for (let k in fn) wrapFn[k] ??= fn[k];\n fn = wrapFn\n }\n }\n }\n return fn\n}\n\n/**\n * @typedef {Object} FragmentLike\n * @property {Node[]} childNodes - Child nodes of the fragment\n * @property {DocumentFragment} content - The document fragment content\n * @property {() => void} remove - Remove the fragment from DOM\n * @property {(el: Node) => void} replaceWith - Replace the fragment with an element\n * @property {Attr[]} attributes - Attributes from the original template\n * @property {(name: string) => void} removeAttribute - Remove an attribute\n */\n\n/**\n * Creates a fragment holder from a template element with minimal API surface.\n * @param {HTMLTemplateElement | FragmentLike} tpl - Template element or existing fragment\n * @returns {FragmentLike} Fragment-like object\n */\nexport const frag = (tpl) => {\n if (!tpl.nodeType) return tpl // existing tpl\n\n let content = tpl.content.cloneNode(true), // document fragment holder of content\n attributes = [...tpl.attributes],\n ref = document.createTextNode(''),\n // ensure at least one node\n childNodes = (content.append(ref), [...content.childNodes])\n\n return {\n childNodes,\n content,\n remove: () => content.append(...childNodes),\n replaceWith(el) {\n if (el === ref) return\n ref.before(el)\n content.append(...childNodes)\n },\n attributes,\n removeAttribute(name) { attributes.splice(attributes.findIndex(a => a.name === name), 1) },\n }\n}\n\n/**\n * Converts camelCase to kebab-case.\n * @param {string} str - String to convert\n * @returns {string} Kebab-case string\n */\nexport const dashcase = (str) => str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());\n\n/**\n * Sets or removes an attribute on an element.\n * @param {Element} el - Target element\n * @param {string} name - Attribute name\n * @param {string | boolean | null | undefined} v - Attribute value (null/false removes, true sets empty)\n * @returns {void}\n */\nexport const attr = (el, name, v) => (v == null || v === false) ? el.removeAttribute(name) : el.setAttribute(name, v === true ? \"\" : v);\n\n/**\n * Converts class input to className string (like clsx/classnames).\n * @param {string | string[] | Record<string, boolean> | null | undefined} c - Class input\n * @returns {string} Space-separated class string\n */\nexport const clsx = (c, _out = []) => !c ? '' : typeof c === 'string' ? c : (\n Array.isArray(c) ? c.map(clsx) :\n Object.entries(c).reduce((s, [k, v]) => !v ? s : [...s, k], [])\n).join(' ')\n\n/**\n * Throttles a function to run at most once per tick (or custom scheduler).\n * Fires on leading edge, then on trailing edge if called during throttle.\n * @template {Function} T\n * @param {T} fn - Function to throttle\n * @param {number|Function} [ms] - Delay in ms or scheduler function (default: microtask)\n * @returns {T} Throttled function\n */\nexport const throttle = (fn, ms) => {\n let _planned = 0, arg, schedule = typeof ms === 'function' ? ms : ms ? (fn) => setTimeout(fn, ms) : queueMicrotask;\n const throttled = (e) => {\n arg = e\n if (!_planned++) fn(arg), schedule((_dirty = _planned > 1) => (\n _planned = 0, _dirty && throttled(arg)\n ));\n }\n return throttled;\n}\n\n/**\n * Debounces a function to run after a delay since the last call.\n * @template {Function} T\n * @param {T} fn - Function to debounce\n * @param {number|Function} [ms] - Delay in ms or scheduler function (default: microtask)\n * @param {boolean} [immediate=false] - Fire on leading edge instead of trailing\n * @returns {T} Debounced function\n */\nexport const debounce = (fn, ms, immediate) => {\n let schedule = typeof ms === 'function' ? ms : ms ? (fn) => setTimeout(fn, ms) : queueMicrotask;\n return immediate\n ? ((_blocked) => (arg) => !_blocked && (fn(arg), _blocked = 1, schedule(() => _blocked = 0)))()\n : ((_count = 0) => (arg, _c = ++_count) => schedule(() => _c == _count && fn(arg)))()\n}\n\n/**\n * Parses time string to milliseconds. Supports: 100, 100ms, 1s, 1m\n * @param {string|number} t - Time value\n * @returns {number} Milliseconds\n */\nexport * from './store.js';\n\nexport default sprae\n", "/**\n * @fileoverview Signals-powered reactive proxy store\n * @module sprae/store\n */\n\nimport { signal, computed, batch, untracked } from './core.js'\n\n/** Symbol for accessing the internal signals map */\nexport const _signals = Symbol('signals')\n\n/** Symbol for the change signal that tracks object keys or array length */\nexport const _change = Symbol('change')\n\n/** Symbol for stashed setter on computed values */\nexport const _set = Symbol('set')\n\n// a hack to simulate sandbox for `with` in evaluator\nlet sandbox = true\n\n/**\n * Reactive store with signals backing.\n * @template T\n * @typedef {T & { [_signals]: Record<string | symbol, import('./core.js').Signal<any>> }} ReactiveStore\n */\n\n/**\n * Creates a reactive proxy store from an object or array.\n * Properties become signals for fine-grained reactivity.\n * Supports nested objects, arrays, computed getters, and methods.\n *\n * @template {Object} T\n * @param {T} values - Initial values object\n * @param {Object} [parent] - Parent scope for inheritance\n * @returns {ReactiveStore<T>} Reactive proxy store\n *\n * @example\n * const state = store({ count: 0, get doubled() { return this.count * 2 } })\n * state.count = 5 // triggers updates\n * state.doubled // 10 (computed)\n */\nexport const store = (values, parent) => {\n if (!values) return values\n\n // ignore globals\n // FIXME: handle via has trap\n if (values[Symbol.toStringTag]) return values;\n\n // bypass existing store\n if (values[_signals]) return values\n\n // non-objects: for array redirect to list\n if (values.constructor !== Object) return Array.isArray(values) ? list(values) : values\n\n // _change stores total number of keys to track new props\n let keyCount = Object.keys(values).length,\n signals = {}\n\n // proxy conducts prop access to signals\n let state = new Proxy(Object.assign(signals, {\n [_change]: signal(keyCount),\n [_signals]: signals\n }), {\n get: (_, k) => {\n if (k in signals) return (signals[k] ? signals[k].valueOf() : signals[k])\n return parent ? parent[k] : (typeof globalThis[k] === 'function' && !globalThis[k].prototype ? globalThis[k].bind(globalThis) : globalThis[k])\n },\n\n set: (_, k, v) => {\n // console.group('SET', k, v)\n if (k in signals) return set(signals, k, v), 1\n\n // turn off sandbox to check if parents have the prop - we don't want to create new prop in global scope\n sandbox = false\n\n // write transparency for parent scope, unlike prototype chain\n // if prop is defined in parent scope (except global) - write there\n if (parent && k in parent) {\n parent[k] = v\n }\n // else create in current scope\n else {\n create(signals, k, v)\n signals[_change].value = ++keyCount\n }\n\n sandbox = true\n\n // console.groupEnd()\n // bump length for new signal\n return 1\n },\n\n // FIXME: try to avild calling Symbol.dispose here. Maybe _delete method?\n deleteProperty: (_, k) => {\n k in signals && (k[0] != '_' && signals[k]?.[Symbol.dispose]?.(), delete signals[k], signals[_change].value = --keyCount)\n return 1\n },\n\n // subscribe to length when spreading\n ownKeys: () => (signals[_change].value, Reflect.ownKeys(signals)),\n\n // sandbox prevents writing to global\n has: (_, k) => {\n if (k in signals) return true\n if (parent) return k in parent\n return sandbox\n }\n })\n\n // init signals for values\n const descs = Object.getOwnPropertyDescriptors(values)\n\n for (let k in values) {\n // getter turns into computed\n if (descs[k]?.get)\n // stash setter\n (signals[k] = computed(descs[k].get.bind(state)))[_set] = descs[k].set?.bind(state);\n\n // init blank signal - make sure we don't take prototype one\n else create(signals, k, values[k])\n }\n\n return state\n}\n\n/**\n * Creates a reactive array store with lazy signal initialization.\n * Arrays can be large, so signals are created on-demand.\n * @param {any[]} values - Initial array values\n * @param {Object} [parent=globalThis] - Parent scope\n * @returns {ReactiveStore<any[]>} Reactive array proxy\n */\nconst list = (values, parent = globalThis) => {\n\n // gotta fill with null since proto methods like .reduce may fail\n let signals = Array(values.length).fill(null),\n\n // if .length was accessed from mutator (.push/etc) method\n isMut = false,\n\n // since array mutator methods read .length internally only once, we disable it on the moment of call, allowing rest of operations to be reactive\n mut = fn => function () { isMut = true; return fn.apply(this, arguments); },\n\n length = signal(values.length),\n\n // proxy passes prop access to signals\n state = new Proxy(\n Object.assign(signals, {\n [_change]: length,\n [_signals]: signals,\n // patch mutators\n push: mut(signals.push),\n pop: mut(signals.pop),\n shift: mut(signals.shift),\n unshift: mut(signals.unshift),\n splice: mut(signals.splice),\n }),\n {\n get(_, k) {\n // console.log('GET', k, isMut)\n\n // if .length is read within mutators - peek signal to avoid recursive subscription\n // we need to ignore it only once and keep for the rest of the mutator call\n if (k === 'length') return isMut ? (isMut = false, signals.length) : length.value;\n\n // non-numeric\n if (typeof k === 'symbol' || isNaN(k)) return signals[k]?.valueOf() ?? parent[k];\n\n // create signal (lazy)\n // NOTE: if you decide to unlazy values, think about large arrays - init upfront can be costly\n return (signals[k] ??= signal(store(values[k]))).valueOf()\n },\n\n set(_, k, v) {\n // console.log('SET', k, v)\n\n // .length\n if (k === 'length') {\n // force cleaning up tail\n for (let i = v; i < signals.length; i++) delete state[i]\n // .length = N directly\n length.value = signals.length = v;\n }\n\n // force changing length, if eg. a=[]; a[1]=1 - need to come after setting the item\n else if (k >= signals.length) create(signals, k, v), state.length = +k + 1\n\n // existing signal\n else signals[k] ? set(signals, k, v) : create(signals, k, v)\n\n return 1\n },\n\n // dispose notifies any signal deps, like :each\n deleteProperty: (_, k) => (signals[k]?.[Symbol.dispose]?.(), delete signals[k], 1),\n })\n\n return state\n}\n\n/**\n * Creates a signal for a property value.\n * Skips wrapping for untracked props (underscore prefix) and existing signals.\n * @param {Object} signals - Signals storage object\n * @param {string} k - Property key\n * @param {any} v - Property value\n */\nconst create = (signals, k, v) => (signals[k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n\n/**\n * Updates a signal value, handling arrays specially for efficient patching.\n * @param {Object} signals - Signals storage object\n * @param {string} k - Property key\n * @param {any} v - New value\n */\nconst set = (signals, k, v, _s, _v) => {\n // skip unchanged (although can be handled by last condition - we skip a few checks this way)\n return k[0] === '_' ? (signals[k] = v) :\n (v !== (_v = (_s = signals[k]).peek())) && (\n // stashed _set for value with getter/setter\n _s[_set] ? _s[_set](v) :\n // patch array\n Array.isArray(v) && Array.isArray(_v) ?\n // if we update plain array (stored in signal) - take over value instead\n // since input value can be store, we have to make sure we don't subscribe to its length or values\n // FIXME: generalize to objects\n _change in _v ?\n untracked(() => batch(() => {\n for (let i = 0; i < v.length; i++) _v[i] = v[i]\n _v.length = v.length // forces deleting tail signals\n })) :\n (_s.value = v) :\n // .x = y\n (_s.value = store(v))\n )\n}\n\n\n// make sure state contains first element of path, eg. `a` from `a.b[c]`\n// NOTE: we don't need since we force proxy sandbox\n// export const ensure = (state, expr, _name = expr.match(/^\\w+(?=\\s*(?:\\.|\\[|$))/)) => _name && (state[_signals][_name[0]] ??= null)\n\nexport default store\n", "/**\n * @fileoverview Minimal signals implementation (preact-signals compatible)\n * @module sprae/signal\n */\n\n/** @type {import('./core.js').EffectFn | null} */\nlet current\n\nlet depth = 0\n\n/** @type {Set<import('./core.js').EffectFn> | null} */\nlet batched;\n\n/**\n * Creates a reactive signal.\n * @template T\n * @param {T} v - Initial value\n * @returns {import('./core.js').Signal<T>}\n */\nexport const signal = (v, _s, _obs = new Set, _v = () => _s.value) => (\n _s = {\n get value() {\n current?.deps.add(_obs.add(current));\n return v\n },\n set value(val) {\n if (val === v) return\n v = val;\n for (let sub of _obs) batched ? batched.add(sub) : sub(); // notify effects\n },\n peek() { return v },\n toJSON: _v, toString: _v, valueOf: _v\n }\n)\n\n/**\n * Creates a reactive effect that re-runs when dependencies change.\n * @param {() => void | (() => void)} fn - Effect function, may return cleanup\n * @returns {() => void} Dispose function\n */\nexport const effect = (fn, _teardown, _fx, _deps) => (\n _fx = (prev) => {\n let tmp = _teardown;\n _teardown = null; // we null _teardown to avoid repeated call in case of recursive update\n tmp?.call?.();\n prev = current, current = _fx\n if (depth++ > 10) throw 'Cycle detected';\n try { _teardown = fn() } finally { current = prev; depth-- }\n },\n _fx.fn = fn,\n _deps = _fx.deps = new Set(),\n\n _fx(),\n (dep) => { _teardown?.call?.(); for (dep of _deps) dep.delete(_fx); _deps.clear() }\n)\n\n/**\n * Creates a computed signal derived from other signals.\n * @template T\n * @param {() => T} fn - Computation function\n * @returns {import('./core.js').Signal<T>}\n */\nexport const computed = (fn, _s = signal(), _c, _e, _v = () => _c.value) => (\n _c = {\n get value() {\n _e ||= effect(() => _s.value = fn());\n return _s.value\n },\n peek: _s.peek,\n toJSON: _v, toString: _v, valueOf: _v\n }\n)\n\n/**\n * Batches multiple signal updates into a single notification.\n * @template T\n * @param {() => T} fn - Function containing updates\n * @returns {T}\n */\nexport const batch = (fn, _first = !batched, _list) => {\n batched ??= new Set;\n try { fn(); }\n finally { if (_first) { [batched, _list] = [null, batched]; for (const fx of _list) fx(); } }\n}\n\n/**\n * Runs a function without tracking dependencies.\n * @template T\n * @param {() => T} fn - Function to run untracked\n * @returns {T}\n */\nexport const untracked = (fn, _prev, _v) => (_prev = current, current = null, _v = fn(), current = _prev, _v)\n\n", "import sprae, { throttle, _on, _off, _state, frag } from '../core.js';\n\n/**\n * Conditional directive - shows/hides element based on condition.\n * Works with :else and :else :if for branching.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @param {Object} state - State object\n * @returns {(value: any) => void} Update function\n */\nexport default (el, state) => {\n let _holder, _el, _match\n\n // new element :if\n if (!el._holder) {\n // mark el as fake-spraed to delay init, since we sprae rest when branch matches, both :if and :else :if\n el[_state] ??= null\n\n _el = el.content ? frag(el) : el\n\n el.replaceWith(_holder = document.createTextNode(''))\n _el._holder = _holder._holder = _holder\n\n\n _holder._clauses = [_el._clause = [_el, false]]\n\n _holder.update = throttle(() => {\n let match = _holder._clauses.find(([, s]) => s)\n\n if (match != _match) {\n _match?.[0].remove()\n _match?.[0][_off]?.()\n if (_match = match) {\n _holder.before(_match[0].content || _match[0])\n // there's no :else after :if, so lazy-sprae here doesn't risk adding own destructor to own list of destructors\n !_match[0][_state] ? (delete _match[0][_state], sprae(_match[0], state)) : _match[0][_on]?.()\n }\n }\n })\n }\n // :else :if needs to be spraed all over to have clean list of offable effects\n else sprae(_el = el, state)\n\n // :else may have children to init which is called after :if\n // or preact can schedule :else after :if, so we ensure order of call by next tick\n return value => {\n _el._clause[1] = value\n _el._holder.update()\n }\n}\n", "import { _on, _off, _state, frag } from '../core.js';\n\n/**\n * Else directive - conditional branch following :if.\n * Can be used as `:else` or `:else :if=\"condition\"`.\n * @param {Element | HTMLTemplateElement} el - Element with directive\n * @returns {() => void} Update function\n */\nexport default (el) => {\n let _el, _prev = el\n\n _el = el.content ? frag(el) : el\n\n // find holder\n while (_prev && !(_el._holder = _prev._holder)) _prev = _prev.previousSibling\n\n el.remove()\n el[_state] = null // mark as fake-spraed to stop further init, to lazy-sprae when branch matches\n\n _el._holder._clauses.push(_el._clause = [_el, true])\n\n return _el._holder.update\n}\n", "import { frag } from \"../core.js\"\n\n/**\n * Text directive - sets textContent reactively.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @returns {(v: any) => void} Update function\n */\nexport default el => (\n // <template :text=\"a\"/> or previously initialized template\n el.content && el.replaceWith(el = frag(el).childNodes[0]),\n v => (v = typeof v === 'function' ? v(el.textContent) : v, el.textContent = v == null ? \"\" : v)\n)\n", "import { clsx, decorate } from \"../core.js\";\n\n/**\n * Class directive - manages CSS classes reactively.\n * Supports strings, arrays, and objects (like clsx/classnames).\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Directive name with modifiers\n * @returns {(v: string | string[] | Record<string, boolean>) => void} Update function\n */\nexport default (el, st, ex, name) => {\n let _cur = new Set, _new\n\n // redefine target, if modifiers have one\n name.includes('.') && (el = decorate({target:el}, name.split('.').slice(1)).target ?? el)\n\n return (v) => {\n _new = new Set\n if (v) clsx(typeof v === 'function' ? v(el.className) : v).split(' ').map(c => c && _new.add(c))\n for (let c of _cur) if (_new.has(c)) _new.delete(c); else el.classList.remove(c);\n for (let c of _cur = _new) el.classList.add(c)\n }\n}\n", "import { attr, decorate } from \"../core.js\";\n\n/**\n * Style directive - sets inline styles reactively.\n * Accepts string or object. Preserves static styles.\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Directive name with modifiers\n * @returns {(v: string | Record<string, string> | ((style: CSSStyleDeclaration) => any)) => void} Update function\n */\nexport default (el, st, ex, name) => {\n let _static;\n\n // redefine target, if modifiers have one\n if (name.includes('.')) el = decorate({target:el}, name.split('.').slice(1)).target ?? el;\n\n return v => {\n if (!_static) { _static = el.getAttribute(\"style\") }\n v = typeof v === \"function\" ? v(el.style) : v\n if (typeof v === \"string\") attr(el, \"style\", _static + '; ' + v);\n else {\n if (_static) attr(el, \"style\", _static);\n // NOTE: we skip names not starting with a letter - eg. el.style stores properties as { 0: --x } or JSDOM has _pfx\n for (let k in v) k[0] == '-' ? el.style.setProperty(k, v[k]) : k[0] > 'A' && (el.style[k] = v[k])\n }\n }\n}\n", "/**\n * Effect directive - runs side effects.\n * Calls function result if expression evaluates to a function.\n * @returns {(fn: any) => any} Update function\n */\nexport default () => (fn) => typeof fn === 'function' && fn()\n", "import sprae, { attr, parse, _state } from \"../core.js\";\n\n/**\n * Creates a setter function for two-way binding.\n * @param {string} expr - Expression to assign to\n * @returns {(target: Object, value: any) => void} Setter function\n */\nexport const setter = (expr, _set = parse(`${expr}=__`)) => (target, value) => {\n target.__ = value; _set(target), delete target.__\n}\n\n/**\n * Value directive - two-way binding for form elements.\n * Supports text, checkbox, radio, select, and textarea.\n * @param {HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement} el - Form element\n * @param {Object} state - State object\n * @param {string} expr - Bound expression\n * @returns {(value: any) => void} Update function\n */\nexport default (el, state, expr) => {\n // bind back to value, but some values can be not bindable, eg. `:value=\"7\"`\n try {\n const set = setter(expr)\n const handleChange = el.type === 'checkbox' ? () => set(state, el.checked) :\n el.type === 'select-multiple' ? () => set(state, [...el.selectedOptions].map(o => o.value)) :\n () => set(state, el.selectedIndex < 0 ? null : isNaN(el.valueAsNumber) ? el.value : el.valueAsNumber);\n\n el.oninput = el.onchange = handleChange; // hope user doesn't redefine these manually via `.oninput = somethingElse` - it saves 5 loc vs addEventListener\n\n if (el.type?.startsWith('select')) {\n // select element also must observe any added/removed options or changed values (outside of sprae)\n new MutationObserver(handleChange).observe(el, { childList: true, subtree: true, attributes: true });\n\n // select options must be initialized before calling an update\n sprae(el, state)\n }\n\n // initial state value - setter has already cached it, so parse is fast\n parse(expr)(state) ?? handleChange()\n } catch { }\n\n return (el.type === \"text\" || el.type === \"\" || el.tagName === \"TEXTAREA\") ?\n (value, _from, _to) => (\n // we retain selection in input\n (_from = el.selectionStart),\n (_to = el.selectionEnd),\n el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)),\n _from && el.setSelectionRange(_from, _to)\n ) :\n (el.type === \"checkbox\") ?\n (value) => (el.checked = value, attr(el, \"checked\", value)) :\n (el.type === 'radio') ? (value) => (\n el.value === value && ((el.checked = value), attr(el, 'checked', value))\n ) :\n (el.type === \"select-one\") ?\n (value) => {\n for (let o of el.options)\n o.value == value ? o.setAttribute(\"selected\", '') : o.removeAttribute(\"selected\");\n el.value = value;\n } :\n (el.type === 'select-multiple') ? (value) => {\n for (let o of el.options) o.removeAttribute('selected')\n for (let v of value) el.querySelector(`[value=\"${v}\"]`).setAttribute('selected', '')\n } :\n (value) => (el.value = value);\n}\n", "import { parse } from \"../core.js\"\nimport { setter } from \"./value.js\"\n\n/**\n * Ref directive - stores element reference in state.\n * If expression is a function, calls it with element (returns dispose).\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Variable name or function expression\n * @returns {{ [Symbol.dispose]: () => void } | void} Disposal object or void\n */\nexport default (el, state, expr) => {\n let fn = parse(expr)(state)\n\n if (typeof fn == 'function') return {[Symbol.dispose]:fn(el)}\n\n // NOTE: we have to set element statically (outside of effect) to avoid parasitic sub - multiple els with same :ref can cause recursion (eg. :each :ref=\"x\")\n // Object.defineProperty(state, expr, { value: el, configurable: true })\n setter(expr)(state, el)\n}\n", "import sprae, { store, untracked, _state, _signals, signal } from '../core.js'\n\n/**\n * Scope directive - creates a child scope with local state.\n * Properties merge into a new scope inheriting from parent.\n * @param {Element} el - Target element\n * @param {Object} rootState - Parent state object\n * @returns {(values: Object | ((state: Object) => Object)) => void | boolean} Update function\n */\nexport default (el, rootState) => {\n // 0 run pre-creates state to provide scope for the first effect - it can write vars in it, so we should already have it\n // el[_state] even replaces own :scope effect state\n let state = el[_state] = store({}, rootState), init = false;\n\n // 1st run spraes subtree with values from scope, it can be postponed by modifiers (we isolate reads from parent effect)\n // 2nd+ runs update subscope\n return values => {\n values = typeof values === 'function' ? values(state) : values;\n\n // we bind to subscope to alleviate friction using scope method directly\n // also returned props should force-create signals in subscope, not overwriting parent\n if (values !== state) {\n for (let k in values) {\n // _add forces new prop, instead of checking parent\n let v = typeof values[k] === 'function' ? values[k].bind(state) : values[k]\n // update\n if (k in state[_signals]) state[k] = v\n // create\n else (state[_signals][k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n }\n }\n\n // Object.assign(subscope, call(values, subscope))\n return !init && (init = true, delete el[_state], untracked(() => sprae(el, state)))\n }\n}\n", "import sprae, { store, parse, _state, effect, _change, _signals, frag, throttle, debounce } from \"../core.js\";\n\n/**\n * Each directive - renders list items from array/object/number.\n * Syntax: `:each=\"item in items\"` or `:each=\"(item, idx) of items\"`\n * @param {HTMLTemplateElement | Element} tpl - Template element\n * @param {Object} state - State object\n * @param {string} expr - Iterator expression\n * @returns {{ eval: Function, [Symbol.dispose]: () => void }} Directive result\n */\nexport default (tpl, state, expr) => {\n const [lhs, rhs] = expr.split(/\\bin|of\\b/)\n\n let [itemVar, idxVar = \"$\"] = lhs.trim().replace(/\\(|\\)/g, '').split(/\\s*,\\s*/);\n\n // we need :if to be able to replace holder instead of tpl for :if :each case\n let holder = document.createTextNode(\"\");\n\n // we re-create items any time new items are produced\n let cur, keys, items, prevl = 0\n\n let update = throttle(() => {\n let i = 0, newItems = items, newl = newItems.length\n\n // plain array update, not store (signal with array) - updates full list\n if (cur && !cur[_change]) {\n for (let s of cur[_signals] || []) s[Symbol.dispose]()\n cur = null, prevl = 0\n }\n\n\n // delete\n if (newl < prevl) cur.length = newl\n\n // update, append, init\n else {\n // init\n if (!cur) cur = newItems\n // update\n else while (i < prevl) cur[i] = newItems[i++]\n\n // batch append using DocumentFragment for efficiency\n let batchSize = newl - i\n let batch = batchSize > 1 ? document.createDocumentFragment() : null\n let pending = batch ? [] : null\n\n // append\n for (; i < newl; i++) {\n cur[i] = newItems[i]\n\n let idx = i\n let el = tpl.content ? frag(tpl) : tpl.cloneNode(true);\n // el.content is DocumentFragment for frag() output, el itself for cloneNode\n let insertNode = el.content || el\n\n // collect for batch insert\n if (batch) {\n batch.appendChild(insertNode)\n pending.push([ el, idx ])\n } else {\n holder.before(insertNode)\n let subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n sprae(el, subscope)\n }\n\n // signal/holder disposal removes element\n let _prev = ((cur[_signals] ||= [])[i] ||= {})[Symbol.dispose]\n cur[_signals][i][Symbol.dispose] = () => {\n _prev?.(), el[Symbol.dispose]?.(), el.remove()\n };\n }\n\n // batch insert all at once, then sprae\n if (batch) {\n holder.before(batch)\n for (let [el, idx] of pending) {\n let subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n sprae(el, subscope)\n }\n }\n }\n\n prevl = newl\n })\n\n tpl.replaceWith(holder);\n tpl[_state] = null // mark as fake-spraed, to preserve :-attribs for template\n\n return Object.assign(value => {\n // resolve new items\n keys = null\n if (typeof value === \"number\") items = Array.from({ length: value }, (_, i) => i + 1)\n else if (value?.constructor === Object) keys = Object.keys(value), items = Object.values(value)\n else items = value || []\n\n // whenever list changes, we rebind internal change effect\n return effect(() => {\n // subscribe to items change (.length) - we do it every time (not just in update) since preact signals unsubscribes unused signals\n items[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n update()\n })\n }, {eval:parse(rhs)})\n}\n", "import { attr } from \"../core.js\";\n\n/**\n * Default attribute directive - sets any attribute value.\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Attribute name\n * @returns {(v: any) => void} Update function\n */\nexport default (el, st, ex, name) => v => attr(el, name, typeof v === 'function' ? v(el.getAttribute(name)) : v)\n", "import { attr, dashcase } from \"../core.js\";\n\n/**\n * Spread directive - sets multiple attributes from object.\n * Keys are converted from camelCase to kebab-case.\n * @param {Element} target - Target element\n * @returns {(value: Record<string, any>) => void} Update function\n */\nexport default (target) => value => { for (let key in value) attr(target, dashcase(key), value[key]) }\n", "import { parse, decorate } from \"../core.js\"\n\n/**\n * Event directive - attaches event listeners with modifiers.\n * Syntax: `:onclick=\"handler\"` or `:onclick.prevent.stop=\"handler\"`\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Handler expression\n * @param {string} name - Event name with modifiers (e.g., 'onclick.prevent')\n * @returns {{ [Symbol.dispose]: () => void }} Disposal object\n */\nexport default (el, state, expr, name) => {\n // wrap inline cb into function\n // if (!/^(?:[\\w$]+|\\([^()]*\\))\\s*=>/.test(expr) && !/^function\\b/.test(expr)) expr = `()=>{${expr}}`;\n\n const [type, ...mods] = name.slice(2).split('.'),\n evaluate = parse(expr).bind(el),\n trigger = decorate(Object.assign(e => evaluate(state, (fn) => typeof fn === 'function' ? fn(e) : fn), { target: el }), mods);\n\n trigger.target.addEventListener(type, trigger, trigger)\n return {\n [Symbol.dispose]() {\n trigger.target.removeEventListener(type, trigger)\n }\n }\n}\n", "import { _dispose, parse, decorate } from \"../core.js\"\n\n/**\n * Sequence directive - chains event handlers.\n * Syntax: `:onclick..keyup.enter=\"handler\"` - click triggers, then waits for Enter.\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Handler expression\n * @param {string} names - Chained event names separated by `..`\n * @returns {{ [Symbol.dispose]: () => void }} Disposal object\n */\nexport default (el, state, expr, names) => {\n let cur, // current step callback\n off // current step disposal\n\n let steps = names.split('..').map((step, i, { length }) => step.split(':').reduce(\n (prev, str) => {\n const [name, ...mods] = str.slice(2).split('.')\n\n const evaluate = parse(expr).bind(el)\n\n const next = (fn, e) => cur = typeof fn === 'function' ? fn(e) : fn\n const trigger = decorate(Object.assign(\n e => (!i ? evaluate(state, (fn) => next(fn, e)) : next(cur, e), off(), off = steps[(i + 1) % length]()),\n { target: el }\n ), mods)\n\n\n return (_poff) => (\n _poff = prev?.(),\n trigger.target.addEventListener(name, trigger, trigger),\n () => (_poff?.(), trigger.target.removeEventListener(name, trigger))\n )\n }, null)\n )\n\n off = steps[0]()\n\n return {\n [Symbol.dispose]() {\n off?.()\n }\n }\n}\n", "import sprae, { _dispose } from \"../core.js\"\n\n/**\n * HTML directive - sets innerHTML and initializes nested directives.\n * Supports templates for fragment insertion.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @param {Object} state - State object\n * @returns {(v: string | ((html: string) => string)) => void | (() => void)} Update function\n */\nexport default (el, state) => {\n // <template :html=\"a\"/> - fragment case: use placeholder + range\n if (el.content) {\n let start = document.createTextNode(''),\n end = document.createTextNode(''),\n range = document.createRange()\n el.replaceWith(start, end)\n return v => {\n v = typeof v === 'function' ? v('') : v\n range.setStartAfter(start)\n range.setEndBefore(end)\n range.deleteContents()\n if (v != null && v !== '') {\n let frag = range.createContextualFragment(v)\n sprae(frag, state)\n range.insertNode(frag)\n }\n }\n }\n return v => (v = typeof v === 'function' ? v(el.innerHTML) : v, el.innerHTML = v == null ? \"\" : v, sprae(el, state), el[_dispose])\n}\n", "/**\n * Portal directive - teleports element to another container.\n * Value can be selector string, element, or falsy to return home.\n * @param {Element} el - Element to teleport\n * @param {Object} state - State object\n * @param {string} expr - Expression\n * @returns {(value: string | Element | null | false) => void} Update function\n */\nexport default (el, state, expr) => {\n const comment = document.createComment(':portal')\n let currentTarget = null\n\n // Insert placeholder before element\n el.before(comment)\n\n return (value) => {\n // Resolve target: selector string, element, or null/false to return home\n // For selectors, first try within the same root, then document\n const root = el.getRootNode()\n const target = typeof value === 'string'\n ? (root.querySelector?.(value) || document.querySelector(value))\n : value instanceof Element ? value\n : value ? document.body : null\n\n // No change needed\n if (target === currentTarget) return\n\n if (target) {\n // Move to target\n target.appendChild(el)\n } else {\n // Return home (after placeholder)\n comment.after(el)\n }\n\n currentTarget = target\n }\n}\n", "/**\n * Hidden directive - toggles the hidden attribute.\n * @param {Element} el - Target element\n * @returns {(value: any) => boolean} Update function\n */\nexport default (el) => (value) => el.hidden = !!value\n", "/**\n * @fileoverview Sprae - lightweight reactive HTML templating library\n * @module sprae\n */\n\nimport store from \"./store.js\";\nimport { batch, computed, effect, signal, untracked } from './core.js';\nimport * as signals from './signal.js';\nimport sprae, { use, decorate, directive, modifier, parse, throttle, debounce, _off, _state, _on, _dispose, _add } from './core.js';\n\nimport _if from \"./directive/if.js\";\nimport _else from \"./directive/else.js\";\nimport _text from \"./directive/text.js\";\nimport _class from \"./directive/class.js\";\nimport _style from \"./directive/style.js\";\nimport _fx from \"./directive/fx.js\";\nimport _value from \"./directive/value.js\";\nimport _ref from \"./directive/ref.js\";\nimport _scope from \"./directive/scope.js\";\nimport _each from \"./directive/each.js\";\nimport _default from \"./directive/_.js\";\nimport _spread from \"./directive/spread.js\";\nimport _event from \"./directive/event.js\";\nimport _seq from \"./directive/sequence.js\";\nimport _html from \"./directive/html.js\";\nimport _portal from \"./directive/portal.js\";\nimport _hidden from \"./directive/hidden.js\";\n\n\nObject.assign(directive, {\n _: (el, state, expr, name) => (name.startsWith('on') ? _event : _default)(el, state, expr, name),\n '': _spread,\n class: _class,\n text: _text,\n html: _html,\n style: _style,\n fx: _fx,\n value: _value,\n ref: _ref,\n scope: _scope,\n if: _if,\n else: _else,\n each: _each,\n portal: _portal,\n hidden: _hidden\n})\n\n\n/**\n * Directive initializer with modifiers support.\n * @param {Element} target - Target element\n * @param {string} name - Directive name with modifiers (e.g., 'onclick.throttle-500')\n * @param {string} expr - Expression string\n * @param {Object} state - Reactive state object\n * @returns {() => (() => void) | void} Initializer function that returns a disposer\n */\nconst dir = (target, name, expr, state) => {\n let [dirName, ...mods] = name.split('.'), create = directive[dirName] || directive._\n\n return () => {\n let update = create(target, state, expr, name)\n\n if (!update?.call) return update?.[_dispose]\n\n // throttle prevents multiple updates within one tick as well as isolates stack for each update\n let trigger = decorate(Object.assign(throttle(() => change.value++), { target }), mods),\n change = signal(0), // signal authorized to trigger effect: 0 = init; >0 = trigger\n count = 0, // called effect count\n evaluate = update.eval ?? parse(expr).bind(target),\n _out, out = () => (typeof _out === 'function' && _out(), _out=null) // effect trigger and invoke may happen in the same tick, so it will be effect-within-effect call - we need to store output of evaluate to return from trigger effect\n\n state = target[_state] ?? state\n\n return effect(() => (\n // if planned count is same as actual count - plan new update, else update right away\n change.value == count ? (trigger()) : (count = change.value, _out = evaluate(state, update)),\n out\n ))\n }\n}\n\n// Parses time string to ms: 100, 100ms, 1s, 1m\nconst parseTime = (t) => !t ? 0 : typeof t === 'number' ? t :\n (([, n, u] = t.match(/^(\\d+)(ms|s|m)?$/) || []) => (n = +n, u === 's' ? n * 1000 : u === 'm' ? n * 60000 : n))()\n\n// Creates scheduler from time/keyword (idle, raf, tick, or ms)\nconst scheduler = (t) =>\n t === 'idle' ? requestIdleCallback :\n t === 'raf' ? requestAnimationFrame :\n !t || t === 'tick' ? queueMicrotask :\n (fn) => setTimeout(fn, parseTime(t))\n\n// Built-in modifiers for timing, targeting, and event handling\nObject.assign(modifier, {\n /**\n * Delays callback by interval since last call (trailing edge).\n * Supports: tick (default), raf, idle, N, Nms, Ns, Nm. Add -immediate for leading edge.\n * Examples: .debounce, .debounce-100, .debounce-1s, .debounce-raf, .debounce-idle, .debounce-100-immediate\n */\n debounce: (fn, a, b) => debounce(fn, scheduler(a === 'immediate' ? b : a), a === 'immediate' || b === 'immediate'),\n /**\n * Limits callback rate to interval (leading + trailing edges).\n * Supports: tick (default), raf, idle, N, Nms, Ns, Nm.\n * Examples: .throttle, .throttle-100, .throttle-1s, .throttle-raf, .throttle-idle\n */\n throttle: (fn, a) => throttle(fn, scheduler(a)),\n /** Runs callback after delay. Supports: tick (default), raf, idle, N, Nms, Ns, Nm. */\n delay: (fn, a) => ((sched = scheduler(a)) => (e) => sched(() => fn(e)))(),\n\n /** @deprecated Use .delay instead */\n tick: (fn) => (console.warn('Deprecated'), (e) => (queueMicrotask(() => fn(e)))),\n /** @deprecated Use .throttle-raf instead */\n raf: (fn) => (console.warn('Deprecated'), (e) => requestAnimationFrame(() => fn(e))),\n\n /** Calls handler only once. */\n once: (fn, _done, _fn) => (_fn = (e) => !_done && (_done = 1, fn(e)), _fn.once = true, _fn),\n\n /** Attaches event listener to window. */\n window: fn => (fn.target = fn.target.ownerDocument.defaultView, fn),\n /** Attaches event listener to document. */\n document: fn => (fn.target = fn.target.ownerDocument, fn),\n /** Attaches event listener to document root element (<html>). */\n root: fn => (fn.target = fn.target.ownerDocument.documentElement, fn),\n /** Attaches event listener to body. */\n body: fn => (fn.target = fn.target.ownerDocument.body, fn),\n /** Attaches event listener to parent element. */\n parent: fn => (fn.target = fn.target.parentNode, fn),\n /** Triggers only when event target is the element itself. */\n self: (fn) => (e) => (e.target === fn.target && fn(e)),\n /** Triggers when click is outside the element. */\n away: (fn) => Object.assign((e) => (!fn.target.contains(e.target) && e.target.isConnected && fn(e)), {target: fn.target.ownerDocument}),\n\n /** Calls preventDefault() before handler. */\n prevent: (fn) => (e) => (e?.preventDefault(), fn(e)),\n /** Calls stopPropagation() or stopImmediatePropagation() (with -immediate). */\n stop: (fn, _how) => (e) => (_how?.[0] === 'i' ? e?.stopImmediatePropagation() : e?.stopPropagation(), fn(e)),\n /** @deprecated Use .stop-immediate instead */\n immediate: (fn) => (console.warn('Deprecated'), (e) => (e?.stopImmediatePropagation(), fn(e))),\n /** Sets passive option for event listener. */\n passive: fn => (fn.passive = true, fn),\n /** Sets capture option for event listener. */\n capture: fn => (fn.capture = true, fn),\n})\n/** Alias for .away modifier */\nmodifier.outside = modifier.away\n\n/**\n * Key testers for keyboard event modifiers.\n * @type {Record<string, (e: KeyboardEvent) => boolean>}\n */\nconst keys = {\n ctrl: e => e.ctrlKey || e.key === \"Control\" || e.key === \"Ctrl\",\n shift: e => e.shiftKey || e.key === \"Shift\",\n alt: e => e.altKey || e.key === \"Alt\",\n meta: e => e.metaKey || e.key === \"Meta\",\n cmd: e => e.metaKey || e.key === \"Command\",\n arrow: e => e.key.startsWith(\"Arrow\"),\n enter: e => e.key === \"Enter\",\n esc: e => e.key.startsWith(\"Esc\"),\n tab: e => e.key === \"Tab\",\n space: e => e.key === \"\u00A0\" || e.key === \"Space\" || e.key === \" \",\n delete: e => e.key === \"Delete\" || e.key === \"Backspace\",\n digit: e => /^\\d$/.test(e.key),\n letter: e => /^\\p{L}$/gu.test(e.key),\n char: e => /^\\S$/.test(e.key),\n};\n\n// match key by name, or by e.key (case-insensitive), or by keyCode (digits)\nconst keyMatch = (k, e) => keys[k]?.(e) || e.key.toLowerCase() === k || e.keyCode == k\n\n// Augment modifiers with key testers (e.g., .enter, .ctrl, .ctrl-a, .ctrl-65)\nfor (let k in keys) modifier[k] = (fn, a, b) => (e) => keys[k](e) && (!a || keyMatch(a, e)) && (!b || keyMatch(b, e)) && fn(e)\n\n\n// Checks for first-level semicolons (statement vs expression)\nconst hasSemi = s => {\n for (let d=0,i=0;i<s.length;i++) {\n if (s[i]=='{') d++\n else if (s[i]=='}') d--\n else if (s[i]==';' && !d) return true\n }\n return false\n}\n\n// Configure sprae with default compiler and signals\nuse({\n\n// Default compiler wraps expression for new Function\n compile: expr => {\n // if, const, let - no return\n if (/^(if|let|const)\\b/.test(expr));\n // first-level semicolons - no return\n else if (hasSemi(expr));\n else expr = `return ${expr}`\n // async expression\n if (/\\bawait\\s/.test(expr)) expr = `return (async()=>{${expr}})()`\n return sprae.constructor(`with(arguments[0]){${expr}}`)\n },\n dir: (el, name, expr, state) => {\n // sequences shortcut\n if (name.includes('..')) return () => _seq(el, state, expr, name)[_dispose]\n return name.split(':').reduce((prev, str) => {\n let start = dir(el, str, expr, state)\n return !prev ? start : (p, s) => (p = prev(), s = start(), () => { p(); s() })\n }, null)\n },\n ...signals\n})\n\n\n// Expose for runtime configuration\nsprae.use = use\nsprae.store = store\nsprae.directive = directive\nsprae.modifier = modifier\n\n/**\n * Disposes a spraed element, cleaning up all effects and state.\n * @param {Element} el - Element to dispose\n */\nsprae.dispose = (el) => el[_dispose]?.()\n\n\n/**\n * Auto-initializes sprae on dynamically added elements.\n * Uses MutationObserver to detect new DOM nodes and apply directives.\n *\n * @param {Element} [root=document.body] - Root element to observe\n * @param {Object} [values] - Initial state values\n * @returns {Object} The reactive state object\n *\n * @example\n * ```js\n * // Auto-init on page load\n * sprae.start(document.body, { count: 0 })\n * ```\n */\nconst start = sprae.start = (root = document.body, values) => {\n const state = store(values)\n sprae(root, state);\n const mo = new MutationObserver(mutations => {\n for (const m of mutations) {\n for (const el of m.addedNodes) {\n // el can be spraed or removed by subsprae (like within :each/:if)\n if (el.nodeType === 1 && el[_state] === undefined && root.contains(el)) {\n // even if element has no spraeable attrs, some of its children can have\n root[_add](el)\n }\n }\n for (const el of m.removedNodes) el.nodeType === 1 && el[_dispose]?.()\n }\n });\n mo.observe(root, { childList: true, subtree: true });\n return state\n}\n\n\n/** Package version (injected by bundler) */\nsprae.version = \"12.4.0\"\n\nconst dispose = sprae.dispose\n\nexport default sprae\nexport { sprae, store, signal, effect, computed, batch, untracked, start, use, throttle, debounce, dispose }\n", "var sprae = require(\"./sprae.js\").default; module.exports = sprae; var cur = document.currentScript;\nvar prefix = cur.getAttribute(\"prefix\") ?? cur.dataset.prefix ?? cur.dataset.spraePrefix;\nvar start = cur.getAttribute(\"start\") ?? cur.dataset.start ?? cur.dataset.spraeStart;\nif (prefix) sprae.use({ prefix });\nif (start != null && start !== 'false') (start && start !== 'true' ? document.querySelectorAll(start) : [document.body || document.documentElement]).forEach(el => sprae.start(el))"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["_dispose", "_state", "_on", "_off", "_add", "prefix", "signal", "effect", "computed", "batch", "untracked", "directive", "modifier", "currentDir", "currentEl", "elHint", "err", "sprae", "dir", "compile", "parse", "cache", "use", "decorate", "frag", "dashcase", "attr", "clsx", "throttle", "debounce", "core_default", "init_core", "__esmMin", "init_store", "fn", "el", "hint", "expr", "msg", "state", "store_default", "fx", "offs", "off", "add", "_attrs", "start", "i", "name", "value", "child", "next", "e", "cb", "_out", "result", "v", "config", "mods", "params", "mod", "wrapFn", "k", "tpl", "content", "attributes", "ref", "childNodes", "a", "str", "match", "c", "s", "ms", "_planned", "arg", "schedule", "throttled", "_dirty", "immediate", "_blocked", "_count", "_c", "_signals", "_change", "_set", "sandbox", "store", "list", "create", "set", "store_default", "init_store", "__esmMin", "init_core", "values", "parent", "keyCount", "signals", "state", "signal", "_", "k", "v", "descs", "computed", "isMut", "mut", "fn", "length", "i", "_s", "_v", "untracked", "batch", "signal_exports", "__export", "batch", "computed", "effect", "signal", "untracked", "current", "depth", "batched", "init_signal", "__esmMin", "v", "_s", "_obs", "_v", "val", "sub", "fn", "_teardown", "_fx", "_deps", "prev", "tmp", "dep", "_c", "_e", "_first", "_list", "fx", "_prev", "if_default", "init_if", "__esmMin", "init_core", "el", "state", "_a", "_holder", "_el", "_match", "core_default", "_state", "frag", "throttle", "match", "s", "_off", "_on", "value", "else_default", "init_else", "__esmMin", "init_core", "el", "_el", "_prev", "frag", "_state", "text_default", "init_text", "__esmMin", "init_core", "el", "frag", "v", "class_default", "init_class", "__esmMin", "init_core", "el", "st", "ex", "name", "_cur", "_new", "decorate", "v", "clsx", "c", "style_default", "init_style", "__esmMin", "init_core", "el", "st", "ex", "name", "_static", "decorate", "v", "attr", "k", "fx_default", "init_fx", "__esmMin", "fn", "setter", "value_default", "init_value", "__esmMin", "init_core", "expr", "_set", "parse", "target", "value", "el", "state", "set", "handleChange", "o", "core_default", "_from", "_to", "attr", "v", "ref_default", "init_ref", "__esmMin", "init_core", "init_value", "el", "state", "expr", "fn", "parse", "setter", "scope_default", "init_scope", "__esmMin", "init_core", "el", "rootState", "state", "_state", "store", "init", "values", "k", "v", "_signals", "signal", "untracked", "core_default", "each_default", "init_each", "__esmMin", "init_core", "tpl", "state", "expr", "lhs", "rhs", "itemVar", "idxVar", "holder", "cur", "keys", "items", "prevl", "update", "throttle", "_a", "_b", "i", "newItems", "newl", "_change", "s", "_signals", "batch", "pending", "idx", "el", "frag", "insertNode", "subscope", "core_default", "_prev", "_state", "value", "_", "effect", "parse", "__default", "init__", "__esmMin", "init_core", "el", "st", "ex", "name", "v", "attr", "spread_default", "init_spread", "__esmMin", "init_core", "target", "value", "key", "attr", "dashcase", "event_default", "init_event", "__esmMin", "init_core", "el", "state", "expr", "name", "type", "mods", "evaluate", "parse", "trigger", "decorate", "e", "fn", "sequence_default", "init_sequence", "__esmMin", "init_core", "el", "state", "expr", "names", "cur", "off", "steps", "step", "i", "length", "prev", "str", "name", "mods", "evaluate", "parse", "next", "fn", "e", "trigger", "decorate", "_poff", "html_default", "init_html", "__esmMin", "init_core", "el", "state", "start", "end", "range", "v", "frag", "core_default", "_dispose", "portal_default", "init_portal", "__esmMin", "el", "state", "expr", "comment", "currentTarget", "value", "root", "target", "hidden_default", "init_hidden", "__esmMin", "el", "value", "sprae_exports", "__export", "batch", "computed", "debounce", "sprae_default", "dispose", "effect", "signal", "core_default", "start", "store_default", "throttle", "untracked", "use", "dir", "parseTime", "scheduler", "keys", "keyMatch", "hasSemi", "init_sprae", "__esmMin", "init_store", "init_core", "init_signal", "init_if", "init_else", "init_text", "init_class", "init_style", "init_fx", "init_value", "init_ref", "init_scope", "init_each", "init__", "init_spread", "init_event", "init_sequence", "init_html", "init_portal", "init_hidden", "directive", "el", "state", "expr", "name", "event_default", "__default", "spread_default", "class_default", "text_default", "html_default", "style_default", "fx_default", "value_default", "ref_default", "scope_default", "if_default", "else_default", "each_default", "portal_default", "hidden_default", "target", "dirName", "mods", "create", "update", "_dispose", "trigger", "decorate", "change", "count", "evaluate", "parse", "_out", "out", "_state", "t", "n", "u", "fn", "modifier", "a", "b", "sched", "e", "_done", "_fn", "_how", "k", "s", "d", "i", "sequence_default", "prev", "str", "p", "signal_exports", "root", "values", "mutations", "m", "_add", "sprae", "cur", "prefix", "start", "el"]
|
|
4
|
+
"sourcesContent": ["import store, { _change, _signals } from \"./store.js\";\n\n/** Symbol for disposal (using standard Symbol.dispose if available) */\nexport const _dispose = (Symbol.dispose ||= Symbol(\"dispose\"))\n\n/** Symbol for accessing element's reactive state */\nexport const _state = Symbol(\"state\")\n\n/** Symbol for enabling element effects */\nexport const _on = Symbol('on')\n\n/** Symbol for disabling element effects */\nexport const _off = Symbol('off')\n\n/** Symbol for adding child to element */\nexport const _add = Symbol('init')\n\n/** Directive prefix (default: ':') */\nexport let prefix = ':';\n\n/**\n * A reactive signal containing a value.\n * @template T\n * @typedef {Object} Signal\n * @property {T} value - Current value (reading subscribes, writing notifies)\n * @property {() => T} peek - Read without subscribing\n * @property {() => T} valueOf - Get value for coercion\n * @property {() => T} toJSON - Get value for JSON serialization\n * @property {() => string} toString - Get value as string\n */\n\n/**\n * Internal effect function type.\n * @typedef {Object} EffectFn\n * @property {Set<Set<EffectFn>>} deps - Dependency sets\n * @property {() => void} fn - Original function\n */\n\n/**\n * Creates a reactive signal.\n * @template T\n * @type {<T>(value: T) => Signal<T>}\n */\nexport let signal;\n\n/**\n * Creates a reactive effect that re-runs when dependencies change.\n * @type {(fn: () => void | (() => void)) => () => void}\n */\nexport let effect;\n\n/**\n * Creates a computed signal derived from other signals.\n * @template T\n * @type {<T>(fn: () => T) => Signal<T>}\n */\nexport let computed;\n\n/**\n * Batches multiple signal updates into a single notification.\n * @template T\n * @type {<T>(fn: () => T) => T}\n */\nexport let batch = (fn) => fn();\n\n/**\n * Runs a function without tracking signal dependencies.\n * @template T\n * @type {<T>(fn: () => T) => T}\n */\nexport let untracked = batch;\n\n/**\n * Registry of directive handlers.\n * @type {Record<string, DirectiveHandler>}\n */\nexport let directive = {};\n\n/**\n * Registry of modifier functions.\n * @type {Record<string, ModifierHandler>}\n */\nexport let modifier = {}\n\nlet currentDir = null;\nlet currentEl = null;\n\n/**\n * Formats element for error message (minimal context).\n * @param {Element} [el] - Element to format\n * @returns {string} Element hint like \"<div#id.class>\"\n */\nconst elHint = (el) => {\n if (!el?.tagName) return ''\n let hint = el.tagName.toLowerCase()\n if (el.id) hint += '#' + el.id\n else if (el.className) hint += '.' + el.className.split(' ')[0]\n return `<${hint}>`\n}\n\n/**\n * Reports an error with context.\n * @param {Error|string} e - Error to report\n * @param {string} [expr] - Expression that caused error\n */\nconst err = (e, expr) => {\n let msg = `\u2234 ${e}`\n if (currentEl) msg += `\\n in ${elHint(currentEl)}`\n if (currentDir && expr) {\n // Truncate long expressions\n const display = expr.length > 100 ? expr.slice(0, 80) + `\u2026 (${expr.length} chars)` : expr\n msg += `\\n ${currentDir}=\"${display}\"`\n }\n console.error(msg)\n}\n\n/**\n * @callback DirectiveHandler\n * @param {Element} el - Target element\n * @param {Object} state - Reactive state object\n * @param {string} expr - Expression string\n * @param {string} [name] - Directive name with modifiers\n * @returns {((value: any) => void | (() => void)) | { [Symbol.dispose]: () => void } | void}\n */\n\n/**\n * @callback ModifierHandler\n * @param {Function} fn - Function to modify\n * @param {...string} args - Modifier arguments (from dash-separated values)\n * @returns {Function}\n */\n\n/**\n * @typedef {Object} SpraeState\n * @property {Record<string, Signal>} [_signals] - Internal signals map\n */\n\n/**\n * Applies directives to an HTML element and manages its reactive state.\n *\n * @param {Element} [el=document.body] - The target HTML element to apply directives to.\n * @param {Object} [state] - Initial state values to populate the element's reactive state.\n * @returns {SpraeState & Object} The reactive state object associated with the element.\n */\nconst sprae = (el = document.body, state) => {\n // repeated call can be caused by eg. :each with new objects with old keys\n if (el[_state]) return Object.assign(el[_state], state)\n\n // console.group('sprae', el)\n\n // take over existing state instead of creating a clone\n state = store(state || {})\n\n let fx = [], offs = []\n\n // on/off all effects\n // we don't call prevOn as convention: everything defined before :else :if won't be disabled by :if\n // imagine <x :onx=\"...\" :if=\"...\"/> - when :if is false, it disables directives after :if (calls _off) but ignores :onx\n el[_on] = () => (!offs && (offs = fx.map(fn => fn())))\n el[_off] = () => (offs?.map(off => off()), offs = null)\n\n // destroy\n el[_dispose] ||= () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_add] = el[_state] = null)\n\n const add = el[_add] = (el) => {\n let _attrs = el.attributes, start;\n\n // we iterate live collection (subsprae can init args)\n if (_attrs) for (let i = 0; i < _attrs.length;) {\n let { name, value } = _attrs[i]\n\n if (name.startsWith(prefix)) {\n el.removeAttribute(name)\n\n currentDir = name;\n currentEl = el;\n\n // directive initializer can be redefined\n fx.push(start = dir(el, name.slice(prefix.length), value, state)), offs.push(start())\n\n // stop after subsprae like :each, :if, :scope etc.\n if (_state in el) return\n } else i++\n }\n\n // :if and :each replace element with text node, which tweaks .children length, but .childNodes length persists\n // real DOM: firstChild/nextSibling avoids array copy; frag.childNodes is already snapshot array\n if (el.firstChild !== undefined) {\n let child = el.firstChild, next\n while (child) (next = child.nextSibling, child.nodeType == 1 && add(child), child = next)\n }\n else for (let child of el.childNodes) child.nodeType == 1 && add(child)\n };\n\n add(el);\n\n // if element was spraed by inline :with/:if/:each/etc instruction (meaning it has state placeholder) - skip, otherwise save _state\n if (el[_state] === undefined) el[_state] = state\n\n // console.groupEnd()\n\n return state;\n}\n\n// directive initializer\n/** @type {(el: Element, name: string, expr: string, state: Object) => () => (() => void) | void} */\nexport let dir\n\n/**\n * Compiles an expression string into an evaluator function.\n * @type {(expr: string) => (state: Object) => any}\n */\nexport let compile\n\n/**\n * Parses an expression into an evaluator function, caching the result for reuse.\n *\n * @param {string} expr - The expression to parse and compile into a function.\n * @returns {(state: Object, cb?: (value: any) => any) => any} The compiled evaluator function for the expression.\n */\nexport const parse = (expr) => {\n let fn = cache[expr=expr.trim()]\n if (fn) return fn\n\n // static time errors\n try {\n fn = compile(expr || 'undefined')\n // Object.defineProperty(fn, \"name\", { value: `\u2234 ${expr}` })\n } catch (e) { err(e, expr) }\n\n // run time errors\n return cache[expr] = function (state, cb, _out) {\n try {\n let result = fn?.call(this, state)\n // if cb is given (to handle async/await exprs, usually directive update) - call it with result and return a cleanup function\n if (cb) return result?.then\n ? (result.then(v => _out = cb(v)).catch(e => err(e, expr)), () => typeof _out === 'function' && _out())\n : cb(result)\n else return result\n } catch (e) {\n err(e, expr)\n }\n }\n}\nconst cache = {};\n\n\n/**\n * @typedef {Object} SpraeConfig\n * @property {(expr: string) => (state: Object) => any} [compile] - Custom expression compiler\n * @property {string} [prefix] - Directive prefix (default: ':')\n * @property {<T>(value: T) => Signal<T>} [signal] - Signal factory\n * @property {(fn: () => void | (() => void)) => () => void} [effect] - Effect factory\n * @property {<T>(fn: () => T) => Signal<T>} [computed] - Computed factory\n * @property {<T>(fn: () => T) => T} [batch] - Batch function\n * @property {<T>(fn: () => T) => T} [untracked] - Untracked function\n * @property {(el: Element, name: string, expr: string, state: Object) => () => (() => void) | void} [dir] - Directive initializer\n */\n\n/**\n * Configure sprae with custom signals, compiler, or prefix.\n * @param {SpraeConfig} config - Configuration options\n * @returns {void}\n */\nexport const use = (config) => (\n config.compile && (compile = config.compile),\n config.prefix && (prefix = config.prefix),\n config.signal && (signal = config.signal),\n config.effect && (effect = config.effect),\n config.computed && (computed = config.computed),\n config.batch && (batch = config.batch),\n config.untracked && (untracked = config.untracked),\n config.dir && (dir = config.dir)\n)\n\n/**\n * Applies modifiers to a function.\n * @param {Function & { target?: Element }} fn - Function to decorate\n * @param {string[]} mods - Modifier names with arguments (e.g., ['throttle-500', 'prevent'])\n * @returns {Function} Decorated function\n */\nexport const decorate = (fn, mods) => {\n while (mods.length) {\n let [name, ...params] = mods.pop().split('-'), mod = modifier[name], wrapFn\n if (mod) {\n if ((wrapFn = mod(fn, ...params)) !== fn) {\n for (let k in fn) wrapFn[k] ??= fn[k];\n fn = wrapFn\n }\n }\n }\n return fn\n}\n\n/**\n * @typedef {Object} FragmentLike\n * @property {Node[]} childNodes - Child nodes of the fragment\n * @property {DocumentFragment} content - The document fragment content\n * @property {() => void} remove - Remove the fragment from DOM\n * @property {(el: Node) => void} replaceWith - Replace the fragment with an element\n * @property {Attr[]} attributes - Attributes from the original template\n * @property {(name: string) => void} removeAttribute - Remove an attribute\n */\n\n/**\n * Creates a fragment holder from a template element with minimal API surface.\n * @param {HTMLTemplateElement | FragmentLike} tpl - Template element or existing fragment\n * @returns {FragmentLike} Fragment-like object\n */\nexport const frag = (tpl) => {\n if (!tpl.nodeType) return tpl // existing tpl\n\n let content = tpl.content.cloneNode(true), // document fragment holder of content\n attributes = [...tpl.attributes],\n ref = document.createTextNode(''),\n // ensure at least one node\n childNodes = (content.append(ref), [...content.childNodes])\n\n return {\n childNodes,\n content,\n remove: () => content.append(...childNodes),\n replaceWith(el) {\n if (el === ref) return\n ref.before(el)\n content.append(...childNodes)\n },\n attributes,\n removeAttribute(name) { attributes.splice(attributes.findIndex(a => a.name === name), 1) },\n }\n}\n\n/**\n * Converts camelCase to kebab-case.\n * @param {string} str - String to convert\n * @returns {string} Kebab-case string\n */\nexport const dashcase = (str) => str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());\n\n/**\n * Sets or removes an attribute on an element.\n * @param {Element} el - Target element\n * @param {string} name - Attribute name\n * @param {string | boolean | null | undefined} v - Attribute value (null/false removes, true sets empty)\n * @returns {void}\n */\nexport const attr = (el, name, v) => (v == null || v === false) ? el.removeAttribute(name) : el.setAttribute(name, v === true ? \"\" : v);\n\n/**\n * Converts class input to className string (like clsx/classnames).\n * @param {string | string[] | Record<string, boolean> | null | undefined} c - Class input\n * @returns {string} Space-separated class string\n */\nexport const clsx = (c, _out = []) => !c ? '' : typeof c === 'string' ? c : (\n Array.isArray(c) ? c.map(clsx) :\n Object.entries(c).reduce((s, [k, v]) => !v ? s : [...s, k], [])\n).join(' ')\n\n/**\n * Throttles a function to run at most once per tick (or custom scheduler).\n * Fires on leading edge, then on trailing edge if called during throttle.\n * @template {Function} T\n * @param {T} fn - Function to throttle\n * @param {number|Function} [ms] - Delay in ms or scheduler function (default: microtask)\n * @returns {T} Throttled function\n */\nexport const throttle = (fn, ms) => {\n let _planned = 0, arg, schedule = typeof ms === 'function' ? ms : ms ? (fn) => setTimeout(fn, ms) : queueMicrotask;\n const throttled = (e) => {\n arg = e\n if (!_planned++) fn(arg), schedule((_dirty = _planned > 1) => (\n _planned = 0, _dirty && throttled(arg)\n ));\n }\n return throttled;\n}\n\n/**\n * Debounces a function to run after a delay since the last call.\n * @template {Function} T\n * @param {T} fn - Function to debounce\n * @param {number|Function} [ms] - Delay in ms or scheduler function (default: microtask)\n * @param {boolean} [immediate=false] - Fire on leading edge instead of trailing\n * @returns {T} Debounced function\n */\nexport const debounce = (fn, ms, immediate) => {\n let schedule = typeof ms === 'function' ? ms : ms ? (fn) => setTimeout(fn, ms) : queueMicrotask;\n return immediate\n ? ((_blocked) => (arg) => !_blocked && (fn(arg), _blocked = 1, schedule(() => _blocked = 0)))()\n : ((_count = 0) => (arg, _c = ++_count) => schedule(() => _c == _count && fn(arg)))()\n}\n\n/**\n * Parses time string to milliseconds. Supports: 100, 100ms, 1s, 1m\n * @param {string|number} t - Time value\n * @returns {number} Milliseconds\n */\nexport * from './store.js';\n\nexport default sprae\n", "/**\n * @fileoverview Signals-powered reactive proxy store\n * @module sprae/store\n */\n\nimport { signal, computed, batch, untracked } from './core.js'\n\n/** Symbol for accessing the internal signals map */\nexport const _signals = Symbol('signals')\n\n/** Symbol for the change signal that tracks object keys or array length */\nexport const _change = Symbol('change')\n\n/** Symbol for stashed setter on computed values */\nexport const _set = Symbol('set')\n\n// a hack to simulate sandbox for `with` in evaluator\nlet sandbox = true\n\n/**\n * Reactive store with signals backing.\n * @template T\n * @typedef {T & { [_signals]: Record<string | symbol, import('./core.js').Signal<any>> }} ReactiveStore\n */\n\n/**\n * Creates a reactive proxy store from an object or array.\n * Properties become signals for fine-grained reactivity.\n * Supports nested objects, arrays, computed getters, and methods.\n *\n * @template {Object} T\n * @param {T} values - Initial values object\n * @param {Object} [parent] - Parent scope for inheritance\n * @returns {ReactiveStore<T>} Reactive proxy store\n *\n * @example\n * const state = store({ count: 0, get doubled() { return this.count * 2 } })\n * state.count = 5 // triggers updates\n * state.doubled // 10 (computed)\n */\nexport const store = (values, parent) => {\n if (!values) return values\n\n // ignore globals\n // FIXME: handle via has trap\n if (values[Symbol.toStringTag]) return values;\n\n // bypass existing store\n if (values[_signals]) return values\n\n // non-objects: for array redirect to list\n if (values.constructor !== Object) return Array.isArray(values) ? list(values) : values\n\n // _change stores total number of keys to track new props\n let keyCount = Object.keys(values).length,\n signals = {}\n\n // proxy conducts prop access to signals\n let state = new Proxy(Object.assign(signals, {\n [_change]: signal(keyCount),\n [_signals]: signals\n }), {\n get: (_, k) => {\n if (k in signals) return (signals[k] ? signals[k].valueOf() : signals[k])\n return parent ? parent[k] : (typeof globalThis[k] === 'function' && !globalThis[k].prototype ? globalThis[k].bind(globalThis) : globalThis[k])\n },\n\n set: (_, k, v) => {\n // console.group('SET', k, v)\n if (k in signals) return set(signals, k, v), 1\n\n // turn off sandbox to check if parents have the prop - we don't want to create new prop in global scope\n sandbox = false\n\n // write transparency for parent scope, unlike prototype chain\n // if prop is defined in parent scope (except global) - write there\n if (parent && k in parent) {\n parent[k] = v\n }\n // else create in current scope\n else {\n create(signals, k, v)\n signals[_change].value = ++keyCount\n }\n\n sandbox = true\n\n // console.groupEnd()\n // bump length for new signal\n return 1\n },\n\n // FIXME: try to avild calling Symbol.dispose here. Maybe _delete method?\n deleteProperty: (_, k) => {\n k in signals && (k[0] != '_' && signals[k]?.[Symbol.dispose]?.(), delete signals[k], signals[_change].value = --keyCount)\n return 1\n },\n\n // subscribe to length when spreading\n ownKeys: () => (signals[_change].value, Reflect.ownKeys(signals)),\n\n // sandbox prevents writing to global\n has: (_, k) => {\n if (k in signals) return true\n if (parent) return k in parent\n return sandbox\n }\n })\n\n // init signals for values\n const descs = Object.getOwnPropertyDescriptors(values)\n\n for (let k in values) {\n // getter turns into computed\n if (descs[k]?.get)\n // stash setter\n (signals[k] = computed(descs[k].get.bind(state)))[_set] = descs[k].set?.bind(state);\n\n // init blank signal - make sure we don't take prototype one\n else create(signals, k, values[k])\n }\n\n return state\n}\n\n/**\n * Creates a reactive array store with lazy signal initialization.\n * Arrays can be large, so signals are created on-demand.\n * @param {any[]} values - Initial array values\n * @param {Object} [parent=globalThis] - Parent scope\n * @returns {ReactiveStore<any[]>} Reactive array proxy\n */\nconst list = (values, parent = globalThis) => {\n\n // gotta fill with null since proto methods like .reduce may fail\n let signals = Array(values.length).fill(null),\n\n // if .length was accessed from mutator (.push/etc) method\n isMut = false,\n\n // since array mutator methods read .length internally only once, we disable it on the moment of call, allowing rest of operations to be reactive\n mut = fn => function () { isMut = true; return fn.apply(this, arguments); },\n\n length = signal(values.length),\n\n // proxy passes prop access to signals\n state = new Proxy(\n Object.assign(signals, {\n [_change]: length,\n [_signals]: signals,\n // patch mutators\n push: mut(signals.push),\n pop: mut(signals.pop),\n shift: mut(signals.shift),\n unshift: mut(signals.unshift),\n splice: mut(signals.splice),\n }),\n {\n get(_, k) {\n // console.log('GET', k, isMut)\n\n // if .length is read within mutators - peek signal to avoid recursive subscription\n // we need to ignore it only once and keep for the rest of the mutator call\n if (k === 'length') return isMut ? (isMut = false, signals.length) : length.value;\n\n // non-numeric\n if (typeof k === 'symbol' || isNaN(k)) return signals[k]?.valueOf() ?? parent[k];\n\n // create signal (lazy)\n // NOTE: if you decide to unlazy values, think about large arrays - init upfront can be costly\n return (signals[k] ??= signal(store(values[k]))).valueOf()\n },\n\n set(_, k, v) {\n // console.log('SET', k, v)\n\n // .length\n if (k === 'length') {\n // force cleaning up tail\n for (let i = v; i < signals.length; i++) delete state[i]\n // .length = N directly\n length.value = signals.length = v;\n }\n\n // force changing length, if eg. a=[]; a[1]=1 - need to come after setting the item\n else if (k >= signals.length) create(signals, k, v), state.length = +k + 1\n\n // existing signal\n else signals[k] ? set(signals, k, v) : create(signals, k, v)\n\n return 1\n },\n\n // dispose notifies any signal deps, like :each\n deleteProperty: (_, k) => (signals[k]?.[Symbol.dispose]?.(), delete signals[k], 1),\n })\n\n return state\n}\n\n/**\n * Creates a signal for a property value.\n * Skips wrapping for untracked props (underscore prefix) and existing signals.\n * @param {Object} signals - Signals storage object\n * @param {string} k - Property key\n * @param {any} v - Property value\n */\nconst create = (signals, k, v) => (signals[k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n\n/**\n * Updates a signal value, handling arrays specially for efficient patching.\n * @param {Object} signals - Signals storage object\n * @param {string} k - Property key\n * @param {any} v - New value\n */\nconst set = (signals, k, v, _s, _v) => {\n // skip unchanged (although can be handled by last condition - we skip a few checks this way)\n return k[0] === '_' ? (signals[k] = v) :\n (v !== (_v = (_s = signals[k]).peek())) && (\n // stashed _set for value with getter/setter\n _s[_set] ? _s[_set](v) :\n // patch array\n Array.isArray(v) && Array.isArray(_v) ?\n // if we update plain array (stored in signal) - take over value instead\n // since input value can be store, we have to make sure we don't subscribe to its length or values\n // FIXME: generalize to objects\n _change in _v ?\n untracked(() => batch(() => {\n for (let i = 0; i < v.length; i++) _v[i] = v[i]\n _v.length = v.length // forces deleting tail signals\n })) :\n (_s.value = v) :\n // .x = y\n (_s.value = store(v))\n )\n}\n\n\n// make sure state contains first element of path, eg. `a` from `a.b[c]`\n// NOTE: we don't need since we force proxy sandbox\n// export const ensure = (state, expr, _name = expr.match(/^\\w+(?=\\s*(?:\\.|\\[|$))/)) => _name && (state[_signals][_name[0]] ??= null)\n\nexport default store\n", "/**\n * @fileoverview Minimal signals implementation (preact-signals compatible)\n * @module sprae/signal\n */\n\n/** @type {import('./core.js').EffectFn | null} */\nlet current\n\nlet depth = 0\n\n/** @type {Set<import('./core.js').EffectFn> | null} */\nlet batched;\n\n/**\n * Creates a reactive signal.\n * @template T\n * @param {T} v - Initial value\n * @returns {import('./core.js').Signal<T>}\n */\nexport const signal = (v, _s, _obs = new Set, _v = () => _s.value) => (\n _s = {\n get value() {\n current?.deps.add(_obs.add(current));\n return v\n },\n set value(val) {\n if (val === v) return\n v = val;\n for (let sub of _obs) batched ? batched.add(sub) : sub(); // notify effects\n },\n peek() { return v },\n toJSON: _v, toString: _v, valueOf: _v\n }\n)\n\n/**\n * Creates a reactive effect that re-runs when dependencies change.\n * @param {() => void | (() => void)} fn - Effect function, may return cleanup\n * @returns {() => void} Dispose function\n */\nexport const effect = (fn, _teardown, _fx, _deps) => (\n _fx = (prev) => {\n let tmp = _teardown;\n _teardown = null; // we null _teardown to avoid repeated call in case of recursive update\n tmp?.call?.();\n prev = current, current = _fx\n if (depth++ > 10) throw 'Cycle detected';\n try { _teardown = fn() } finally { current = prev; depth-- }\n },\n _fx.fn = fn,\n _deps = _fx.deps = new Set(),\n\n _fx(),\n (dep) => { _teardown?.call?.(); for (dep of _deps) dep.delete(_fx); _deps.clear() }\n)\n\n/**\n * Creates a computed signal derived from other signals.\n * @template T\n * @param {() => T} fn - Computation function\n * @returns {import('./core.js').Signal<T>}\n */\nexport const computed = (fn, _s = signal(), _c, _e, _v = () => _c.value) => (\n _c = {\n get value() {\n _e ||= effect(() => _s.value = fn());\n return _s.value\n },\n peek: _s.peek,\n toJSON: _v, toString: _v, valueOf: _v\n }\n)\n\n/**\n * Batches multiple signal updates into a single notification.\n * @template T\n * @param {() => T} fn - Function containing updates\n * @returns {T}\n */\nexport const batch = (fn, _first = !batched, _list) => {\n batched ??= new Set;\n try { fn(); }\n finally { if (_first) { [batched, _list] = [null, batched]; for (const fx of _list) fx(); } }\n}\n\n/**\n * Runs a function without tracking dependencies.\n * @template T\n * @param {() => T} fn - Function to run untracked\n * @returns {T}\n */\nexport const untracked = (fn, _prev, _v) => (_prev = current, current = null, _v = fn(), current = _prev, _v)\n\n", "import sprae, { throttle, _on, _off, _state, frag } from '../core.js';\n\n/**\n * Conditional directive - shows/hides element based on condition.\n * Works with :else and :else :if for branching.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @param {Object} state - State object\n * @returns {(value: any) => void} Update function\n */\nexport default (el, state) => {\n let _holder, _el, _match\n\n // new element :if\n if (!el._holder) {\n // mark el as fake-spraed to delay init, since we sprae rest when branch matches, both :if and :else :if\n el[_state] ??= null\n\n _el = el.content ? frag(el) : el\n\n el.replaceWith(_holder = document.createTextNode(''))\n _el._holder = _holder._holder = _holder\n\n\n _holder._clauses = [_el._clause = [_el, false]]\n\n _holder.update = throttle(() => {\n let match = _holder._clauses.find(([, s]) => s)\n\n if (match != _match) {\n _match?.[0].remove()\n _match?.[0][_off]?.()\n if (_match = match) {\n _holder.before(_match[0].content || _match[0])\n // there's no :else after :if, so lazy-sprae here doesn't risk adding own destructor to own list of destructors\n !_match[0][_state] ? (delete _match[0][_state], sprae(_match[0], state)) : _match[0][_on]?.()\n }\n }\n })\n }\n // :else :if needs to be spraed all over to have clean list of offable effects\n else sprae(_el = el, state)\n\n // :else may have children to init which is called after :if\n // or preact can schedule :else after :if, so we ensure order of call by next tick\n return value => {\n _el._clause[1] = value\n _el._holder.update()\n }\n}\n", "import { _on, _off, _state, frag } from '../core.js';\n\n/**\n * Else directive - conditional branch following :if.\n * Can be used as `:else` or `:else :if=\"condition\"`.\n * @param {Element | HTMLTemplateElement} el - Element with directive\n * @returns {() => void} Update function\n */\nexport default (el) => {\n let _el, _prev = el\n\n _el = el.content ? frag(el) : el\n\n // find holder\n while (_prev && !(_el._holder = _prev._holder)) _prev = _prev.previousSibling\n\n el.remove()\n el[_state] = null // mark as fake-spraed to stop further init, to lazy-sprae when branch matches\n\n _el._holder._clauses.push(_el._clause = [_el, true])\n\n return _el._holder.update\n}\n", "import { frag } from \"../core.js\"\n\n/**\n * Text directive - sets textContent reactively.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @returns {(v: any) => void} Update function\n */\nexport default el => (\n // <template :text=\"a\"/> or previously initialized template\n el.content && el.replaceWith(el = frag(el).childNodes[0]),\n v => (v = typeof v === 'function' ? v(el.textContent) : v, el.textContent = v == null ? \"\" : v)\n)\n", "import { clsx, decorate } from \"../core.js\";\n\n/**\n * Class directive - manages CSS classes reactively.\n * Supports strings, arrays, and objects (like clsx/classnames).\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Directive name with modifiers\n * @returns {(v: string | string[] | Record<string, boolean>) => void} Update function\n */\nexport default (el, st, ex, name) => {\n let _cur = new Set, _new\n\n // redefine target, if modifiers have one\n name.includes('.') && (el = decorate({target:el}, name.split('.').slice(1)).target ?? el)\n\n return (v) => {\n _new = new Set\n if (v) clsx(typeof v === 'function' ? v(el.className) : v).split(' ').map(c => c && _new.add(c))\n for (let c of _cur) if (_new.has(c)) _new.delete(c); else el.classList.remove(c);\n for (let c of _cur = _new) el.classList.add(c)\n }\n}\n", "import { attr, decorate } from \"../core.js\";\n\n/**\n * Style directive - sets inline styles reactively.\n * Accepts string or object. Preserves static styles.\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Directive name with modifiers\n * @returns {(v: string | Record<string, string> | ((style: CSSStyleDeclaration) => any)) => void} Update function\n */\nexport default (el, st, ex, name) => {\n let _static;\n\n // redefine target, if modifiers have one\n if (name.includes('.')) el = decorate({target:el}, name.split('.').slice(1)).target ?? el;\n\n return v => {\n if (!_static) { _static = el.getAttribute(\"style\") }\n v = typeof v === \"function\" ? v(el.style) : v\n if (typeof v === \"string\") attr(el, \"style\", _static + '; ' + v);\n else {\n if (_static) attr(el, \"style\", _static);\n // NOTE: we skip names not starting with a letter - eg. el.style stores properties as { 0: --x } or JSDOM has _pfx\n for (let k in v) k[0] == '-' ? el.style.setProperty(k, v[k]) : k[0] > 'A' && (el.style[k] = v[k])\n }\n }\n}\n", "/**\n * Effect directive - runs side effects.\n * Calls function result if expression evaluates to a function.\n * @returns {(fn: any) => any} Update function\n */\nexport default () => (fn) => typeof fn === 'function' && fn()\n", "import sprae, { attr, parse, _state } from \"../core.js\";\n\n/**\n * Creates a setter function for two-way binding.\n * @param {string} expr - Expression to assign to\n * @returns {(target: Object, value: any) => void} Setter function\n */\nexport const setter = (expr, _set = parse(`${expr}=__`)) => (target, value) => {\n target.__ = value; _set(target), delete target.__\n}\n\n/**\n * Value directive - two-way binding for form elements.\n * Supports text, checkbox, radio, select, and textarea.\n * @param {HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement} el - Form element\n * @param {Object} state - State object\n * @param {string} expr - Bound expression\n * @returns {(value: any) => void} Update function\n */\nexport default (el, state, expr) => {\n // bind back to value, but some values can be not bindable, eg. `:value=\"7\"`\n try {\n const set = setter(expr)\n const handleChange = el.type === 'checkbox' ? () => set(state, el.checked) :\n el.type === 'select-multiple' ? () => set(state, [...el.selectedOptions].map(o => o.value)) :\n () => set(state, el.selectedIndex < 0 ? null : isNaN(el.valueAsNumber) ? el.value : el.valueAsNumber);\n\n el.oninput = el.onchange = handleChange; // hope user doesn't redefine these manually via `.oninput = somethingElse` - it saves 5 loc vs addEventListener\n\n if (el.type?.startsWith('select')) {\n // select element also must observe any added/removed options or changed values (outside of sprae)\n new MutationObserver(handleChange).observe(el, { childList: true, subtree: true, attributes: true });\n\n // select options must be initialized before calling an update\n sprae(el, state)\n }\n\n // initial state value - setter has already cached it, so parse is fast\n parse(expr)(state) ?? handleChange()\n } catch { }\n\n return (el.type === \"text\" || el.type === \"\" || el.tagName === \"TEXTAREA\") ?\n (value, _from, _to) => (\n // we retain selection in input\n (_from = el.selectionStart),\n (_to = el.selectionEnd),\n el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)),\n _from && el.setSelectionRange(_from, _to)\n ) :\n (el.type === \"checkbox\") ?\n (value) => (el.checked = value, attr(el, \"checked\", value)) :\n (el.type === 'radio') ? (value) => (\n el.value === value && ((el.checked = value), attr(el, 'checked', value))\n ) :\n (el.type === \"select-one\") ?\n (value) => {\n for (let o of el.options)\n o.value == value ? o.setAttribute(\"selected\", '') : o.removeAttribute(\"selected\");\n el.value = value;\n } :\n (el.type === 'select-multiple') ? (value) => {\n for (let o of el.options) o.removeAttribute('selected')\n for (let v of value) el.querySelector(`[value=\"${v}\"]`).setAttribute('selected', '')\n } :\n (value) => (el.value = value);\n}\n", "import { parse } from \"../core.js\"\nimport { setter } from \"./value.js\"\n\n/**\n * Ref directive - stores element reference in state.\n * If expression is a function, calls it with element (returns dispose).\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Variable name or function expression\n * @returns {{ [Symbol.dispose]: () => void } | void} Disposal object or void\n */\nexport default (el, state, expr) => {\n let fn = parse(expr)(state)\n\n if (typeof fn == 'function') return {[Symbol.dispose]:fn(el)}\n\n // NOTE: we have to set element statically (outside of effect) to avoid parasitic sub - multiple els with same :ref can cause recursion (eg. :each :ref=\"x\")\n // Object.defineProperty(state, expr, { value: el, configurable: true })\n setter(expr)(state, el)\n}\n", "import sprae, { store, untracked, _state, _signals, signal } from '../core.js'\n\n/**\n * Scope directive - creates a child scope with local state.\n * Properties merge into a new scope inheriting from parent.\n * @param {Element} el - Target element\n * @param {Object} rootState - Parent state object\n * @returns {(values: Object | ((state: Object) => Object)) => void | boolean} Update function\n */\nexport default (el, rootState) => {\n // 0 run pre-creates state to provide scope for the first effect - it can write vars in it, so we should already have it\n // el[_state] even replaces own :scope effect state\n let state = el[_state] = store({}, rootState), init = false;\n\n // 1st run spraes subtree with values from scope, it can be postponed by modifiers (we isolate reads from parent effect)\n // 2nd+ runs update subscope\n return values => {\n values = typeof values === 'function' ? values(state) : values;\n\n // we bind to subscope to alleviate friction using scope method directly\n // also returned props should force-create signals in subscope, not overwriting parent\n if (values !== state) {\n for (let k in values) {\n // _add forces new prop, instead of checking parent\n let v = typeof values[k] === 'function' ? values[k].bind(state) : values[k]\n // update\n if (k in state[_signals]) state[k] = v\n // create\n else (state[_signals][k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n }\n }\n\n // Object.assign(subscope, call(values, subscope))\n return !init && (init = true, delete el[_state], untracked(() => sprae(el, state)))\n }\n}\n", "import sprae, { store, parse, _state, effect, _change, _signals, frag, throttle, debounce } from \"../core.js\";\n\n/**\n * Each directive - renders list items from array/object/number.\n * Syntax: `:each=\"item in items\"` or `:each=\"(item, idx) of items\"`\n * @param {HTMLTemplateElement | Element} tpl - Template element\n * @param {Object} state - State object\n * @param {string} expr - Iterator expression\n * @returns {{ eval: Function, [Symbol.dispose]: () => void }} Directive result\n */\nexport default (tpl, state, expr) => {\n const [lhs, rhs] = expr.split(/\\bin|of\\b/)\n\n let [itemVar, idxVar = \"$\"] = lhs.trim().replace(/\\(|\\)/g, '').split(/\\s*,\\s*/);\n\n // we need :if to be able to replace holder instead of tpl for :if :each case\n let holder = document.createTextNode(\"\");\n\n // we re-create items any time new items are produced\n let cur, keys, items, prevl = 0\n\n let update = throttle(() => {\n let i = 0, newItems = items, newl = newItems.length\n\n // plain array update, not store (signal with array) - updates full list\n if (cur && !cur[_change]) {\n for (let s of cur[_signals] || []) s[Symbol.dispose]()\n cur = null, prevl = 0\n }\n\n\n // delete\n if (newl < prevl) cur.length = newl\n\n // update, append, init\n else {\n // init\n if (!cur) cur = newItems\n // update\n else while (i < prevl) cur[i] = newItems[i++]\n\n // batch append using DocumentFragment for efficiency\n let batchSize = newl - i\n let batch = batchSize > 1 ? document.createDocumentFragment() : null\n let pending = batch ? [] : null\n\n // append\n for (; i < newl; i++) {\n cur[i] = newItems[i]\n\n let idx = i\n let el = tpl.content ? frag(tpl) : tpl.cloneNode(true);\n // el.content is DocumentFragment for frag() output, el itself for cloneNode\n let insertNode = el.content || el\n\n // collect for batch insert\n if (batch) {\n batch.appendChild(insertNode)\n pending.push([ el, idx ])\n } else {\n holder.before(insertNode)\n let subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n sprae(el, subscope)\n }\n\n // signal/holder disposal removes element\n let _prev = ((cur[_signals] ||= [])[i] ||= {})[Symbol.dispose]\n cur[_signals][i][Symbol.dispose] = () => {\n _prev?.(), el[Symbol.dispose]?.(), el.remove()\n };\n }\n\n // batch insert all at once, then sprae\n if (batch) {\n holder.before(batch)\n for (let [el, idx] of pending) {\n let subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n sprae(el, subscope)\n }\n }\n }\n\n prevl = newl\n })\n\n tpl.replaceWith(holder);\n tpl[_state] = null // mark as fake-spraed, to preserve :-attribs for template\n\n return Object.assign(value => {\n // resolve new items\n keys = null\n if (typeof value === \"number\") items = Array.from({ length: value }, (_, i) => i + 1)\n else if (value?.constructor === Object) keys = Object.keys(value), items = Object.values(value)\n else items = value || []\n\n // whenever list changes, we rebind internal change effect\n return effect(() => {\n // subscribe to items change (.length) - we do it every time (not just in update) since preact signals unsubscribes unused signals\n items[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n update()\n })\n }, {eval:parse(rhs)})\n}\n", "import { attr } from \"../core.js\";\n\n/**\n * Default attribute directive - sets any attribute value.\n * @param {Element} el - Target element\n * @param {Object} st - State object\n * @param {string} ex - Expression\n * @param {string} name - Attribute name\n * @returns {(v: any) => void} Update function\n */\nexport default (el, st, ex, name) => v => attr(el, name, typeof v === 'function' ? v(el.getAttribute(name)) : v)\n", "import { attr, dashcase } from \"../core.js\";\n\n/**\n * Spread directive - sets multiple attributes from object.\n * Keys are converted from camelCase to kebab-case.\n * @param {Element} target - Target element\n * @returns {(value: Record<string, any>) => void} Update function\n */\nexport default (target) => value => { for (let key in value) attr(target, dashcase(key), value[key]) }\n", "import { parse, decorate } from \"../core.js\"\n\n/**\n * Event directive - attaches event listeners with modifiers.\n * Syntax: `:onclick=\"handler\"` or `:onclick.prevent.stop=\"handler\"`\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Handler expression\n * @param {string} name - Event name with modifiers (e.g., 'onclick.prevent')\n * @returns {{ [Symbol.dispose]: () => void }} Disposal object\n */\nexport default (el, state, expr, name) => {\n // wrap inline cb into function\n // if (!/^(?:[\\w$]+|\\([^()]*\\))\\s*=>/.test(expr) && !/^function\\b/.test(expr)) expr = `()=>{${expr}}`;\n\n const [type, ...mods] = name.slice(2).split('.'),\n evaluate = parse(expr).bind(el),\n trigger = decorate(Object.assign(e => evaluate(state, (fn) => typeof fn === 'function' ? fn(e) : fn), { target: el }), mods);\n\n trigger.target.addEventListener(type, trigger, trigger)\n return {\n [Symbol.dispose]() {\n trigger.target.removeEventListener(type, trigger)\n }\n }\n}\n", "import { _dispose, parse, decorate } from \"../core.js\"\n\n/**\n * Sequence directive - chains event handlers.\n * Syntax: `:onclick..keyup.enter=\"handler\"` - click triggers, then waits for Enter.\n * @param {Element} el - Target element\n * @param {Object} state - State object\n * @param {string} expr - Handler expression\n * @param {string} names - Chained event names separated by `..`\n * @returns {{ [Symbol.dispose]: () => void }} Disposal object\n */\nexport default (el, state, expr, names) => {\n let cur, // current step callback\n off // current step disposal\n\n let steps = names.split('..').map((step, i, { length }) => step.split(':').reduce(\n (prev, str) => {\n const [name, ...mods] = str.slice(2).split('.')\n\n const evaluate = parse(expr).bind(el)\n\n const next = (fn, e) => cur = typeof fn === 'function' ? fn(e) : fn\n const trigger = decorate(Object.assign(\n e => (!i ? evaluate(state, (fn) => next(fn, e)) : next(cur, e), off(), off = steps[(i + 1) % length]()),\n { target: el }\n ), mods)\n\n\n return (_poff) => (\n _poff = prev?.(),\n trigger.target.addEventListener(name, trigger, trigger),\n () => (_poff?.(), trigger.target.removeEventListener(name, trigger))\n )\n }, null)\n )\n\n off = steps[0]()\n\n return {\n [Symbol.dispose]() {\n off?.()\n }\n }\n}\n", "import sprae, { _dispose } from \"../core.js\"\n\n/**\n * HTML directive - sets innerHTML and initializes nested directives.\n * Supports templates for fragment insertion.\n * @param {Element | HTMLTemplateElement} el - Target element\n * @param {Object} state - State object\n * @returns {(v: string | ((html: string) => string)) => void | (() => void)} Update function\n */\nexport default (el, state) => {\n // <template :html=\"a\"/> - fragment case: use placeholder + range\n if (el.content) {\n let start = document.createTextNode(''),\n end = document.createTextNode(''),\n range = document.createRange()\n el.replaceWith(start, end)\n return v => {\n v = typeof v === 'function' ? v('') : v\n range.setStartAfter(start)\n range.setEndBefore(end)\n range.deleteContents()\n if (v != null && v !== '') {\n let frag = range.createContextualFragment(v)\n sprae(frag, state)\n range.insertNode(frag)\n }\n }\n }\n return v => (v = typeof v === 'function' ? v(el.innerHTML) : v, el.innerHTML = v == null ? \"\" : v, sprae(el, state), el[_dispose])\n}\n", "/**\n * Portal directive - teleports element to another container.\n * Value can be selector string, element, or falsy to return home.\n * @param {Element} el - Element to teleport\n * @param {Object} state - State object\n * @param {string} expr - Expression\n * @returns {(value: string | Element | null | false) => void} Update function\n */\nexport default (el, state, expr) => {\n const comment = document.createComment(':portal')\n let currentTarget = null\n\n // Insert placeholder before element\n el.before(comment)\n\n return (value) => {\n // Resolve target: selector string, element, or null/false to return home\n // For selectors, first try within the same root, then document\n const root = el.getRootNode()\n const target = typeof value === 'string'\n ? (root.querySelector?.(value) || document.querySelector(value))\n : value instanceof Element ? value\n : value ? document.body : null\n\n // No change needed\n if (target === currentTarget) return\n\n if (target) {\n // Move to target\n target.appendChild(el)\n } else {\n // Return home (after placeholder)\n comment.after(el)\n }\n\n currentTarget = target\n }\n}\n", "/**\n * Hidden directive - toggles the hidden attribute.\n * @param {Element} el - Target element\n * @returns {(value: any) => boolean} Update function\n */\nexport default (el) => (value) => el.hidden = !!value\n", "/**\n * @fileoverview Sprae - lightweight reactive HTML templating library\n * @module sprae\n */\n\nimport store from \"./store.js\";\nimport { batch, computed, effect, signal, untracked } from './core.js';\nimport * as signals from './signal.js';\nimport sprae, { use, decorate, directive, modifier, parse, throttle, debounce, _off, _state, _on, _dispose, _add } from './core.js';\n\nimport _if from \"./directive/if.js\";\nimport _else from \"./directive/else.js\";\nimport _text from \"./directive/text.js\";\nimport _class from \"./directive/class.js\";\nimport _style from \"./directive/style.js\";\nimport _fx from \"./directive/fx.js\";\nimport _value from \"./directive/value.js\";\nimport _ref from \"./directive/ref.js\";\nimport _scope from \"./directive/scope.js\";\nimport _each from \"./directive/each.js\";\nimport _default from \"./directive/_.js\";\nimport _spread from \"./directive/spread.js\";\nimport _event from \"./directive/event.js\";\nimport _seq from \"./directive/sequence.js\";\nimport _html from \"./directive/html.js\";\nimport _portal from \"./directive/portal.js\";\nimport _hidden from \"./directive/hidden.js\";\n\n\nObject.assign(directive, {\n _: (el, state, expr, name) => (name.startsWith('on') ? _event : _default)(el, state, expr, name),\n '': _spread,\n class: _class,\n text: _text,\n html: _html,\n style: _style,\n fx: _fx,\n value: _value,\n ref: _ref,\n scope: _scope,\n if: _if,\n else: _else,\n each: _each,\n portal: _portal,\n hidden: _hidden\n})\n\n\n/**\n * Directive initializer with modifiers support.\n * @param {Element} target - Target element\n * @param {string} name - Directive name with modifiers (e.g., 'onclick.throttle-500')\n * @param {string} expr - Expression string\n * @param {Object} state - Reactive state object\n * @returns {() => (() => void) | void} Initializer function that returns a disposer\n */\nconst dir = (target, name, expr, state) => {\n let [dirName, ...mods] = name.split('.'), create = directive[dirName] || directive._\n\n return () => {\n let update = create(target, state, expr, name)\n\n if (!update?.call) return update?.[_dispose]\n\n // throttle prevents multiple updates within one tick as well as isolates stack for each update\n let trigger = decorate(Object.assign(throttle(() => change.value++), { target }), mods),\n change = signal(0), // signal authorized to trigger effect: 0 = init; >0 = trigger\n count = 0, // called effect count\n evaluate = update.eval ?? parse(expr).bind(target),\n _out, out = () => (typeof _out === 'function' && _out(), _out=null) // effect trigger and invoke may happen in the same tick, so it will be effect-within-effect call - we need to store output of evaluate to return from trigger effect\n\n state = target[_state] ?? state\n\n return effect(() => (\n // if planned count is same as actual count - plan new update, else update right away\n change.value == count ? (trigger()) : (count = change.value, _out = evaluate(state, update)),\n out\n ))\n }\n}\n\n// Parses time string to ms: 100, 100ms, 1s, 1m\nconst parseTime = (t) => !t ? 0 : typeof t === 'number' ? t :\n (([, n, u] = t.match(/^(\\d+)(ms|s|m)?$/) || []) => (n = +n, u === 's' ? n * 1000 : u === 'm' ? n * 60000 : n))()\n\n// Creates scheduler from time/keyword (idle, raf, tick, or ms)\nconst scheduler = (t) =>\n t === 'idle' ? requestIdleCallback :\n t === 'raf' ? requestAnimationFrame :\n !t || t === 'tick' ? queueMicrotask :\n (fn) => setTimeout(fn, parseTime(t))\n\n// Built-in modifiers for timing, targeting, and event handling\nObject.assign(modifier, {\n /**\n * Delays callback by interval since last call (trailing edge).\n * Supports: tick (default), raf, idle, N, Nms, Ns, Nm. Add -immediate for leading edge.\n * Examples: .debounce, .debounce-100, .debounce-1s, .debounce-raf, .debounce-idle, .debounce-100-immediate\n */\n debounce: (fn, a, b) => debounce(fn, scheduler(a === 'immediate' ? b : a), a === 'immediate' || b === 'immediate'),\n /**\n * Limits callback rate to interval (leading + trailing edges).\n * Supports: tick (default), raf, idle, N, Nms, Ns, Nm.\n * Examples: .throttle, .throttle-100, .throttle-1s, .throttle-raf, .throttle-idle\n */\n throttle: (fn, a) => throttle(fn, scheduler(a)),\n /** Runs callback after delay. Supports: tick (default), raf, idle, N, Nms, Ns, Nm. */\n delay: (fn, a) => ((sched = scheduler(a)) => (e) => sched(() => fn(e)))(),\n\n /** Calls handler only once. */\n once: (fn, _done, _fn) => (_fn = (e) => !_done && (_done = 1, fn(e)), _fn.once = true, _fn),\n\n /** Attaches event listener to window. */\n window: fn => (fn.target = fn.target.ownerDocument.defaultView, fn),\n /** Attaches event listener to document. */\n document: fn => (fn.target = fn.target.ownerDocument, fn),\n /** Attaches event listener to document root element (<html>). */\n root: fn => (fn.target = fn.target.ownerDocument.documentElement, fn),\n /** Attaches event listener to body. */\n body: fn => (fn.target = fn.target.ownerDocument.body, fn),\n /** Attaches event listener to parent element. */\n parent: fn => (fn.target = fn.target.parentNode, fn),\n /** Triggers only when event target is the element itself. */\n self: (fn) => (e) => (e.target === fn.target && fn(e)),\n /** Triggers when click is outside the element. */\n away: (fn) => Object.assign((e) => (!fn.target.contains(e.target) && e.target.isConnected && fn(e)), {target: fn.target.ownerDocument}),\n\n /** Calls preventDefault() before handler. */\n prevent: (fn) => (e) => (e?.preventDefault(), fn(e)),\n /** Calls stopPropagation() or stopImmediatePropagation() (with -immediate). */\n stop: (fn, _how) => (e) => (_how?.[0] === 'i' ? e?.stopImmediatePropagation() : e?.stopPropagation(), fn(e)),\n /** Sets passive option for event listener. */\n passive: fn => (fn.passive = true, fn),\n /** Sets capture option for event listener. */\n capture: fn => (fn.capture = true, fn),\n})\n/** Alias for .away modifier */\nmodifier.outside = modifier.away\n\n/**\n * Key testers for keyboard event modifiers.\n * @type {Record<string, (e: KeyboardEvent) => boolean>}\n */\nconst keys = {\n ctrl: e => e.ctrlKey || e.key === \"Control\" || e.key === \"Ctrl\",\n shift: e => e.shiftKey || e.key === \"Shift\",\n alt: e => e.altKey || e.key === \"Alt\",\n meta: e => e.metaKey || e.key === \"Meta\",\n cmd: e => e.metaKey || e.key === \"Command\",\n arrow: e => e.key.startsWith(\"Arrow\"),\n enter: e => e.key === \"Enter\",\n esc: e => e.key.startsWith(\"Esc\"),\n tab: e => e.key === \"Tab\",\n space: e => e.key === \"\u00A0\" || e.key === \"Space\" || e.key === \" \",\n delete: e => e.key === \"Delete\" || e.key === \"Backspace\",\n digit: e => /^\\d$/.test(e.key),\n letter: e => /^\\p{L}$/gu.test(e.key),\n char: e => /^\\S$/.test(e.key),\n};\n\n// match key by name, or by e.key (case-insensitive), or by keyCode (digits)\nconst keyMatch = (k, e) => keys[k]?.(e) || e.key.toLowerCase() === k || e.keyCode == k\n\n// Augment modifiers with key testers (e.g., .enter, .ctrl, .ctrl-a, .ctrl-65)\nfor (let k in keys) modifier[k] = (fn, a, b) => (e) => keys[k](e) && (!a || keyMatch(a, e)) && (!b || keyMatch(b, e)) && fn(e)\n\n\n// Checks for first-level semicolons (statement vs expression)\nconst hasSemi = s => {\n for (let d=0,i=0;i<s.length;i++) {\n if (s[i]=='{') d++\n else if (s[i]=='}') d--\n else if (s[i]==';' && !d) return true\n }\n return false\n}\n\n// Configure sprae with default compiler and signals\nuse({\n\n// Default compiler wraps expression for new Function\n compile: expr => {\n // if, const, let - no return\n if (/^(if|let|const)\\b/.test(expr));\n // first-level semicolons - no return\n else if (hasSemi(expr));\n else expr = `return ${expr}`\n // async expression\n if (/\\bawait\\s/.test(expr)) expr = `return (async()=>{${expr}})()`\n return sprae.constructor(`with(arguments[0]){${expr}}`)\n },\n dir: (el, name, expr, state) => {\n // sequences shortcut\n if (name.includes('..')) return () => _seq(el, state, expr, name)[_dispose]\n return name.split(':').reduce((prev, str) => {\n let start = dir(el, str, expr, state)\n return !prev ? start : (p, s) => (p = prev(), s = start(), () => { p(); s() })\n }, null)\n },\n ...signals\n})\n\n\n// Expose for runtime configuration\nsprae.use = use\nsprae.store = store\nsprae.directive = directive\nsprae.modifier = modifier\n\n/**\n * Disposes a spraed element, cleaning up all effects and state.\n * @param {Element} el - Element to dispose\n */\nsprae.dispose = (el) => el[_dispose]?.()\n\n\n/**\n * Auto-initializes sprae on dynamically added elements.\n * Uses MutationObserver to detect new DOM nodes and apply directives.\n *\n * @param {Element} [root=document.body] - Root element to observe\n * @param {Object} [values] - Initial state values\n * @returns {Object} The reactive state object\n *\n * @example\n * ```js\n * // Auto-init on page load\n * sprae.start(document.body, { count: 0 })\n * ```\n */\nconst start = sprae.start = (root = document.body, values) => {\n const state = store(values)\n sprae(root, state);\n const mo = new MutationObserver(mutations => {\n for (const m of mutations) {\n for (const el of m.addedNodes) {\n // el can be spraed or removed by subsprae (like within :each/:if)\n if (el.nodeType === 1 && el[_state] === undefined && root.contains(el)) {\n // even if element has no spraeable attrs, some of its children can have\n root[_add](el)\n }\n }\n for (const el of m.removedNodes) el.nodeType === 1 && el[_dispose]?.()\n }\n });\n mo.observe(root, { childList: true, subtree: true });\n return state\n}\n\n\n/** Package version (injected by bundler) */\nsprae.version = \"12.4.1\"\n\nconst dispose = sprae.dispose\n\nexport default sprae\nexport { sprae, store, signal, effect, computed, batch, untracked, start, use, throttle, debounce, dispose }\n", "var sprae = require(\"./sprae.js\").default; module.exports = sprae; var cur = document.currentScript;\nvar prefix = cur.getAttribute(\"prefix\") ?? cur.dataset.prefix ?? cur.dataset.spraePrefix;\nvar start = cur.getAttribute(\"start\") ?? cur.dataset.start ?? cur.dataset.spraeStart;\nif (prefix) sprae.use({ prefix });\nif (start != null && start !== 'false') (start && start !== 'true' ? document.querySelectorAll(start) : [document.body || document.documentElement]).forEach(el => sprae.start(el))"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["_dispose", "_state", "_on", "_off", "_add", "prefix", "signal", "effect", "computed", "batch", "untracked", "directive", "modifier", "currentDir", "currentEl", "elHint", "err", "sprae", "dir", "compile", "parse", "cache", "use", "decorate", "frag", "dashcase", "attr", "clsx", "throttle", "debounce", "core_default", "init_core", "__esmMin", "init_store", "fn", "el", "hint", "expr", "msg", "display", "state", "store_default", "fx", "offs", "off", "add", "_attrs", "start", "i", "name", "value", "child", "next", "e", "cb", "_out", "result", "v", "config", "mods", "params", "mod", "wrapFn", "k", "tpl", "content", "attributes", "ref", "childNodes", "a", "str", "match", "c", "s", "ms", "_planned", "arg", "schedule", "throttled", "_dirty", "immediate", "_blocked", "_count", "_c", "_signals", "_change", "_set", "sandbox", "store", "list", "create", "set", "store_default", "init_store", "__esmMin", "init_core", "values", "parent", "keyCount", "signals", "state", "signal", "_", "k", "v", "descs", "computed", "isMut", "mut", "fn", "length", "i", "_s", "_v", "untracked", "batch", "signal_exports", "__export", "batch", "computed", "effect", "signal", "untracked", "current", "depth", "batched", "init_signal", "__esmMin", "v", "_s", "_obs", "_v", "val", "sub", "fn", "_teardown", "_fx", "_deps", "prev", "tmp", "dep", "_c", "_e", "_first", "_list", "fx", "_prev", "if_default", "init_if", "__esmMin", "init_core", "el", "state", "_a", "_holder", "_el", "_match", "core_default", "_state", "frag", "throttle", "match", "s", "_off", "_on", "value", "else_default", "init_else", "__esmMin", "init_core", "el", "_el", "_prev", "frag", "_state", "text_default", "init_text", "__esmMin", "init_core", "el", "frag", "v", "class_default", "init_class", "__esmMin", "init_core", "el", "st", "ex", "name", "_cur", "_new", "decorate", "v", "clsx", "c", "style_default", "init_style", "__esmMin", "init_core", "el", "st", "ex", "name", "_static", "decorate", "v", "attr", "k", "fx_default", "init_fx", "__esmMin", "fn", "setter", "value_default", "init_value", "__esmMin", "init_core", "expr", "_set", "parse", "target", "value", "el", "state", "set", "handleChange", "o", "core_default", "_from", "_to", "attr", "v", "ref_default", "init_ref", "__esmMin", "init_core", "init_value", "el", "state", "expr", "fn", "parse", "setter", "scope_default", "init_scope", "__esmMin", "init_core", "el", "rootState", "state", "_state", "store", "init", "values", "k", "v", "_signals", "signal", "untracked", "core_default", "each_default", "init_each", "__esmMin", "init_core", "tpl", "state", "expr", "lhs", "rhs", "itemVar", "idxVar", "holder", "cur", "keys", "items", "prevl", "update", "throttle", "_a", "_b", "i", "newItems", "newl", "_change", "s", "_signals", "batch", "pending", "idx", "el", "frag", "insertNode", "subscope", "core_default", "_prev", "_state", "value", "_", "effect", "parse", "__default", "init__", "__esmMin", "init_core", "el", "st", "ex", "name", "v", "attr", "spread_default", "init_spread", "__esmMin", "init_core", "target", "value", "key", "attr", "dashcase", "event_default", "init_event", "__esmMin", "init_core", "el", "state", "expr", "name", "type", "mods", "evaluate", "parse", "trigger", "decorate", "e", "fn", "sequence_default", "init_sequence", "__esmMin", "init_core", "el", "state", "expr", "names", "cur", "off", "steps", "step", "i", "length", "prev", "str", "name", "mods", "evaluate", "parse", "next", "fn", "e", "trigger", "decorate", "_poff", "html_default", "init_html", "__esmMin", "init_core", "el", "state", "start", "end", "range", "v", "frag", "core_default", "_dispose", "portal_default", "init_portal", "__esmMin", "el", "state", "expr", "comment", "currentTarget", "value", "root", "target", "hidden_default", "init_hidden", "__esmMin", "el", "value", "sprae_exports", "__export", "batch", "computed", "debounce", "sprae_default", "dispose", "effect", "signal", "core_default", "start", "store_default", "throttle", "untracked", "use", "dir", "parseTime", "scheduler", "keys", "keyMatch", "hasSemi", "init_sprae", "__esmMin", "init_store", "init_core", "init_signal", "init_if", "init_else", "init_text", "init_class", "init_style", "init_fx", "init_value", "init_ref", "init_scope", "init_each", "init__", "init_spread", "init_event", "init_sequence", "init_html", "init_portal", "init_hidden", "directive", "el", "state", "expr", "name", "event_default", "__default", "spread_default", "class_default", "text_default", "html_default", "style_default", "fx_default", "value_default", "ref_default", "scope_default", "if_default", "else_default", "each_default", "portal_default", "hidden_default", "target", "dirName", "mods", "create", "update", "_dispose", "trigger", "decorate", "change", "count", "evaluate", "parse", "_out", "out", "_state", "t", "n", "u", "fn", "modifier", "a", "b", "sched", "e", "_done", "_fn", "_how", "k", "s", "d", "i", "sequence_default", "prev", "str", "p", "signal_exports", "root", "values", "mutations", "m", "_add", "sprae", "cur", "prefix", "start", "el"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sprae",
|
|
3
3
|
"description": "DOM microhydration",
|
|
4
|
-
"version": "12.4.
|
|
4
|
+
"version": "12.4.1",
|
|
5
5
|
"main": "./sprae.js",
|
|
6
6
|
"module": "./sprae.js",
|
|
7
7
|
"umd:main": "dist/sprae.umd.js",
|
|
@@ -64,7 +64,8 @@
|
|
|
64
64
|
"bench": "node --expose-gc -r ./test/register-happy.cjs test/bench.js",
|
|
65
65
|
"build": "node .esbuild.js",
|
|
66
66
|
"types": "tsc --declaration --declarationMap --emitDeclarationOnly --outDir types --target ESNext --module ESNext --moduleResolution bundler --allowJs --skipLibCheck --noEmitOnError false sprae.js core.js store.js signal.js directive/*.js",
|
|
67
|
-
"prepublishOnly": "npm run build && npm run types"
|
|
67
|
+
"prepublishOnly": "npm run build && npm run types",
|
|
68
|
+
"site": "bundle exec jekyll serve --livereload"
|
|
68
69
|
},
|
|
69
70
|
"repository": {
|
|
70
71
|
"type": "git",
|
package/readme.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# [∴](https://dy.github.io/sprae) spræ [](https://github.com/dy/sprae/actions/workflows/node.js.yml)  spræ [](https://github.com/dy/sprae/actions/workflows/node.js.yml)  [](https://www.npmjs.com/package/sprae)
|
|
2
2
|
|
|
3
3
|
Ræctive sprinkles for HTML/JSX
|
|
4
4
|
|
|
@@ -37,7 +37,7 @@ Ræctive sprinkles for HTML/JSX
|
|
|
37
37
|
|
|
38
38
|
| | [alpine](alpine.md) | sprae |
|
|
39
39
|
|------------------|--------|-------|
|
|
40
|
-
| _size_ | ~16kb | ~
|
|
40
|
+
| _size_ | ~16kb | ~6kb |
|
|
41
41
|
| _performance_ | ~2× slower | 1.00× |
|
|
42
42
|
| _CSP_ | limited | full |
|
|
43
43
|
| _reactivity_ | custom | [signals](docs.md#signals) |
|
package/sprae.js
CHANGED
|
@@ -107,11 +107,6 @@ Object.assign(modifier, {
|
|
|
107
107
|
/** Runs callback after delay. Supports: tick (default), raf, idle, N, Nms, Ns, Nm. */
|
|
108
108
|
delay: (fn, a) => ((sched = scheduler(a)) => (e) => sched(() => fn(e)))(),
|
|
109
109
|
|
|
110
|
-
/** @deprecated Use .delay instead */
|
|
111
|
-
tick: (fn) => (console.warn('Deprecated'), (e) => (queueMicrotask(() => fn(e)))),
|
|
112
|
-
/** @deprecated Use .throttle-raf instead */
|
|
113
|
-
raf: (fn) => (console.warn('Deprecated'), (e) => requestAnimationFrame(() => fn(e))),
|
|
114
|
-
|
|
115
110
|
/** Calls handler only once. */
|
|
116
111
|
once: (fn, _done, _fn) => (_fn = (e) => !_done && (_done = 1, fn(e)), _fn.once = true, _fn),
|
|
117
112
|
|
|
@@ -134,8 +129,6 @@ Object.assign(modifier, {
|
|
|
134
129
|
prevent: (fn) => (e) => (e?.preventDefault(), fn(e)),
|
|
135
130
|
/** Calls stopPropagation() or stopImmediatePropagation() (with -immediate). */
|
|
136
131
|
stop: (fn, _how) => (e) => (_how?.[0] === 'i' ? e?.stopImmediatePropagation() : e?.stopPropagation(), fn(e)),
|
|
137
|
-
/** @deprecated Use .stop-immediate instead */
|
|
138
|
-
immediate: (fn) => (console.warn('Deprecated'), (e) => (e?.stopImmediatePropagation(), fn(e))),
|
|
139
132
|
/** Sets passive option for event listener. */
|
|
140
133
|
passive: fn => (fn.passive = true, fn),
|
|
141
134
|
/** Sets capture option for event listener. */
|
package/types/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../core.js"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,2BAA8D;AAE9D,oDAAoD;AACpD,mCAAqC;AAErC,0CAA0C;AAC1C,gCAA+B;AAE/B,2CAA2C;AAC3C,iCAAiC;AAEjC,yCAAyC;AACzC,iCAAkC;AAElC,sCAAsC;AACtC,0BAAwB;AAExB;;;;;;;;;GASG;AAEH;;;;;GAKG;AAEH;;;;GAIG;AACH,mBAFU,CAAC,GAAC,EAAE,KAAK,EAAE,GAAC,KAAK,MAAM,CAAC,GAAC,CAAC,CAElB;AAElB;;;GAGG;AACH,mBAFU,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,MAAM,IAAI,CAErC;AAElB;;;;GAIG;AACH,qBAFU,CAAC,GAAC,EAAE,EAAE,EAAE,MAAM,GAAC,KAAK,MAAM,CAAC,GAAC,CAAC,CAEnB;AAEpB;;;;GAIG;AACH,kBAFU,CAAC,GAAC,EAAE,EAAE,EAAE,MAAM,GAAC,KAAK,GAAC,CAEC;AAEhC;;;;GAIG;AACH,sBAFU,CAAC,GAAC,EAAE,EAAE,EAAE,MAAM,GAAC,KAAK,GAAC,CAEF;AAE7B;;;GAGG;AACH,sBAFU,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAEhB;AAE1B;;;GAGG;AACH,qBAFU,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAEjB;
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../core.js"],"names":[],"mappings":"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"}
|
package/types/sprae.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprae.d.ts","sourceRoot":"","sources":["../sprae.js"],"names":[],"mappings":";kBAQwH,WAAW;kBAHjH,YAAY;uBAC6B,WAAW;uBAAX,WAAW;yBAAX,WAAW;sBAAX,WAAW;0BAAX,WAAW;
|
|
1
|
+
{"version":3,"file":"sprae.d.ts","sourceRoot":"","sources":["../sprae.js"],"names":[],"mappings":";kBAQwH,WAAW;kBAHjH,YAAY;uBAC6B,WAAW;uBAAX,WAAW;yBAAX,WAAW;sBAAX,WAAW;0BAAX,WAAW;AAgOxD,6BAVH,OAAO,qBA2BjB;oBA/OuH,WAAW;yBAAX,WAAW;yBAAX,WAAW;AAqPnI,0BAA6B"}
|