sprae 12.1.0 → 12.2.0

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 CHANGED
@@ -1,4 +1,5 @@
1
1
  import store, { _change, _signals } from "./store.js";
2
+ import pkg from './package.json' with { type: 'json' };
2
3
 
3
4
  export const _dispose = (Symbol.dispose ||= Symbol("dispose")),
4
5
  _state = Symbol("state"),
@@ -75,6 +76,7 @@ const sprae = (el = document.body, state) => {
75
76
  return state;
76
77
  }
77
78
 
79
+ sprae.version = pkg.version;
78
80
 
79
81
  /**
80
82
  * Initializes directive (defined by sprae build), returns "on" function that enables it
@@ -96,20 +98,39 @@ const initDirective = (el, dirName, expr, state) => {
96
98
  if (name.startsWith('on')) {
97
99
  let type = name.slice(2),
98
100
  fn = applyMods(
99
- Object.assign(
101
+ sx(
100
102
  // single event vs chain
101
103
  length == 1 ? e => evaluate(state, (fn) => call(fn, e)) :
102
104
  (e => (cur = (!i ? e => call(evaluate(state), e) : cur)(e), off(), off = steps[(i + 1) % length]())),
103
- { target: el, type }
105
+ { target: el }
104
106
  ),
105
107
  mods);
106
108
 
107
109
  return (_poff) => (_poff = prev?.(), fn.target.addEventListener(type, fn, fn), () => (_poff?.(), fn.target.removeEventListener(type, fn)))
108
110
  }
109
111
 
112
+ let fn, dispose, change, count;
113
+
114
+ if (mods.length) {
115
+ change = signal(-1), // signal authorized to trigger effect: 0 = init; >0 = trigger
116
+ count = -1 // called effect count
117
+
118
+ // effect applier - first time it applies the effect, next times effect is triggered by change signal
119
+ fn = applyMods(sx(throttle(() => {
120
+ if (++change.value) return // all calls except for the first one are handled by effect
121
+ dispose = effect(() => update && (
122
+ change.value == count ? fn() : // plan update: separate tick (via throttle) makes sure planner effect call is finished before eval call
123
+ (count = change.value, evaluate(state, update)) // if changed more than effect called - call it
124
+ ));
125
+ }), {target: el}), mods)
126
+ }
127
+ else {
128
+ fn = sx(() => dispose = effect(() => evaluate(state, update)), {target: el })
129
+ }
130
+
110
131
  // props have no sequences and can be sync
111
132
  // it's nice to see directive as taking some part of current context and returning new or updated context
112
- let update = (directive[name] || directive['*'])(el, state, expr, name)
133
+ let update = (directive[name] || directive['*'])(fn.target, state, expr, name)
113
134
 
114
135
  // some directives are effect-less
115
136
  if (!update) return
@@ -117,32 +138,14 @@ const initDirective = (el, dirName, expr, state) => {
117
138
  // take over state if directive created it (mainly :scope)
118
139
  if (el[_state]) state = el[_state]
119
140
 
120
- // no-modifiers shortcut
121
- if (!mods.length && !prev) return ((() => effect(() => evaluate(state, update))))
122
-
123
- let dispose,
124
- change = signal(-1), // signal authorized to trigger effect: 0 = init; >0 = trigger
125
- count = -1, // called effect count
126
-
127
- // effect applier - first time it applies the effect, next times effect is triggered by change signal
128
- fn = throttle(applyMods(() => {
129
- if (++change.value) return // all calls except for the first one are handled by effect
130
- dispose = effect(() => update && (
131
- change.value == count ? fn() : // separate tick makes sure planner effect call is finished before real eval call
132
- (count = change.value, evaluate(state, update)) // if changed more than effect called - call it
133
- ));
134
- }, mods))
135
-
136
141
  return (_poff) => (
137
142
  _poff = prev?.(),
138
143
  // console.log('ON', name),
139
144
  fn(),
140
- ({
141
- [name]: () => (
142
- // console.log('OFF', name, el),
143
- _poff?.(), dispose(), change.value = -1, count = dispose = null
144
- )
145
- })[name]
145
+ () => (
146
+ // console.log('OFF', name, el),
147
+ _poff?.(), dispose?.(), change && (change.value = -1, count = dispose = null)
148
+ )
146
149
  )
147
150
  }, null)
148
151
  ));
package/dist/sprae.js CHANGED
@@ -1,5 +1,5 @@
1
- var B=Symbol.dispose||(Symbol.dispose=Symbol("dispose")),l=Symbol("state"),H=Symbol("on"),K=Symbol("off"),G=Symbol("add"),T=":",O,I,U,X=e=>e(),R=X,D={},F={},Q=null,ie=(e=document.body,r)=>{if(e[l])return Object.assign(e[l],r);r=J(r||{});let t=[],o=[],n,i=()=>!o&&(o=t.map(c=>c())),s=()=>(o?.map(c=>c()),o=null);e[H]=i,e[K]=s,e[B]||(e[B]=()=>(e[K](),e[K]=e[H]=e[B]=e[l]=e[G]=null));let a=(c,f=c.attributes)=>{if(f)for(let d=0;d<f.length;){let{name:u,value:m}=f[d];if(u.startsWith(T)){if(c.removeAttribute(u),(n=Te(c,u,m,r))&&(t.push(n),o.push(n())),l in c)return}else d++}for(let d of[...c.childNodes])d.nodeType==1&&a(d)};return e[G]=a,a(e),e[l]===void 0&&(e[l]=r),r},Te=(e,r,t,o)=>{let n,i,s=r.slice(T.length).split("..").map((a,c,{length:f})=>a.split(T).reduce((d,u)=>{let[m,...h]=u.split("."),$=A(t,D[Q=m]?.parse);if(m.startsWith("on")){let M=m.slice(2),L=ne(Object.assign(f==1?q=>$(o,z=>y(z,q)):q=>(n=(c?n:z=>y($(o),z))(q),i(),i=s[(c+1)%f]()),{target:e,type:M}),h);return q=>(q=d?.(),L.target.addEventListener(M,L,L),()=>(q?.(),L.target.removeEventListener(M,L)))}let w=(D[m]||D["*"])(e,o,t,m);if(!w)return;if(e[l]&&(o=e[l]),!h.length&&!d)return()=>I(()=>$(o,w));let x,P=O(-1),S=-1,V=C(ne(()=>{++P.value||(x=I(()=>w&&(P.value==S?V():(S=P.value,$(o,w)))))},h));return M=>(M=d?.(),V(),{[m]:()=>(M?.(),x(),P.value=-1,S=x=null)}[m])},null));return()=>i=s[0]?.()},Y=e=>(e.compile&&(ae=e.compile),e.prefix&&(T=e.prefix),e.signal&&(O=e.signal),e.effect&&(I=e.effect),e.computed&&(U=e.computed),e.batch&&(X=e.batch),e.untracked&&(R=e.untracked)),se=(e=document.body,r)=>{let t=J(r);return ie(e,t),new MutationObserver(n=>{for(let i of n)for(let s of i.addedNodes)if(s.nodeType===1&&s[l]===void 0){for(let a of s.attributes)if(a.name.startsWith(T)){e[G](s);break}}}).observe(e,{childList:!0,subtree:!0}),t},ae,A=(e,r,t)=>{if(t=A.cache[e])return t;let o=e.trim()||"undefined";r&&(o=r(o)),/^(if|let|const)\b/.test(o)||/;(?![^{]*})/.test(o)||(o=`return ${o}`),/\bawait\s/.test(o)&&(o=`return (async()=>{ ${o} })()`);try{t=ae(o),Object.defineProperty(t,"name",{value:`\u2234 ${e}`})}catch(n){console.error(`\u2234 ${n}
1
+ var ne={name:"sprae",description:"DOM microhydration",version:"12.2.0",main:"./sprae.js",module:"./sprae.js","umd:main":"dist/sprae.umd.js",unpkg:"dist/sprae.umd.js",types:"dist/sprae.d.ts",type:"module",files:["core.js","sprae.js","store.js","signal.js","micro.js","directive","dist"],devDependencies:{"@preact/signals":"^2.0.4","@preact/signals-core":"^1.8.0","@webreflection/signal":"^2.1.2","es-module-shims":"^1.10.0",esbuild:"^0.23.0","esbuild-plugin-umd-wrapper":"^2.0.3",hyperf:"^1.7.0",jsdom:"^27.0.0",requestidlecallback:"^0.3.0","signal-polyfill":"^0.1.1",subscript:"^9.1.0",tst:"^7.2.0",ulive:"^1.0.7",usignal:"^0.9.0","wait-please":"^3.1.0"},scripts:{test:"node -r ./test/register.cjs test/test.js",build:"node .esbuild.js"},repository:{type:"git",url:"git+https://github.com/dy/sprae.git"},keywords:["hydration","progressive","progressive enhancement","signals","directives","preact-signals","reactive","template-parts","petit-vue","alpinejs","templating"],author:"Dmitry Iv <df.creative@gmail.com>",license:"MIT",bugs:{url:"https://github.com/dy/sprae/issues"},homepage:"https://github.com/dy/sprae#readme"};var J=Symbol.dispose||(Symbol.dispose=Symbol("dispose")),l=Symbol("state"),H=Symbol("on"),K=Symbol("off"),G=Symbol("add"),T=":",A,v,U,X=e=>e(),R=X,q={},V={},Q=null,Y=(e=document.body,r)=>{if(e[l])return Object.assign(e[l],r);r=F(r||{});let t=[],o=[],s,i=()=>!o&&(o=t.map(c=>c())),n=()=>(o?.map(c=>c()),o=null);e[H]=i,e[K]=n,e[J]||(e[J]=()=>(e[K](),e[K]=e[H]=e[J]=e[l]=e[G]=null));let a=(c,p=c.attributes)=>{if(p)for(let d=0;d<p.length;){let{name:u,value:y}=p[d];if(u.startsWith(T)){if(c.removeAttribute(u),(s=Me(c,u,y,r))&&(t.push(s),o.push(s())),l in c)return}else d++}for(let d of[...c.childNodes])d.nodeType==1&&a(d)};return e[G]=a,a(e),e[l]===void 0&&(e[l]=r),r};Y.version=ne.version;var Me=(e,r,t,o)=>{let s,i,n=r.slice(T.length).split("..").map((a,c,{length:p})=>a.split(T).reduce((d,u)=>{let[y,...g]=u.split("."),D=S(t,q[Q=y]?.parse);if(y.startsWith("on")){let L=y.slice(2),I=ae(B(p==1?P=>D(o,z=>m(z,P)):P=>(s=(c?s:z=>m(D(o),z))(P),i(),i=n[(c+1)%p]()),{target:e}),g);return P=>(P=d?.(),I.target.addEventListener(L,I,I),()=>(P?.(),I.target.removeEventListener(L,I)))}let k,h,w,b;g.length?(w=A(-1),b=-1,k=ae(B(C(()=>{++w.value||(h=v(()=>W&&(w.value==b?k():(b=w.value,D(o,W)))))}),{target:e}),g)):k=B(()=>h=v(()=>D(o,W)),{target:e});let W=(q[y]||q["*"])(k.target,o,t,y);if(W)return e[l]&&(o=e[l]),L=>(L=d?.(),k(),()=>(L?.(),h?.(),w&&(w.value=-1,b=h=null)))},null));return()=>i=n[0]?.()},_=e=>(e.compile&&(ue=e.compile),e.prefix&&(T=e.prefix),e.signal&&(A=e.signal),e.effect&&(v=e.effect),e.computed&&(U=e.computed),e.batch&&(X=e.batch),e.untracked&&(R=e.untracked)),ce=(e=document.body,r)=>{let t=F(r);return Y(e,t),new MutationObserver(s=>{for(let i of s)for(let n of i.addedNodes)if(n.nodeType===1&&n[l]===void 0){for(let a of n.attributes)if(a.name.startsWith(T)){e[G](n);break}}}).observe(e,{childList:!0,subtree:!0}),t},ue,S=(e,r,t)=>{if(t=S.cache[e])return t;let o=e.trim()||"undefined";r&&(o=r(o)),/^(if|let|const)\b/.test(o)||/;(?![^{]*})/.test(o)||(o=`return ${o}`),/\bawait\s/.test(o)&&(o=`return (async()=>{ ${o} })()`);try{t=ue(o),Object.defineProperty(t,"name",{value:`\u2234 ${e}`})}catch(s){console.error(`\u2234 ${s}
2
2
 
3
- ${T+Q}="${e}"`)}return A.cache[e]=(n,i,s)=>{try{let a=t?.(n);return i?(a?.then?a.then(c=>s=i(c)):s=i(a),()=>y(s)):a}catch(a){console.error(`\u2234 ${a}
3
+ ${T+Q}="${e}"`)}return S.cache[e]=(s,i,n)=>{try{let a=t?.(s);return i?(a?.then?a.then(c=>n=i(c)):n=i(a),()=>m(n)):a}catch(a){console.error(`\u2234 ${a}
4
4
 
5
- ${T+Q}="${e}"`)}}};A.cache={};var ne=(e,r)=>{for(;r.length;){let[t,...o]=r.pop().split("-");e=Ce(F[t]?.(e,...o)??e,e)}return e},Ce=(e,r)=>{if(e!=r)for(let t in r)e[t]??(e[t]=r[t]);return e},j=e=>{if(!e.nodeType)return e;let r=e.content.cloneNode(!0),t=[...e.attributes],o=document.createTextNode(""),n=(r.append(o),[...r.childNodes]);return{childNodes:n,content:r,remove:()=>r.append(...n),replaceWith(i){i!==o&&(o.before(i),r.append(...n))},attributes:t,removeAttribute(i){t.splice(t.findIndex(s=>s.name===i),1)}}},y=(e,r)=>typeof e=="function"?e(r):e,ce=e=>e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(r,t)=>(t?"-":"")+r.toLowerCase()),b=(e,r,t)=>t==null||t===!1?e.removeAttribute(r):e.setAttribute(r,t===!0?"":t),_=(e,r=[])=>e?typeof e=="string"?e:(Array.isArray(e)?e.map(_):Object.entries(e).reduce((t,[o,n])=>n?[...t,o]:t,[])).join(" "):"",C=(e,r=queueMicrotask)=>{let t=0,o=n=>{t++||(e(n),r((i=t>1)=>(t=0,i&&o(n))))};return o},ue=(e,r=queueMicrotask,t=0)=>(o,n=++t)=>r(()=>n==t&&e(o)),p=ie;var g=Symbol("signals"),k=Symbol("change"),ee=Symbol("set"),v=!0,W=(e,r)=>{if(!e||e[Symbol.toStringTag]||e[g])return e;if(e.constructor!==Object)return Array.isArray(e)?We(e):e;let t=Object.keys(e).length,o={},n=new Proxy(Object.assign(o,{[k]:O(t),[g]:o}),{get:(s,a)=>a in o?o[a]?o[a].valueOf():o[a]:r?r[a]:globalThis[a],set:(s,a,c,f)=>a in o?(le(o,a,c),1):(v=!1,r&&a in r?r[a]=c:(Z(o,a,c),o[k].value=++t),v=!0,1),deleteProperty:(s,a)=>(a in o&&(a[0]!="_"&&o[a]?.[Symbol.dispose]?.(),delete o[a],o[k].value=--t),1),ownKeys:()=>(o[k].value,Reflect.ownKeys(o)),has:(s,a)=>a in o?!0:r?a in r:v}),i=Object.getOwnPropertyDescriptors(e);for(let s in e)i[s]?.get?(o[s]=U(i[s].get.bind(n)))[ee]=i[s].set?.bind(n):Z(o,s,e[s]);return n},We=(e,r=globalThis)=>{let t=Array(e.length).fill(null),o=!1,n=a=>function(){return o=!0,a.apply(this,arguments)},i=O(e.length),s=new Proxy(Object.assign(t,{[k]:i,[g]:t,push:n(t.push),pop:n(t.pop),shift:n(t.shift),unshift:n(t.unshift),splice:n(t.splice)}),{get(a,c){return c==="length"?o?(o=!1,t.length):i.value:typeof c=="symbol"||isNaN(c)?t[c]?.valueOf()??r[c]:(t[c]??(t[c]=O(W(e[c])))).valueOf()},set(a,c,f){if(c==="length"){for(let d=f;d<t.length;d++)delete s[d];i.value=t.length=f}else c>=t.length?(Z(t,c,f),s.length=+c+1):t[c]?le(t,c,f):Z(t,c,f);return 1},deleteProperty:(a,c)=>(t[c]?.[Symbol.dispose]?.(),delete t[c],1)});return s},Z=(e,r,t)=>e[r]=r[0]=="_"||t?.peek?t:O(W(t)),le=(e,r,t,o,n)=>r[0]==="_"?e[r]=t:t!==(n=(o=e[r]).peek())&&(o[ee]?o[ee](t):Array.isArray(t)&&Array.isArray(n)?k in n?R(()=>X(()=>{for(let i=0;i<t.length;i++)n[i]=t[i];n.length=t.length})):o.value=t:o.value=W(t)),J=W;var N,fe=0,E,te=(e,r,t=new Set,o=()=>r.value)=>r={get value(){return N?.deps.push(t.add(N)),e},set value(n){if(n!==e){e=n;for(let i of t)E?E.add(i):i()}},peek(){return e},toJSON:o,then:o,toString:o,valueOf:o},re=(e,r,t,o,n)=>(t=i=>{if(n=r,r=null,n?.call?.(),i=N,N=t,fe++>10)throw"Cycle detected";try{r=e()}finally{N=i,fe--}},o=t.deps=[],t(),i=>{for(r?.call?.();i=o.pop();)i.delete(t)}),pe=(e,r=te(),t,o,n=()=>t.value)=>t={get value(){return o||(o=re(()=>r.value=e())),r.value},peek:r.peek,toJSON:n,then:n,toString:n,valueOf:n},de=(e,r=!E)=>{E??(E=new Set);try{e()}finally{if(r){for(let t of E)t();E=null}}},me=(e,r,t)=>(r=N,N=null,t=e(),N=r,t);var ye=(e,r,t,o,n)=>{var i;return e._holder?p(o=e,r):(e[i=l]??(e[i]=null),o=e.content?j(e):e,e.replaceWith(t=document.createTextNode("")),o._holder=t._holder=t,t._clauses=[o._clause=[o,!1]],t.update=C(()=>{let s=t._clauses.find(([,a])=>a);s!=n&&(n?.[0].remove(),n?.[0][K]?.(),(n=s)&&(t.before(n[0].content||n[0]),n[0][l]?n[0][H]?.():(delete n[0][l],p(n[0],r))))})),s=>{o._clause[1]=s,o._holder.update()}};var he=(e,r,t,o,n=e)=>{for(t=e.content?j(e):e;n&&!(t._holder=n._holder);)n=n.previousSibling;return e.remove(),e[l]=null,t._holder._clauses.push(t._clause=[t,!0]),t._holder.update};var be=e=>(e.content&&e.replaceWith(e=j(e).childNodes[0]),r=>(r=y(r,e.textContent),e.textContent=r??""));var ge=(e,r,t)=>(r=new Set,o=>{t=new Set,o&&_(y(o,e.className)).split(" ").map(n=>n&&t.add(n));for(let n of r)t.has(n)?t.delete(n):e.classList.remove(n);for(let n of r=t)e.classList.add(n)});var xe=(e,r)=>(r=e.getAttribute("style"),t=>{if(t=y(t,e.style),typeof t=="string")b(e,"style",r+"; "+t);else{r&&b(e,"style",r);for(let o in t)o[0]=="-"?e.style.setProperty(o,t[o]):o[0]>"A"&&(e.style[o]=t[o])}});var Se=()=>y;var Pe=(e,r=A(`${e}=__`))=>(t,o)=>{t.__=o,r(t),delete t.__},Ae=(e,r,t,o)=>{try{let n=Pe(t),i=e.type==="checkbox"?()=>n(r,e.checked):e.type==="select-multiple"?()=>n(r,[...e.selectedOptions].map(s=>s.value)):()=>n(r,e.selectedIndex<0?null:e.value);e.oninput=e.onchange=i,e.type?.startsWith("select")&&(new MutationObserver(i).observe(e,{childList:!0,subtree:!0,attributes:!0}),p(e,r)),A(t)(r)??i()}catch{}return e.type==="text"||e.type===""?n=>e.setAttribute("value",e.value=n??""):e.tagName==="TEXTAREA"||e.type==="text"||e.type===""?(n,i,s)=>(i=e.selectionStart,s=e.selectionEnd,e.setAttribute("value",e.value=n??""),i&&e.setSelectionRange(i,s)):e.type==="checkbox"?n=>(e.checked=n,b(e,"checked",n)):e.type==="radio"?n=>e.value===n&&(e.checked=n,b(e,"checked",n)):e.type==="select-one"?n=>{for(let i of e.options)i.value==n?i.setAttribute("selected",""):i.removeAttribute("selected");e.value=n}:e.type==="select-multiple"?n=>{for(let i of e.options)i.removeAttribute("selected");for(let i of n)e.querySelector(`[value="${i}"]`).setAttribute("selected","")}:n=>e.value=n};var Oe=(e,r,t,o,n,i)=>{if(typeof A(t)(r)=="function")return s=>s(e);Object.defineProperty(r,t,{value:e,configurable:!0})};var ke=(e,r)=>{let t=e[l]=W({},r),o=!1;return n=>{if(n=y(n,t),n!==t)for(let i in n){let s=typeof n[i]=="function"?n[i].bind(t):n[i];i in t[g]?t[i]=s:t[g][i]=i[0]=="_"||s?.peek?s:O(W(s))}return!o&&(o=!0,delete e[l],R(()=>p(e,t)))}};var je=(e,r,t)=>{let[o,n="$"]=t.split(/\bin\b/)[0].trim().replace(/\(|\)/g,"").split(/\s*,\s*/),i=document.createTextNode(""),s,a,c,f=0,d=C(()=>{var $,w;let u=0,m=c,h=m.length;if(s&&!s[k]){for(let x of s[g]||[])x[Symbol.dispose]();s=null,f=0}if(h<f)s.length=h;else{if(!s)s=m;else for(;u<f;)s[u]=m[u++];for(;u<h;u++){s[u]=m[u];let x=u,P=Object.create(r,{[o]:{get:()=>s[x]},[n]:{value:a?a[x]:x}}),S=e.content?j(e):e.cloneNode(!0);i.before(S.content||S),p(S,P);let V=((w=s[$=g]||(s[$]=[]))[u]||(w[u]={}))[Symbol.dispose];s[g][u][Symbol.dispose]=()=>{V?.(),S[Symbol.dispose]?.(),S.remove()}}}f=h});return e.replaceWith(i),e[l]=null,u=>(a=null,typeof u=="number"?c=Array.from({length:u},(m,h)=>h+1):u?.constructor===Object?(a=Object.keys(u),c=Object.values(u)):c=u||[],I(()=>{c[k]?.value,d()}))};je.parse=e=>e.split(/\bin\b/)[1].trim();var Ne=je;var $e=(e,r,t,o)=>n=>b(e,o,y(n,e.getAttribute(o)));var we=e=>r=>{for(let t in r)b(e,ce(t),r[t])};Object.assign(D,{"*":$e,"":we,class:ge,text:be,style:xe,fx:Se,value:Ae,ref:Oe,scope:ke,if:ye,else:he,each:Ne});Object.assign(F,{debounce:(e,r=250,t=r==="tick"?queueMicrotask:r==="raf"?requestAnimationFrame:r==="idle"?requestIdleCallback:n=>setTimeout(n,r),o=0)=>ue(e,t),throttle:(e,r=250,t=r==="tick"?queueMicrotask:r==="raf"?requestAnimationFrame:o=>setTimeout(o,r))=>C(e,t),once:(e,r,t)=>Object.assign(o=>!r&&(r=1,e(o)),{once:!0}),prevent:e=>r=>(r?.preventDefault(),e(r)),stop:e=>r=>(r?.stopPropagation(),e(r)),immediate:e=>r=>(r?.stopImmediatePropagation(),e(r)),passive:e=>(e.passive=!0,e),capture:e=>(e.capture=!0,e),window:e=>(e.target=window,e),document:e=>(e.target=document,e),parent:e=>(e.target=e.target.parentNode,e),self:e=>r=>r.target===e.target&&e(r),outside:e=>(r,t)=>(t=e.target,!t.contains(r.target)&&r.target.isConnected&&(t.offsetWidth||t.offsetHeight))});var oe={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"||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)};for(let e in oe)F[e]=(r,...t)=>o=>oe[e](o)&&t.every(n=>oe[n]?.(o)??o.key===n)&&r(o);Y({compile:e=>p.constructor(`with (arguments[0]) { ${e} }`),signal:te,effect:re,computed:pe,batch:de,untracked:me});p.use=Y;p.store=J;p.directive=D;p.modifier=F;p.start=se;var Et=p;export{de as batch,pe as computed,Et as default,re as effect,te as signal,p as sprae,se as start,J as store,me as untracked,Y as use};
5
+ ${T+Q}="${e}"`)}}};S.cache={};var ae=(e,r)=>{for(;r.length;){let[t,...o]=r.pop().split("-");e=B(V[t]?.(e,...o)??e,e)}return e},B=(e,r)=>{if(e!=r)for(let t in r)e[t]??(e[t]=r[t]);return e},N=e=>{if(!e.nodeType)return e;let r=e.content.cloneNode(!0),t=[...e.attributes],o=document.createTextNode(""),s=(r.append(o),[...r.childNodes]);return{childNodes:s,content:r,remove:()=>r.append(...s),replaceWith(i){i!==o&&(o.before(i),r.append(...s))},attributes:t,removeAttribute(i){t.splice(t.findIndex(n=>n.name===i),1)}}},m=(e,r)=>typeof e=="function"?e(r):e,le=e=>e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(r,t)=>(t?"-":"")+r.toLowerCase()),x=(e,r,t)=>t==null||t===!1?e.removeAttribute(r):e.setAttribute(r,t===!0?"":t),ee=(e,r=[])=>e?typeof e=="string"?e:(Array.isArray(e)?e.map(ee):Object.entries(e).reduce((t,[o,s])=>s?[...t,o]:t,[])).join(" "):"",C=(e,r=queueMicrotask)=>{let t=0,o=s=>{t++||(e(s),r((i=t>1)=>(t=0,i&&o(s))))};return o},pe=(e,r=queueMicrotask,t=0)=>(o,s=++t)=>r(()=>s==t&&e(o)),f=Y;var j=Symbol("signals"),O=Symbol("change"),re=Symbol("set"),te=!0,M=(e,r)=>{if(!e||e[Symbol.toStringTag]||e[j])return e;if(e.constructor!==Object)return Array.isArray(e)?We(e):e;let t=Object.keys(e).length,o={},s=new Proxy(Object.assign(o,{[O]:A(t),[j]:o}),{get:(n,a)=>a in o?o[a]?o[a].valueOf():o[a]:r?r[a]:globalThis[a],set:(n,a,c,p)=>a in o?(fe(o,a,c),1):(te=!1,r&&a in r?r[a]=c:(Z(o,a,c),o[O].value=++t),te=!0,1),deleteProperty:(n,a)=>(a in o&&(a[0]!="_"&&o[a]?.[Symbol.dispose]?.(),delete o[a],o[O].value=--t),1),ownKeys:()=>(o[O].value,Reflect.ownKeys(o)),has:(n,a)=>a in o?!0:r?a in r:te}),i=Object.getOwnPropertyDescriptors(e);for(let n in e)i[n]?.get?(o[n]=U(i[n].get.bind(s)))[re]=i[n].set?.bind(s):Z(o,n,e[n]);return s},We=(e,r=globalThis)=>{let t=Array(e.length).fill(null),o=!1,s=a=>function(){return o=!0,a.apply(this,arguments)},i=A(e.length),n=new Proxy(Object.assign(t,{[O]:i,[j]:t,push:s(t.push),pop:s(t.pop),shift:s(t.shift),unshift:s(t.unshift),splice:s(t.splice)}),{get(a,c){return c==="length"?o?(o=!1,t.length):i.value:typeof c=="symbol"||isNaN(c)?t[c]?.valueOf()??r[c]:(t[c]??(t[c]=A(M(e[c])))).valueOf()},set(a,c,p){if(c==="length"){for(let d=p;d<t.length;d++)delete n[d];i.value=t.length=p}else c>=t.length?(Z(t,c,p),n.length=+c+1):t[c]?fe(t,c,p):Z(t,c,p);return 1},deleteProperty:(a,c)=>(t[c]?.[Symbol.dispose]?.(),delete t[c],1)});return n},Z=(e,r,t)=>e[r]=r[0]=="_"||t?.peek?t:A(M(t)),fe=(e,r,t,o,s)=>r[0]==="_"?e[r]=t:t!==(s=(o=e[r]).peek())&&(o[re]?o[re](t):Array.isArray(t)&&Array.isArray(s)?O in s?R(()=>X(()=>{for(let i=0;i<t.length;i++)s[i]=t[i];s.length=t.length})):o.value=t:o.value=M(t)),F=M;var $,de=0,E,oe=(e,r,t=new Set,o=()=>r.value)=>r={get value(){return $?.deps.push(t.add($)),e},set value(s){if(s!==e){e=s;for(let i of t)E?E.add(i):i()}},peek(){return e},toJSON:o,then:o,toString:o,valueOf:o},se=(e,r,t,o,s)=>(t=i=>{if(s=r,r=null,s?.call?.(),i=$,$=t,de++>10)throw"Cycle detected";try{r=e()}finally{$=i,de--}},o=t.deps=[],t(),i=>{for(r?.call?.();i=o.pop();)i.delete(t)}),me=(e,r=oe(),t,o,s=()=>t.value)=>t={get value(){return o||(o=se(()=>r.value=e())),r.value},peek:r.peek,toJSON:s,then:s,toString:s,valueOf:s},ye=(e,r=!E)=>{E??(E=new Set);try{e()}finally{if(r){for(let t of E)t();E=null}}},ge=(e,r,t)=>(r=$,$=null,t=e(),$=r,t);var he=(e,r,t,o,s)=>{var i;return e._holder?f(o=e,r):(e[i=l]??(e[i]=null),o=e.content?N(e):e,e.replaceWith(t=document.createTextNode("")),o._holder=t._holder=t,t._clauses=[o._clause=[o,!1]],t.update=C(()=>{let n=t._clauses.find(([,a])=>a);n!=s&&(s?.[0].remove(),s?.[0][K]?.(),(s=n)&&(t.before(s[0].content||s[0]),s[0][l]?s[0][H]?.():(delete s[0][l],f(s[0],r))))})),n=>{o._clause[1]=n,o._holder.update()}};var be=(e,r,t,o,s=e)=>{for(t=e.content?N(e):e;s&&!(t._holder=s._holder);)s=s.previousSibling;return e.remove(),e[l]=null,t._holder._clauses.push(t._clause=[t,!0]),t._holder.update};var xe=e=>(e.content&&e.replaceWith(e=N(e).childNodes[0]),r=>(r=m(r,e.textContent),e.textContent=r??""));var je=(e,r,t)=>(r=new Set,o=>{t=new Set,o&&ee(m(o,e.className)).split(" ").map(s=>s&&t.add(s));for(let s of r)t.has(s)?t.delete(s):e.classList.remove(s);for(let s of r=t)e.classList.add(s)});var Se=(e,r)=>(r=e.getAttribute("style"),t=>{if(t=m(t,e.style),typeof t=="string")x(e,"style",r+"; "+t);else{r&&x(e,"style",r);for(let o in t)o[0]=="-"?e.style.setProperty(o,t[o]):o[0]>"A"&&(e.style[o]=t[o])}});var Ae=()=>m;var Pe=(e,r=S(`${e}=__`))=>(t,o)=>{t.__=o,r(t),delete t.__},Oe=(e,r,t,o)=>{try{let s=Pe(t),i=e.type==="checkbox"?()=>s(r,e.checked):e.type==="select-multiple"?()=>s(r,[...e.selectedOptions].map(n=>n.value)):()=>s(r,e.selectedIndex<0?null:e.value);e.oninput=e.onchange=i,e.type?.startsWith("select")&&(new MutationObserver(i).observe(e,{childList:!0,subtree:!0,attributes:!0}),f(e,r)),S(t)(r)??i()}catch{}return e.type==="text"||e.type===""?s=>e.setAttribute("value",e.value=s??""):e.tagName==="TEXTAREA"||e.type==="text"||e.type===""?(s,i,n)=>(i=e.selectionStart,n=e.selectionEnd,e.setAttribute("value",e.value=s??""),i&&e.setSelectionRange(i,n)):e.type==="checkbox"?s=>(e.checked=s,x(e,"checked",s)):e.type==="radio"?s=>e.value===s&&(e.checked=s,x(e,"checked",s)):e.type==="select-one"?s=>{for(let i of e.options)i.value==s?i.setAttribute("selected",""):i.removeAttribute("selected");e.value=s}:e.type==="select-multiple"?s=>{for(let i of e.options)i.removeAttribute("selected");for(let i of s)e.querySelector(`[value="${i}"]`).setAttribute("selected","")}:s=>e.value=s};var ke=(e,r,t,o,s,i)=>{if(typeof S(t)(r)=="function")return n=>n(e);Object.defineProperty(r,t,{value:e,configurable:!0})};var we=(e,r)=>{let t=e[l]=M({},r),o=!1;return s=>{if(s=m(s,t),s!==t)for(let i in s){let n=typeof s[i]=="function"?s[i].bind(t):s[i];i in t[j]?t[i]=n:t[j][i]=i[0]=="_"||n?.peek?n:A(M(n))}return!o&&(o=!0,delete e[l],R(()=>f(e,t)))}};var Ne=(e,r,t)=>{let[o,s="$"]=t.split(/\bin\b/)[0].trim().replace(/\(|\)/g,"").split(/\s*,\s*/),i=document.createTextNode(""),n,a,c,p=0,d=C(()=>{var D,k;let u=0,y=c,g=y.length;if(n&&!n[O]){for(let h of n[j]||[])h[Symbol.dispose]();n=null,p=0}if(g<p)n.length=g;else{if(!n)n=y;else for(;u<p;)n[u]=y[u++];for(;u<g;u++){n[u]=y[u];let h=u,w=Object.create(r,{[o]:{get:()=>n[h]},[s]:{value:a?a[h]:h}}),b=e.content?N(e):e.cloneNode(!0);i.before(b.content||b),f(b,w);let W=((k=n[D=j]||(n[D]=[]))[u]||(k[u]={}))[Symbol.dispose];n[j][u][Symbol.dispose]=()=>{W?.(),b[Symbol.dispose]?.(),b.remove()}}}p=g});return e.replaceWith(i),e[l]=null,u=>(a=null,typeof u=="number"?c=Array.from({length:u},(y,g)=>g+1):u?.constructor===Object?(a=Object.keys(u),c=Object.values(u)):c=u||[],v(()=>{c[O]?.value,d()}))};Ne.parse=e=>e.split(/\bin\b/)[1].trim();var $e=Ne;var De=(e,r,t,o)=>s=>x(e,o,m(s,e.getAttribute(o)));var Te=e=>r=>{for(let t in r)x(e,le(t),r[t])};Object.assign(q,{"*":De,"":Te,class:je,text:xe,style:Se,fx:Ae,value:Oe,ref:ke,scope:we,if:he,else:be,each:$e});Object.assign(V,{debounce:(e,r=250,t=r==="tick"?queueMicrotask:r==="raf"?requestAnimationFrame:r==="idle"?requestIdleCallback:s=>setTimeout(s,r),o=0)=>pe(e,t),throttle:(e,r=250,t=r==="tick"?queueMicrotask:r==="raf"?requestAnimationFrame:o=>setTimeout(o,r))=>C(e,t),once:(e,r,t)=>Object.assign(o=>!r&&(r=1,e(o)),{once:!0}),prevent:e=>r=>(r?.preventDefault(),e(r)),stop:e=>r=>(r?.stopPropagation(),e(r)),immediate:e=>r=>(r?.stopImmediatePropagation(),e(r)),passive:e=>(e.passive=!0,e),capture:e=>(e.capture=!0,e),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=>r=>r.target===e.target&&e(r),outside:e=>(r,t)=>(t=e.target,!t.contains(r.target)&&r.target.isConnected&&(t.offsetWidth||t.offsetHeight))});var ie={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"||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)};for(let e in ie)V[e]=(r,...t)=>o=>ie[e](o)&&t.every(s=>ie[s]?.(o)??o.key===s)&&r(o);_({compile:e=>f.constructor(`with (arguments[0]) { ${e} }`),signal:oe,effect:se,computed:me,batch:ye,untracked:ge});f.use=_;f.store=F;f.directive=q;f.modifier=V;f.start=ce;var vt=f;export{ye as batch,me as computed,vt as default,se as effect,oe as signal,f as sprae,ce as start,F as store,ge as untracked,_ as use};
package/dist/sprae.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 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/default.js", "../directive/spread.js", "../sprae.js"],
4
- "sourcesContent": ["import store, { _change, _signals } from \"./store.js\";\n\nexport const _dispose = (Symbol.dispose ||= Symbol(\"dispose\")),\n _state = Symbol(\"state\"),\n _on = Symbol('on'),\n _off = Symbol('off'),\n _add = Symbol('add');\n\n\nexport let prefix = ':', signal, effect, computed, batch = (fn) => fn(), untracked = batch;\n\nexport let directive = {}, modifier = {}\n\nlet currentDir = null;\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|store} [state] - Initial state values to populate the element's reactive state.\n * @returns {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.outerHTML)\n\n // take over existing state instead of creating a clone\n state = store(state || {})\n\n let fx = [], offs = [], fn,\n on = () => (!offs && (offs = fx.map(fn => fn()))),\n off = () => (offs?.map(off => off()), offs = null)\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] = on\n el[_off] = off\n\n // destroy\n el[_dispose] ||= () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_state] = el[_add] = null)\n\n const add = (el, _attrs = el.attributes) => {\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 // directive initializer can be redefined\n if (fn = initDirective(el, name, value, state)) fx.push(fn), offs.push(fn())\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 // for (let i = 0, child; i < (el.childNodes.length); i++) child = el.childNodes[i], child.nodeType == 1 && add(child)\n for (let child of [...el.childNodes]) child.nodeType == 1 && add(child)\n };\n\n el[_add] = add;\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\n/**\n * Initializes directive (defined by sprae build), returns \"on\" function that enables it\n * Multiprop sequences initializer, eg. :a:b..c:d\n * @type {(el: HTMLElement, name:string, value:string, state:Object) => Function}\n * */\nconst initDirective = (el, dirName, expr, state) => {\n let cur, // current step callback\n off // current step disposal\n\n let steps = dirName.slice(prefix.length).split('..').map((step, i, { length }) => (\n // multiple attributes like :id:for=\"\"\n step.split(prefix).reduce((prev, str) => {\n let [name, ...mods] = str.split('.');\n let evaluate = parse(expr, directive[currentDir = name]?.parse)\n\n // a hack, but events have no signal-effects and can be sequenced\n // FIXME: events are molded into core, but should be an optional directive\n if (name.startsWith('on')) {\n let type = name.slice(2),\n fn = applyMods(\n Object.assign(\n // single event vs chain\n length == 1 ? e => evaluate(state, (fn) => call(fn, e)) :\n (e => (cur = (!i ? e => call(evaluate(state), e) : cur)(e), off(), off = steps[(i + 1) % length]())),\n { target: el, type }\n ),\n mods);\n\n return (_poff) => (_poff = prev?.(), fn.target.addEventListener(type, fn, fn), () => (_poff?.(), fn.target.removeEventListener(type, fn)))\n }\n\n // props have no sequences and can be sync\n // it's nice to see directive as taking some part of current context and returning new or updated context\n let update = (directive[name] || directive['*'])(el, state, expr, name)\n\n // some directives are effect-less\n if (!update) return\n\n // take over state if directive created it (mainly :scope)\n if (el[_state]) state = el[_state]\n\n // no-modifiers shortcut\n if (!mods.length && !prev) return ((() => effect(() => evaluate(state, update))))\n\n let dispose,\n change = signal(-1), // signal authorized to trigger effect: 0 = init; >0 = trigger\n count = -1, // called effect count\n\n // effect applier - first time it applies the effect, next times effect is triggered by change signal\n fn = throttle(applyMods(() => {\n if (++change.value) return // all calls except for the first one are handled by effect\n dispose = effect(() => update && (\n change.value == count ? fn() : // separate tick makes sure planner effect call is finished before real eval call\n (count = change.value, evaluate(state, update)) // if changed more than effect called - call it\n ));\n }, mods))\n\n return (_poff) => (\n _poff = prev?.(),\n // console.log('ON', name),\n fn(),\n ({\n [name]: () => (\n // console.log('OFF', name, el),\n _poff?.(), dispose(), change.value = -1, count = dispose = null\n )\n })[name]\n )\n }, null)\n ));\n\n // off can be changed on the go\n return () => (off = steps[0]?.())\n}\n\n\n/**\n * Configure sprae\n */\nexport const use = (s) => (\n s.compile && (compile = s.compile),\n s.prefix && (prefix = s.prefix),\n s.signal && (signal = s.signal),\n s.effect && (effect = s.effect),\n s.computed && (computed = s.computed),\n s.batch && (batch = s.batch),\n s.untracked && (untracked = s.untracked)\n)\n\n\n/**\n * Lifecycle hanger: makes DOM slightly slower but spraes automatically\n */\nexport const 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 if (el.nodeType === 1 && el[_state] === undefined) {\n for (const attr of el.attributes) {\n if (attr.name.startsWith(prefix)) {\n root[_add](el); break;\n }\n }\n }\n }\n // for (const el of m.removedNodes) el[Symbol.dispose]?.()\n }\n });\n mo.observe(root, { childList: true, subtree: true });\n return state\n}\n\n\n/**\n * Compiles an expression into an evaluator function.\n * @type {(dir:string, expr: string, clean?: string => string) => Function}\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 {Function} The compiled evaluator function for the expression.\n */\nexport const parse = (expr, prepare, _fn) => {\n if (_fn = parse.cache[expr]) return _fn\n\n let _expr = expr.trim() || 'undefined'\n if (prepare) _expr = prepare(_expr)\n\n // if, const, let - no return\n if (/^(if|let|const)\\b/.test(_expr) || /;(?![^{]*})/.test(_expr)) ;\n else _expr = `return ${_expr}`\n\n // async expression\n if (/\\bawait\\s/.test(_expr)) _expr = `return (async()=>{ ${_expr} })()`\n\n // static time errors\n try {\n _fn = compile(_expr)\n Object.defineProperty(_fn, \"name\", {value: `\u2234 ${expr}`})\n } catch (e) { console.error(`\u2234 ${e}\\n\\n${prefix + currentDir}=\"${expr}\"`) }\n\n // run time errors\n return parse.cache[expr] = (state, cb, _out) => {\n try {\n let result = _fn?.(state)\n // if cb is given (to handle asyncs) - call it with result and return function that returns last cb result - needed for effect cleanup\n if (cb) return result?.then ? result.then(v => _out = cb(v)) : _out = cb(result), () => call(_out)\n else return result\n } catch (e) {\n console.error(`\u2234 ${e}\\n\\n${prefix + currentDir}=\"${expr}\"`)\n }\n }\n}\nparse.cache = {};\n\n\n// apply modifiers to context (from the end due to nature of wrapping ctx.call)\nconst applyMods = (fn, mods) => {\n while (mods.length) {\n let [name, ...params] = mods.pop().split('-')\n fn = sx(modifier[name]?.(fn, ...params) ?? fn, fn)\n }\n return fn\n}\n\n// soft-extend missing props and ignoring signals\nconst sx = (a, b) => { if (a != b) for (let k in b) (a[k] ??= b[k]); return a }\n\n// instantiated <template> fragment holder, like persisting fragment but with minimal API surface\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 // get parentNode() { return childNodes[0].parentNode },\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 // setAttributeNode() { }\n }\n}\n\n// if value is function - return result of its call\nexport const call = (v, arg) => typeof v === 'function' ? v(arg) : v\n\n// camel to kebab\nexport const dashcase = (str) => str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());\n\n// set attr\nexport const attr = (el, name, v) => (v == null || v === false) ? el.removeAttribute(name) : el.setAttribute(name, v === true ? \"\" : v);\n\n// convert any-arg to className string\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// throttle function to (once per tick or other custom scheduler)\nexport const throttle = (fn, schedule = queueMicrotask) => {\n let _planned = 0;\n const throttled = (e) => {\n if (!_planned++) fn(e), schedule((_dirty = _planned > 1) => (\n _planned = 0, _dirty && throttled(e)\n ));\n }\n return throttled;\n}\n\nexport const debounce = (fn, schedule = queueMicrotask, _count = 0) => (arg, _planned=++_count) => schedule(() => (_planned == _count && fn(arg)))\n\nexport * from './store.js';\n\nexport default sprae\n", "// signals-based proxy\nimport { signal, computed, batch, untracked, _add } from './core.js'\n\n\n// _signals allows both storing signals and checking instance, which would be difficult with WeakMap\nexport const _signals = Symbol('signals'),\n // _change is a signal that tracks changes to the object keys or array length\n _change = Symbol('change'),\n // _set is stashed setter for computed values\n _set = Symbol('set')\n\n// a hack to simulate sandbox for `with` in evaluator\nlet sandbox = true\n\n// object store is not lazy\n// parent defines parent scope or sandbox\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 // console.log('GET', k, signals)\n if (k in signals) return (signals[k] ? signals[k].valueOf() : signals[k])\n return parent ? parent[k] : globalThis[k]\n },\n\n set: (_, k, v, _s) => {\n // console.group('SET', k, v, signals, k in signals)\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// array store - signals are lazy since arrays can be very large & expensive\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// create signal value, skip untracked\nconst create = (signals, k, v) => (signals[k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n\n// set/update signal value\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", "// preact-signals minimal implementation\nlet current, depth = 0, batched;\n\n// default signals impl\n\nexport const signal = (v, _s, _obs = new Set, _v = () => _s.value) => (\n _s = {\n get value() {\n current?.deps.push(_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, then: _v, toString: _v, valueOf: _v\n }\n)\n\nexport const effect = (fn, _teardown, _fx, _deps, __tmp) => (\n _fx = (prev) => {\n __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 _deps = _fx.deps = [],\n\n _fx(),\n (dep) => { _teardown?.call?.(); while (dep = _deps.pop()) dep.delete(_fx); }\n)\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, then: _v, toString: _v, valueOf: _v\n }\n)\n\nexport const batch = (fn, _first = !batched) => {\n batched ??= new Set;\n try { fn(); }\n finally { if (_first) { for (const fx of batched) fx(); batched = null } }\n}\n\nexport const untracked = (fn, _prev, _v) => (_prev = current, current = null, _v = fn(), current = _prev, _v)\n", "// \"centralized\" version of :if\nimport sprae, { throttle, _on, _off, _state, frag } from '../core.js';\n\n// :if=\"a\"\nexport default (el, state, _holder, _el, _match) => {\n // new element :if\n // console.log(':if init', el)\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 // console.group(':if update clauses', ..._holder._clauses)\n\n if (match != _match) {\n // console.log(':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 // console.groupEnd()\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 // console.log(':if update', _el, value)\n _el._clause[1] = value\n _el._holder.update()\n }\n}\n", "import { _on, _off, _state, frag } from '../core.js';\n\n\n// NOTE: we can reach :else counterpart whereas prev :else :if is on hold\nexport default (el, state, _el, _, _prev=el) => {\n\n // console.log(':else init', el)\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, call } from \"../core.js\"\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 = call(v, el.textContent), el.textContent = v == null ? \"\" : v)\n)\n", "import { clsx, call } from \"../core.js\";\n\nexport default (el, _cur, _new) => (\n _cur = new Set,\n (v) => {\n _new = new Set\n if (v) clsx(call(v, el.className)).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 { call, attr } from \"../core.js\";\n\nexport default (el, _static) => (\n _static = el.getAttribute(\"style\"),\n v => {\n v = call(v, el.style)\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", "import { call } from \"../core.js\"\n\nexport default () => call\n", "import sprae, { attr, parse, _state } from \"../core.js\";\n\n\n// create expression setter, reflecting value back to state\nexport const setter = (expr, _set = parse(`${expr}=__`)) => (target, value) => {\n // save value to stash\n target.__ = value; _set(target), delete target.__\n}\n\nexport default (el, state, expr, name) => {\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 : el.value)\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, no need to parse again\n parse(expr)(state) ?? handleChange()\n } catch { }\n\n return (el.type === \"text\" || el.type === \"\") ?\n (value) => el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)) :\n (el.tagName === \"TEXTAREA\" || el.type === \"text\" || el.type === \"\") ?\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\"\n// import { setter } from \"./value.js\"\n\nexport default (el, state, expr, name, _prev, _set) => {\n // FIXME: we call eval twice here - once to check if it's fn, second for update (from core)\n if (typeof parse(expr)(state) == 'function') return v => (v(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 // (setter(expr)(state, el))\n Object.defineProperty(state, expr, { value: el, configurable: true })\n}\n", "import sprae, { store, call, untracked, _state, _signals, signal } from '../core.js'\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 subscope = 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 = call(values, subscope);\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 !== subscope) {\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(subscope) : values[k]\n // update\n if (k in subscope[_signals]) subscope[k] = v\n // create\n else (subscope[_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, subscope)))\n }\n}\n", "import sprae, { store, _state, effect, _change, _signals, frag, throttle } from \"../core.js\";\n\nconst each = (tpl, state, expr) => {\n let [itemVar, idxVar = \"$\"] = expr.split(/\\bin\\b/)[0].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 // FIXME: pass items to update instead of global\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 // 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 // append\n for (; i < newl; i++) {\n cur[i] = newItems[i]\n\n let idx = i,\n // inherited state must be cheaper in terms of memory and faster in terms of performance, compared to creating a proxy store\n // subscope = store({\n // // NOTE: since we simulate signal, we have to make sure it's actual signal, not fake one\n // // FIXME: try to avoid this, we also have issue with wrongly calling dispose in store on delete\n // [itemVar]: cur[_signals]?.[idx]?.peek ? cur[_signals]?.[idx] : cur[idx],\n // [idxVar]: keys ? keys[idx] : idx\n // }, state)\n subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n\n let el = tpl.content ? frag(tpl) : tpl.cloneNode(true);\n\n holder.before(el.content || el);\n\n sprae(el, subscope);\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\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 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 unsubscribes unused signals\n items[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n update()\n })\n }\n}\n\n// :each directive skips v, k\neach.parse = (str) => str.split(/\\bin\\b/)[1].trim()\n\nexport default each\n", "import { attr, call } from \"../core.js\";\n\nexport default (el, st, ex, name) => v => attr(el, name, call(v, el.getAttribute(name)))\n", "import { attr, dashcase } from \"../core.js\";\n\nexport default (target) => value => { for (let key in value) attr(target, dashcase(key), value[key]) }\n", "import store from \"./store.js\";\nimport { batch, computed, effect, signal, untracked } from './signal.js';\nimport sprae, { use, directive, modifier, start, throttle, debounce, _add, _off, _state, _on, _dispose } 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/default.js\";\nimport _spread from \"./directive/spread.js\";\n\n\nObject.assign(directive, {\n // :x=\"x\"\n '*': _default,\n\n // FIXME\n // 'on*': _on,\n\n // :=\"{a,b,c}\"\n '': _spread,\n\n // :class=\"[a, b, c]\"\n class: _class,\n\n // :text=\"...\"\n text: _text,\n\n // :style=\"...\"\n style: _style,\n\n // :fx=\"...\"\n fx: _fx,\n\n // :value - 2 way binding like x-model\n value: _value,\n\n // :ref=\"...\"\n ref: _ref,\n\n // :scope creates variables scope for a subtree\n scope: _scope,\n\n if: _if,\n else: _else,\n\n // :each=\"v,k in src\"\n each: _each\n})\n\nObject.assign(modifier, {\n debounce: (fn,\n _how = 250,\n _schedule = _how === \"tick\" ? queueMicrotask : _how === \"raf\" ? requestAnimationFrame : _how === \"idle\" ? requestIdleCallback : ((fn) => setTimeout(fn, _how)),\n _count = 0\n ) =>\n debounce(fn, _schedule),\n\n throttle: (fn, _how = 250, _schedule = _how === \"tick\" ? queueMicrotask : _how === \"raf\" ? requestAnimationFrame : ((fn) => setTimeout(fn, _how))) => (\n throttle(fn, _schedule)\n ),\n\n once: (fn, _done, _fn) => Object.assign((e) => !_done && (_done = 1, fn(e)), { once: true }),\n\n // event modifiers\n // actions\n prevent: (fn) => (e) => (e?.preventDefault(), fn(e)),\n stop: (fn) => (e) => (e?.stopPropagation(), fn(e)),\n immediate: (fn) => (e) => (e?.stopImmediatePropagation(), fn(e)),\n\n // options\n passive: fn => (fn.passive = true, fn),\n capture: fn => (fn.capture = true, fn),\n\n // target\n window: fn => (fn.target = window, fn),\n document: fn => (fn.target = document, fn),\n parent: fn => (fn.target = fn.target.parentNode, fn),\n\n // test\n self: (fn) => (e) => (e.target === fn.target && fn(e)),\n\n outside: (fn) => (e, _target) => (\n _target = fn.target,\n !_target.contains(e.target) && e.target.isConnected && (_target.offsetWidth || _target.offsetHeight)\n ),\n})\n\n// key testers\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\" || 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// augment modifiers with key testers\nfor (let k in keys) modifier[k] = (fn, ...params) => (e) => keys[k](e) && params.every(k => keys[k]?.(e) ?? e.key === k) && fn(e)\n\nuse({\n compile: expr => {\n return sprae.constructor(`with (arguments[0]) { ${expr} }`)\n },\n\n // signals\n signal, effect, computed, batch, untracked\n})\n\n// expose for runtime config\nsprae.use = use\nsprae.store = store\nsprae.directive = directive\nsprae.modifier = modifier\nsprae.start = start\n\nexport default sprae\nexport { sprae, store, signal, effect, computed, batch, untracked, start, use }\n"],
5
- "mappings": "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",
6
- "names": ["_dispose", "_state", "_on", "_off", "_add", "prefix", "signal", "effect", "computed", "batch", "fn", "untracked", "directive", "modifier", "currentDir", "sprae", "el", "state", "store_default", "fx", "offs", "on", "off", "add", "_attrs", "i", "name", "value", "initDirective", "child", "dirName", "expr", "cur", "steps", "step", "length", "prev", "str", "mods", "evaluate", "parse", "type", "applyMods", "e", "call", "_poff", "update", "dispose", "change", "count", "throttle", "use", "s", "compile", "start", "root", "values", "mutations", "m", "attr", "prepare", "_fn", "_expr", "cb", "_out", "result", "v", "params", "sx", "a", "b", "k", "frag", "tpl", "content", "attributes", "ref", "childNodes", "arg", "dashcase", "match", "clsx", "c", "schedule", "_planned", "throttled", "_dirty", "debounce", "_count", "core_default", "_signals", "_change", "_set", "sandbox", "store", "values", "parent", "list", "keyCount", "signals", "state", "signal", "_", "k", "v", "_s", "set", "create", "descs", "computed", "isMut", "mut", "fn", "length", "i", "_v", "untracked", "batch", "store_default", "current", "depth", "batched", "signal", "v", "_s", "_obs", "_v", "val", "sub", "effect", "fn", "_teardown", "_fx", "_deps", "__tmp", "prev", "dep", "computed", "_c", "_e", "batch", "_first", "fx", "untracked", "_prev", "if_default", "el", "state", "_holder", "_el", "_match", "_a", "core_default", "_state", "frag", "throttle", "match", "s", "_off", "_on", "value", "else_default", "el", "state", "_el", "_", "_prev", "frag", "_state", "text_default", "el", "frag", "v", "call", "class_default", "el", "_cur", "_new", "v", "clsx", "call", "c", "style_default", "el", "_static", "v", "call", "attr", "k", "fx_default", "call", "setter", "expr", "_set", "parse", "target", "value", "value_default", "el", "state", "name", "set", "handleChange", "o", "core_default", "from", "to", "attr", "v", "ref_default", "el", "state", "expr", "name", "_prev", "_set", "parse", "v", "scope_default", "el", "rootState", "subscope", "_state", "store", "init", "values", "call", "k", "v", "_signals", "signal", "untracked", "core_default", "each", "tpl", "state", "expr", "itemVar", "idxVar", "holder", "cur", "keys", "items", "prevl", "update", "throttle", "_a", "_b", "i", "newItems", "newl", "_change", "s", "_signals", "idx", "subscope", "el", "frag", "core_default", "_prev", "_state", "value", "_", "effect", "str", "each_default", "default_default", "el", "st", "ex", "name", "v", "attr", "call", "spread_default", "target", "value", "key", "attr", "dashcase", "directive", "default_default", "spread_default", "class_default", "text_default", "style_default", "fx_default", "value_default", "ref_default", "scope_default", "if_default", "else_default", "each_default", "modifier", "fn", "_how", "_schedule", "_count", "debounce", "throttle", "_done", "_fn", "e", "_target", "keys", "k", "params", "use", "expr", "core_default", "signal", "effect", "computed", "batch", "untracked", "store_default", "start", "sprae_default"]
3
+ "sources": ["../package.json", "../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/default.js", "../directive/spread.js", "../sprae.js"],
4
+ "sourcesContent": ["{\n \"name\": \"sprae\",\n \"description\": \"DOM microhydration\",\n \"version\": \"12.2.0\",\n \"main\": \"./sprae.js\",\n \"module\": \"./sprae.js\",\n \"umd:main\": \"dist/sprae.umd.js\",\n \"unpkg\": \"dist/sprae.umd.js\",\n \"types\": \"dist/sprae.d.ts\",\n \"type\": \"module\",\n \"files\": [\n \"core.js\",\n \"sprae.js\",\n \"store.js\",\n \"signal.js\",\n \"micro.js\",\n \"directive\",\n \"dist\"\n ],\n \"devDependencies\": {\n \"@preact/signals\": \"^2.0.4\",\n \"@preact/signals-core\": \"^1.8.0\",\n \"@webreflection/signal\": \"^2.1.2\",\n \"es-module-shims\": \"^1.10.0\",\n \"esbuild\": \"^0.23.0\",\n \"esbuild-plugin-umd-wrapper\": \"^2.0.3\",\n \"hyperf\": \"^1.7.0\",\n \"jsdom\": \"^27.0.0\",\n \"requestidlecallback\": \"^0.3.0\",\n \"signal-polyfill\": \"^0.1.1\",\n \"subscript\": \"^9.1.0\",\n \"tst\": \"^7.2.0\",\n \"ulive\": \"^1.0.7\",\n \"usignal\": \"^0.9.0\",\n \"wait-please\": \"^3.1.0\"\n },\n \"scripts\": {\n \"test\": \"node -r ./test/register.cjs test/test.js\",\n \"build\": \"node .esbuild.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/dy/sprae.git\"\n },\n \"keywords\": [\n \"hydration\",\n \"progressive\",\n \"progressive enhancement\",\n \"signals\",\n \"directives\",\n \"preact-signals\",\n \"reactive\",\n \"template-parts\",\n \"petit-vue\",\n \"alpinejs\",\n \"templating\"\n ],\n \"author\": \"Dmitry Iv <df.creative@gmail.com>\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/dy/sprae/issues\"\n },\n \"homepage\": \"https://github.com/dy/sprae#readme\"\n}\n", "import store, { _change, _signals } from \"./store.js\";\nimport pkg from './package.json' with { type: 'json' };\n\nexport const _dispose = (Symbol.dispose ||= Symbol(\"dispose\")),\n _state = Symbol(\"state\"),\n _on = Symbol('on'),\n _off = Symbol('off'),\n _add = Symbol('add');\n\n\nexport let prefix = ':', signal, effect, computed, batch = (fn) => fn(), untracked = batch;\n\nexport let directive = {}, modifier = {}\n\nlet currentDir = null;\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|store} [state] - Initial state values to populate the element's reactive state.\n * @returns {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.outerHTML)\n\n // take over existing state instead of creating a clone\n state = store(state || {})\n\n let fx = [], offs = [], fn,\n on = () => (!offs && (offs = fx.map(fn => fn()))),\n off = () => (offs?.map(off => off()), offs = null)\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] = on\n el[_off] = off\n\n // destroy\n el[_dispose] ||= () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_state] = el[_add] = null)\n\n const add = (el, _attrs = el.attributes) => {\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 // directive initializer can be redefined\n if (fn = initDirective(el, name, value, state)) fx.push(fn), offs.push(fn())\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 // for (let i = 0, child; i < (el.childNodes.length); i++) child = el.childNodes[i], child.nodeType == 1 && add(child)\n for (let child of [...el.childNodes]) child.nodeType == 1 && add(child)\n };\n\n el[_add] = add;\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\nsprae.version = pkg.version;\n\n/**\n * Initializes directive (defined by sprae build), returns \"on\" function that enables it\n * Multiprop sequences initializer, eg. :a:b..c:d\n * @type {(el: HTMLElement, name:string, value:string, state:Object) => Function}\n * */\nconst initDirective = (el, dirName, expr, state) => {\n let cur, // current step callback\n off // current step disposal\n\n let steps = dirName.slice(prefix.length).split('..').map((step, i, { length }) => (\n // multiple attributes like :id:for=\"\"\n step.split(prefix).reduce((prev, str) => {\n let [name, ...mods] = str.split('.');\n let evaluate = parse(expr, directive[currentDir = name]?.parse)\n\n // a hack, but events have no signal-effects and can be sequenced\n // FIXME: events are molded into core, but should be an optional directive\n if (name.startsWith('on')) {\n let type = name.slice(2),\n fn = applyMods(\n sx(\n // single event vs chain\n length == 1 ? e => evaluate(state, (fn) => call(fn, e)) :\n (e => (cur = (!i ? e => call(evaluate(state), e) : cur)(e), off(), off = steps[(i + 1) % length]())),\n { target: el }\n ),\n mods);\n\n return (_poff) => (_poff = prev?.(), fn.target.addEventListener(type, fn, fn), () => (_poff?.(), fn.target.removeEventListener(type, fn)))\n }\n\n let fn, dispose, change, count;\n\n if (mods.length) {\n change = signal(-1), // signal authorized to trigger effect: 0 = init; >0 = trigger\n count = -1 // called effect count\n\n // effect applier - first time it applies the effect, next times effect is triggered by change signal\n fn = applyMods(sx(throttle(() => {\n if (++change.value) return // all calls except for the first one are handled by effect\n dispose = effect(() => update && (\n change.value == count ? fn() : // plan update: separate tick (via throttle) makes sure planner effect call is finished before eval call\n (count = change.value, evaluate(state, update)) // if changed more than effect called - call it\n ));\n }), {target: el}), mods)\n }\n else {\n fn = sx(() => dispose = effect(() => evaluate(state, update)), {target: el })\n }\n\n // props have no sequences and can be sync\n // it's nice to see directive as taking some part of current context and returning new or updated context\n let update = (directive[name] || directive['*'])(fn.target, state, expr, name)\n\n // some directives are effect-less\n if (!update) return\n\n // take over state if directive created it (mainly :scope)\n if (el[_state]) state = el[_state]\n\n return (_poff) => (\n _poff = prev?.(),\n // console.log('ON', name),\n fn(),\n () => (\n // console.log('OFF', name, el),\n _poff?.(), dispose?.(), change && (change.value = -1, count = dispose = null)\n )\n )\n }, null)\n ));\n\n // off can be changed on the go\n return () => (off = steps[0]?.())\n}\n\n\n/**\n * Configure sprae\n */\nexport const use = (s) => (\n s.compile && (compile = s.compile),\n s.prefix && (prefix = s.prefix),\n s.signal && (signal = s.signal),\n s.effect && (effect = s.effect),\n s.computed && (computed = s.computed),\n s.batch && (batch = s.batch),\n s.untracked && (untracked = s.untracked)\n)\n\n\n/**\n * Lifecycle hanger: makes DOM slightly slower but spraes automatically\n */\nexport const 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 if (el.nodeType === 1 && el[_state] === undefined) {\n for (const attr of el.attributes) {\n if (attr.name.startsWith(prefix)) {\n root[_add](el); break;\n }\n }\n }\n }\n // for (const el of m.removedNodes) el[Symbol.dispose]?.()\n }\n });\n mo.observe(root, { childList: true, subtree: true });\n return state\n}\n\n\n/**\n * Compiles an expression into an evaluator function.\n * @type {(dir:string, expr: string, clean?: string => string) => Function}\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 {Function} The compiled evaluator function for the expression.\n */\nexport const parse = (expr, prepare, _fn) => {\n if (_fn = parse.cache[expr]) return _fn\n\n let _expr = expr.trim() || 'undefined'\n if (prepare) _expr = prepare(_expr)\n\n // if, const, let - no return\n if (/^(if|let|const)\\b/.test(_expr) || /;(?![^{]*})/.test(_expr)) ;\n else _expr = `return ${_expr}`\n\n // async expression\n if (/\\bawait\\s/.test(_expr)) _expr = `return (async()=>{ ${_expr} })()`\n\n // static time errors\n try {\n _fn = compile(_expr)\n Object.defineProperty(_fn, \"name\", {value: `\u2234 ${expr}`})\n } catch (e) { console.error(`\u2234 ${e}\\n\\n${prefix + currentDir}=\"${expr}\"`) }\n\n // run time errors\n return parse.cache[expr] = (state, cb, _out) => {\n try {\n let result = _fn?.(state)\n // if cb is given (to handle asyncs) - call it with result and return function that returns last cb result - needed for effect cleanup\n if (cb) return result?.then ? result.then(v => _out = cb(v)) : _out = cb(result), () => call(_out)\n else return result\n } catch (e) {\n console.error(`\u2234 ${e}\\n\\n${prefix + currentDir}=\"${expr}\"`)\n }\n }\n}\nparse.cache = {};\n\n\n// apply modifiers to context (from the end due to nature of wrapping ctx.call)\nconst applyMods = (fn, mods) => {\n while (mods.length) {\n let [name, ...params] = mods.pop().split('-')\n fn = sx(modifier[name]?.(fn, ...params) ?? fn, fn)\n }\n return fn\n}\n\n// soft-extend missing props and ignoring signals\nconst sx = (a, b) => { if (a != b) for (let k in b) (a[k] ??= b[k]); return a }\n\n// instantiated <template> fragment holder, like persisting fragment but with minimal API surface\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 // get parentNode() { return childNodes[0].parentNode },\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 // setAttributeNode() { }\n }\n}\n\n// if value is function - return result of its call\nexport const call = (v, arg) => typeof v === 'function' ? v(arg) : v\n\n// camel to kebab\nexport const dashcase = (str) => str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());\n\n// set attr\nexport const attr = (el, name, v) => (v == null || v === false) ? el.removeAttribute(name) : el.setAttribute(name, v === true ? \"\" : v);\n\n// convert any-arg to className string\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// throttle function to (once per tick or other custom scheduler)\nexport const throttle = (fn, schedule = queueMicrotask) => {\n let _planned = 0;\n const throttled = (e) => {\n if (!_planned++) fn(e), schedule((_dirty = _planned > 1) => (\n _planned = 0, _dirty && throttled(e)\n ));\n }\n return throttled;\n}\n\nexport const debounce = (fn, schedule = queueMicrotask, _count = 0) => (arg, _planned=++_count) => schedule(() => (_planned == _count && fn(arg)))\n\nexport * from './store.js';\n\nexport default sprae\n", "// signals-based proxy\nimport { signal, computed, batch, untracked, _add } from './core.js'\n\n\n// _signals allows both storing signals and checking instance, which would be difficult with WeakMap\nexport const _signals = Symbol('signals'),\n // _change is a signal that tracks changes to the object keys or array length\n _change = Symbol('change'),\n // _set is stashed setter for computed values\n _set = Symbol('set')\n\n// a hack to simulate sandbox for `with` in evaluator\nlet sandbox = true\n\n// object store is not lazy\n// parent defines parent scope or sandbox\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 // console.log('GET', k, signals)\n if (k in signals) return (signals[k] ? signals[k].valueOf() : signals[k])\n return parent ? parent[k] : globalThis[k]\n },\n\n set: (_, k, v, _s) => {\n // console.group('SET', k, v, signals, k in signals)\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// array store - signals are lazy since arrays can be very large & expensive\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// create signal value, skip untracked\nconst create = (signals, k, v) => (signals[k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n\n// set/update signal value\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", "// preact-signals minimal implementation\nlet current, depth = 0, batched;\n\n// default signals impl\n\nexport const signal = (v, _s, _obs = new Set, _v = () => _s.value) => (\n _s = {\n get value() {\n current?.deps.push(_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, then: _v, toString: _v, valueOf: _v\n }\n)\n\nexport const effect = (fn, _teardown, _fx, _deps, __tmp) => (\n _fx = (prev) => {\n __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 _deps = _fx.deps = [],\n\n _fx(),\n (dep) => { _teardown?.call?.(); while (dep = _deps.pop()) dep.delete(_fx); }\n)\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, then: _v, toString: _v, valueOf: _v\n }\n)\n\nexport const batch = (fn, _first = !batched) => {\n batched ??= new Set;\n try { fn(); }\n finally { if (_first) { for (const fx of batched) fx(); batched = null } }\n}\n\nexport const untracked = (fn, _prev, _v) => (_prev = current, current = null, _v = fn(), current = _prev, _v)\n", "// \"centralized\" version of :if\nimport sprae, { throttle, _on, _off, _state, frag } from '../core.js';\n\n// :if=\"a\"\nexport default (el, state, _holder, _el, _match) => {\n // new element :if\n // console.log(':if init', el)\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 // console.group(':if update clauses', ..._holder._clauses)\n\n if (match != _match) {\n // console.log(':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 // console.groupEnd()\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 // console.log(':if update', _el, value)\n _el._clause[1] = value\n _el._holder.update()\n }\n}\n", "import { _on, _off, _state, frag } from '../core.js';\n\n\n// NOTE: we can reach :else counterpart whereas prev :else :if is on hold\nexport default (el, state, _el, _, _prev=el) => {\n\n // console.log(':else init', el)\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, call } from \"../core.js\"\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 = call(v, el.textContent), el.textContent = v == null ? \"\" : v)\n)\n", "import { clsx, call } from \"../core.js\";\n\nexport default (el, _cur, _new) => (\n _cur = new Set,\n (v) => {\n _new = new Set\n if (v) clsx(call(v, el.className)).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 { call, attr } from \"../core.js\";\n\nexport default (el, _static) => (\n _static = el.getAttribute(\"style\"),\n v => {\n v = call(v, el.style)\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", "import { call } from \"../core.js\"\n\nexport default () => call\n", "import sprae, { attr, parse, _state } from \"../core.js\";\n\n\n// create expression setter, reflecting value back to state\nexport const setter = (expr, _set = parse(`${expr}=__`)) => (target, value) => {\n // save value to stash\n target.__ = value; _set(target), delete target.__\n}\n\nexport default (el, state, expr, name) => {\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 : el.value)\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, no need to parse again\n parse(expr)(state) ?? handleChange()\n } catch { }\n\n return (el.type === \"text\" || el.type === \"\") ?\n (value) => el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)) :\n (el.tagName === \"TEXTAREA\" || el.type === \"text\" || el.type === \"\") ?\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\"\n// import { setter } from \"./value.js\"\n\nexport default (el, state, expr, name, _prev, _set) => {\n // FIXME: we call eval twice here - once to check if it's fn, second for update (from core)\n if (typeof parse(expr)(state) == 'function') return v => (v(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 // (setter(expr)(state, el))\n Object.defineProperty(state, expr, { value: el, configurable: true })\n}\n", "import sprae, { store, call, untracked, _state, _signals, signal } from '../core.js'\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 subscope = 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 = call(values, subscope);\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 !== subscope) {\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(subscope) : values[k]\n // update\n if (k in subscope[_signals]) subscope[k] = v\n // create\n else (subscope[_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, subscope)))\n }\n}\n", "import sprae, { store, _state, effect, _change, _signals, frag, throttle } from \"../core.js\";\n\nconst each = (tpl, state, expr) => {\n let [itemVar, idxVar = \"$\"] = expr.split(/\\bin\\b/)[0].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 // FIXME: pass items to update instead of global\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 // 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 // append\n for (; i < newl; i++) {\n cur[i] = newItems[i]\n\n let idx = i,\n // inherited state must be cheaper in terms of memory and faster in terms of performance, compared to creating a proxy store\n // subscope = store({\n // // NOTE: since we simulate signal, we have to make sure it's actual signal, not fake one\n // // FIXME: try to avoid this, we also have issue with wrongly calling dispose in store on delete\n // [itemVar]: cur[_signals]?.[idx]?.peek ? cur[_signals]?.[idx] : cur[idx],\n // [idxVar]: keys ? keys[idx] : idx\n // }, state)\n subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n\n let el = tpl.content ? frag(tpl) : tpl.cloneNode(true);\n\n holder.before(el.content || el);\n\n sprae(el, subscope);\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\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 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 unsubscribes unused signals\n items[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n update()\n })\n }\n}\n\n// :each directive skips v, k\neach.parse = (str) => str.split(/\\bin\\b/)[1].trim()\n\nexport default each\n", "import { attr, call } from \"../core.js\";\n\nexport default (el, st, ex, name) => v => attr(el, name, call(v, el.getAttribute(name)))\n", "import { attr, dashcase } from \"../core.js\";\n\nexport default (target) => value => { for (let key in value) attr(target, dashcase(key), value[key]) }\n", "import store from \"./store.js\";\nimport { batch, computed, effect, signal, untracked } from './signal.js';\nimport sprae, { use, directive, modifier, start, throttle, debounce, _add, _off, _state, _on, _dispose } 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/default.js\";\nimport _spread from \"./directive/spread.js\";\n\n\nObject.assign(directive, {\n // :x=\"x\"\n '*': _default,\n\n // FIXME\n // 'on*': _on,\n\n // :=\"{a,b,c}\"\n '': _spread,\n\n // :class=\"[a, b, c]\"\n class: _class,\n\n // :text=\"...\"\n text: _text,\n\n // :style=\"...\"\n style: _style,\n\n // :fx=\"...\"\n fx: _fx,\n\n // :value - 2 way binding like x-model\n value: _value,\n\n // :ref=\"...\"\n ref: _ref,\n\n // :scope creates variables scope for a subtree\n scope: _scope,\n\n if: _if,\n else: _else,\n\n // :each=\"v,k in src\"\n each: _each\n})\n\nObject.assign(modifier, {\n debounce: (fn,\n _how = 250,\n _schedule = _how === \"tick\" ? queueMicrotask : _how === \"raf\" ? requestAnimationFrame : _how === \"idle\" ? requestIdleCallback : ((fn) => setTimeout(fn, _how)),\n _count = 0\n ) =>\n debounce(fn, _schedule),\n\n throttle: (fn, _how = 250, _schedule = _how === \"tick\" ? queueMicrotask : _how === \"raf\" ? requestAnimationFrame : ((fn) => setTimeout(fn, _how))) => (\n throttle(fn, _schedule)\n ),\n\n once: (fn, _done, _fn) => Object.assign((e) => !_done && (_done = 1, fn(e)), { once: true }),\n\n // event modifiers\n // actions\n prevent: (fn) => (e) => (e?.preventDefault(), fn(e)),\n stop: (fn) => (e) => (e?.stopPropagation(), fn(e)),\n immediate: (fn) => (e) => (e?.stopImmediatePropagation(), fn(e)),\n\n // options\n passive: fn => (fn.passive = true, fn),\n capture: fn => (fn.capture = true, fn),\n\n // target\n window: fn => (fn.target = fn.target.ownerDocument.defaultView, fn),\n document: fn => (fn.target = fn.target.ownerDocument, fn),\n root: fn => (fn.target = fn.target.ownerDocument.documentElement, fn),\n body: fn => (fn.target = fn.target.ownerDocument.body, fn),\n parent: fn => (fn.target = fn.target.parentNode, fn),\n\n // testers\n self: (fn) => (e) => (e.target === fn.target && fn(e)),\n\n outside: (fn) => (e, _target) => (\n _target = fn.target,\n !_target.contains(e.target) && e.target.isConnected && (_target.offsetWidth || _target.offsetHeight)\n ),\n})\n\n// key testers\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\" || 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// augment modifiers with key testers\nfor (let k in keys) modifier[k] = (fn, ...params) => (e) => keys[k](e) && params.every(k => keys[k]?.(e) ?? e.key === k) && fn(e)\n\nuse({\n compile: expr => {\n return sprae.constructor(`with (arguments[0]) { ${expr} }`)\n },\n\n // signals\n signal, effect, computed, batch, untracked\n})\n\n// expose for runtime config\nsprae.use = use\nsprae.store = store\nsprae.directive = directive\nsprae.modifier = modifier\nsprae.start = start\n\nexport default sprae\nexport { sprae, store, signal, effect, computed, batch, untracked, start, use }\n"],
5
+ "mappings": "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",
6
+ "names": ["package_default", "_dispose", "_state", "_on", "_off", "_add", "prefix", "signal", "effect", "computed", "batch", "fn", "untracked", "directive", "modifier", "currentDir", "sprae", "el", "state", "store_default", "fx", "offs", "on", "off", "add", "_attrs", "i", "name", "value", "initDirective", "child", "package_default", "dirName", "expr", "cur", "steps", "step", "length", "prev", "str", "mods", "evaluate", "parse", "type", "applyMods", "sx", "e", "call", "_poff", "dispose", "change", "count", "throttle", "update", "use", "s", "compile", "start", "root", "values", "mutations", "m", "attr", "prepare", "_fn", "_expr", "cb", "_out", "result", "v", "params", "a", "b", "k", "frag", "tpl", "content", "attributes", "ref", "childNodes", "arg", "dashcase", "match", "clsx", "c", "schedule", "_planned", "throttled", "_dirty", "debounce", "_count", "core_default", "_signals", "_change", "_set", "sandbox", "store", "values", "parent", "list", "keyCount", "signals", "state", "signal", "_", "k", "v", "_s", "set", "create", "descs", "computed", "isMut", "mut", "fn", "length", "i", "_v", "untracked", "batch", "store_default", "current", "depth", "batched", "signal", "v", "_s", "_obs", "_v", "val", "sub", "effect", "fn", "_teardown", "_fx", "_deps", "__tmp", "prev", "dep", "computed", "_c", "_e", "batch", "_first", "fx", "untracked", "_prev", "if_default", "el", "state", "_holder", "_el", "_match", "_a", "core_default", "_state", "frag", "throttle", "match", "s", "_off", "_on", "value", "else_default", "el", "state", "_el", "_", "_prev", "frag", "_state", "text_default", "el", "frag", "v", "call", "class_default", "el", "_cur", "_new", "v", "clsx", "call", "c", "style_default", "el", "_static", "v", "call", "attr", "k", "fx_default", "call", "setter", "expr", "_set", "parse", "target", "value", "value_default", "el", "state", "name", "set", "handleChange", "o", "core_default", "from", "to", "attr", "v", "ref_default", "el", "state", "expr", "name", "_prev", "_set", "parse", "v", "scope_default", "el", "rootState", "subscope", "_state", "store", "init", "values", "call", "k", "v", "_signals", "signal", "untracked", "core_default", "each", "tpl", "state", "expr", "itemVar", "idxVar", "holder", "cur", "keys", "items", "prevl", "update", "throttle", "_a", "_b", "i", "newItems", "newl", "_change", "s", "_signals", "idx", "subscope", "el", "frag", "core_default", "_prev", "_state", "value", "_", "effect", "str", "each_default", "default_default", "el", "st", "ex", "name", "v", "attr", "call", "spread_default", "target", "value", "key", "attr", "dashcase", "directive", "default_default", "spread_default", "class_default", "text_default", "style_default", "fx_default", "value_default", "ref_default", "scope_default", "if_default", "else_default", "each_default", "modifier", "fn", "_how", "_schedule", "_count", "debounce", "throttle", "_done", "_fn", "e", "_target", "keys", "k", "params", "use", "expr", "core_default", "signal", "effect", "computed", "batch", "untracked", "store_default", "start", "sprae_default"]
7
7
  }
package/dist/sprae.umd.js CHANGED
@@ -1,9 +1,9 @@
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 re=Object.defineProperty;var Ye=Object.getOwnPropertyDescriptor;var ve=Object.getOwnPropertyNames;var _e=Object.prototype.hasOwnProperty;var m=(e,r)=>()=>(e&&(r=e(e=0)),r);var et=(e,r)=>{for(var t in r)re(e,t,{get:r[t],enumerable:!0})},tt=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of ve(r))!_e.call(e,o)&&o!==t&&re(e,o,{get:()=>r[o],enumerable:!(n=Ye(r,o))||n.enumerable});return e};var rt=e=>tt(re({},"__esModule",{value:!0}),e);var z,l,G,J,oe,P,j,V,ie,Q,B,L,H,ne,he,ot,U,se,be,k,ye,nt,$,h,ge,x,ae,W,xe,p,b=m(()=>{Y();Y();z=Symbol.dispose||(Symbol.dispose=Symbol("dispose")),l=Symbol("state"),G=Symbol("on"),J=Symbol("off"),oe=Symbol("add"),P=":",Q=e=>e(),B=Q,L={},H={},ne=null,he=(e=document.body,r)=>{if(e[l])return Object.assign(e[l],r);r=K(r||{});let t=[],n=[],o,i=()=>!n&&(n=t.map(u=>u())),s=()=>(n?.map(u=>u()),n=null);e[G]=i,e[J]=s,e[z]||(e[z]=()=>(e[J](),e[J]=e[G]=e[z]=e[l]=e[oe]=null));let a=(u,f=u.attributes)=>{if(f)for(let d=0;d<f.length;){let{name:c,value:y}=f[d];if(c.startsWith(P)){if(u.removeAttribute(c),(o=ot(u,c,y,r))&&(t.push(o),n.push(o())),l in u)return}else d++}for(let d of[...u.childNodes])d.nodeType==1&&a(d)};return e[oe]=a,a(e),e[l]===void 0&&(e[l]=r),r},ot=(e,r,t,n)=>{let o,i,s=r.slice(P.length).split("..").map((a,u,{length:f})=>a.split(P).reduce((d,c)=>{let[y,...g]=c.split("."),T=k(t,L[ne=y]?.parse);if(y.startsWith("on")){let M=y.slice(2),F=ye(Object.assign(f==1?D=>T(n,te=>h(te,D)):D=>(o=(u?o:te=>h(T(n),te))(D),i(),i=s[(u+1)%f]()),{target:e,type:M}),g);return D=>(D=d?.(),F.target.addEventListener(M,F,F),()=>(D?.(),F.target.removeEventListener(M,F)))}let C=(L[y]||L["*"])(e,n,t,y);if(!C)return;if(e[l]&&(n=e[l]),!g.length&&!d)return()=>V(()=>T(n,C));let A,E=j(-1),O=-1,Z=W(ye(()=>{++E.value||(A=V(()=>C&&(E.value==O?Z():(O=E.value,T(n,C)))))},g));return M=>(M=d?.(),Z(),{[y]:()=>(M?.(),A(),E.value=-1,O=A=null)}[y])},null));return()=>i=s[0]?.()},U=e=>(e.compile&&(be=e.compile),e.prefix&&(P=e.prefix),e.signal&&(j=e.signal),e.effect&&(V=e.effect),e.computed&&(ie=e.computed),e.batch&&(Q=e.batch),e.untracked&&(B=e.untracked)),se=(e=document.body,r)=>{let t=K(r);return he(e,t),new MutationObserver(o=>{for(let i of o)for(let s of i.addedNodes)if(s.nodeType===1&&s[l]===void 0){for(let a of s.attributes)if(a.name.startsWith(P)){e[oe](s);break}}}).observe(e,{childList:!0,subtree:!0}),t},k=(e,r,t)=>{if(t=k.cache[e])return t;let n=e.trim()||"undefined";r&&(n=r(n)),/^(if|let|const)\b/.test(n)||/;(?![^{]*})/.test(n)||(n=`return ${n}`),/\bawait\s/.test(n)&&(n=`return (async()=>{ ${n} })()`);try{t=be(n),Object.defineProperty(t,"name",{value:`\u2234 ${e}`})}catch(o){console.error(`\u2234 ${o}
2
+ var oe=Object.defineProperty;var et=Object.getOwnPropertyDescriptor;var tt=Object.getOwnPropertyNames;var rt=Object.prototype.hasOwnProperty;var d=(e,r)=>()=>(e&&(r=e(e=0)),r);var ot=(e,r)=>{for(var t in r)oe(e,t,{get:r[t],enumerable:!0})},st=(e,r,t,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of tt(r))!rt.call(e,o)&&o!==t&&oe(e,o,{get:()=>r[o],enumerable:!(s=et(r,o))||s.enumerable});return e};var it=e=>st(oe({},"__esModule",{value:!0}),e);var be,he=d(()=>{be={name:"sprae",description:"DOM microhydration",version:"12.2.0",main:"./sprae.js",module:"./sprae.js","umd:main":"dist/sprae.umd.js",unpkg:"dist/sprae.umd.js",types:"dist/sprae.d.ts",type:"module",files:["core.js","sprae.js","store.js","signal.js","micro.js","directive","dist"],devDependencies:{"@preact/signals":"^2.0.4","@preact/signals-core":"^1.8.0","@webreflection/signal":"^2.1.2","es-module-shims":"^1.10.0",esbuild:"^0.23.0","esbuild-plugin-umd-wrapper":"^2.0.3",hyperf:"^1.7.0",jsdom:"^27.0.0",requestidlecallback:"^0.3.0","signal-polyfill":"^0.1.1",subscript:"^9.1.0",tst:"^7.2.0",ulive:"^1.0.7",usignal:"^0.9.0","wait-please":"^3.1.0"},scripts:{test:"node -r ./test/register.cjs test/test.js",build:"node .esbuild.js"},repository:{type:"git",url:"git+https://github.com/dy/sprae.git"},keywords:["hydration","progressive","progressive enhancement","signals","directives","preact-signals","reactive","template-parts","petit-vue","alpinejs","templating"],author:"Dmitry Iv <df.creative@gmail.com>",license:"MIT",bugs:{url:"https://github.com/dy/sprae/issues"},homepage:"https://github.com/dy/sprae#readme"}});var Z,l,G,F,se,q,k,J,ne,Q,B,L,H,ie,ae,at,U,ue,Se,O,xe,z,D,y,Ae,A,ce,M,je,f,g=d(()=>{Y();he();Y();Z=Symbol.dispose||(Symbol.dispose=Symbol("dispose")),l=Symbol("state"),G=Symbol("on"),F=Symbol("off"),se=Symbol("add"),q=":",Q=e=>e(),B=Q,L={},H={},ie=null,ae=(e=document.body,r)=>{if(e[l])return Object.assign(e[l],r);r=v(r||{});let t=[],s=[],o,i=()=>!s&&(s=t.map(u=>u())),n=()=>(s?.map(u=>u()),s=null);e[G]=i,e[F]=n,e[Z]||(e[Z]=()=>(e[F](),e[F]=e[G]=e[Z]=e[l]=e[se]=null));let a=(u,p=u.attributes)=>{if(p)for(let m=0;m<p.length;){let{name:c,value:h}=p[m];if(c.startsWith(q)){if(u.removeAttribute(c),(o=at(u,c,h,r))&&(t.push(o),s.push(o())),l in u)return}else m++}for(let m of[...u.childNodes])m.nodeType==1&&a(m)};return e[se]=a,a(e),e[l]===void 0&&(e[l]=r),r};ae.version=be.version;at=(e,r,t,s)=>{let o,i,n=r.slice(q.length).split("..").map((a,u,{length:p})=>a.split(q).reduce((m,c)=>{let[h,...b]=c.split("."),C=O(t,L[ie=h]?.parse);if(h.startsWith("on")){let R=h.slice(2),V=xe(z(p==1?E=>C(s,re=>y(re,E)):E=>(o=(u?o:re=>y(C(s),re))(E),i(),i=n[(u+1)%p]()),{target:e}),b);return E=>(E=m?.(),V.target.addEventListener(R,V,V),()=>(E?.(),V.target.removeEventListener(R,V)))}let N,x,$,S;b.length?($=k(-1),S=-1,N=xe(z(M(()=>{++$.value||(x=J(()=>W&&($.value==S?N():(S=$.value,C(s,W)))))}),{target:e}),b)):N=z(()=>x=J(()=>C(s,W)),{target:e});let W=(L[h]||L["*"])(N.target,s,t,h);if(W)return e[l]&&(s=e[l]),R=>(R=m?.(),N(),()=>(R?.(),x?.(),$&&($.value=-1,S=x=null)))},null));return()=>i=n[0]?.()},U=e=>(e.compile&&(Se=e.compile),e.prefix&&(q=e.prefix),e.signal&&(k=e.signal),e.effect&&(J=e.effect),e.computed&&(ne=e.computed),e.batch&&(Q=e.batch),e.untracked&&(B=e.untracked)),ue=(e=document.body,r)=>{let t=v(r);return ae(e,t),new MutationObserver(o=>{for(let i of o)for(let n of i.addedNodes)if(n.nodeType===1&&n[l]===void 0){for(let a of n.attributes)if(a.name.startsWith(q)){e[se](n);break}}}).observe(e,{childList:!0,subtree:!0}),t},O=(e,r,t)=>{if(t=O.cache[e])return t;let s=e.trim()||"undefined";r&&(s=r(s)),/^(if|let|const)\b/.test(s)||/;(?![^{]*})/.test(s)||(s=`return ${s}`),/\bawait\s/.test(s)&&(s=`return (async()=>{ ${s} })()`);try{t=Se(s),Object.defineProperty(t,"name",{value:`\u2234 ${e}`})}catch(o){console.error(`\u2234 ${o}
3
3
 
4
- ${P+ne}="${e}"`)}return k.cache[e]=(o,i,s)=>{try{let a=t?.(o);return i?(a?.then?a.then(u=>s=i(u)):s=i(a),()=>h(s)):a}catch(a){console.error(`\u2234 ${a}
4
+ ${q+ie}="${e}"`)}return O.cache[e]=(o,i,n)=>{try{let a=t?.(o);return i?(a?.then?a.then(u=>n=i(u)):n=i(a),()=>y(n)):a}catch(a){console.error(`\u2234 ${a}
5
5
 
6
- ${P+ne}="${e}"`)}}};k.cache={};ye=(e,r)=>{for(;r.length;){let[t,...n]=r.pop().split("-");e=nt(H[t]?.(e,...n)??e,e)}return e},nt=(e,r)=>{if(e!=r)for(let t in r)e[t]??(e[t]=r[t]);return e},$=e=>{if(!e.nodeType)return e;let r=e.content.cloneNode(!0),t=[...e.attributes],n=document.createTextNode(""),o=(r.append(n),[...r.childNodes]);return{childNodes:o,content:r,remove:()=>r.append(...o),replaceWith(i){i!==n&&(n.before(i),r.append(...o))},attributes:t,removeAttribute(i){t.splice(t.findIndex(s=>s.name===i),1)}}},h=(e,r)=>typeof e=="function"?e(r):e,ge=e=>e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(r,t)=>(t?"-":"")+r.toLowerCase()),x=(e,r,t)=>t==null||t===!1?e.removeAttribute(r):e.setAttribute(r,t===!0?"":t),ae=(e,r=[])=>e?typeof e=="string"?e:(Array.isArray(e)?e.map(ae):Object.entries(e).reduce((t,[n,o])=>o?[...t,n]:t,[])).join(" "):"",W=(e,r=queueMicrotask)=>{let t=0,n=o=>{t++||(e(o),r((i=t>1)=>(t=0,i&&n(o))))};return n},xe=(e,r=queueMicrotask,t=0)=>(n,o=++t)=>r(()=>o==t&&e(n)),p=he});var S,N,ce,ue,q,it,v,Se,K,Y=m(()=>{b();S=Symbol("signals"),N=Symbol("change"),ce=Symbol("set"),ue=!0,q=(e,r)=>{if(!e||e[Symbol.toStringTag]||e[S])return e;if(e.constructor!==Object)return Array.isArray(e)?it(e):e;let t=Object.keys(e).length,n={},o=new Proxy(Object.assign(n,{[N]:j(t),[S]:n}),{get:(s,a)=>a in n?n[a]?n[a].valueOf():n[a]:r?r[a]:globalThis[a],set:(s,a,u,f)=>a in n?(Se(n,a,u),1):(ue=!1,r&&a in r?r[a]=u:(v(n,a,u),n[N].value=++t),ue=!0,1),deleteProperty:(s,a)=>(a in n&&(a[0]!="_"&&n[a]?.[Symbol.dispose]?.(),delete n[a],n[N].value=--t),1),ownKeys:()=>(n[N].value,Reflect.ownKeys(n)),has:(s,a)=>a in n?!0:r?a in r:ue}),i=Object.getOwnPropertyDescriptors(e);for(let s in e)i[s]?.get?(n[s]=ie(i[s].get.bind(o)))[ce]=i[s].set?.bind(o):v(n,s,e[s]);return o},it=(e,r=globalThis)=>{let t=Array(e.length).fill(null),n=!1,o=a=>function(){return n=!0,a.apply(this,arguments)},i=j(e.length),s=new Proxy(Object.assign(t,{[N]:i,[S]:t,push:o(t.push),pop:o(t.pop),shift:o(t.shift),unshift:o(t.unshift),splice:o(t.splice)}),{get(a,u){return u==="length"?n?(n=!1,t.length):i.value:typeof u=="symbol"||isNaN(u)?t[u]?.valueOf()??r[u]:(t[u]??(t[u]=j(q(e[u])))).valueOf()},set(a,u,f){if(u==="length"){for(let d=f;d<t.length;d++)delete s[d];i.value=t.length=f}else u>=t.length?(v(t,u,f),s.length=+u+1):t[u]?Se(t,u,f):v(t,u,f);return 1},deleteProperty:(a,u)=>(t[u]?.[Symbol.dispose]?.(),delete t[u],1)});return s},v=(e,r,t)=>e[r]=r[0]=="_"||t?.peek?t:j(q(t)),Se=(e,r,t,n,o)=>r[0]==="_"?e[r]=t:t!==(o=(n=e[r]).peek())&&(n[ce]?n[ce](t):Array.isArray(t)&&Array.isArray(o)?N in o?B(()=>Q(()=>{for(let i=0;i<t.length;i++)o[i]=t[i];o.length=t.length})):n.value=t:n.value=q(t)),K=q});var w,Ae,I,_,ee,le,fe,pe,Oe=m(()=>{Ae=0,_=(e,r,t=new Set,n=()=>r.value)=>r={get value(){return w?.deps.push(t.add(w)),e},set value(o){if(o!==e){e=o;for(let i of t)I?I.add(i):i()}},peek(){return e},toJSON:n,then:n,toString:n,valueOf:n},ee=(e,r,t,n,o)=>(t=i=>{if(o=r,r=null,o?.call?.(),i=w,w=t,Ae++>10)throw"Cycle detected";try{r=e()}finally{w=i,Ae--}},n=t.deps=[],t(),i=>{for(r?.call?.();i=n.pop();)i.delete(t)}),le=(e,r=_(),t,n,o=()=>t.value)=>t={get value(){return n||(n=ee(()=>r.value=e())),r.value},peek:r.peek,toJSON:o,then:o,toString:o,valueOf:o},fe=(e,r=!I)=>{I??(I=new Set);try{e()}finally{if(r){for(let t of I)t();I=null}}},pe=(e,r,t)=>(r=w,w=null,t=e(),w=r,t)});var ke,je=m(()=>{b();ke=(e,r,t,n,o)=>{var i;return e._holder?p(n=e,r):(e[i=l]??(e[i]=null),n=e.content?$(e):e,e.replaceWith(t=document.createTextNode("")),n._holder=t._holder=t,t._clauses=[n._clause=[n,!1]],t.update=W(()=>{let s=t._clauses.find(([,a])=>a);s!=o&&(o?.[0].remove(),o?.[0][J]?.(),(o=s)&&(t.before(o[0].content||o[0]),o[0][l]?o[0][G]?.():(delete o[0][l],p(o[0],r))))})),s=>{n._clause[1]=s,n._holder.update()}}});var Ne,$e=m(()=>{b();Ne=(e,r,t,n,o=e)=>{for(t=e.content?$(e):e;o&&!(t._holder=o._holder);)o=o.previousSibling;return e.remove(),e[l]=null,t._holder._clauses.push(t._clause=[t,!0]),t._holder.update}});var we,Te=m(()=>{b();we=e=>(e.content&&e.replaceWith(e=$(e).childNodes[0]),r=>(r=h(r,e.textContent),e.textContent=r??""))});var Ce,Pe=m(()=>{b();Ce=(e,r,t)=>(r=new Set,n=>{t=new Set,n&&ae(h(n,e.className)).split(" ").map(o=>o&&t.add(o));for(let o of r)t.has(o)?t.delete(o):e.classList.remove(o);for(let o of r=t)e.classList.add(o)})});var We,qe=m(()=>{b();We=(e,r)=>(r=e.getAttribute("style"),t=>{if(t=h(t,e.style),typeof t=="string")x(e,"style",r+"; "+t);else{r&&x(e,"style",r);for(let n in t)n[0]=="-"?e.style.setProperty(n,t[n]):n[0]>"A"&&(e.style[n]=t[n])}})});var Ee,Me=m(()=>{b();Ee=()=>h});var st,De,Le=m(()=>{b();st=(e,r=k(`${e}=__`))=>(t,n)=>{t.__=n,r(t),delete t.__},De=(e,r,t,n)=>{try{let o=st(t),i=e.type==="checkbox"?()=>o(r,e.checked):e.type==="select-multiple"?()=>o(r,[...e.selectedOptions].map(s=>s.value)):()=>o(r,e.selectedIndex<0?null:e.value);e.oninput=e.onchange=i,e.type?.startsWith("select")&&(new MutationObserver(i).observe(e,{childList:!0,subtree:!0,attributes:!0}),p(e,r)),k(t)(r)??i()}catch{}return e.type==="text"||e.type===""?o=>e.setAttribute("value",e.value=o??""):e.tagName==="TEXTAREA"||e.type==="text"||e.type===""?(o,i,s)=>(i=e.selectionStart,s=e.selectionEnd,e.setAttribute("value",e.value=o??""),i&&e.setSelectionRange(i,s)):e.type==="checkbox"?o=>(e.checked=o,x(e,"checked",o)):e.type==="radio"?o=>e.value===o&&(e.checked=o,x(e,"checked",o)):e.type==="select-one"?o=>{for(let i of e.options)i.value==o?i.setAttribute("selected",""):i.removeAttribute("selected");e.value=o}:e.type==="select-multiple"?o=>{for(let i of e.options)i.removeAttribute("selected");for(let i of o)e.querySelector(`[value="${i}"]`).setAttribute("selected","")}:o=>e.value=o}});var Ke,Ie=m(()=>{b();Ke=(e,r,t,n,o,i)=>{if(typeof k(t)(r)=="function")return s=>s(e);Object.defineProperty(r,t,{value:e,configurable:!0})}});var Re,Fe=m(()=>{b();Re=(e,r)=>{let t=e[l]=q({},r),n=!1;return o=>{if(o=h(o,t),o!==t)for(let i in o){let s=typeof o[i]=="function"?o[i].bind(t):o[i];i in t[S]?t[i]=s:t[S][i]=i[0]=="_"||s?.peek?s:j(q(s))}return!n&&(n=!0,delete e[l],B(()=>p(e,t)))}}});var Je,Ve,Be=m(()=>{b();Je=(e,r,t)=>{let[n,o="$"]=t.split(/\bin\b/)[0].trim().replace(/\(|\)/g,"").split(/\s*,\s*/),i=document.createTextNode(""),s,a,u,f=0,d=W(()=>{var T,C;let c=0,y=u,g=y.length;if(s&&!s[N]){for(let A of s[S]||[])A[Symbol.dispose]();s=null,f=0}if(g<f)s.length=g;else{if(!s)s=y;else for(;c<f;)s[c]=y[c++];for(;c<g;c++){s[c]=y[c];let A=c,E=Object.create(r,{[n]:{get:()=>s[A]},[o]:{value:a?a[A]:A}}),O=e.content?$(e):e.cloneNode(!0);i.before(O.content||O),p(O,E);let Z=((C=s[T=S]||(s[T]=[]))[c]||(C[c]={}))[Symbol.dispose];s[S][c][Symbol.dispose]=()=>{Z?.(),O[Symbol.dispose]?.(),O.remove()}}}f=g});return e.replaceWith(i),e[l]=null,c=>(a=null,typeof c=="number"?u=Array.from({length:c},(y,g)=>g+1):c?.constructor===Object?(a=Object.keys(c),u=Object.values(c)):u=c||[],V(()=>{u[N]?.value,d()}))};Je.parse=e=>e.split(/\bin\b/)[1].trim();Ve=Je});var He,Xe=m(()=>{b();He=(e,r,t,n)=>o=>x(e,n,h(o,e.getAttribute(n)))});var Ze,ze=m(()=>{b();Ze=e=>r=>{for(let t in r)x(e,ge(t),r[t])}});var Ge={};et(Ge,{batch:()=>fe,computed:()=>le,default:()=>at,effect:()=>ee,signal:()=>_,sprae:()=>p,start:()=>se,store:()=>K,untracked:()=>pe,use:()=>U});var de,at,Qe=m(()=>{Y();Oe();b();je();$e();Te();Pe();qe();Me();Le();Ie();Fe();Be();Xe();ze();Object.assign(L,{"*":He,"":Ze,class:Ce,text:we,style:We,fx:Ee,value:De,ref:Ke,scope:Re,if:ke,else:Ne,each:Ve});Object.assign(H,{debounce:(e,r=250,t=r==="tick"?queueMicrotask:r==="raf"?requestAnimationFrame:r==="idle"?requestIdleCallback:o=>setTimeout(o,r),n=0)=>xe(e,t),throttle:(e,r=250,t=r==="tick"?queueMicrotask:r==="raf"?requestAnimationFrame:n=>setTimeout(n,r))=>W(e,t),once:(e,r,t)=>Object.assign(n=>!r&&(r=1,e(n)),{once:!0}),prevent:e=>r=>(r?.preventDefault(),e(r)),stop:e=>r=>(r?.stopPropagation(),e(r)),immediate:e=>r=>(r?.stopImmediatePropagation(),e(r)),passive:e=>(e.passive=!0,e),capture:e=>(e.capture=!0,e),window:e=>(e.target=window,e),document:e=>(e.target=document,e),parent:e=>(e.target=e.target.parentNode,e),self:e=>r=>r.target===e.target&&e(r),outside:e=>(r,t)=>(t=e.target,!t.contains(r.target)&&r.target.isConnected&&(t.offsetWidth||t.offsetHeight))});de={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"||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)};for(let e in de)H[e]=(r,...t)=>n=>de[e](n)&&t.every(o=>de[o]?.(n)??n.key===o)&&r(n);U({compile:e=>p.constructor(`with (arguments[0]) { ${e} }`),signal:_,effect:ee,computed:le,batch:fe,untracked:pe});p.use=U;p.store=K;p.directive=L;p.modifier=H;p.start=se;at=p});var me=(Qe(),rt(Ge)).default;module.exports=me;var R=document.currentScript,Ue=R.getAttribute("prefix")??R.dataset.prefix??R.dataset.spraePrefix,X=R.getAttribute("start")??R.dataset.start??R.dataset.spraeStart;Ue&&me.use({prefix:Ue});X!=null&&X!=="false"&&(X&&X!=="true"?document.querySelectorAll(X):[document.body]).forEach(e=>me.start(e));
6
+ ${q+ie}="${e}"`)}}};O.cache={};xe=(e,r)=>{for(;r.length;){let[t,...s]=r.pop().split("-");e=z(H[t]?.(e,...s)??e,e)}return e},z=(e,r)=>{if(e!=r)for(let t in r)e[t]??(e[t]=r[t]);return e},D=e=>{if(!e.nodeType)return e;let r=e.content.cloneNode(!0),t=[...e.attributes],s=document.createTextNode(""),o=(r.append(s),[...r.childNodes]);return{childNodes:o,content:r,remove:()=>r.append(...o),replaceWith(i){i!==s&&(s.before(i),r.append(...o))},attributes:t,removeAttribute(i){t.splice(t.findIndex(n=>n.name===i),1)}}},y=(e,r)=>typeof e=="function"?e(r):e,Ae=e=>e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(r,t)=>(t?"-":"")+r.toLowerCase()),A=(e,r,t)=>t==null||t===!1?e.removeAttribute(r):e.setAttribute(r,t===!0?"":t),ce=(e,r=[])=>e?typeof e=="string"?e:(Array.isArray(e)?e.map(ce):Object.entries(e).reduce((t,[s,o])=>o?[...t,s]:t,[])).join(" "):"",M=(e,r=queueMicrotask)=>{let t=0,s=o=>{t++||(e(o),r((i=t>1)=>(t=0,i&&s(o))))};return s},je=(e,r=queueMicrotask,t=0)=>(s,o=++t)=>r(()=>o==t&&e(s)),f=ae});var j,w,pe,le,P,ut,_,Oe,v,Y=d(()=>{g();j=Symbol("signals"),w=Symbol("change"),pe=Symbol("set"),le=!0,P=(e,r)=>{if(!e||e[Symbol.toStringTag]||e[j])return e;if(e.constructor!==Object)return Array.isArray(e)?ut(e):e;let t=Object.keys(e).length,s={},o=new Proxy(Object.assign(s,{[w]:k(t),[j]:s}),{get:(n,a)=>a in s?s[a]?s[a].valueOf():s[a]:r?r[a]:globalThis[a],set:(n,a,u,p)=>a in s?(Oe(s,a,u),1):(le=!1,r&&a in r?r[a]=u:(_(s,a,u),s[w].value=++t),le=!0,1),deleteProperty:(n,a)=>(a in s&&(a[0]!="_"&&s[a]?.[Symbol.dispose]?.(),delete s[a],s[w].value=--t),1),ownKeys:()=>(s[w].value,Reflect.ownKeys(s)),has:(n,a)=>a in s?!0:r?a in r:le}),i=Object.getOwnPropertyDescriptors(e);for(let n in e)i[n]?.get?(s[n]=ne(i[n].get.bind(o)))[pe]=i[n].set?.bind(o):_(s,n,e[n]);return o},ut=(e,r=globalThis)=>{let t=Array(e.length).fill(null),s=!1,o=a=>function(){return s=!0,a.apply(this,arguments)},i=k(e.length),n=new Proxy(Object.assign(t,{[w]:i,[j]:t,push:o(t.push),pop:o(t.pop),shift:o(t.shift),unshift:o(t.unshift),splice:o(t.splice)}),{get(a,u){return u==="length"?s?(s=!1,t.length):i.value:typeof u=="symbol"||isNaN(u)?t[u]?.valueOf()??r[u]:(t[u]??(t[u]=k(P(e[u])))).valueOf()},set(a,u,p){if(u==="length"){for(let m=p;m<t.length;m++)delete n[m];i.value=t.length=p}else u>=t.length?(_(t,u,p),n.length=+u+1):t[u]?Oe(t,u,p):_(t,u,p);return 1},deleteProperty:(a,u)=>(t[u]?.[Symbol.dispose]?.(),delete t[u],1)});return n},_=(e,r,t)=>e[r]=r[0]=="_"||t?.peek?t:k(P(t)),Oe=(e,r,t,s,o)=>r[0]==="_"?e[r]=t:t!==(o=(s=e[r]).peek())&&(s[pe]?s[pe](t):Array.isArray(t)&&Array.isArray(o)?w in o?B(()=>Q(()=>{for(let i=0;i<t.length;i++)o[i]=t[i];o.length=t.length})):s.value=t:s.value=P(t)),v=P});var T,ke,I,ee,te,fe,de,me,we=d(()=>{ke=0,ee=(e,r,t=new Set,s=()=>r.value)=>r={get value(){return T?.deps.push(t.add(T)),e},set value(o){if(o!==e){e=o;for(let i of t)I?I.add(i):i()}},peek(){return e},toJSON:s,then:s,toString:s,valueOf:s},te=(e,r,t,s,o)=>(t=i=>{if(o=r,r=null,o?.call?.(),i=T,T=t,ke++>10)throw"Cycle detected";try{r=e()}finally{T=i,ke--}},s=t.deps=[],t(),i=>{for(r?.call?.();i=s.pop();)i.delete(t)}),fe=(e,r=ee(),t,s,o=()=>t.value)=>t={get value(){return s||(s=te(()=>r.value=e())),r.value},peek:r.peek,toJSON:o,then:o,toString:o,valueOf:o},de=(e,r=!I)=>{I??(I=new Set);try{e()}finally{if(r){for(let t of I)t();I=null}}},me=(e,r,t)=>(r=T,T=null,t=e(),T=r,t)});var Ne,$e=d(()=>{g();Ne=(e,r,t,s,o)=>{var i;return e._holder?f(s=e,r):(e[i=l]??(e[i]=null),s=e.content?D(e):e,e.replaceWith(t=document.createTextNode("")),s._holder=t._holder=t,t._clauses=[s._clause=[s,!1]],t.update=M(()=>{let n=t._clauses.find(([,a])=>a);n!=o&&(o?.[0].remove(),o?.[0][F]?.(),(o=n)&&(t.before(o[0].content||o[0]),o[0][l]?o[0][G]?.():(delete o[0][l],f(o[0],r))))})),n=>{s._clause[1]=n,s._holder.update()}}});var De,Te=d(()=>{g();De=(e,r,t,s,o=e)=>{for(t=e.content?D(e):e;o&&!(t._holder=o._holder);)o=o.previousSibling;return e.remove(),e[l]=null,t._holder._clauses.push(t._clause=[t,!0]),t._holder.update}});var Ce,qe=d(()=>{g();Ce=e=>(e.content&&e.replaceWith(e=D(e).childNodes[0]),r=>(r=y(r,e.textContent),e.textContent=r??""))});var Me,Pe=d(()=>{g();Me=(e,r,t)=>(r=new Set,s=>{t=new Set,s&&ce(y(s,e.className)).split(" ").map(o=>o&&t.add(o));for(let o of r)t.has(o)?t.delete(o):e.classList.remove(o);for(let o of r=t)e.classList.add(o)})});var We,Ee=d(()=>{g();We=(e,r)=>(r=e.getAttribute("style"),t=>{if(t=y(t,e.style),typeof t=="string")A(e,"style",r+"; "+t);else{r&&A(e,"style",r);for(let s in t)s[0]=="-"?e.style.setProperty(s,t[s]):s[0]>"A"&&(e.style[s]=t[s])}})});var Le,ve=d(()=>{g();Le=()=>y});var ct,Ie,Ke=d(()=>{g();ct=(e,r=O(`${e}=__`))=>(t,s)=>{t.__=s,r(t),delete t.__},Ie=(e,r,t,s)=>{try{let o=ct(t),i=e.type==="checkbox"?()=>o(r,e.checked):e.type==="select-multiple"?()=>o(r,[...e.selectedOptions].map(n=>n.value)):()=>o(r,e.selectedIndex<0?null:e.value);e.oninput=e.onchange=i,e.type?.startsWith("select")&&(new MutationObserver(i).observe(e,{childList:!0,subtree:!0,attributes:!0}),f(e,r)),O(t)(r)??i()}catch{}return e.type==="text"||e.type===""?o=>e.setAttribute("value",e.value=o??""):e.tagName==="TEXTAREA"||e.type==="text"||e.type===""?(o,i,n)=>(i=e.selectionStart,n=e.selectionEnd,e.setAttribute("value",e.value=o??""),i&&e.setSelectionRange(i,n)):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 i of e.options)i.value==o?i.setAttribute("selected",""):i.removeAttribute("selected");e.value=o}:e.type==="select-multiple"?o=>{for(let i of e.options)i.removeAttribute("selected");for(let i of o)e.querySelector(`[value="${i}"]`).setAttribute("selected","")}:o=>e.value=o}});var Re,Ve=d(()=>{g();Re=(e,r,t,s,o,i)=>{if(typeof O(t)(r)=="function")return n=>n(e);Object.defineProperty(r,t,{value:e,configurable:!0})}});var Fe,Je=d(()=>{g();Fe=(e,r)=>{let t=e[l]=P({},r),s=!1;return o=>{if(o=y(o,t),o!==t)for(let i in o){let n=typeof o[i]=="function"?o[i].bind(t):o[i];i in t[j]?t[i]=n:t[j][i]=i[0]=="_"||n?.peek?n:k(P(n))}return!s&&(s=!0,delete e[l],B(()=>f(e,t)))}}});var Be,He,Xe=d(()=>{g();Be=(e,r,t)=>{let[s,o="$"]=t.split(/\bin\b/)[0].trim().replace(/\(|\)/g,"").split(/\s*,\s*/),i=document.createTextNode(""),n,a,u,p=0,m=M(()=>{var C,N;let c=0,h=u,b=h.length;if(n&&!n[w]){for(let x of n[j]||[])x[Symbol.dispose]();n=null,p=0}if(b<p)n.length=b;else{if(!n)n=h;else for(;c<p;)n[c]=h[c++];for(;c<b;c++){n[c]=h[c];let x=c,$=Object.create(r,{[s]:{get:()=>n[x]},[o]:{value:a?a[x]:x}}),S=e.content?D(e):e.cloneNode(!0);i.before(S.content||S),f(S,$);let W=((N=n[C=j]||(n[C]=[]))[c]||(N[c]={}))[Symbol.dispose];n[j][c][Symbol.dispose]=()=>{W?.(),S[Symbol.dispose]?.(),S.remove()}}}p=b});return e.replaceWith(i),e[l]=null,c=>(a=null,typeof c=="number"?u=Array.from({length:c},(h,b)=>b+1):c?.constructor===Object?(a=Object.keys(c),u=Object.values(c)):u=c||[],J(()=>{u[w]?.value,m()}))};Be.parse=e=>e.split(/\bin\b/)[1].trim();He=Be});var Ze,ze=d(()=>{g();Ze=(e,r,t,s)=>o=>A(e,s,y(o,e.getAttribute(s)))});var Ge,Qe=d(()=>{g();Ge=e=>r=>{for(let t in r)A(e,Ae(t),r[t])}});var Ue={};ot(Ue,{batch:()=>de,computed:()=>fe,default:()=>lt,effect:()=>te,signal:()=>ee,sprae:()=>f,start:()=>ue,store:()=>v,untracked:()=>me,use:()=>U});var ye,lt,Ye=d(()=>{Y();we();g();$e();Te();qe();Pe();Ee();ve();Ke();Ve();Je();Xe();ze();Qe();Object.assign(L,{"*":Ze,"":Ge,class:Me,text:Ce,style:We,fx:Le,value:Ie,ref:Re,scope:Fe,if:Ne,else:De,each:He});Object.assign(H,{debounce:(e,r=250,t=r==="tick"?queueMicrotask:r==="raf"?requestAnimationFrame:r==="idle"?requestIdleCallback:o=>setTimeout(o,r),s=0)=>je(e,t),throttle:(e,r=250,t=r==="tick"?queueMicrotask:r==="raf"?requestAnimationFrame:s=>setTimeout(s,r))=>M(e,t),once:(e,r,t)=>Object.assign(s=>!r&&(r=1,e(s)),{once:!0}),prevent:e=>r=>(r?.preventDefault(),e(r)),stop:e=>r=>(r?.stopPropagation(),e(r)),immediate:e=>r=>(r?.stopImmediatePropagation(),e(r)),passive:e=>(e.passive=!0,e),capture:e=>(e.capture=!0,e),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=>r=>r.target===e.target&&e(r),outside:e=>(r,t)=>(t=e.target,!t.contains(r.target)&&r.target.isConnected&&(t.offsetWidth||t.offsetHeight))});ye={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"||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)};for(let e in ye)H[e]=(r,...t)=>s=>ye[e](s)&&t.every(o=>ye[o]?.(s)??s.key===o)&&r(s);U({compile:e=>f.constructor(`with (arguments[0]) { ${e} }`),signal:ee,effect:te,computed:fe,batch:de,untracked:me});f.use=U;f.store=v;f.directive=L;f.modifier=H;f.start=ue;lt=f});var ge=(Ye(),it(Ue)).default;module.exports=ge;var K=document.currentScript,_e=K.getAttribute("prefix")??K.dataset.prefix??K.dataset.spraePrefix,X=K.getAttribute("start")??K.dataset.start??K.dataset.spraeStart;_e&&ge.use({prefix:_e});X!=null&&X!=="false"&&(X&&X!=="true"?document.querySelectorAll(X):[document.body]).forEach(e=>ge.start(e));
7
7
  ;if (typeof module.exports == "object" && typeof exports == "object") {
8
8
  var __cp = (to, from, except, desc) => {
9
9
  if ((from && typeof from === "object") || typeof from === "function") {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 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/default.js", "../directive/spread.js", "../sprae.js", "<stdin>"],
4
- "sourcesContent": ["import store, { _change, _signals } from \"./store.js\";\n\nexport const _dispose = (Symbol.dispose ||= Symbol(\"dispose\")),\n _state = Symbol(\"state\"),\n _on = Symbol('on'),\n _off = Symbol('off'),\n _add = Symbol('add');\n\n\nexport let prefix = ':', signal, effect, computed, batch = (fn) => fn(), untracked = batch;\n\nexport let directive = {}, modifier = {}\n\nlet currentDir = null;\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|store} [state] - Initial state values to populate the element's reactive state.\n * @returns {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.outerHTML)\n\n // take over existing state instead of creating a clone\n state = store(state || {})\n\n let fx = [], offs = [], fn,\n on = () => (!offs && (offs = fx.map(fn => fn()))),\n off = () => (offs?.map(off => off()), offs = null)\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] = on\n el[_off] = off\n\n // destroy\n el[_dispose] ||= () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_state] = el[_add] = null)\n\n const add = (el, _attrs = el.attributes) => {\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 // directive initializer can be redefined\n if (fn = initDirective(el, name, value, state)) fx.push(fn), offs.push(fn())\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 // for (let i = 0, child; i < (el.childNodes.length); i++) child = el.childNodes[i], child.nodeType == 1 && add(child)\n for (let child of [...el.childNodes]) child.nodeType == 1 && add(child)\n };\n\n el[_add] = add;\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\n/**\n * Initializes directive (defined by sprae build), returns \"on\" function that enables it\n * Multiprop sequences initializer, eg. :a:b..c:d\n * @type {(el: HTMLElement, name:string, value:string, state:Object) => Function}\n * */\nconst initDirective = (el, dirName, expr, state) => {\n let cur, // current step callback\n off // current step disposal\n\n let steps = dirName.slice(prefix.length).split('..').map((step, i, { length }) => (\n // multiple attributes like :id:for=\"\"\n step.split(prefix).reduce((prev, str) => {\n let [name, ...mods] = str.split('.');\n let evaluate = parse(expr, directive[currentDir = name]?.parse)\n\n // a hack, but events have no signal-effects and can be sequenced\n // FIXME: events are molded into core, but should be an optional directive\n if (name.startsWith('on')) {\n let type = name.slice(2),\n fn = applyMods(\n Object.assign(\n // single event vs chain\n length == 1 ? e => evaluate(state, (fn) => call(fn, e)) :\n (e => (cur = (!i ? e => call(evaluate(state), e) : cur)(e), off(), off = steps[(i + 1) % length]())),\n { target: el, type }\n ),\n mods);\n\n return (_poff) => (_poff = prev?.(), fn.target.addEventListener(type, fn, fn), () => (_poff?.(), fn.target.removeEventListener(type, fn)))\n }\n\n // props have no sequences and can be sync\n // it's nice to see directive as taking some part of current context and returning new or updated context\n let update = (directive[name] || directive['*'])(el, state, expr, name)\n\n // some directives are effect-less\n if (!update) return\n\n // take over state if directive created it (mainly :scope)\n if (el[_state]) state = el[_state]\n\n // no-modifiers shortcut\n if (!mods.length && !prev) return ((() => effect(() => evaluate(state, update))))\n\n let dispose,\n change = signal(-1), // signal authorized to trigger effect: 0 = init; >0 = trigger\n count = -1, // called effect count\n\n // effect applier - first time it applies the effect, next times effect is triggered by change signal\n fn = throttle(applyMods(() => {\n if (++change.value) return // all calls except for the first one are handled by effect\n dispose = effect(() => update && (\n change.value == count ? fn() : // separate tick makes sure planner effect call is finished before real eval call\n (count = change.value, evaluate(state, update)) // if changed more than effect called - call it\n ));\n }, mods))\n\n return (_poff) => (\n _poff = prev?.(),\n // console.log('ON', name),\n fn(),\n ({\n [name]: () => (\n // console.log('OFF', name, el),\n _poff?.(), dispose(), change.value = -1, count = dispose = null\n )\n })[name]\n )\n }, null)\n ));\n\n // off can be changed on the go\n return () => (off = steps[0]?.())\n}\n\n\n/**\n * Configure sprae\n */\nexport const use = (s) => (\n s.compile && (compile = s.compile),\n s.prefix && (prefix = s.prefix),\n s.signal && (signal = s.signal),\n s.effect && (effect = s.effect),\n s.computed && (computed = s.computed),\n s.batch && (batch = s.batch),\n s.untracked && (untracked = s.untracked)\n)\n\n\n/**\n * Lifecycle hanger: makes DOM slightly slower but spraes automatically\n */\nexport const 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 if (el.nodeType === 1 && el[_state] === undefined) {\n for (const attr of el.attributes) {\n if (attr.name.startsWith(prefix)) {\n root[_add](el); break;\n }\n }\n }\n }\n // for (const el of m.removedNodes) el[Symbol.dispose]?.()\n }\n });\n mo.observe(root, { childList: true, subtree: true });\n return state\n}\n\n\n/**\n * Compiles an expression into an evaluator function.\n * @type {(dir:string, expr: string, clean?: string => string) => Function}\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 {Function} The compiled evaluator function for the expression.\n */\nexport const parse = (expr, prepare, _fn) => {\n if (_fn = parse.cache[expr]) return _fn\n\n let _expr = expr.trim() || 'undefined'\n if (prepare) _expr = prepare(_expr)\n\n // if, const, let - no return\n if (/^(if|let|const)\\b/.test(_expr) || /;(?![^{]*})/.test(_expr)) ;\n else _expr = `return ${_expr}`\n\n // async expression\n if (/\\bawait\\s/.test(_expr)) _expr = `return (async()=>{ ${_expr} })()`\n\n // static time errors\n try {\n _fn = compile(_expr)\n Object.defineProperty(_fn, \"name\", {value: `\u2234 ${expr}`})\n } catch (e) { console.error(`\u2234 ${e}\\n\\n${prefix + currentDir}=\"${expr}\"`) }\n\n // run time errors\n return parse.cache[expr] = (state, cb, _out) => {\n try {\n let result = _fn?.(state)\n // if cb is given (to handle asyncs) - call it with result and return function that returns last cb result - needed for effect cleanup\n if (cb) return result?.then ? result.then(v => _out = cb(v)) : _out = cb(result), () => call(_out)\n else return result\n } catch (e) {\n console.error(`\u2234 ${e}\\n\\n${prefix + currentDir}=\"${expr}\"`)\n }\n }\n}\nparse.cache = {};\n\n\n// apply modifiers to context (from the end due to nature of wrapping ctx.call)\nconst applyMods = (fn, mods) => {\n while (mods.length) {\n let [name, ...params] = mods.pop().split('-')\n fn = sx(modifier[name]?.(fn, ...params) ?? fn, fn)\n }\n return fn\n}\n\n// soft-extend missing props and ignoring signals\nconst sx = (a, b) => { if (a != b) for (let k in b) (a[k] ??= b[k]); return a }\n\n// instantiated <template> fragment holder, like persisting fragment but with minimal API surface\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 // get parentNode() { return childNodes[0].parentNode },\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 // setAttributeNode() { }\n }\n}\n\n// if value is function - return result of its call\nexport const call = (v, arg) => typeof v === 'function' ? v(arg) : v\n\n// camel to kebab\nexport const dashcase = (str) => str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());\n\n// set attr\nexport const attr = (el, name, v) => (v == null || v === false) ? el.removeAttribute(name) : el.setAttribute(name, v === true ? \"\" : v);\n\n// convert any-arg to className string\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// throttle function to (once per tick or other custom scheduler)\nexport const throttle = (fn, schedule = queueMicrotask) => {\n let _planned = 0;\n const throttled = (e) => {\n if (!_planned++) fn(e), schedule((_dirty = _planned > 1) => (\n _planned = 0, _dirty && throttled(e)\n ));\n }\n return throttled;\n}\n\nexport const debounce = (fn, schedule = queueMicrotask, _count = 0) => (arg, _planned=++_count) => schedule(() => (_planned == _count && fn(arg)))\n\nexport * from './store.js';\n\nexport default sprae\n", "// signals-based proxy\nimport { signal, computed, batch, untracked, _add } from './core.js'\n\n\n// _signals allows both storing signals and checking instance, which would be difficult with WeakMap\nexport const _signals = Symbol('signals'),\n // _change is a signal that tracks changes to the object keys or array length\n _change = Symbol('change'),\n // _set is stashed setter for computed values\n _set = Symbol('set')\n\n// a hack to simulate sandbox for `with` in evaluator\nlet sandbox = true\n\n// object store is not lazy\n// parent defines parent scope or sandbox\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 // console.log('GET', k, signals)\n if (k in signals) return (signals[k] ? signals[k].valueOf() : signals[k])\n return parent ? parent[k] : globalThis[k]\n },\n\n set: (_, k, v, _s) => {\n // console.group('SET', k, v, signals, k in signals)\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// array store - signals are lazy since arrays can be very large & expensive\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// create signal value, skip untracked\nconst create = (signals, k, v) => (signals[k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n\n// set/update signal value\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", "// preact-signals minimal implementation\nlet current, depth = 0, batched;\n\n// default signals impl\n\nexport const signal = (v, _s, _obs = new Set, _v = () => _s.value) => (\n _s = {\n get value() {\n current?.deps.push(_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, then: _v, toString: _v, valueOf: _v\n }\n)\n\nexport const effect = (fn, _teardown, _fx, _deps, __tmp) => (\n _fx = (prev) => {\n __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 _deps = _fx.deps = [],\n\n _fx(),\n (dep) => { _teardown?.call?.(); while (dep = _deps.pop()) dep.delete(_fx); }\n)\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, then: _v, toString: _v, valueOf: _v\n }\n)\n\nexport const batch = (fn, _first = !batched) => {\n batched ??= new Set;\n try { fn(); }\n finally { if (_first) { for (const fx of batched) fx(); batched = null } }\n}\n\nexport const untracked = (fn, _prev, _v) => (_prev = current, current = null, _v = fn(), current = _prev, _v)\n", "// \"centralized\" version of :if\nimport sprae, { throttle, _on, _off, _state, frag } from '../core.js';\n\n// :if=\"a\"\nexport default (el, state, _holder, _el, _match) => {\n // new element :if\n // console.log(':if init', el)\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 // console.group(':if update clauses', ..._holder._clauses)\n\n if (match != _match) {\n // console.log(':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 // console.groupEnd()\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 // console.log(':if update', _el, value)\n _el._clause[1] = value\n _el._holder.update()\n }\n}\n", "import { _on, _off, _state, frag } from '../core.js';\n\n\n// NOTE: we can reach :else counterpart whereas prev :else :if is on hold\nexport default (el, state, _el, _, _prev=el) => {\n\n // console.log(':else init', el)\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, call } from \"../core.js\"\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 = call(v, el.textContent), el.textContent = v == null ? \"\" : v)\n)\n", "import { clsx, call } from \"../core.js\";\n\nexport default (el, _cur, _new) => (\n _cur = new Set,\n (v) => {\n _new = new Set\n if (v) clsx(call(v, el.className)).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 { call, attr } from \"../core.js\";\n\nexport default (el, _static) => (\n _static = el.getAttribute(\"style\"),\n v => {\n v = call(v, el.style)\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", "import { call } from \"../core.js\"\n\nexport default () => call\n", "import sprae, { attr, parse, _state } from \"../core.js\";\n\n\n// create expression setter, reflecting value back to state\nexport const setter = (expr, _set = parse(`${expr}=__`)) => (target, value) => {\n // save value to stash\n target.__ = value; _set(target), delete target.__\n}\n\nexport default (el, state, expr, name) => {\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 : el.value)\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, no need to parse again\n parse(expr)(state) ?? handleChange()\n } catch { }\n\n return (el.type === \"text\" || el.type === \"\") ?\n (value) => el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)) :\n (el.tagName === \"TEXTAREA\" || el.type === \"text\" || el.type === \"\") ?\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\"\n// import { setter } from \"./value.js\"\n\nexport default (el, state, expr, name, _prev, _set) => {\n // FIXME: we call eval twice here - once to check if it's fn, second for update (from core)\n if (typeof parse(expr)(state) == 'function') return v => (v(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 // (setter(expr)(state, el))\n Object.defineProperty(state, expr, { value: el, configurable: true })\n}\n", "import sprae, { store, call, untracked, _state, _signals, signal } from '../core.js'\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 subscope = 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 = call(values, subscope);\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 !== subscope) {\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(subscope) : values[k]\n // update\n if (k in subscope[_signals]) subscope[k] = v\n // create\n else (subscope[_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, subscope)))\n }\n}\n", "import sprae, { store, _state, effect, _change, _signals, frag, throttle } from \"../core.js\";\n\nconst each = (tpl, state, expr) => {\n let [itemVar, idxVar = \"$\"] = expr.split(/\\bin\\b/)[0].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 // FIXME: pass items to update instead of global\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 // 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 // append\n for (; i < newl; i++) {\n cur[i] = newItems[i]\n\n let idx = i,\n // inherited state must be cheaper in terms of memory and faster in terms of performance, compared to creating a proxy store\n // subscope = store({\n // // NOTE: since we simulate signal, we have to make sure it's actual signal, not fake one\n // // FIXME: try to avoid this, we also have issue with wrongly calling dispose in store on delete\n // [itemVar]: cur[_signals]?.[idx]?.peek ? cur[_signals]?.[idx] : cur[idx],\n // [idxVar]: keys ? keys[idx] : idx\n // }, state)\n subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n\n let el = tpl.content ? frag(tpl) : tpl.cloneNode(true);\n\n holder.before(el.content || el);\n\n sprae(el, subscope);\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\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 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 unsubscribes unused signals\n items[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n update()\n })\n }\n}\n\n// :each directive skips v, k\neach.parse = (str) => str.split(/\\bin\\b/)[1].trim()\n\nexport default each\n", "import { attr, call } from \"../core.js\";\n\nexport default (el, st, ex, name) => v => attr(el, name, call(v, el.getAttribute(name)))\n", "import { attr, dashcase } from \"../core.js\";\n\nexport default (target) => value => { for (let key in value) attr(target, dashcase(key), value[key]) }\n", "import store from \"./store.js\";\nimport { batch, computed, effect, signal, untracked } from './signal.js';\nimport sprae, { use, directive, modifier, start, throttle, debounce, _add, _off, _state, _on, _dispose } 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/default.js\";\nimport _spread from \"./directive/spread.js\";\n\n\nObject.assign(directive, {\n // :x=\"x\"\n '*': _default,\n\n // FIXME\n // 'on*': _on,\n\n // :=\"{a,b,c}\"\n '': _spread,\n\n // :class=\"[a, b, c]\"\n class: _class,\n\n // :text=\"...\"\n text: _text,\n\n // :style=\"...\"\n style: _style,\n\n // :fx=\"...\"\n fx: _fx,\n\n // :value - 2 way binding like x-model\n value: _value,\n\n // :ref=\"...\"\n ref: _ref,\n\n // :scope creates variables scope for a subtree\n scope: _scope,\n\n if: _if,\n else: _else,\n\n // :each=\"v,k in src\"\n each: _each\n})\n\nObject.assign(modifier, {\n debounce: (fn,\n _how = 250,\n _schedule = _how === \"tick\" ? queueMicrotask : _how === \"raf\" ? requestAnimationFrame : _how === \"idle\" ? requestIdleCallback : ((fn) => setTimeout(fn, _how)),\n _count = 0\n ) =>\n debounce(fn, _schedule),\n\n throttle: (fn, _how = 250, _schedule = _how === \"tick\" ? queueMicrotask : _how === \"raf\" ? requestAnimationFrame : ((fn) => setTimeout(fn, _how))) => (\n throttle(fn, _schedule)\n ),\n\n once: (fn, _done, _fn) => Object.assign((e) => !_done && (_done = 1, fn(e)), { once: true }),\n\n // event modifiers\n // actions\n prevent: (fn) => (e) => (e?.preventDefault(), fn(e)),\n stop: (fn) => (e) => (e?.stopPropagation(), fn(e)),\n immediate: (fn) => (e) => (e?.stopImmediatePropagation(), fn(e)),\n\n // options\n passive: fn => (fn.passive = true, fn),\n capture: fn => (fn.capture = true, fn),\n\n // target\n window: fn => (fn.target = window, fn),\n document: fn => (fn.target = document, fn),\n parent: fn => (fn.target = fn.target.parentNode, fn),\n\n // test\n self: (fn) => (e) => (e.target === fn.target && fn(e)),\n\n outside: (fn) => (e, _target) => (\n _target = fn.target,\n !_target.contains(e.target) && e.target.isConnected && (_target.offsetWidth || _target.offsetHeight)\n ),\n})\n\n// key testers\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\" || 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// augment modifiers with key testers\nfor (let k in keys) modifier[k] = (fn, ...params) => (e) => keys[k](e) && params.every(k => keys[k]?.(e) ?? e.key === k) && fn(e)\n\nuse({\n compile: expr => {\n return sprae.constructor(`with (arguments[0]) { ${expr} }`)\n },\n\n // signals\n signal, effect, computed, batch, untracked\n})\n\n// expose for runtime config\nsprae.use = use\nsprae.store = store\nsprae.directive = directive\nsprae.modifier = modifier\nsprae.start = start\n\nexport default sprae\nexport { sprae, store, signal, effect, computed, batch, untracked, start, use }\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]).forEach(el => sprae.start(el))"],
5
- "mappings": ";6cAAA,IAEaA,EACXC,EACAC,EACAC,EACAC,GAGSC,EAAcC,EAAQC,EAAQC,GAAUC,EAAsBC,EAE9DC,EAAgBC,EAEvBC,GASEC,GA6DAC,GA0EOC,EAcAC,GA0BFC,GAQEC,EAmCPC,GASAC,GAGOC,EA0BAC,EAGAC,GAGAC,EAGAC,GAMAC,EAUAC,GAINC,EAnTPC,EAAAC,EAAA,KAAAC,IAiTAA,IA/SahC,EAAY,OAAO,UAAP,OAAO,QAAY,OAAO,SAAS,GAC1DC,EAAS,OAAO,OAAO,EACvBC,EAAM,OAAO,IAAI,EACjBC,EAAO,OAAO,KAAK,EACnBC,GAAO,OAAO,KAAK,EAGVC,EAAS,IAA+BI,EAASwB,GAAOA,EAAG,EAAGvB,EAAYD,EAE1EE,EAAY,CAAC,EAAGC,EAAW,CAAC,EAEnCC,GAAa,KASXC,GAAQ,CAACoB,EAAK,SAAS,KAAMC,IAAU,CAE3C,GAAID,EAAGjC,CAAM,EAAG,OAAO,OAAO,OAAOiC,EAAGjC,CAAM,EAAGkC,CAAK,EAKtDA,EAAQC,EAAMD,GAAS,CAAC,CAAC,EAEzB,IAAIE,EAAK,CAAC,EAAGC,EAAO,CAAC,EAAGL,EACtBM,EAAK,IAAO,CAACD,IAASA,EAAOD,EAAG,IAAIJ,GAAMA,EAAG,CAAC,GAC9CO,EAAM,KAAOF,GAAM,IAAIE,GAAOA,EAAI,CAAC,EAAGF,EAAO,MAK/CJ,EAAGhC,CAAG,EAAIqC,EACVL,EAAG/B,CAAI,EAAIqC,EAGXN,EAAAlC,KAAAkC,EAAAlC,GAAiB,KAAOkC,EAAG/B,CAAI,EAAE,EAAG+B,EAAG/B,CAAI,EAAI+B,EAAGhC,CAAG,EAAIgC,EAAGlC,CAAQ,EAAIkC,EAAGjC,CAAM,EAAIiC,EAAG9B,EAAI,EAAI,OAEhG,IAAMqC,EAAM,CAACP,EAAIQ,EAASR,EAAG,aAAe,CAE1C,GAAIQ,EAAQ,QAASC,EAAI,EAAGA,EAAID,EAAO,QAAS,CAC9C,GAAI,CAAE,KAAAE,EAAM,MAAAC,CAAM,EAAIH,EAAOC,CAAC,EAE9B,GAAIC,EAAK,WAAWvC,CAAM,GAOxB,GANA6B,EAAG,gBAAgBU,CAAI,GAGnBX,EAAKlB,GAAcmB,EAAIU,EAAMC,EAAOV,CAAK,KAAGE,EAAG,KAAKJ,CAAE,EAAGK,EAAK,KAAKL,EAAG,CAAC,GAGvEhC,KAAUiC,EAAI,YACbS,GACT,CAIA,QAASG,IAAS,CAAC,GAAGZ,EAAG,UAAU,EAAGY,EAAM,UAAY,GAAKL,EAAIK,CAAK,CACxE,EAEA,OAAAZ,EAAG9B,EAAI,EAAIqC,EAEXA,EAAIP,CAAE,EAGFA,EAAGjC,CAAM,IAAM,SAAWiC,EAAGjC,CAAM,EAAIkC,GAIpCA,CACT,EAQMpB,GAAgB,CAACmB,EAAIa,EAASC,EAAMb,IAAU,CAClD,IAAIc,EACFT,EAEEU,EAAQH,EAAQ,MAAM1C,EAAO,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC8C,EAAMR,EAAG,CAAE,OAAAS,CAAO,IAE1ED,EAAK,MAAM9C,CAAM,EAAE,OAAO,CAACgD,EAAMC,IAAQ,CACvC,GAAI,CAACV,EAAM,GAAGW,CAAI,EAAID,EAAI,MAAM,GAAG,EAC/BE,EAAWrC,EAAM6B,EAAMrC,EAAUE,GAAa+B,CAAI,GAAG,KAAK,EAI9D,GAAIA,EAAK,WAAW,IAAI,EAAG,CACzB,IAAIa,EAAOb,EAAK,MAAM,CAAC,EACrBX,EAAKb,GACH,OAAO,OAELgC,GAAU,EAAKM,GAAKF,EAASrB,EAAQF,IAAOV,EAAKU,GAAIyB,CAAC,CAAC,EACpDA,IAAMT,GAAQN,EAAqCM,EAAhCS,IAAKnC,EAAKiC,EAASrB,CAAK,EAAGuB,EAAC,GAASA,CAAC,EAAGlB,EAAI,EAAGA,EAAMU,GAAOP,EAAI,GAAKS,CAAM,EAAE,GACpG,CAAE,OAAQlB,EAAI,KAAAuB,CAAK,CACrB,EACAF,CAAI,EAER,OAAQI,IAAWA,EAAQN,IAAO,EAAGpB,EAAG,OAAO,iBAAiBwB,EAAMxB,EAAIA,CAAE,EAAG,KAAO0B,IAAQ,EAAG1B,EAAG,OAAO,oBAAoBwB,EAAMxB,CAAE,GACzI,CAIA,IAAI2B,GAAUjD,EAAUiC,CAAI,GAAKjC,EAAU,GAAG,GAAGuB,EAAIC,EAAOa,EAAMJ,CAAI,EAGtE,GAAI,CAACgB,EAAQ,OAMb,GAHI1B,EAAGjC,CAAM,IAAGkC,EAAQD,EAAGjC,CAAM,GAG7B,CAACsD,EAAK,QAAU,CAACF,EAAM,MAAS,IAAM9C,EAAO,IAAOiD,EAASrB,EAAOyB,CAAM,CAAC,EAE/E,IAAIC,EACFC,EAASxD,EAAO,EAAE,EAClByD,EAAQ,GAGR9B,EAAKN,EAASP,GAAU,IAAM,CACxB,EAAE0C,EAAO,QACbD,EAAUtD,EAAO,IAAMqD,IACrBE,EAAO,OAASC,EAAQ9B,EAAG,GACxB8B,EAAQD,EAAO,MAAON,EAASrB,EAAOyB,CAAM,GAChD,EACH,EAAGL,CAAI,CAAC,EAEV,OAAQI,IACNA,EAAQN,IAAO,EAEfpB,EAAG,EACF,CACC,CAACW,CAAI,EAAG,KAENe,IAAQ,EAAGE,EAAQ,EAAGC,EAAO,MAAQ,GAAIC,EAAQF,EAAU,KAE/D,EAAGjB,CAAI,EAEX,EAAG,IAAI,CACR,EAGD,MAAO,IAAOJ,EAAMU,EAAM,CAAC,IAAI,CACjC,EAMalC,EAAOgD,IAClBA,EAAE,UAAY9C,GAAU8C,EAAE,SAC1BA,EAAE,SAAW3D,EAAS2D,EAAE,QACxBA,EAAE,SAAW1D,EAAS0D,EAAE,QACxBA,EAAE,SAAWzD,EAASyD,EAAE,QACxBA,EAAE,WAAaxD,GAAWwD,EAAE,UAC5BA,EAAE,QAAUvD,EAAQuD,EAAE,OACtBA,EAAE,YAActD,EAAYsD,EAAE,YAOnB/C,GAAQ,CAACgD,EAAO,SAAS,KAAMC,IAAW,CACrD,IAAM/B,EAAQC,EAAM8B,CAAM,EAC1B,OAAApD,GAAMmD,EAAM9B,CAAK,EACN,IAAI,iBAAiBgC,GAAa,CAC3C,QAAWC,KAAKD,EACd,QAAWjC,KAAMkC,EAAE,WACjB,GAAIlC,EAAG,WAAa,GAAKA,EAAGjC,CAAM,IAAM,QACtC,QAAWwB,KAAQS,EAAG,WACpB,GAAIT,EAAK,KAAK,WAAWpB,CAAM,EAAG,CAChC4D,EAAK7D,EAAI,EAAE8B,CAAE,EAAG,KAClB,EAMV,CAAC,EACE,QAAQ+B,EAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAC5C9B,CACT,EAeahB,EAAQ,CAAC6B,EAAMqB,EAASC,IAAQ,CAC3C,GAAIA,EAAMnD,EAAM,MAAM6B,CAAI,EAAG,OAAOsB,EAEpC,IAAIC,EAAQvB,EAAK,KAAK,GAAK,YACvBqB,IAASE,EAAQF,EAAQE,CAAK,GAG9B,oBAAoB,KAAKA,CAAK,GAAK,cAAc,KAAKA,CAAK,IAC1DA,EAAQ,UAAUA,CAAK,IAGxB,YAAY,KAAKA,CAAK,IAAGA,EAAQ,sBAAsBA,CAAK,SAGhE,GAAI,CACFD,EAAMpD,GAAQqD,CAAK,EACnB,OAAO,eAAeD,EAAK,OAAQ,CAAC,MAAO,UAAKtB,CAAI,EAAE,CAAC,CACzD,OAASU,EAAG,CAAE,QAAQ,MAAM,UAAKA,CAAC;AAAA;AAAA,EAAOrD,EAASQ,EAAU,KAAKmC,CAAI,GAAG,CAAE,CAG1E,OAAO7B,EAAM,MAAM6B,CAAI,EAAI,CAACb,EAAOqC,EAAIC,IAAS,CAC9C,GAAI,CACF,IAAIC,EAASJ,IAAMnC,CAAK,EAExB,OAAIqC,GAAWE,GAAQ,KAAOA,EAAO,KAAKC,GAAKF,EAAOD,EAAGG,CAAC,CAAC,EAAIF,EAAOD,EAAGE,CAAM,EAAG,IAAMnD,EAAKkD,CAAI,GACrFC,CACd,OAAShB,EAAG,CACV,QAAQ,MAAM,UAAKA,CAAC;AAAA;AAAA,EAAOrD,EAASQ,EAAU,KAAKmC,CAAI,GAAG,CAC5D,CACF,CACF,EACA7B,EAAM,MAAQ,CAAC,EAITC,GAAY,CAACa,EAAIsB,IAAS,CAC9B,KAAOA,EAAK,QAAQ,CAClB,GAAI,CAACX,EAAM,GAAGgC,CAAM,EAAIrB,EAAK,IAAI,EAAE,MAAM,GAAG,EAC5CtB,EAAKZ,GAAGT,EAASgC,CAAI,IAAIX,EAAI,GAAG2C,CAAM,GAAK3C,EAAIA,CAAE,CACnD,CACA,OAAOA,CACT,EAGMZ,GAAK,CAACwD,EAAGC,IAAM,CAAE,GAAID,GAAKC,EAAG,QAASC,KAAKD,EAAID,EAAAE,KAAAF,EAAAE,GAASD,EAAEC,CAAC,GAAI,OAAOF,CAAE,EAGjEvD,EAAQ0D,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,CAEL,WAAAG,EACA,QAAAH,EACA,OAAQ,IAAMA,EAAQ,OAAO,GAAGG,CAAU,EAC1C,YAAYlD,EAAI,CACVA,IAAOiD,IACXA,EAAI,OAAOjD,CAAE,EACb+C,EAAQ,OAAO,GAAGG,CAAU,EAC9B,EACA,WAAAF,EACA,gBAAgBtC,EAAM,CAAEsC,EAAW,OAAOA,EAAW,UAAUL,GAAKA,EAAE,OAASjC,CAAI,EAAG,CAAC,CAAE,CAE3F,CACF,EAGarB,EAAO,CAACoD,EAAGU,IAAQ,OAAOV,GAAM,WAAaA,EAAEU,CAAG,EAAIV,EAGtDnD,GAAY8B,GAAQA,EAAI,QAAQ,mCAAoC,CAACgC,EAAO3C,KAAOA,EAAI,IAAM,IAAM2C,EAAM,YAAY,CAAC,EAGtH7D,EAAO,CAACS,EAAIU,EAAM+B,IAAOA,GAAK,MAAQA,IAAM,GAASzC,EAAG,gBAAgBU,CAAI,EAAIV,EAAG,aAAaU,EAAM+B,IAAM,GAAO,GAAKA,CAAC,EAGzHjD,GAAO,CAAC6D,EAAGd,EAAO,CAAC,IAAOc,EAAS,OAAOA,GAAM,SAAWA,GACtE,MAAM,QAAQA,CAAC,EAAIA,EAAE,IAAI7D,EAAI,EAC3B,OAAO,QAAQ6D,CAAC,EAAE,OAAO,CAACvB,EAAG,CAACe,EAAGJ,CAAC,IAAOA,EAAQ,CAAC,GAAGX,EAAGe,CAAC,EAAZf,EAAe,CAAC,CAAC,GAChE,KAAK,GAAG,EAHiC,GAM9BrC,EAAW,CAACM,EAAIuD,EAAW,iBAAmB,CACzD,IAAIC,EAAW,EACTC,EAAahC,GAAM,CAClB+B,MAAYxD,EAAGyB,CAAC,EAAG8B,EAAS,CAACG,EAASF,EAAW,KACpDA,EAAW,EAAGE,GAAUD,EAAUhC,CAAC,EACpC,EACH,EACA,OAAOgC,CACT,EAEa9D,GAAW,CAACK,EAAIuD,EAAW,eAAgBI,EAAS,IAAM,CAACP,EAAKI,EAAS,EAAEG,IAAWJ,EAAS,IAAOC,GAAYG,GAAU3D,EAAGoD,CAAG,CAAE,EAI1IxD,EAAQf,KCnTf,IAKa+E,EAEXC,EAEAC,GAGEC,GAISC,EAuFPC,GAqEAC,EAGAC,GA2BCC,EA1MPC,EAAAC,EAAA,KACAC,IAIaX,EAAW,OAAO,SAAS,EAEtCC,EAAU,OAAO,QAAQ,EAEzBC,GAAO,OAAO,KAAK,EAGjBC,GAAU,GAIDC,EAAQ,CAACQ,EAAQC,IAAW,CAQvC,GAPI,CAACD,GAIDA,EAAO,OAAO,WAAW,GAGzBA,EAAOZ,CAAQ,EAAG,OAAOY,EAG7B,GAAIA,EAAO,cAAgB,OAAQ,OAAO,MAAM,QAAQA,CAAM,EAAIP,GAAKO,CAAM,EAAIA,EAGjF,IAAIE,EAAW,OAAO,KAAKF,CAAM,EAAE,OACjCG,EAAU,CAAC,EAGTC,EAAQ,IAAI,MAAM,OAAO,OAAOD,EAAS,CAC3C,CAACd,CAAO,EAAGgB,EAAOH,CAAQ,EAC1B,CAACd,CAAQ,EAAGe,CACd,CAAC,EAAG,CACF,IAAK,CAACG,EAAGC,IAEHA,KAAKJ,EAAiBA,EAAQI,CAAC,EAAIJ,EAAQI,CAAC,EAAE,QAAQ,EAAIJ,EAAQI,CAAC,EAChEN,EAASA,EAAOM,CAAC,EAAI,WAAWA,CAAC,EAG1C,IAAK,CAACD,EAAGC,EAAGC,EAAGC,IAETF,KAAKJ,GAAgBR,GAAIQ,EAASI,EAAGC,CAAC,EAAG,IAG7CjB,GAAU,GAINU,GAAUM,KAAKN,EACjBA,EAAOM,CAAC,EAAIC,GAIZd,EAAOS,EAASI,EAAGC,CAAC,EACpBL,EAAQd,CAAO,EAAE,MAAQ,EAAEa,GAG7BX,GAAU,GAIH,GAIT,eAAgB,CAACe,EAAGC,KAClBA,KAAKJ,IAAYI,EAAE,CAAC,GAAK,KAAOJ,EAAQI,CAAC,IAAI,OAAO,OAAO,IAAI,EAAG,OAAOJ,EAAQI,CAAC,EAAGJ,EAAQd,CAAO,EAAE,MAAQ,EAAEa,GACzG,GAIT,QAAS,KAAOC,EAAQd,CAAO,EAAE,MAAO,QAAQ,QAAQc,CAAO,GAG/D,IAAK,CAACG,EAAGC,IACHA,KAAKJ,EAAgB,GACrBF,EAAeM,KAAKN,EACjBV,EAEX,CAAC,EAGKmB,EAAQ,OAAO,0BAA0BV,CAAM,EAErD,QAASO,KAAKP,EAERU,EAAMH,CAAC,GAAG,KAEXJ,EAAQI,CAAC,EAAII,GAASD,EAAMH,CAAC,EAAE,IAAI,KAAKH,CAAK,CAAC,GAAGd,EAAI,EAAIoB,EAAMH,CAAC,EAAE,KAAK,KAAKH,CAAK,EAG/EV,EAAOS,EAASI,EAAGP,EAAOO,CAAC,CAAC,EAGnC,OAAOH,CACT,EAGMX,GAAO,CAACO,EAAQC,EAAS,aAAe,CAG5C,IAAIE,EAAU,MAAMH,EAAO,MAAM,EAAE,KAAK,IAAI,EAG1CY,EAAQ,GAGRC,EAAMC,GAAM,UAAY,CAAE,OAAAF,EAAQ,GAAaE,EAAG,MAAM,KAAM,SAAS,CAAG,EAE1EC,EAASV,EAAOL,EAAO,MAAM,EAG7BI,EAAQ,IAAI,MACV,OAAO,OAAOD,EAAS,CACrB,CAACd,CAAO,EAAG0B,EACX,CAAC3B,CAAQ,EAAGe,EAEZ,KAAMU,EAAIV,EAAQ,IAAI,EACtB,IAAKU,EAAIV,EAAQ,GAAG,EACpB,MAAOU,EAAIV,EAAQ,KAAK,EACxB,QAASU,EAAIV,EAAQ,OAAO,EAC5B,OAAQU,EAAIV,EAAQ,MAAM,CAC5B,CAAC,EACD,CACE,IAAIG,EAAGC,EAAG,CAKR,OAAIA,IAAM,SAAiBK,GAASA,EAAQ,GAAOT,EAAQ,QAAUY,EAAO,MAGxE,OAAOR,GAAM,UAAY,MAAMA,CAAC,EAAUJ,EAAQI,CAAC,GAAG,QAAQ,GAAKN,EAAOM,CAAC,GAIvEJ,EAAAI,KAAAJ,EAAAI,GAAeF,EAAOb,EAAMQ,EAAOO,CAAC,CAAC,CAAC,IAAG,QAAQ,CAC3D,EAEA,IAAID,EAAGC,EAAGC,EAAG,CAIX,GAAID,IAAM,SAAU,CAElB,QAASS,EAAIR,EAAGQ,EAAIb,EAAQ,OAAQa,IAAK,OAAOZ,EAAMY,CAAC,EAEvDD,EAAO,MAAQZ,EAAQ,OAASK,CAClC,MAGSD,GAAKJ,EAAQ,QAAQT,EAAOS,EAASI,EAAGC,CAAC,EAAGJ,EAAM,OAAS,CAACG,EAAI,GAGpEJ,EAAQI,CAAC,EAAIZ,GAAIQ,EAASI,EAAGC,CAAC,EAAId,EAAOS,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,EAGMV,EAAS,CAACS,EAASI,EAAGC,IAAOL,EAAQI,CAAC,EAAKA,EAAE,CAAC,GAAK,KAAOC,GAAG,KAAQA,EAAIH,EAAOb,EAAMgB,CAAC,CAAC,EAGxFb,GAAM,CAACQ,EAASI,EAAGC,EAAGC,EAAIQ,IAEvBV,EAAE,CAAC,IAAM,IAAOJ,EAAQI,CAAC,EAAIC,EACjCA,KAAOS,GAAMR,EAAKN,EAAQI,CAAC,GAAG,KAAK,KAElCE,EAAGnB,EAAI,EAAImB,EAAGnB,EAAI,EAAEkB,CAAC,EAEnB,MAAM,QAAQA,CAAC,GAAK,MAAM,QAAQS,CAAE,EAIlC5B,KAAW4B,EACTC,EAAU,IAAMC,EAAM,IAAM,CAC1B,QAAS,EAAI,EAAG,EAAIX,EAAE,OAAQ,IAAKS,EAAG,CAAC,EAAIT,EAAE,CAAC,EAC9CS,EAAG,OAAST,EAAE,MAChB,CAAC,CAAC,EACDC,EAAG,MAAQD,EAEbC,EAAG,MAAQjB,EAAMgB,CAAC,GAStBZ,EAAQJ,IC1Mf,IACI4B,EAASC,GAAWC,EAIXC,EAgBAC,GAeAC,GAWAC,GAMAC,GArDbC,GAAAC,EAAA,KACaR,GAAQ,EAIRE,EAAS,CAACO,EAAGC,EAAIC,EAAO,IAAI,IAAKC,EAAK,IAAMF,EAAG,QAC1DA,EAAK,CACH,IAAI,OAAQ,CACV,OAAAX,GAAS,KAAK,KAAKY,EAAK,IAAIZ,CAAO,CAAC,EAC7BU,CACT,EACA,IAAI,MAAMI,EAAK,CACb,GAAIA,IAAQJ,EACZ,CAAAA,EAAII,EACJ,QAASC,KAAOH,EAAMV,EAAUA,EAAQ,IAAIa,CAAG,EAAIA,EAAI,EACzD,EACA,MAAO,CAAE,OAAOL,CAAE,EAClB,OAAQG,EAAI,KAAMA,EAAI,SAAUA,EAAI,QAASA,CAC/C,EAGWT,GAAS,CAACY,EAAIC,EAAWC,EAAKC,EAAOC,KAChDF,EAAOG,GAAS,CAKd,GAJAD,EAAQH,EACRA,EAAY,KACZG,GAAO,OAAO,EACdC,EAAOrB,EAASA,EAAUkB,EACtBjB,KAAU,GAAI,KAAM,iBACxB,GAAI,CAAEgB,EAAYD,EAAG,CAAG,QAAE,CAAUhB,EAAUqB,EAAMpB,IAAQ,CAC9D,EACAkB,EAAQD,EAAI,KAAO,CAAC,EAEpBA,EAAI,EACHI,GAAQ,CAAuB,IAArBL,GAAW,OAAO,EAAUK,EAAMH,EAAM,IAAI,GAAGG,EAAI,OAAOJ,CAAG,CAAG,GAGhEb,GAAW,CAACW,EAAIL,EAAKR,EAAO,EAAGoB,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,KAAMA,EAAI,SAAUA,EAAI,QAASA,CAC/C,EAGWP,GAAQ,CAACU,EAAIS,EAAS,CAACvB,IAAY,CAC9CA,MAAY,IAAI,KAChB,GAAI,CAAEc,EAAG,CAAG,QACZ,CAAU,GAAIS,EAAQ,CAAE,QAAWC,KAAMxB,EAASwB,EAAG,EAAGxB,EAAU,IAAK,CAAE,CAC3E,EAEaK,GAAY,CAACS,EAAIW,EAAOd,KAAQc,EAAQ3B,EAASA,EAAU,KAAMa,EAAKG,EAAG,EAAGhB,EAAU2B,EAAOd,KCrD1G,IAIOe,GAJPC,GAAAC,EAAA,KACAC,IAGOH,GAAQ,CAACI,EAAIC,EAAOC,EAASC,EAAKC,IAAW,CAJpD,IAAAC,EAOE,OAAKL,EAAG,QA8BHM,EAAMH,EAAMH,EAAIC,CAAK,GA5BxBD,EAAAK,EAAGE,KAAHP,EAAAK,GAAe,MAEfF,EAAMH,EAAG,QAAUQ,EAAKR,CAAE,EAAIA,EAE9BA,EAAG,YAAYE,EAAU,SAAS,eAAe,EAAE,CAAC,EACpDC,EAAI,QAAUD,EAAQ,QAAUA,EAGhCA,EAAQ,SAAW,CAACC,EAAI,QAAU,CAACA,EAAK,EAAK,CAAC,EAE9CD,EAAQ,OAASO,EAAS,IAAM,CAC9B,IAAIC,EAAQR,EAAQ,SAAS,KAAK,CAAC,CAAC,CAAES,CAAC,IAAMA,CAAC,EAG1CD,GAASN,IAEXA,IAAS,CAAC,EAAE,OAAO,EACnBA,IAAS,CAAC,EAAEQ,CAAI,IAAI,GAChBR,EAASM,KACXR,EAAQ,OAAOE,EAAO,CAAC,EAAE,SAAWA,EAAO,CAAC,CAAC,EAE5CA,EAAO,CAAC,EAAEG,CAAM,EAA0DH,EAAO,CAAC,EAAES,CAAG,IAAI,GAAtE,OAAOT,EAAO,CAAC,EAAEG,CAAM,EAAGD,EAAMF,EAAO,CAAC,EAAGH,CAAK,IAI5E,CAAC,GAOIa,GAAS,CAEdX,EAAI,QAAQ,CAAC,EAAIW,EACjBX,EAAI,QAAQ,OAAO,CACrB,CACF,IC9CA,IAIOY,GAJPC,GAAAC,EAAA,KAAAC,IAIOH,GAAQ,CAACI,EAAIC,EAAOC,EAAKC,EAAGC,EAAMJ,IAAO,CAM9C,IAHAE,EAAMF,EAAG,QAAUK,EAAKL,CAAE,EAAIA,EAGvBI,GAAS,EAAEF,EAAI,QAAUE,EAAM,UAAUA,EAAQA,EAAM,gBAE9D,OAAAJ,EAAG,OAAO,EACVA,EAAGM,CAAM,EAAI,KAEbJ,EAAI,QAAQ,SAAS,KAAKA,EAAI,QAAU,CAACA,EAAK,EAAI,CAAC,EAE5CA,EAAI,QAAQ,MACrB,IClBA,IAEOK,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQI,IAEbA,EAAG,SAAWA,EAAG,YAAYA,EAAKC,EAAKD,CAAE,EAAE,WAAW,CAAC,CAAC,EACxDE,IAAMA,EAAIC,EAAKD,EAAGF,EAAG,WAAW,EAAGA,EAAG,YAAcE,GAAY,OCLlE,IAEOE,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQ,CAACI,EAAIC,EAAMC,KACxBD,EAAO,IAAI,IACVE,GAAM,CACLD,EAAO,IAAI,IACPC,GAAGC,GAAKC,EAAKF,EAAGH,EAAG,SAAS,CAAC,EAAE,MAAM,GAAG,EAAE,IAAIM,GAAKA,GAAKJ,EAAK,IAAII,CAAC,CAAC,EACvE,QAASA,KAAKL,EAAUC,EAAK,IAAII,CAAC,EAAGJ,EAAK,OAAOI,CAAC,EAAQN,EAAG,UAAU,OAAOM,CAAC,EAC/E,QAASA,KAAKL,EAAOC,EAAMF,EAAG,UAAU,IAAIM,CAAC,CAC/C,KCTF,IAEOC,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQ,CAACI,EAAIC,KAClBA,EAAUD,EAAG,aAAa,OAAO,EACjCE,GAAK,CAEH,GADAA,EAAIC,EAAKD,EAAGF,EAAG,KAAK,EAChB,OAAOE,GAAM,SAAUE,EAAKJ,EAAI,QAASC,EAAU,KAAOC,CAAC,MAC1D,CACCD,GAASG,EAAKJ,EAAI,QAASC,CAAO,EAEtC,QAASI,KAAKH,EAAGG,EAAE,CAAC,GAAK,IAAML,EAAG,MAAM,YAAYK,EAAGH,EAAEG,CAAC,CAAC,EAAIA,EAAE,CAAC,EAAI,MAAQL,EAAG,MAAMK,CAAC,EAAIH,EAAEG,CAAC,EACjG,CACF,KCZF,IAEOC,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQ,IAAMI,ICFrB,IAIaC,GAKNC,GATPC,GAAAC,EAAA,KAAAC,IAIaJ,GAAS,CAACK,EAAMC,EAAOC,EAAM,GAAGF,CAAI,KAAK,IAAM,CAACG,EAAQC,IAAU,CAE7ED,EAAO,GAAKC,EAAOH,EAAKE,CAAM,EAAG,OAAOA,EAAO,EACjD,EAEOP,GAAQ,CAACS,EAAIC,EAAON,EAAMO,IAAS,CAExC,GAAI,CACF,IAAMC,EAAMb,GAAOK,CAAI,EACjBS,EAAeJ,EAAG,OAAS,WAAa,IAAMG,EAAIF,EAAOD,EAAG,OAAO,EACvEA,EAAG,OAAS,kBAAoB,IAAMG,EAAIF,EAAO,CAAC,GAAGD,EAAG,eAAe,EAAE,IAAIK,GAAKA,EAAE,KAAK,CAAC,EACxF,IAAMF,EAAIF,EAAOD,EAAG,cAAgB,EAAI,KAAOA,EAAG,KAAK,EAE3DA,EAAG,QAAUA,EAAG,SAAWI,EAEvBJ,EAAG,MAAM,WAAW,QAAQ,IAE9B,IAAI,iBAAiBI,CAAY,EAAE,QAAQJ,EAAI,CAAE,UAAW,GAAM,QAAS,GAAM,WAAY,EAAK,CAAC,EAGnGM,EAAMN,EAAIC,CAAK,GAIjBJ,EAAMF,CAAI,EAAEM,CAAK,GAAKG,EAAa,CACrC,MAAQ,CAAE,CAEV,OAAQJ,EAAG,OAAS,QAAUA,EAAG,OAAS,GACvCD,GAAUC,EAAG,aAAa,QAAUA,EAAG,MAAQD,GAAgB,EAAW,EAC1EC,EAAG,UAAY,YAAcA,EAAG,OAAS,QAAUA,EAAG,OAAS,GAC9D,CAACD,EAAOQ,EAAMC,KAEXD,EAAOP,EAAG,eACVQ,EAAKR,EAAG,aACTA,EAAG,aAAa,QAAUA,EAAG,MAAQD,GAAgB,EAAW,EAChEQ,GAAQP,EAAG,kBAAkBO,EAAMC,CAAE,GAEtCR,EAAG,OAAS,WACVD,IAAWC,EAAG,QAAUD,EAAOU,EAAKT,EAAI,UAAWD,CAAK,GACxDC,EAAG,OAAS,QAAYD,GACvBC,EAAG,QAAUD,IAAWC,EAAG,QAAUD,EAAQU,EAAKT,EAAI,UAAWD,CAAK,GAErEC,EAAG,OAAS,aACVD,GAAU,CACT,QAASM,KAAKL,EAAG,QACfK,EAAE,OAASN,EAAQM,EAAE,aAAa,WAAY,EAAE,EAAIA,EAAE,gBAAgB,UAAU,EAClFL,EAAG,MAAQD,CACb,EACCC,EAAG,OAAS,kBAAsBD,GAAU,CAC3C,QAASM,KAAKL,EAAG,QAASK,EAAE,gBAAgB,UAAU,EACtD,QAASK,KAAKX,EAAOC,EAAG,cAAc,WAAWU,CAAC,IAAI,EAAE,aAAa,WAAY,EAAE,CACrF,EACGX,GAAWC,EAAG,MAAQD,CACrC,ICzDA,IAGOY,GAHPC,GAAAC,EAAA,KAAAC,IAGOH,GAAQ,CAACI,EAAIC,EAAOC,EAAMC,EAAMC,EAAOC,IAAS,CAErD,GAAI,OAAOC,EAAMJ,CAAI,EAAED,CAAK,GAAK,WAAY,OAAOM,GAAMA,EAAEP,CAAE,EAI9D,OAAO,eAAeC,EAAOC,EAAM,CAAE,MAAOF,EAAI,aAAc,EAAK,CAAC,CACtE,ICVA,IAEOQ,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQ,CAACI,EAAIC,IAAc,CAGhC,IAAIC,EAAWF,EAAGG,CAAM,EAAIC,EAAM,CAAC,EAAGH,CAAS,EAAGI,EAAO,GAIzD,OAAOC,GAAU,CAKf,GAJAA,EAASC,EAAKD,EAAQJ,CAAQ,EAI1BI,IAAWJ,EACb,QAASM,KAAKF,EAAQ,CAEpB,IAAIG,EAAI,OAAOH,EAAOE,CAAC,GAAM,WAAaF,EAAOE,CAAC,EAAE,KAAKN,CAAQ,EAAII,EAAOE,CAAC,EAEzEA,KAAKN,EAASQ,CAAQ,EAAGR,EAASM,CAAC,EAAIC,EAErCP,EAASQ,CAAQ,EAAEF,CAAC,EAAKA,EAAE,CAAC,GAAK,KAAOC,GAAG,KAAQA,EAAIE,EAAOP,EAAMK,CAAC,CAAC,CAC9E,CAIF,MAAO,CAACJ,IAASA,EAAO,GAAM,OAAOL,EAAGG,CAAM,EAAGS,EAAU,IAAMC,EAAMb,EAAIE,CAAQ,CAAC,EACtF,CACF,IC5BA,IAEMY,GAuFCC,GAzFPC,GAAAC,EAAA,KAAAC,IAEMJ,GAAO,CAACK,EAAKC,EAAOC,IAAS,CACjC,GAAI,CAACC,EAASC,EAAS,GAAG,EAAIF,EAAK,MAAM,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,SAAU,EAAE,EAAE,MAAM,SAAS,EAG9FG,EAAS,SAAS,eAAe,EAAE,EAGnCC,EAAKC,EAAMC,EAAOC,EAAQ,EAG1BC,EAASC,EAAS,IAAM,CAZ9B,IAAAC,EAAAC,EAaI,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,CAGA,GAAIO,EAAOP,EAAOH,EAAI,OAASU,MAG1B,CAEH,GAAI,CAACV,EAAKA,EAAMS,MAEX,MAAOD,EAAIL,GAAOH,EAAIQ,CAAC,EAAIC,EAASD,GAAG,EAG5C,KAAOA,EAAIE,EAAMF,IAAK,CACpBR,EAAIQ,CAAC,EAAIC,EAASD,CAAC,EAEnB,IAAIM,EAAMN,EAQVO,EAAW,OAAO,OAAOpB,EAAO,CAC9B,CAACE,CAAO,EAAG,CAAE,IAAK,IAAMG,EAAIc,CAAG,CAAE,EACjC,CAAChB,CAAM,EAAG,CAAE,MAAOG,EAAOA,EAAKa,CAAG,EAAIA,CAAI,CAC5C,CAAC,EAEGE,EAAKtB,EAAI,QAAUuB,EAAKvB,CAAG,EAAIA,EAAI,UAAU,EAAI,EAErDK,EAAO,OAAOiB,EAAG,SAAWA,CAAE,EAE9BE,EAAMF,EAAID,CAAQ,EAGlB,IAAII,IAAUZ,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,CACvCW,IAAQ,EAAGH,EAAG,OAAO,OAAO,IAAI,EAAGA,EAAG,OAAO,CAC/C,CACF,CACF,CAEAb,EAAQO,CACV,CAAC,EAED,OAAAhB,EAAI,YAAYK,CAAM,EACtBL,EAAI0B,CAAM,EAAI,KAEPC,IAELpB,EAAO,KACH,OAAOoB,GAAU,SAAUnB,EAAQ,MAAM,KAAK,CAAE,OAAQmB,CAAM,EAAG,CAACC,EAAGd,IAAMA,EAAI,CAAC,EAC3Ea,GAAO,cAAgB,QAAQpB,EAAO,OAAO,KAAKoB,CAAK,EAAGnB,EAAQ,OAAO,OAAOmB,CAAK,GACzFnB,EAAQmB,GAAS,CAAC,EAGhBE,EAAO,IAAM,CAElBrB,EAAMS,CAAO,GAAG,MAGhBP,EAAO,CACT,CAAC,EAEL,EAGAf,GAAK,MAASmC,GAAQA,EAAI,MAAM,QAAQ,EAAE,CAAC,EAAE,KAAK,EAE3ClC,GAAQD,KCzFf,IAEOoC,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQ,CAACI,EAAIC,EAAIC,EAAIC,IAASC,GAAKC,EAAKL,EAAIG,EAAMG,EAAKF,EAAGJ,EAAG,aAAaG,CAAI,CAAC,CAAC,ICFvF,IAEOI,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAASI,GAAWC,GAAS,CAAE,QAASC,KAAOD,EAAOE,EAAKH,EAAQI,GAASF,CAAG,EAAGD,EAAMC,CAAG,CAAC,CAAE,ICFrG,IAAAG,GAAA,GAAAC,GAAAD,GAAA,WAAAE,GAAA,aAAAC,GAAA,YAAAC,GAAA,WAAAC,GAAA,WAAAC,EAAA,UAAAC,EAAA,UAAAC,GAAA,UAAAC,EAAA,cAAAC,GAAA,QAAAC,IAAA,IA+FMC,GAmCCR,GAlIPS,GAAAC,EAAA,KAAAC,IACAC,KACAC,IAEAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KAGA,OAAO,OAAOC,EAAW,CAEvB,IAAKC,GAML,GAAIC,GAGJ,MAAOC,GAGP,KAAMC,GAGN,MAAOC,GAGP,GAAIC,GAGJ,MAAOC,GAGP,IAAKC,GAGL,MAAOC,GAEP,GAAIC,GACJ,KAAMC,GAGN,KAAMC,EACR,CAAC,EAED,OAAO,OAAOC,EAAU,CACtB,SAAU,CAACC,EACTC,EAAO,IACPC,EAAYD,IAAS,OAAS,eAAiBA,IAAS,MAAQ,sBAAwBA,IAAS,OAAS,oBAAwBD,GAAO,WAAWA,EAAIC,CAAI,EAC5JE,EAAS,IAETC,GAASJ,EAAIE,CAAS,EAExB,SAAU,CAACF,EAAIC,EAAO,IAAKC,EAAYD,IAAS,OAAS,eAAiBA,IAAS,MAAQ,sBAA0BD,GAAO,WAAWA,EAAIC,CAAI,IAC7II,EAASL,EAAIE,CAAS,EAGxB,KAAM,CAACF,EAAIM,EAAOC,IAAQ,OAAO,OAAQC,GAAM,CAACF,IAAUA,EAAQ,EAAGN,EAAGQ,CAAC,GAAI,CAAE,KAAM,EAAK,CAAC,EAI3F,QAAUR,GAAQQ,IAAOA,GAAG,eAAe,EAAGR,EAAGQ,CAAC,GAClD,KAAOR,GAAQQ,IAAOA,GAAG,gBAAgB,EAAGR,EAAGQ,CAAC,GAChD,UAAYR,GAAQQ,IAAOA,GAAG,yBAAyB,EAAGR,EAAGQ,CAAC,GAG9D,QAASR,IAAOA,EAAG,QAAU,GAAMA,GACnC,QAASA,IAAOA,EAAG,QAAU,GAAMA,GAGnC,OAAQA,IAAOA,EAAG,OAAS,OAAQA,GACnC,SAAUA,IAAOA,EAAG,OAAS,SAAUA,GACvC,OAAQA,IAAOA,EAAG,OAASA,EAAG,OAAO,WAAYA,GAGjD,KAAOA,GAAQQ,GAAOA,EAAE,SAAWR,EAAG,QAAUA,EAAGQ,CAAC,EAEpD,QAAUR,GAAO,CAACQ,EAAGC,KACnBA,EAAUT,EAAG,OACb,CAACS,EAAQ,SAASD,EAAE,MAAM,GAAKA,EAAE,OAAO,cAAgBC,EAAQ,aAAeA,EAAQ,cAE3F,CAAC,EAGKzC,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,QAAU,EAAE,MAAQ,UACtD,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,EAGA,QAAS0C,KAAK1C,GAAM+B,EAASW,CAAC,EAAI,CAACV,KAAOW,IAAYH,GAAMxC,GAAK0C,CAAC,EAAEF,CAAC,GAAKG,EAAO,MAAMD,GAAK1C,GAAK0C,CAAC,IAAIF,CAAC,GAAKA,EAAE,MAAQE,CAAC,GAAKV,EAAGQ,CAAC,EAEhIzC,EAAI,CACF,QAAS6C,GACAjD,EAAM,YAAY,yBAAyBiD,CAAI,IAAI,EAI5D,OAAAlD,EAAQ,OAAAD,GAAQ,SAAAF,GAAU,MAAAD,GAAO,UAAAQ,EACnC,CAAC,EAGDH,EAAM,IAAMI,EACZJ,EAAM,MAAQE,EACdF,EAAM,UAAYuB,EAClBvB,EAAM,SAAWoC,EACjBpC,EAAM,MAAQC,GAEPJ,GAAQG,IClIf,IAAIkD,GAAQ,cAAsB,QAAS,OAAO,QAAUA,GAAO,IAAIC,EAAM,SAAS,cAClFC,GAASD,EAAI,aAAa,QAAQ,GAAKA,EAAI,QAAQ,QAAUA,EAAI,QAAQ,YACzEE,EAAQF,EAAI,aAAa,OAAO,GAAKA,EAAI,QAAQ,OAASA,EAAI,QAAQ,WACtEC,IAAQF,GAAM,IAAI,CAAE,OAAAE,EAAO,CAAC,EAC5BC,GAAS,MAAQA,IAAU,UAAUA,GAASA,IAAU,OAAS,SAAS,iBAAiBA,CAAK,EAAI,CAAC,SAAS,IAAI,GAAG,QAAQC,GAAMJ,GAAM,MAAMI,CAAE,CAAC",
6
- "names": ["_dispose", "_state", "_on", "_off", "_add", "prefix", "signal", "effect", "computed", "batch", "untracked", "directive", "modifier", "currentDir", "sprae", "initDirective", "use", "start", "compile", "parse", "applyMods", "sx", "frag", "call", "dashcase", "attr", "clsx", "throttle", "debounce", "core_default", "init_core", "__esmMin", "init_store", "fn", "el", "state", "store_default", "fx", "offs", "on", "off", "add", "_attrs", "i", "name", "value", "child", "dirName", "expr", "cur", "steps", "step", "length", "prev", "str", "mods", "evaluate", "type", "e", "_poff", "update", "dispose", "change", "count", "s", "root", "values", "mutations", "m", "prepare", "_fn", "_expr", "cb", "_out", "result", "v", "params", "a", "b", "k", "tpl", "content", "attributes", "ref", "childNodes", "arg", "match", "c", "schedule", "_planned", "throttled", "_dirty", "_count", "_signals", "_change", "_set", "sandbox", "store", "list", "create", "set", "store_default", "init_store", "__esmMin", "init_core", "values", "parent", "keyCount", "signals", "state", "signal", "_", "k", "v", "_s", "descs", "computed", "isMut", "mut", "fn", "length", "i", "_v", "untracked", "batch", "current", "depth", "batched", "signal", "effect", "computed", "batch", "untracked", "init_signal", "__esmMin", "v", "_s", "_obs", "_v", "val", "sub", "fn", "_teardown", "_fx", "_deps", "__tmp", "prev", "dep", "_c", "_e", "_first", "fx", "_prev", "if_default", "init_if", "__esmMin", "init_core", "el", "state", "_holder", "_el", "_match", "_a", "core_default", "_state", "frag", "throttle", "match", "s", "_off", "_on", "value", "else_default", "init_else", "__esmMin", "init_core", "el", "state", "_el", "_", "_prev", "frag", "_state", "text_default", "init_text", "__esmMin", "init_core", "el", "frag", "v", "call", "class_default", "init_class", "__esmMin", "init_core", "el", "_cur", "_new", "v", "clsx", "call", "c", "style_default", "init_style", "__esmMin", "init_core", "el", "_static", "v", "call", "attr", "k", "fx_default", "init_fx", "__esmMin", "init_core", "call", "setter", "value_default", "init_value", "__esmMin", "init_core", "expr", "_set", "parse", "target", "value", "el", "state", "name", "set", "handleChange", "o", "core_default", "from", "to", "attr", "v", "ref_default", "init_ref", "__esmMin", "init_core", "el", "state", "expr", "name", "_prev", "_set", "parse", "v", "scope_default", "init_scope", "__esmMin", "init_core", "el", "rootState", "subscope", "_state", "store", "init", "values", "call", "k", "v", "_signals", "signal", "untracked", "core_default", "each", "each_default", "init_each", "__esmMin", "init_core", "tpl", "state", "expr", "itemVar", "idxVar", "holder", "cur", "keys", "items", "prevl", "update", "throttle", "_a", "_b", "i", "newItems", "newl", "_change", "s", "_signals", "idx", "subscope", "el", "frag", "core_default", "_prev", "_state", "value", "_", "effect", "str", "default_default", "init_default", "__esmMin", "init_core", "el", "st", "ex", "name", "v", "attr", "call", "spread_default", "init_spread", "__esmMin", "init_core", "target", "value", "key", "attr", "dashcase", "sprae_exports", "__export", "batch", "computed", "sprae_default", "effect", "signal", "core_default", "start", "store_default", "untracked", "use", "keys", "init_sprae", "__esmMin", "init_store", "init_signal", "init_core", "init_if", "init_else", "init_text", "init_class", "init_style", "init_fx", "init_value", "init_ref", "init_scope", "init_each", "init_default", "init_spread", "directive", "default_default", "spread_default", "class_default", "text_default", "style_default", "fx_default", "value_default", "ref_default", "scope_default", "if_default", "else_default", "each_default", "modifier", "fn", "_how", "_schedule", "_count", "debounce", "throttle", "_done", "_fn", "e", "_target", "k", "params", "expr", "sprae", "cur", "prefix", "start", "el"]
3
+ "sources": ["../package.json", "../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/default.js", "../directive/spread.js", "../sprae.js", "<stdin>"],
4
+ "sourcesContent": ["{\n \"name\": \"sprae\",\n \"description\": \"DOM microhydration\",\n \"version\": \"12.2.0\",\n \"main\": \"./sprae.js\",\n \"module\": \"./sprae.js\",\n \"umd:main\": \"dist/sprae.umd.js\",\n \"unpkg\": \"dist/sprae.umd.js\",\n \"types\": \"dist/sprae.d.ts\",\n \"type\": \"module\",\n \"files\": [\n \"core.js\",\n \"sprae.js\",\n \"store.js\",\n \"signal.js\",\n \"micro.js\",\n \"directive\",\n \"dist\"\n ],\n \"devDependencies\": {\n \"@preact/signals\": \"^2.0.4\",\n \"@preact/signals-core\": \"^1.8.0\",\n \"@webreflection/signal\": \"^2.1.2\",\n \"es-module-shims\": \"^1.10.0\",\n \"esbuild\": \"^0.23.0\",\n \"esbuild-plugin-umd-wrapper\": \"^2.0.3\",\n \"hyperf\": \"^1.7.0\",\n \"jsdom\": \"^27.0.0\",\n \"requestidlecallback\": \"^0.3.0\",\n \"signal-polyfill\": \"^0.1.1\",\n \"subscript\": \"^9.1.0\",\n \"tst\": \"^7.2.0\",\n \"ulive\": \"^1.0.7\",\n \"usignal\": \"^0.9.0\",\n \"wait-please\": \"^3.1.0\"\n },\n \"scripts\": {\n \"test\": \"node -r ./test/register.cjs test/test.js\",\n \"build\": \"node .esbuild.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/dy/sprae.git\"\n },\n \"keywords\": [\n \"hydration\",\n \"progressive\",\n \"progressive enhancement\",\n \"signals\",\n \"directives\",\n \"preact-signals\",\n \"reactive\",\n \"template-parts\",\n \"petit-vue\",\n \"alpinejs\",\n \"templating\"\n ],\n \"author\": \"Dmitry Iv <df.creative@gmail.com>\",\n \"license\": \"MIT\",\n \"bugs\": {\n \"url\": \"https://github.com/dy/sprae/issues\"\n },\n \"homepage\": \"https://github.com/dy/sprae#readme\"\n}\n", "import store, { _change, _signals } from \"./store.js\";\nimport pkg from './package.json' with { type: 'json' };\n\nexport const _dispose = (Symbol.dispose ||= Symbol(\"dispose\")),\n _state = Symbol(\"state\"),\n _on = Symbol('on'),\n _off = Symbol('off'),\n _add = Symbol('add');\n\n\nexport let prefix = ':', signal, effect, computed, batch = (fn) => fn(), untracked = batch;\n\nexport let directive = {}, modifier = {}\n\nlet currentDir = null;\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|store} [state] - Initial state values to populate the element's reactive state.\n * @returns {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.outerHTML)\n\n // take over existing state instead of creating a clone\n state = store(state || {})\n\n let fx = [], offs = [], fn,\n on = () => (!offs && (offs = fx.map(fn => fn()))),\n off = () => (offs?.map(off => off()), offs = null)\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] = on\n el[_off] = off\n\n // destroy\n el[_dispose] ||= () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_state] = el[_add] = null)\n\n const add = (el, _attrs = el.attributes) => {\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 // directive initializer can be redefined\n if (fn = initDirective(el, name, value, state)) fx.push(fn), offs.push(fn())\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 // for (let i = 0, child; i < (el.childNodes.length); i++) child = el.childNodes[i], child.nodeType == 1 && add(child)\n for (let child of [...el.childNodes]) child.nodeType == 1 && add(child)\n };\n\n el[_add] = add;\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\nsprae.version = pkg.version;\n\n/**\n * Initializes directive (defined by sprae build), returns \"on\" function that enables it\n * Multiprop sequences initializer, eg. :a:b..c:d\n * @type {(el: HTMLElement, name:string, value:string, state:Object) => Function}\n * */\nconst initDirective = (el, dirName, expr, state) => {\n let cur, // current step callback\n off // current step disposal\n\n let steps = dirName.slice(prefix.length).split('..').map((step, i, { length }) => (\n // multiple attributes like :id:for=\"\"\n step.split(prefix).reduce((prev, str) => {\n let [name, ...mods] = str.split('.');\n let evaluate = parse(expr, directive[currentDir = name]?.parse)\n\n // a hack, but events have no signal-effects and can be sequenced\n // FIXME: events are molded into core, but should be an optional directive\n if (name.startsWith('on')) {\n let type = name.slice(2),\n fn = applyMods(\n sx(\n // single event vs chain\n length == 1 ? e => evaluate(state, (fn) => call(fn, e)) :\n (e => (cur = (!i ? e => call(evaluate(state), e) : cur)(e), off(), off = steps[(i + 1) % length]())),\n { target: el }\n ),\n mods);\n\n return (_poff) => (_poff = prev?.(), fn.target.addEventListener(type, fn, fn), () => (_poff?.(), fn.target.removeEventListener(type, fn)))\n }\n\n let fn, dispose, change, count;\n\n if (mods.length) {\n change = signal(-1), // signal authorized to trigger effect: 0 = init; >0 = trigger\n count = -1 // called effect count\n\n // effect applier - first time it applies the effect, next times effect is triggered by change signal\n fn = applyMods(sx(throttle(() => {\n if (++change.value) return // all calls except for the first one are handled by effect\n dispose = effect(() => update && (\n change.value == count ? fn() : // plan update: separate tick (via throttle) makes sure planner effect call is finished before eval call\n (count = change.value, evaluate(state, update)) // if changed more than effect called - call it\n ));\n }), {target: el}), mods)\n }\n else {\n fn = sx(() => dispose = effect(() => evaluate(state, update)), {target: el })\n }\n\n // props have no sequences and can be sync\n // it's nice to see directive as taking some part of current context and returning new or updated context\n let update = (directive[name] || directive['*'])(fn.target, state, expr, name)\n\n // some directives are effect-less\n if (!update) return\n\n // take over state if directive created it (mainly :scope)\n if (el[_state]) state = el[_state]\n\n return (_poff) => (\n _poff = prev?.(),\n // console.log('ON', name),\n fn(),\n () => (\n // console.log('OFF', name, el),\n _poff?.(), dispose?.(), change && (change.value = -1, count = dispose = null)\n )\n )\n }, null)\n ));\n\n // off can be changed on the go\n return () => (off = steps[0]?.())\n}\n\n\n/**\n * Configure sprae\n */\nexport const use = (s) => (\n s.compile && (compile = s.compile),\n s.prefix && (prefix = s.prefix),\n s.signal && (signal = s.signal),\n s.effect && (effect = s.effect),\n s.computed && (computed = s.computed),\n s.batch && (batch = s.batch),\n s.untracked && (untracked = s.untracked)\n)\n\n\n/**\n * Lifecycle hanger: makes DOM slightly slower but spraes automatically\n */\nexport const 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 if (el.nodeType === 1 && el[_state] === undefined) {\n for (const attr of el.attributes) {\n if (attr.name.startsWith(prefix)) {\n root[_add](el); break;\n }\n }\n }\n }\n // for (const el of m.removedNodes) el[Symbol.dispose]?.()\n }\n });\n mo.observe(root, { childList: true, subtree: true });\n return state\n}\n\n\n/**\n * Compiles an expression into an evaluator function.\n * @type {(dir:string, expr: string, clean?: string => string) => Function}\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 {Function} The compiled evaluator function for the expression.\n */\nexport const parse = (expr, prepare, _fn) => {\n if (_fn = parse.cache[expr]) return _fn\n\n let _expr = expr.trim() || 'undefined'\n if (prepare) _expr = prepare(_expr)\n\n // if, const, let - no return\n if (/^(if|let|const)\\b/.test(_expr) || /;(?![^{]*})/.test(_expr)) ;\n else _expr = `return ${_expr}`\n\n // async expression\n if (/\\bawait\\s/.test(_expr)) _expr = `return (async()=>{ ${_expr} })()`\n\n // static time errors\n try {\n _fn = compile(_expr)\n Object.defineProperty(_fn, \"name\", {value: `\u2234 ${expr}`})\n } catch (e) { console.error(`\u2234 ${e}\\n\\n${prefix + currentDir}=\"${expr}\"`) }\n\n // run time errors\n return parse.cache[expr] = (state, cb, _out) => {\n try {\n let result = _fn?.(state)\n // if cb is given (to handle asyncs) - call it with result and return function that returns last cb result - needed for effect cleanup\n if (cb) return result?.then ? result.then(v => _out = cb(v)) : _out = cb(result), () => call(_out)\n else return result\n } catch (e) {\n console.error(`\u2234 ${e}\\n\\n${prefix + currentDir}=\"${expr}\"`)\n }\n }\n}\nparse.cache = {};\n\n\n// apply modifiers to context (from the end due to nature of wrapping ctx.call)\nconst applyMods = (fn, mods) => {\n while (mods.length) {\n let [name, ...params] = mods.pop().split('-')\n fn = sx(modifier[name]?.(fn, ...params) ?? fn, fn)\n }\n return fn\n}\n\n// soft-extend missing props and ignoring signals\nconst sx = (a, b) => { if (a != b) for (let k in b) (a[k] ??= b[k]); return a }\n\n// instantiated <template> fragment holder, like persisting fragment but with minimal API surface\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 // get parentNode() { return childNodes[0].parentNode },\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 // setAttributeNode() { }\n }\n}\n\n// if value is function - return result of its call\nexport const call = (v, arg) => typeof v === 'function' ? v(arg) : v\n\n// camel to kebab\nexport const dashcase = (str) => str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match, i) => (i ? '-' : '') + match.toLowerCase());\n\n// set attr\nexport const attr = (el, name, v) => (v == null || v === false) ? el.removeAttribute(name) : el.setAttribute(name, v === true ? \"\" : v);\n\n// convert any-arg to className string\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// throttle function to (once per tick or other custom scheduler)\nexport const throttle = (fn, schedule = queueMicrotask) => {\n let _planned = 0;\n const throttled = (e) => {\n if (!_planned++) fn(e), schedule((_dirty = _planned > 1) => (\n _planned = 0, _dirty && throttled(e)\n ));\n }\n return throttled;\n}\n\nexport const debounce = (fn, schedule = queueMicrotask, _count = 0) => (arg, _planned=++_count) => schedule(() => (_planned == _count && fn(arg)))\n\nexport * from './store.js';\n\nexport default sprae\n", "// signals-based proxy\nimport { signal, computed, batch, untracked, _add } from './core.js'\n\n\n// _signals allows both storing signals and checking instance, which would be difficult with WeakMap\nexport const _signals = Symbol('signals'),\n // _change is a signal that tracks changes to the object keys or array length\n _change = Symbol('change'),\n // _set is stashed setter for computed values\n _set = Symbol('set')\n\n// a hack to simulate sandbox for `with` in evaluator\nlet sandbox = true\n\n// object store is not lazy\n// parent defines parent scope or sandbox\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 // console.log('GET', k, signals)\n if (k in signals) return (signals[k] ? signals[k].valueOf() : signals[k])\n return parent ? parent[k] : globalThis[k]\n },\n\n set: (_, k, v, _s) => {\n // console.group('SET', k, v, signals, k in signals)\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// array store - signals are lazy since arrays can be very large & expensive\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// create signal value, skip untracked\nconst create = (signals, k, v) => (signals[k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))\n\n// set/update signal value\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", "// preact-signals minimal implementation\nlet current, depth = 0, batched;\n\n// default signals impl\n\nexport const signal = (v, _s, _obs = new Set, _v = () => _s.value) => (\n _s = {\n get value() {\n current?.deps.push(_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, then: _v, toString: _v, valueOf: _v\n }\n)\n\nexport const effect = (fn, _teardown, _fx, _deps, __tmp) => (\n _fx = (prev) => {\n __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 _deps = _fx.deps = [],\n\n _fx(),\n (dep) => { _teardown?.call?.(); while (dep = _deps.pop()) dep.delete(_fx); }\n)\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, then: _v, toString: _v, valueOf: _v\n }\n)\n\nexport const batch = (fn, _first = !batched) => {\n batched ??= new Set;\n try { fn(); }\n finally { if (_first) { for (const fx of batched) fx(); batched = null } }\n}\n\nexport const untracked = (fn, _prev, _v) => (_prev = current, current = null, _v = fn(), current = _prev, _v)\n", "// \"centralized\" version of :if\nimport sprae, { throttle, _on, _off, _state, frag } from '../core.js';\n\n// :if=\"a\"\nexport default (el, state, _holder, _el, _match) => {\n // new element :if\n // console.log(':if init', el)\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 // console.group(':if update clauses', ..._holder._clauses)\n\n if (match != _match) {\n // console.log(':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 // console.groupEnd()\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 // console.log(':if update', _el, value)\n _el._clause[1] = value\n _el._holder.update()\n }\n}\n", "import { _on, _off, _state, frag } from '../core.js';\n\n\n// NOTE: we can reach :else counterpart whereas prev :else :if is on hold\nexport default (el, state, _el, _, _prev=el) => {\n\n // console.log(':else init', el)\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, call } from \"../core.js\"\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 = call(v, el.textContent), el.textContent = v == null ? \"\" : v)\n)\n", "import { clsx, call } from \"../core.js\";\n\nexport default (el, _cur, _new) => (\n _cur = new Set,\n (v) => {\n _new = new Set\n if (v) clsx(call(v, el.className)).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 { call, attr } from \"../core.js\";\n\nexport default (el, _static) => (\n _static = el.getAttribute(\"style\"),\n v => {\n v = call(v, el.style)\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", "import { call } from \"../core.js\"\n\nexport default () => call\n", "import sprae, { attr, parse, _state } from \"../core.js\";\n\n\n// create expression setter, reflecting value back to state\nexport const setter = (expr, _set = parse(`${expr}=__`)) => (target, value) => {\n // save value to stash\n target.__ = value; _set(target), delete target.__\n}\n\nexport default (el, state, expr, name) => {\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 : el.value)\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, no need to parse again\n parse(expr)(state) ?? handleChange()\n } catch { }\n\n return (el.type === \"text\" || el.type === \"\") ?\n (value) => el.setAttribute(\"value\", (el.value = value == null ? \"\" : value)) :\n (el.tagName === \"TEXTAREA\" || el.type === \"text\" || el.type === \"\") ?\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\"\n// import { setter } from \"./value.js\"\n\nexport default (el, state, expr, name, _prev, _set) => {\n // FIXME: we call eval twice here - once to check if it's fn, second for update (from core)\n if (typeof parse(expr)(state) == 'function') return v => (v(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 // (setter(expr)(state, el))\n Object.defineProperty(state, expr, { value: el, configurable: true })\n}\n", "import sprae, { store, call, untracked, _state, _signals, signal } from '../core.js'\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 subscope = 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 = call(values, subscope);\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 !== subscope) {\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(subscope) : values[k]\n // update\n if (k in subscope[_signals]) subscope[k] = v\n // create\n else (subscope[_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, subscope)))\n }\n}\n", "import sprae, { store, _state, effect, _change, _signals, frag, throttle } from \"../core.js\";\n\nconst each = (tpl, state, expr) => {\n let [itemVar, idxVar = \"$\"] = expr.split(/\\bin\\b/)[0].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 // FIXME: pass items to update instead of global\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 // 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 // append\n for (; i < newl; i++) {\n cur[i] = newItems[i]\n\n let idx = i,\n // inherited state must be cheaper in terms of memory and faster in terms of performance, compared to creating a proxy store\n // subscope = store({\n // // NOTE: since we simulate signal, we have to make sure it's actual signal, not fake one\n // // FIXME: try to avoid this, we also have issue with wrongly calling dispose in store on delete\n // [itemVar]: cur[_signals]?.[idx]?.peek ? cur[_signals]?.[idx] : cur[idx],\n // [idxVar]: keys ? keys[idx] : idx\n // }, state)\n subscope = Object.create(state, {\n [itemVar]: { get: () => cur[idx] },\n [idxVar]: { value: keys ? keys[idx] : idx }\n })\n\n let el = tpl.content ? frag(tpl) : tpl.cloneNode(true);\n\n holder.before(el.content || el);\n\n sprae(el, subscope);\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\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 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 unsubscribes unused signals\n items[_change]?.value\n\n // make first render immediately, debounce subsequent renders\n update()\n })\n }\n}\n\n// :each directive skips v, k\neach.parse = (str) => str.split(/\\bin\\b/)[1].trim()\n\nexport default each\n", "import { attr, call } from \"../core.js\";\n\nexport default (el, st, ex, name) => v => attr(el, name, call(v, el.getAttribute(name)))\n", "import { attr, dashcase } from \"../core.js\";\n\nexport default (target) => value => { for (let key in value) attr(target, dashcase(key), value[key]) }\n", "import store from \"./store.js\";\nimport { batch, computed, effect, signal, untracked } from './signal.js';\nimport sprae, { use, directive, modifier, start, throttle, debounce, _add, _off, _state, _on, _dispose } 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/default.js\";\nimport _spread from \"./directive/spread.js\";\n\n\nObject.assign(directive, {\n // :x=\"x\"\n '*': _default,\n\n // FIXME\n // 'on*': _on,\n\n // :=\"{a,b,c}\"\n '': _spread,\n\n // :class=\"[a, b, c]\"\n class: _class,\n\n // :text=\"...\"\n text: _text,\n\n // :style=\"...\"\n style: _style,\n\n // :fx=\"...\"\n fx: _fx,\n\n // :value - 2 way binding like x-model\n value: _value,\n\n // :ref=\"...\"\n ref: _ref,\n\n // :scope creates variables scope for a subtree\n scope: _scope,\n\n if: _if,\n else: _else,\n\n // :each=\"v,k in src\"\n each: _each\n})\n\nObject.assign(modifier, {\n debounce: (fn,\n _how = 250,\n _schedule = _how === \"tick\" ? queueMicrotask : _how === \"raf\" ? requestAnimationFrame : _how === \"idle\" ? requestIdleCallback : ((fn) => setTimeout(fn, _how)),\n _count = 0\n ) =>\n debounce(fn, _schedule),\n\n throttle: (fn, _how = 250, _schedule = _how === \"tick\" ? queueMicrotask : _how === \"raf\" ? requestAnimationFrame : ((fn) => setTimeout(fn, _how))) => (\n throttle(fn, _schedule)\n ),\n\n once: (fn, _done, _fn) => Object.assign((e) => !_done && (_done = 1, fn(e)), { once: true }),\n\n // event modifiers\n // actions\n prevent: (fn) => (e) => (e?.preventDefault(), fn(e)),\n stop: (fn) => (e) => (e?.stopPropagation(), fn(e)),\n immediate: (fn) => (e) => (e?.stopImmediatePropagation(), fn(e)),\n\n // options\n passive: fn => (fn.passive = true, fn),\n capture: fn => (fn.capture = true, fn),\n\n // target\n window: fn => (fn.target = fn.target.ownerDocument.defaultView, fn),\n document: fn => (fn.target = fn.target.ownerDocument, fn),\n root: fn => (fn.target = fn.target.ownerDocument.documentElement, fn),\n body: fn => (fn.target = fn.target.ownerDocument.body, fn),\n parent: fn => (fn.target = fn.target.parentNode, fn),\n\n // testers\n self: (fn) => (e) => (e.target === fn.target && fn(e)),\n\n outside: (fn) => (e, _target) => (\n _target = fn.target,\n !_target.contains(e.target) && e.target.isConnected && (_target.offsetWidth || _target.offsetHeight)\n ),\n})\n\n// key testers\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\" || 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// augment modifiers with key testers\nfor (let k in keys) modifier[k] = (fn, ...params) => (e) => keys[k](e) && params.every(k => keys[k]?.(e) ?? e.key === k) && fn(e)\n\nuse({\n compile: expr => {\n return sprae.constructor(`with (arguments[0]) { ${expr} }`)\n },\n\n // signals\n signal, effect, computed, batch, untracked\n})\n\n// expose for runtime config\nsprae.use = use\nsprae.store = store\nsprae.directive = directive\nsprae.modifier = modifier\nsprae.start = start\n\nexport default sprae\nexport { sprae, store, signal, effect, computed, batch, untracked, start, use }\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]).forEach(el => sprae.start(el))"],
5
+ "mappings": ";6cAAA,IAAAA,GAAAC,GAAAC,EAAA,KAAAF,GAAA,CACE,KAAQ,QACR,YAAe,qBACf,QAAW,SACX,KAAQ,aACR,OAAU,aACV,WAAY,oBACZ,MAAS,oBACT,MAAS,kBACT,KAAQ,SACR,MAAS,CACP,UACA,WACA,WACA,YACA,WACA,YACA,MACF,EACA,gBAAmB,CACjB,kBAAmB,SACnB,uBAAwB,SACxB,wBAAyB,SACzB,kBAAmB,UACnB,QAAW,UACX,6BAA8B,SAC9B,OAAU,SACV,MAAS,UACT,oBAAuB,SACvB,kBAAmB,SACnB,UAAa,SACb,IAAO,SACP,MAAS,SACT,QAAW,SACX,cAAe,QACjB,EACA,QAAW,CACT,KAAQ,2CACR,MAAS,kBACX,EACA,WAAc,CACZ,KAAQ,MACR,IAAO,qCACT,EACA,SAAY,CACV,YACA,cACA,0BACA,UACA,aACA,iBACA,WACA,iBACA,YACA,WACA,YACF,EACA,OAAU,oCACV,QAAW,MACX,KAAQ,CACN,IAAO,oCACT,EACA,SAAY,oCACd,IC/DA,IAGaG,EACXC,EACAC,EACAC,EACAC,GAGSC,EAAcC,EAAQC,EAAQC,GAAUC,EAAsBC,EAE9DC,EAAgBC,EAEvBC,GASEC,GA8DAC,GA2EOC,EAcAC,GA0BFC,GAQEC,EAmCPC,GASAC,EAGOC,EA0BAC,EAGAC,GAGAC,EAGAC,GAMAC,EAUAC,GAINC,EAtTPC,EAAAC,EAAA,KAAAC,IACAC,KAmTAD,IAjTahC,EAAY,OAAO,UAAP,OAAO,QAAY,OAAO,SAAS,GAC1DC,EAAS,OAAO,OAAO,EACvBC,EAAM,OAAO,IAAI,EACjBC,EAAO,OAAO,KAAK,EACnBC,GAAO,OAAO,KAAK,EAGVC,EAAS,IAA+BI,EAASyB,GAAOA,EAAG,EAAGxB,EAAYD,EAE1EE,EAAY,CAAC,EAAGC,EAAW,CAAC,EAEnCC,GAAa,KASXC,GAAQ,CAACqB,EAAK,SAAS,KAAMC,IAAU,CAE3C,GAAID,EAAGlC,CAAM,EAAG,OAAO,OAAO,OAAOkC,EAAGlC,CAAM,EAAGmC,CAAK,EAKtDA,EAAQC,EAAMD,GAAS,CAAC,CAAC,EAEzB,IAAIE,EAAK,CAAC,EAAGC,EAAO,CAAC,EAAGL,EACtBM,EAAK,IAAO,CAACD,IAASA,EAAOD,EAAG,IAAIJ,GAAMA,EAAG,CAAC,GAC9CO,EAAM,KAAOF,GAAM,IAAIE,GAAOA,EAAI,CAAC,EAAGF,EAAO,MAK/CJ,EAAGjC,CAAG,EAAIsC,EACVL,EAAGhC,CAAI,EAAIsC,EAGXN,EAAAnC,KAAAmC,EAAAnC,GAAiB,KAAOmC,EAAGhC,CAAI,EAAE,EAAGgC,EAAGhC,CAAI,EAAIgC,EAAGjC,CAAG,EAAIiC,EAAGnC,CAAQ,EAAImC,EAAGlC,CAAM,EAAIkC,EAAG/B,EAAI,EAAI,OAEhG,IAAMsC,EAAM,CAACP,EAAIQ,EAASR,EAAG,aAAe,CAE1C,GAAIQ,EAAQ,QAASC,EAAI,EAAGA,EAAID,EAAO,QAAS,CAC9C,GAAI,CAAE,KAAAE,EAAM,MAAAC,CAAM,EAAIH,EAAOC,CAAC,EAE9B,GAAIC,EAAK,WAAWxC,CAAM,GAOxB,GANA8B,EAAG,gBAAgBU,CAAI,GAGnBX,EAAKnB,GAAcoB,EAAIU,EAAMC,EAAOV,CAAK,KAAGE,EAAG,KAAKJ,CAAE,EAAGK,EAAK,KAAKL,EAAG,CAAC,GAGvEjC,KAAUkC,EAAI,YACbS,GACT,CAIA,QAASG,IAAS,CAAC,GAAGZ,EAAG,UAAU,EAAGY,EAAM,UAAY,GAAKL,EAAIK,CAAK,CACxE,EAEA,OAAAZ,EAAG/B,EAAI,EAAIsC,EAEXA,EAAIP,CAAE,EAGFA,EAAGlC,CAAM,IAAM,SAAWkC,EAAGlC,CAAM,EAAImC,GAIpCA,CACT,EAEAtB,GAAM,QAAUkC,GAAI,QAOdjC,GAAgB,CAACoB,EAAIc,EAASC,EAAMd,IAAU,CAClD,IAAIe,EACFV,EAEEW,EAAQH,EAAQ,MAAM5C,EAAO,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,CAACgD,EAAMT,EAAG,CAAE,OAAAU,CAAO,IAE1ED,EAAK,MAAMhD,CAAM,EAAE,OAAO,CAACkD,EAAMC,IAAQ,CACvC,GAAI,CAACX,EAAM,GAAGY,CAAI,EAAID,EAAI,MAAM,GAAG,EAC/BE,EAAWvC,EAAM+B,EAAMvC,EAAUE,GAAagC,CAAI,GAAG,KAAK,EAI9D,GAAIA,EAAK,WAAW,IAAI,EAAG,CACzB,IAAIc,EAAOd,EAAK,MAAM,CAAC,EACrBX,EAAKd,GACHC,EAEEiC,GAAU,EAAKM,GAAKF,EAAStB,EAAQF,IAAOX,EAAKW,GAAI0B,CAAC,CAAC,EACpDA,IAAMT,GAAQP,EAAqCO,EAAhCS,IAAKrC,EAAKmC,EAAStB,CAAK,EAAGwB,EAAC,GAASA,CAAC,EAAGnB,EAAI,EAAGA,EAAMW,GAAOR,EAAI,GAAKU,CAAM,EAAE,GACpG,CAAE,OAAQnB,CAAG,CACf,EACAsB,CAAI,EAER,OAAQI,IAAWA,EAAQN,IAAO,EAAGrB,EAAG,OAAO,iBAAiByB,EAAMzB,EAAIA,CAAE,EAAG,KAAO2B,IAAQ,EAAG3B,EAAG,OAAO,oBAAoByB,EAAMzB,CAAE,GACzI,CAEA,IAAIA,EAAI4B,EAASC,EAAQC,EAErBP,EAAK,QACPM,EAASzD,EAAO,EAAE,EAClB0D,EAAQ,GAGR9B,EAAKd,GAAUC,EAAGM,EAAS,IAAM,CACzB,EAAEoC,EAAO,QACbD,EAAUvD,EAAO,IAAM0D,IACrBF,EAAO,OAASC,EAAQ9B,EAAG,GACxB8B,EAAQD,EAAO,MAAOL,EAAStB,EAAO6B,CAAM,GAChD,EACH,CAAC,EAAG,CAAC,OAAQ9B,CAAE,CAAC,EAAGsB,CAAI,GAGzBvB,EAAKb,EAAG,IAAMyC,EAAUvD,EAAO,IAAOmD,EAAStB,EAAO6B,CAAM,CAAC,EAAG,CAAC,OAAQ9B,CAAG,CAAC,EAK/E,IAAI8B,GAAUtD,EAAUkC,CAAI,GAAKlC,EAAU,GAAG,GAAGuB,EAAG,OAAQE,EAAOc,EAAML,CAAI,EAG7E,GAAKoB,EAGL,OAAI9B,EAAGlC,CAAM,IAAGmC,EAAQD,EAAGlC,CAAM,GAEzB4D,IACNA,EAAQN,IAAO,EAEfrB,EAAG,EACH,KAEE2B,IAAQ,EAAGC,IAAU,EAAGC,IAAWA,EAAO,MAAQ,GAAIC,EAAQF,EAAU,OAG9E,EAAG,IAAI,CACR,EAGD,MAAO,IAAOrB,EAAMW,EAAM,CAAC,IAAI,CACjC,EAMapC,EAAOkD,IAClBA,EAAE,UAAYhD,GAAUgD,EAAE,SAC1BA,EAAE,SAAW7D,EAAS6D,EAAE,QACxBA,EAAE,SAAW5D,EAAS4D,EAAE,QACxBA,EAAE,SAAW3D,EAAS2D,EAAE,QACxBA,EAAE,WAAa1D,GAAW0D,EAAE,UAC5BA,EAAE,QAAUzD,EAAQyD,EAAE,OACtBA,EAAE,YAAcxD,EAAYwD,EAAE,YAOnBjD,GAAQ,CAACkD,EAAO,SAAS,KAAMC,IAAW,CACrD,IAAMhC,EAAQC,EAAM+B,CAAM,EAC1B,OAAAtD,GAAMqD,EAAM/B,CAAK,EACN,IAAI,iBAAiBiC,GAAa,CAC3C,QAAWC,KAAKD,EACd,QAAWlC,KAAMmC,EAAE,WACjB,GAAInC,EAAG,WAAa,GAAKA,EAAGlC,CAAM,IAAM,QACtC,QAAWwB,KAAQU,EAAG,WACpB,GAAIV,EAAK,KAAK,WAAWpB,CAAM,EAAG,CAChC8D,EAAK/D,EAAI,EAAE+B,CAAE,EAAG,KAClB,EAMV,CAAC,EACE,QAAQgC,EAAM,CAAE,UAAW,GAAM,QAAS,EAAK,CAAC,EAC5C/B,CACT,EAeajB,EAAQ,CAAC+B,EAAMqB,EAASC,IAAQ,CAC3C,GAAIA,EAAMrD,EAAM,MAAM+B,CAAI,EAAG,OAAOsB,EAEpC,IAAIC,EAAQvB,EAAK,KAAK,GAAK,YACvBqB,IAASE,EAAQF,EAAQE,CAAK,GAG9B,oBAAoB,KAAKA,CAAK,GAAK,cAAc,KAAKA,CAAK,IAC1DA,EAAQ,UAAUA,CAAK,IAGxB,YAAY,KAAKA,CAAK,IAAGA,EAAQ,sBAAsBA,CAAK,SAGhE,GAAI,CACFD,EAAMtD,GAAQuD,CAAK,EACnB,OAAO,eAAeD,EAAK,OAAQ,CAAC,MAAO,UAAKtB,CAAI,EAAE,CAAC,CACzD,OAASU,EAAG,CAAE,QAAQ,MAAM,UAAKA,CAAC;AAAA;AAAA,EAAOvD,EAASQ,EAAU,KAAKqC,CAAI,GAAG,CAAE,CAG1E,OAAO/B,EAAM,MAAM+B,CAAI,EAAI,CAACd,EAAOsC,EAAIC,IAAS,CAC9C,GAAI,CACF,IAAIC,EAASJ,IAAMpC,CAAK,EAExB,OAAIsC,GAAWE,GAAQ,KAAOA,EAAO,KAAKC,GAAKF,EAAOD,EAAGG,CAAC,CAAC,EAAIF,EAAOD,EAAGE,CAAM,EAAG,IAAMrD,EAAKoD,CAAI,GACrFC,CACd,OAAShB,EAAG,CACV,QAAQ,MAAM,UAAKA,CAAC;AAAA;AAAA,EAAOvD,EAASQ,EAAU,KAAKqC,CAAI,GAAG,CAC5D,CACF,CACF,EACA/B,EAAM,MAAQ,CAAC,EAITC,GAAY,CAACc,EAAIuB,IAAS,CAC9B,KAAOA,EAAK,QAAQ,CAClB,GAAI,CAACZ,EAAM,GAAGiC,CAAM,EAAIrB,EAAK,IAAI,EAAE,MAAM,GAAG,EAC5CvB,EAAKb,EAAGT,EAASiC,CAAI,IAAIX,EAAI,GAAG4C,CAAM,GAAK5C,EAAIA,CAAE,CACnD,CACA,OAAOA,CACT,EAGMb,EAAK,CAAC0D,EAAGC,IAAM,CAAE,GAAID,GAAKC,EAAG,QAASC,KAAKD,EAAID,EAAAE,KAAAF,EAAAE,GAASD,EAAEC,CAAC,GAAI,OAAOF,CAAE,EAGjEzD,EAAQ4D,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,CAEL,WAAAG,EACA,QAAAH,EACA,OAAQ,IAAMA,EAAQ,OAAO,GAAGG,CAAU,EAC1C,YAAYnD,EAAI,CACVA,IAAOkD,IACXA,EAAI,OAAOlD,CAAE,EACbgD,EAAQ,OAAO,GAAGG,CAAU,EAC9B,EACA,WAAAF,EACA,gBAAgBvC,EAAM,CAAEuC,EAAW,OAAOA,EAAW,UAAUL,GAAKA,EAAE,OAASlC,CAAI,EAAG,CAAC,CAAE,CAE3F,CACF,EAGatB,EAAO,CAACsD,EAAGU,IAAQ,OAAOV,GAAM,WAAaA,EAAEU,CAAG,EAAIV,EAGtDrD,GAAYgC,GAAQA,EAAI,QAAQ,mCAAoC,CAACgC,EAAO5C,KAAOA,EAAI,IAAM,IAAM4C,EAAM,YAAY,CAAC,EAGtH/D,EAAO,CAACU,EAAIU,EAAMgC,IAAOA,GAAK,MAAQA,IAAM,GAAS1C,EAAG,gBAAgBU,CAAI,EAAIV,EAAG,aAAaU,EAAMgC,IAAM,GAAO,GAAKA,CAAC,EAGzHnD,GAAO,CAAC+D,EAAGd,EAAO,CAAC,IAAOc,EAAS,OAAOA,GAAM,SAAWA,GACtE,MAAM,QAAQA,CAAC,EAAIA,EAAE,IAAI/D,EAAI,EAC3B,OAAO,QAAQ+D,CAAC,EAAE,OAAO,CAACvB,EAAG,CAACe,EAAGJ,CAAC,IAAOA,EAAQ,CAAC,GAAGX,EAAGe,CAAC,EAAZf,EAAe,CAAC,CAAC,GAChE,KAAK,GAAG,EAHiC,GAM9BvC,EAAW,CAACO,EAAIwD,EAAW,iBAAmB,CACzD,IAAIC,EAAW,EACTC,EAAahC,GAAM,CAClB+B,MAAYzD,EAAG0B,CAAC,EAAG8B,EAAS,CAACG,EAASF,EAAW,KACpDA,EAAW,EAAGE,GAAUD,EAAUhC,CAAC,EACpC,EACH,EACA,OAAOgC,CACT,EAEahE,GAAW,CAACM,EAAIwD,EAAW,eAAgBI,EAAS,IAAM,CAACP,EAAKI,EAAS,EAAEG,IAAWJ,EAAS,IAAOC,GAAYG,GAAU5D,EAAGqD,CAAG,CAAE,EAI1I1D,EAAQf,KCtTf,IAKaiF,EAEXC,EAEAC,GAGEC,GAISC,EAuFPC,GAqEAC,EAGAC,GA2BCC,EA1MPC,EAAAC,EAAA,KACAC,IAIaX,EAAW,OAAO,SAAS,EAEtCC,EAAU,OAAO,QAAQ,EAEzBC,GAAO,OAAO,KAAK,EAGjBC,GAAU,GAIDC,EAAQ,CAACQ,EAAQC,IAAW,CAQvC,GAPI,CAACD,GAIDA,EAAO,OAAO,WAAW,GAGzBA,EAAOZ,CAAQ,EAAG,OAAOY,EAG7B,GAAIA,EAAO,cAAgB,OAAQ,OAAO,MAAM,QAAQA,CAAM,EAAIP,GAAKO,CAAM,EAAIA,EAGjF,IAAIE,EAAW,OAAO,KAAKF,CAAM,EAAE,OACjCG,EAAU,CAAC,EAGTC,EAAQ,IAAI,MAAM,OAAO,OAAOD,EAAS,CAC3C,CAACd,CAAO,EAAGgB,EAAOH,CAAQ,EAC1B,CAACd,CAAQ,EAAGe,CACd,CAAC,EAAG,CACF,IAAK,CAACG,EAAGC,IAEHA,KAAKJ,EAAiBA,EAAQI,CAAC,EAAIJ,EAAQI,CAAC,EAAE,QAAQ,EAAIJ,EAAQI,CAAC,EAChEN,EAASA,EAAOM,CAAC,EAAI,WAAWA,CAAC,EAG1C,IAAK,CAACD,EAAGC,EAAGC,EAAGC,IAETF,KAAKJ,GAAgBR,GAAIQ,EAASI,EAAGC,CAAC,EAAG,IAG7CjB,GAAU,GAINU,GAAUM,KAAKN,EACjBA,EAAOM,CAAC,EAAIC,GAIZd,EAAOS,EAASI,EAAGC,CAAC,EACpBL,EAAQd,CAAO,EAAE,MAAQ,EAAEa,GAG7BX,GAAU,GAIH,GAIT,eAAgB,CAACe,EAAGC,KAClBA,KAAKJ,IAAYI,EAAE,CAAC,GAAK,KAAOJ,EAAQI,CAAC,IAAI,OAAO,OAAO,IAAI,EAAG,OAAOJ,EAAQI,CAAC,EAAGJ,EAAQd,CAAO,EAAE,MAAQ,EAAEa,GACzG,GAIT,QAAS,KAAOC,EAAQd,CAAO,EAAE,MAAO,QAAQ,QAAQc,CAAO,GAG/D,IAAK,CAACG,EAAGC,IACHA,KAAKJ,EAAgB,GACrBF,EAAeM,KAAKN,EACjBV,EAEX,CAAC,EAGKmB,EAAQ,OAAO,0BAA0BV,CAAM,EAErD,QAASO,KAAKP,EAERU,EAAMH,CAAC,GAAG,KAEXJ,EAAQI,CAAC,EAAII,GAASD,EAAMH,CAAC,EAAE,IAAI,KAAKH,CAAK,CAAC,GAAGd,EAAI,EAAIoB,EAAMH,CAAC,EAAE,KAAK,KAAKH,CAAK,EAG/EV,EAAOS,EAASI,EAAGP,EAAOO,CAAC,CAAC,EAGnC,OAAOH,CACT,EAGMX,GAAO,CAACO,EAAQC,EAAS,aAAe,CAG5C,IAAIE,EAAU,MAAMH,EAAO,MAAM,EAAE,KAAK,IAAI,EAG1CY,EAAQ,GAGRC,EAAMC,GAAM,UAAY,CAAE,OAAAF,EAAQ,GAAaE,EAAG,MAAM,KAAM,SAAS,CAAG,EAE1EC,EAASV,EAAOL,EAAO,MAAM,EAG7BI,EAAQ,IAAI,MACV,OAAO,OAAOD,EAAS,CACrB,CAACd,CAAO,EAAG0B,EACX,CAAC3B,CAAQ,EAAGe,EAEZ,KAAMU,EAAIV,EAAQ,IAAI,EACtB,IAAKU,EAAIV,EAAQ,GAAG,EACpB,MAAOU,EAAIV,EAAQ,KAAK,EACxB,QAASU,EAAIV,EAAQ,OAAO,EAC5B,OAAQU,EAAIV,EAAQ,MAAM,CAC5B,CAAC,EACD,CACE,IAAIG,EAAGC,EAAG,CAKR,OAAIA,IAAM,SAAiBK,GAASA,EAAQ,GAAOT,EAAQ,QAAUY,EAAO,MAGxE,OAAOR,GAAM,UAAY,MAAMA,CAAC,EAAUJ,EAAQI,CAAC,GAAG,QAAQ,GAAKN,EAAOM,CAAC,GAIvEJ,EAAAI,KAAAJ,EAAAI,GAAeF,EAAOb,EAAMQ,EAAOO,CAAC,CAAC,CAAC,IAAG,QAAQ,CAC3D,EAEA,IAAID,EAAGC,EAAGC,EAAG,CAIX,GAAID,IAAM,SAAU,CAElB,QAASS,EAAIR,EAAGQ,EAAIb,EAAQ,OAAQa,IAAK,OAAOZ,EAAMY,CAAC,EAEvDD,EAAO,MAAQZ,EAAQ,OAASK,CAClC,MAGSD,GAAKJ,EAAQ,QAAQT,EAAOS,EAASI,EAAGC,CAAC,EAAGJ,EAAM,OAAS,CAACG,EAAI,GAGpEJ,EAAQI,CAAC,EAAIZ,GAAIQ,EAASI,EAAGC,CAAC,EAAId,EAAOS,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,EAGMV,EAAS,CAACS,EAASI,EAAGC,IAAOL,EAAQI,CAAC,EAAKA,EAAE,CAAC,GAAK,KAAOC,GAAG,KAAQA,EAAIH,EAAOb,EAAMgB,CAAC,CAAC,EAGxFb,GAAM,CAACQ,EAASI,EAAGC,EAAGC,EAAIQ,IAEvBV,EAAE,CAAC,IAAM,IAAOJ,EAAQI,CAAC,EAAIC,EACjCA,KAAOS,GAAMR,EAAKN,EAAQI,CAAC,GAAG,KAAK,KAElCE,EAAGnB,EAAI,EAAImB,EAAGnB,EAAI,EAAEkB,CAAC,EAEnB,MAAM,QAAQA,CAAC,GAAK,MAAM,QAAQS,CAAE,EAIlC5B,KAAW4B,EACTC,EAAU,IAAMC,EAAM,IAAM,CAC1B,QAAS,EAAI,EAAG,EAAIX,EAAE,OAAQ,IAAKS,EAAG,CAAC,EAAIT,EAAE,CAAC,EAC9CS,EAAG,OAAST,EAAE,MAChB,CAAC,CAAC,EACDC,EAAG,MAAQD,EAEbC,EAAG,MAAQjB,EAAMgB,CAAC,GAStBZ,EAAQJ,IC1Mf,IACI4B,EAASC,GAAWC,EAIXC,GAgBAC,GAeAC,GAWAC,GAMAC,GArDbC,GAAAC,EAAA,KACaR,GAAQ,EAIRE,GAAS,CAACO,EAAGC,EAAIC,EAAO,IAAI,IAAKC,EAAK,IAAMF,EAAG,QAC1DA,EAAK,CACH,IAAI,OAAQ,CACV,OAAAX,GAAS,KAAK,KAAKY,EAAK,IAAIZ,CAAO,CAAC,EAC7BU,CACT,EACA,IAAI,MAAMI,EAAK,CACb,GAAIA,IAAQJ,EACZ,CAAAA,EAAII,EACJ,QAASC,KAAOH,EAAMV,EAAUA,EAAQ,IAAIa,CAAG,EAAIA,EAAI,EACzD,EACA,MAAO,CAAE,OAAOL,CAAE,EAClB,OAAQG,EAAI,KAAMA,EAAI,SAAUA,EAAI,QAASA,CAC/C,EAGWT,GAAS,CAACY,EAAIC,EAAWC,EAAKC,EAAOC,KAChDF,EAAOG,GAAS,CAKd,GAJAD,EAAQH,EACRA,EAAY,KACZG,GAAO,OAAO,EACdC,EAAOrB,EAASA,EAAUkB,EACtBjB,KAAU,GAAI,KAAM,iBACxB,GAAI,CAAEgB,EAAYD,EAAG,CAAG,QAAE,CAAUhB,EAAUqB,EAAMpB,IAAQ,CAC9D,EACAkB,EAAQD,EAAI,KAAO,CAAC,EAEpBA,EAAI,EACHI,GAAQ,CAAuB,IAArBL,GAAW,OAAO,EAAUK,EAAMH,EAAM,IAAI,GAAGG,EAAI,OAAOJ,CAAG,CAAG,GAGhEb,GAAW,CAACW,EAAIL,EAAKR,GAAO,EAAGoB,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,KAAMA,EAAI,SAAUA,EAAI,QAASA,CAC/C,EAGWP,GAAQ,CAACU,EAAIS,EAAS,CAACvB,IAAY,CAC9CA,MAAY,IAAI,KAChB,GAAI,CAAEc,EAAG,CAAG,QACZ,CAAU,GAAIS,EAAQ,CAAE,QAAWC,KAAMxB,EAASwB,EAAG,EAAGxB,EAAU,IAAK,CAAE,CAC3E,EAEaK,GAAY,CAACS,EAAIW,EAAOd,KAAQc,EAAQ3B,EAASA,EAAU,KAAMa,EAAKG,EAAG,EAAGhB,EAAU2B,EAAOd,KCrD1G,IAIOe,GAJPC,GAAAC,EAAA,KACAC,IAGOH,GAAQ,CAACI,EAAIC,EAAOC,EAASC,EAAKC,IAAW,CAJpD,IAAAC,EAOE,OAAKL,EAAG,QA8BHM,EAAMH,EAAMH,EAAIC,CAAK,GA5BxBD,EAAAK,EAAGE,KAAHP,EAAAK,GAAe,MAEfF,EAAMH,EAAG,QAAUQ,EAAKR,CAAE,EAAIA,EAE9BA,EAAG,YAAYE,EAAU,SAAS,eAAe,EAAE,CAAC,EACpDC,EAAI,QAAUD,EAAQ,QAAUA,EAGhCA,EAAQ,SAAW,CAACC,EAAI,QAAU,CAACA,EAAK,EAAK,CAAC,EAE9CD,EAAQ,OAASO,EAAS,IAAM,CAC9B,IAAIC,EAAQR,EAAQ,SAAS,KAAK,CAAC,CAAC,CAAES,CAAC,IAAMA,CAAC,EAG1CD,GAASN,IAEXA,IAAS,CAAC,EAAE,OAAO,EACnBA,IAAS,CAAC,EAAEQ,CAAI,IAAI,GAChBR,EAASM,KACXR,EAAQ,OAAOE,EAAO,CAAC,EAAE,SAAWA,EAAO,CAAC,CAAC,EAE5CA,EAAO,CAAC,EAAEG,CAAM,EAA0DH,EAAO,CAAC,EAAES,CAAG,IAAI,GAAtE,OAAOT,EAAO,CAAC,EAAEG,CAAM,EAAGD,EAAMF,EAAO,CAAC,EAAGH,CAAK,IAI5E,CAAC,GAOIa,GAAS,CAEdX,EAAI,QAAQ,CAAC,EAAIW,EACjBX,EAAI,QAAQ,OAAO,CACrB,CACF,IC9CA,IAIOY,GAJPC,GAAAC,EAAA,KAAAC,IAIOH,GAAQ,CAACI,EAAIC,EAAOC,EAAKC,EAAGC,EAAMJ,IAAO,CAM9C,IAHAE,EAAMF,EAAG,QAAUK,EAAKL,CAAE,EAAIA,EAGvBI,GAAS,EAAEF,EAAI,QAAUE,EAAM,UAAUA,EAAQA,EAAM,gBAE9D,OAAAJ,EAAG,OAAO,EACVA,EAAGM,CAAM,EAAI,KAEbJ,EAAI,QAAQ,SAAS,KAAKA,EAAI,QAAU,CAACA,EAAK,EAAI,CAAC,EAE5CA,EAAI,QAAQ,MACrB,IClBA,IAEOK,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQI,IAEbA,EAAG,SAAWA,EAAG,YAAYA,EAAKC,EAAKD,CAAE,EAAE,WAAW,CAAC,CAAC,EACxDE,IAAMA,EAAIC,EAAKD,EAAGF,EAAG,WAAW,EAAGA,EAAG,YAAcE,GAAY,OCLlE,IAEOE,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQ,CAACI,EAAIC,EAAMC,KACxBD,EAAO,IAAI,IACVE,GAAM,CACLD,EAAO,IAAI,IACPC,GAAGC,GAAKC,EAAKF,EAAGH,EAAG,SAAS,CAAC,EAAE,MAAM,GAAG,EAAE,IAAIM,GAAKA,GAAKJ,EAAK,IAAII,CAAC,CAAC,EACvE,QAASA,KAAKL,EAAUC,EAAK,IAAII,CAAC,EAAGJ,EAAK,OAAOI,CAAC,EAAQN,EAAG,UAAU,OAAOM,CAAC,EAC/E,QAASA,KAAKL,EAAOC,EAAMF,EAAG,UAAU,IAAIM,CAAC,CAC/C,KCTF,IAEOC,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQ,CAACI,EAAIC,KAClBA,EAAUD,EAAG,aAAa,OAAO,EACjCE,GAAK,CAEH,GADAA,EAAIC,EAAKD,EAAGF,EAAG,KAAK,EAChB,OAAOE,GAAM,SAAUE,EAAKJ,EAAI,QAASC,EAAU,KAAOC,CAAC,MAC1D,CACCD,GAASG,EAAKJ,EAAI,QAASC,CAAO,EAEtC,QAASI,KAAKH,EAAGG,EAAE,CAAC,GAAK,IAAML,EAAG,MAAM,YAAYK,EAAGH,EAAEG,CAAC,CAAC,EAAIA,EAAE,CAAC,EAAI,MAAQL,EAAG,MAAMK,CAAC,EAAIH,EAAEG,CAAC,EACjG,CACF,KCZF,IAEOC,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQ,IAAMI,ICFrB,IAIaC,GAKNC,GATPC,GAAAC,EAAA,KAAAC,IAIaJ,GAAS,CAACK,EAAMC,EAAOC,EAAM,GAAGF,CAAI,KAAK,IAAM,CAACG,EAAQC,IAAU,CAE7ED,EAAO,GAAKC,EAAOH,EAAKE,CAAM,EAAG,OAAOA,EAAO,EACjD,EAEOP,GAAQ,CAACS,EAAIC,EAAON,EAAMO,IAAS,CAExC,GAAI,CACF,IAAMC,EAAMb,GAAOK,CAAI,EACjBS,EAAeJ,EAAG,OAAS,WAAa,IAAMG,EAAIF,EAAOD,EAAG,OAAO,EACvEA,EAAG,OAAS,kBAAoB,IAAMG,EAAIF,EAAO,CAAC,GAAGD,EAAG,eAAe,EAAE,IAAIK,GAAKA,EAAE,KAAK,CAAC,EACxF,IAAMF,EAAIF,EAAOD,EAAG,cAAgB,EAAI,KAAOA,EAAG,KAAK,EAE3DA,EAAG,QAAUA,EAAG,SAAWI,EAEvBJ,EAAG,MAAM,WAAW,QAAQ,IAE9B,IAAI,iBAAiBI,CAAY,EAAE,QAAQJ,EAAI,CAAE,UAAW,GAAM,QAAS,GAAM,WAAY,EAAK,CAAC,EAGnGM,EAAMN,EAAIC,CAAK,GAIjBJ,EAAMF,CAAI,EAAEM,CAAK,GAAKG,EAAa,CACrC,MAAQ,CAAE,CAEV,OAAQJ,EAAG,OAAS,QAAUA,EAAG,OAAS,GACvCD,GAAUC,EAAG,aAAa,QAAUA,EAAG,MAAQD,GAAgB,EAAW,EAC1EC,EAAG,UAAY,YAAcA,EAAG,OAAS,QAAUA,EAAG,OAAS,GAC9D,CAACD,EAAOQ,EAAMC,KAEXD,EAAOP,EAAG,eACVQ,EAAKR,EAAG,aACTA,EAAG,aAAa,QAAUA,EAAG,MAAQD,GAAgB,EAAW,EAChEQ,GAAQP,EAAG,kBAAkBO,EAAMC,CAAE,GAEtCR,EAAG,OAAS,WACVD,IAAWC,EAAG,QAAUD,EAAOU,EAAKT,EAAI,UAAWD,CAAK,GACxDC,EAAG,OAAS,QAAYD,GACvBC,EAAG,QAAUD,IAAWC,EAAG,QAAUD,EAAQU,EAAKT,EAAI,UAAWD,CAAK,GAErEC,EAAG,OAAS,aACVD,GAAU,CACT,QAASM,KAAKL,EAAG,QACfK,EAAE,OAASN,EAAQM,EAAE,aAAa,WAAY,EAAE,EAAIA,EAAE,gBAAgB,UAAU,EAClFL,EAAG,MAAQD,CACb,EACCC,EAAG,OAAS,kBAAsBD,GAAU,CAC3C,QAASM,KAAKL,EAAG,QAASK,EAAE,gBAAgB,UAAU,EACtD,QAASK,KAAKX,EAAOC,EAAG,cAAc,WAAWU,CAAC,IAAI,EAAE,aAAa,WAAY,EAAE,CACrF,EACGX,GAAWC,EAAG,MAAQD,CACrC,ICzDA,IAGOY,GAHPC,GAAAC,EAAA,KAAAC,IAGOH,GAAQ,CAACI,EAAIC,EAAOC,EAAMC,EAAMC,EAAOC,IAAS,CAErD,GAAI,OAAOC,EAAMJ,CAAI,EAAED,CAAK,GAAK,WAAY,OAAOM,GAAMA,EAAEP,CAAE,EAI9D,OAAO,eAAeC,EAAOC,EAAM,CAAE,MAAOF,EAAI,aAAc,EAAK,CAAC,CACtE,ICVA,IAEOQ,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQ,CAACI,EAAIC,IAAc,CAGhC,IAAIC,EAAWF,EAAGG,CAAM,EAAIC,EAAM,CAAC,EAAGH,CAAS,EAAGI,EAAO,GAIzD,OAAOC,GAAU,CAKf,GAJAA,EAASC,EAAKD,EAAQJ,CAAQ,EAI1BI,IAAWJ,EACb,QAASM,KAAKF,EAAQ,CAEpB,IAAIG,EAAI,OAAOH,EAAOE,CAAC,GAAM,WAAaF,EAAOE,CAAC,EAAE,KAAKN,CAAQ,EAAII,EAAOE,CAAC,EAEzEA,KAAKN,EAASQ,CAAQ,EAAGR,EAASM,CAAC,EAAIC,EAErCP,EAASQ,CAAQ,EAAEF,CAAC,EAAKA,EAAE,CAAC,GAAK,KAAOC,GAAG,KAAQA,EAAIE,EAAOP,EAAMK,CAAC,CAAC,CAC9E,CAIF,MAAO,CAACJ,IAASA,EAAO,GAAM,OAAOL,EAAGG,CAAM,EAAGS,EAAU,IAAMC,EAAMb,EAAIE,CAAQ,CAAC,EACtF,CACF,IC5BA,IAEMY,GAuFCC,GAzFPC,GAAAC,EAAA,KAAAC,IAEMJ,GAAO,CAACK,EAAKC,EAAOC,IAAS,CACjC,GAAI,CAACC,EAASC,EAAS,GAAG,EAAIF,EAAK,MAAM,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,SAAU,EAAE,EAAE,MAAM,SAAS,EAG9FG,EAAS,SAAS,eAAe,EAAE,EAGnCC,EAAKC,EAAMC,EAAOC,EAAQ,EAG1BC,EAASC,EAAS,IAAM,CAZ9B,IAAAC,EAAAC,EAaI,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,CAGA,GAAIO,EAAOP,EAAOH,EAAI,OAASU,MAG1B,CAEH,GAAI,CAACV,EAAKA,EAAMS,MAEX,MAAOD,EAAIL,GAAOH,EAAIQ,CAAC,EAAIC,EAASD,GAAG,EAG5C,KAAOA,EAAIE,EAAMF,IAAK,CACpBR,EAAIQ,CAAC,EAAIC,EAASD,CAAC,EAEnB,IAAIM,EAAMN,EAQVO,EAAW,OAAO,OAAOpB,EAAO,CAC9B,CAACE,CAAO,EAAG,CAAE,IAAK,IAAMG,EAAIc,CAAG,CAAE,EACjC,CAAChB,CAAM,EAAG,CAAE,MAAOG,EAAOA,EAAKa,CAAG,EAAIA,CAAI,CAC5C,CAAC,EAEGE,EAAKtB,EAAI,QAAUuB,EAAKvB,CAAG,EAAIA,EAAI,UAAU,EAAI,EAErDK,EAAO,OAAOiB,EAAG,SAAWA,CAAE,EAE9BE,EAAMF,EAAID,CAAQ,EAGlB,IAAII,IAAUZ,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,CACvCW,IAAQ,EAAGH,EAAG,OAAO,OAAO,IAAI,EAAGA,EAAG,OAAO,CAC/C,CACF,CACF,CAEAb,EAAQO,CACV,CAAC,EAED,OAAAhB,EAAI,YAAYK,CAAM,EACtBL,EAAI0B,CAAM,EAAI,KAEPC,IAELpB,EAAO,KACH,OAAOoB,GAAU,SAAUnB,EAAQ,MAAM,KAAK,CAAE,OAAQmB,CAAM,EAAG,CAACC,EAAGd,IAAMA,EAAI,CAAC,EAC3Ea,GAAO,cAAgB,QAAQpB,EAAO,OAAO,KAAKoB,CAAK,EAAGnB,EAAQ,OAAO,OAAOmB,CAAK,GACzFnB,EAAQmB,GAAS,CAAC,EAGhBE,EAAO,IAAM,CAElBrB,EAAMS,CAAO,GAAG,MAGhBP,EAAO,CACT,CAAC,EAEL,EAGAf,GAAK,MAASmC,GAAQA,EAAI,MAAM,QAAQ,EAAE,CAAC,EAAE,KAAK,EAE3ClC,GAAQD,KCzFf,IAEOoC,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAAQ,CAACI,EAAIC,EAAIC,EAAIC,IAASC,GAAKC,EAAKL,EAAIG,EAAMG,EAAKF,EAAGJ,EAAG,aAAaG,CAAI,CAAC,CAAC,ICFvF,IAEOI,GAFPC,GAAAC,EAAA,KAAAC,IAEOH,GAASI,GAAWC,GAAS,CAAE,QAASC,KAAOD,EAAOE,EAAKH,EAAQI,GAASF,CAAG,EAAGD,EAAMC,CAAG,CAAC,CAAE,ICFrG,IAAAG,GAAA,GAAAC,GAAAD,GAAA,WAAAE,GAAA,aAAAC,GAAA,YAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,UAAAC,EAAA,UAAAC,GAAA,UAAAC,EAAA,cAAAC,GAAA,QAAAC,IAAA,IAiGMC,GAmCCR,GApIPS,GAAAC,EAAA,KAAAC,IACAC,KACAC,IAEAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KAGA,OAAO,OAAOC,EAAW,CAEvB,IAAKC,GAML,GAAIC,GAGJ,MAAOC,GAGP,KAAMC,GAGN,MAAOC,GAGP,GAAIC,GAGJ,MAAOC,GAGP,IAAKC,GAGL,MAAOC,GAEP,GAAIC,GACJ,KAAMC,GAGN,KAAMC,EACR,CAAC,EAED,OAAO,OAAOC,EAAU,CACtB,SAAU,CAACC,EACTC,EAAO,IACPC,EAAYD,IAAS,OAAS,eAAiBA,IAAS,MAAQ,sBAAwBA,IAAS,OAAS,oBAAwBD,GAAO,WAAWA,EAAIC,CAAI,EAC5JE,EAAS,IAETC,GAASJ,EAAIE,CAAS,EAExB,SAAU,CAACF,EAAIC,EAAO,IAAKC,EAAYD,IAAS,OAAS,eAAiBA,IAAS,MAAQ,sBAA0BD,GAAO,WAAWA,EAAIC,CAAI,IAC7II,EAASL,EAAIE,CAAS,EAGxB,KAAM,CAACF,EAAIM,EAAOC,IAAQ,OAAO,OAAQC,GAAM,CAACF,IAAUA,EAAQ,EAAGN,EAAGQ,CAAC,GAAI,CAAE,KAAM,EAAK,CAAC,EAI3F,QAAUR,GAAQQ,IAAOA,GAAG,eAAe,EAAGR,EAAGQ,CAAC,GAClD,KAAOR,GAAQQ,IAAOA,GAAG,gBAAgB,EAAGR,EAAGQ,CAAC,GAChD,UAAYR,GAAQQ,IAAOA,GAAG,yBAAyB,EAAGR,EAAGQ,CAAC,GAG9D,QAASR,IAAOA,EAAG,QAAU,GAAMA,GACnC,QAASA,IAAOA,EAAG,QAAU,GAAMA,GAGnC,OAAQA,IAAOA,EAAG,OAASA,EAAG,OAAO,cAAc,YAAaA,GAChE,SAAUA,IAAOA,EAAG,OAASA,EAAG,OAAO,cAAeA,GACtD,KAAMA,IAAOA,EAAG,OAASA,EAAG,OAAO,cAAc,gBAAiBA,GAClE,KAAMA,IAAOA,EAAG,OAASA,EAAG,OAAO,cAAc,KAAMA,GACvD,OAAQA,IAAOA,EAAG,OAASA,EAAG,OAAO,WAAYA,GAGjD,KAAOA,GAAQQ,GAAOA,EAAE,SAAWR,EAAG,QAAUA,EAAGQ,CAAC,EAEpD,QAAUR,GAAO,CAACQ,EAAGC,KACnBA,EAAUT,EAAG,OACb,CAACS,EAAQ,SAASD,EAAE,MAAM,GAAKA,EAAE,OAAO,cAAgBC,EAAQ,aAAeA,EAAQ,cAE3F,CAAC,EAGKzC,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,QAAU,EAAE,MAAQ,UACtD,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,EAGA,QAAS0C,KAAK1C,GAAM+B,EAASW,CAAC,EAAI,CAACV,KAAOW,IAAYH,GAAMxC,GAAK0C,CAAC,EAAEF,CAAC,GAAKG,EAAO,MAAMD,GAAK1C,GAAK0C,CAAC,IAAIF,CAAC,GAAKA,EAAE,MAAQE,CAAC,GAAKV,EAAGQ,CAAC,EAEhIzC,EAAI,CACF,QAAS6C,GACAjD,EAAM,YAAY,yBAAyBiD,CAAI,IAAI,EAI5D,OAAAlD,GAAQ,OAAAD,GAAQ,SAAAF,GAAU,MAAAD,GAAO,UAAAQ,EACnC,CAAC,EAGDH,EAAM,IAAMI,EACZJ,EAAM,MAAQE,EACdF,EAAM,UAAYuB,EAClBvB,EAAM,SAAWoC,EACjBpC,EAAM,MAAQC,GAEPJ,GAAQG,ICpIf,IAAIkD,GAAQ,cAAsB,QAAS,OAAO,QAAUA,GAAO,IAAIC,EAAM,SAAS,cAClFC,GAASD,EAAI,aAAa,QAAQ,GAAKA,EAAI,QAAQ,QAAUA,EAAI,QAAQ,YACzEE,EAAQF,EAAI,aAAa,OAAO,GAAKA,EAAI,QAAQ,OAASA,EAAI,QAAQ,WACtEC,IAAQF,GAAM,IAAI,CAAE,OAAAE,EAAO,CAAC,EAC5BC,GAAS,MAAQA,IAAU,UAAUA,GAASA,IAAU,OAAS,SAAS,iBAAiBA,CAAK,EAAI,CAAC,SAAS,IAAI,GAAG,QAAQC,GAAMJ,GAAM,MAAMI,CAAE,CAAC",
6
+ "names": ["package_default", "init_package", "__esmMin", "_dispose", "_state", "_on", "_off", "_add", "prefix", "signal", "effect", "computed", "batch", "untracked", "directive", "modifier", "currentDir", "sprae", "initDirective", "use", "start", "compile", "parse", "applyMods", "sx", "frag", "call", "dashcase", "attr", "clsx", "throttle", "debounce", "core_default", "init_core", "__esmMin", "init_store", "init_package", "fn", "el", "state", "store_default", "fx", "offs", "on", "off", "add", "_attrs", "i", "name", "value", "child", "package_default", "dirName", "expr", "cur", "steps", "step", "length", "prev", "str", "mods", "evaluate", "type", "e", "_poff", "dispose", "change", "count", "update", "s", "root", "values", "mutations", "m", "prepare", "_fn", "_expr", "cb", "_out", "result", "v", "params", "a", "b", "k", "tpl", "content", "attributes", "ref", "childNodes", "arg", "match", "c", "schedule", "_planned", "throttled", "_dirty", "_count", "_signals", "_change", "_set", "sandbox", "store", "list", "create", "set", "store_default", "init_store", "__esmMin", "init_core", "values", "parent", "keyCount", "signals", "state", "signal", "_", "k", "v", "_s", "descs", "computed", "isMut", "mut", "fn", "length", "i", "_v", "untracked", "batch", "current", "depth", "batched", "signal", "effect", "computed", "batch", "untracked", "init_signal", "__esmMin", "v", "_s", "_obs", "_v", "val", "sub", "fn", "_teardown", "_fx", "_deps", "__tmp", "prev", "dep", "_c", "_e", "_first", "fx", "_prev", "if_default", "init_if", "__esmMin", "init_core", "el", "state", "_holder", "_el", "_match", "_a", "core_default", "_state", "frag", "throttle", "match", "s", "_off", "_on", "value", "else_default", "init_else", "__esmMin", "init_core", "el", "state", "_el", "_", "_prev", "frag", "_state", "text_default", "init_text", "__esmMin", "init_core", "el", "frag", "v", "call", "class_default", "init_class", "__esmMin", "init_core", "el", "_cur", "_new", "v", "clsx", "call", "c", "style_default", "init_style", "__esmMin", "init_core", "el", "_static", "v", "call", "attr", "k", "fx_default", "init_fx", "__esmMin", "init_core", "call", "setter", "value_default", "init_value", "__esmMin", "init_core", "expr", "_set", "parse", "target", "value", "el", "state", "name", "set", "handleChange", "o", "core_default", "from", "to", "attr", "v", "ref_default", "init_ref", "__esmMin", "init_core", "el", "state", "expr", "name", "_prev", "_set", "parse", "v", "scope_default", "init_scope", "__esmMin", "init_core", "el", "rootState", "subscope", "_state", "store", "init", "values", "call", "k", "v", "_signals", "signal", "untracked", "core_default", "each", "each_default", "init_each", "__esmMin", "init_core", "tpl", "state", "expr", "itemVar", "idxVar", "holder", "cur", "keys", "items", "prevl", "update", "throttle", "_a", "_b", "i", "newItems", "newl", "_change", "s", "_signals", "idx", "subscope", "el", "frag", "core_default", "_prev", "_state", "value", "_", "effect", "str", "default_default", "init_default", "__esmMin", "init_core", "el", "st", "ex", "name", "v", "attr", "call", "spread_default", "init_spread", "__esmMin", "init_core", "target", "value", "key", "attr", "dashcase", "sprae_exports", "__export", "batch", "computed", "sprae_default", "effect", "signal", "core_default", "start", "store_default", "untracked", "use", "keys", "init_sprae", "__esmMin", "init_store", "init_signal", "init_core", "init_if", "init_else", "init_text", "init_class", "init_style", "init_fx", "init_value", "init_ref", "init_scope", "init_each", "init_default", "init_spread", "directive", "default_default", "spread_default", "class_default", "text_default", "style_default", "fx_default", "value_default", "ref_default", "scope_default", "if_default", "else_default", "each_default", "modifier", "fn", "_how", "_schedule", "_count", "debounce", "throttle", "_done", "_fn", "e", "_target", "k", "params", "expr", "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.1.0",
4
+ "version": "12.2.0",
5
5
  "main": "./sprae.js",
6
6
  "module": "./sprae.js",
7
7
  "umd:main": "dist/sprae.umd.js",
package/readme.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ∴ spræ [![tests](https://github.com/dy/sprae/actions/workflows/node.js.yml/badge.svg)](https://github.com/dy/sprae/actions/workflows/node.js.yml) [![npm bundle size](https://img.shields.io/bundlephobia/minzip/sprae)](https://bundlephobia.com/package/sprae) [![npm](https://img.shields.io/npm/v/sprae?color=orange)](https://www.npmjs.com/package/sprae)
2
2
 
3
- Simple progressive enhancement for DOM or JSX.<br/>
3
+ <em>S</em>imple <em>pr</em>ogressive <em>æ</em>nhancement for DOM or JSX.<br/>
4
4
 
5
5
  <!-- [Usage](#usage) · [Directives](#directives) · [Modifiers](#modifiers) · [Store](#store) · [Signals](#signals) · [Evaluator](#evaluator) · [Start](#autoinit) · [JSX](#jsx) · [Build](#custom-build) · [Hints](#hints) · [Examples](#examples) -->
6
6
 
@@ -12,7 +12,7 @@ Simple progressive enhancement for DOM or JSX.<br/>
12
12
  <button :onclick="count++">Click me</button>
13
13
  </div>
14
14
 
15
- <script src="https://cdn.jsdelivr.net/npm/sprae@12.x.x" start></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/sprae@12.x.x/dist/sprae.umd.js" start></script>
16
16
  ```
17
17
 
18
18
  Sprae enables reactivity via `:`-directives.
@@ -341,9 +341,9 @@ Call only once.
341
341
  <div :fx.once="console.log('sprae init')">
342
342
  ```
343
343
 
344
- #### `.window`, `.document`, `.parent`, `.outside`, `.self`  <kbd>events only</kbd>
344
+ #### `.window`, `.document`, `.body`, `.root`, `.parent`, `.outside`, `.self`
345
345
 
346
- Specify event target.
346
+ Specify target.
347
347
 
348
348
  ```html
349
349
  <!-- close dropdown when click outside -->
@@ -351,6 +351,9 @@ Specify event target.
351
351
 
352
352
  <!-- interframe communication -->
353
353
  <div :onmessage.window="e => e.data.type === 'success' && complete()">...</div>
354
+
355
+ <!-- set css variable on document root element (<html>) -->
356
+ <main :style.root="{'--x': x}">...</main>
354
357
  ```
355
358
 
356
359
  #### `.passive`, `.capture`  <kbd>events only</kbd>
@@ -644,25 +647,24 @@ Micro sprae version is 2.5kb bundle with essentials:
644
647
 
645
648
  ## Justification
646
649
 
647
- Modern frontend is unhealthy, like processed non-organic food.
648
- Frameworks force into JS-land: build pipelines for "Hello World", proprietary conventions, virtual DOM overhead, brittle tooling.
649
- Pages are not functional without JS. Progressive enhancement is anachronism.
650
-
651
- Build tools should be optional, not mandatory. Frameworks should enhance HTML, not replace it.
650
+ Modern frontend is like processed food.
651
+ Frameworks come with endless tooling, tedious setups and configs, proprietary conventions, artificial abstractions and ecosystem lock-in. Progressive enhancement / graceful degradation is anachronism.
652
652
 
653
- Native [template-parts](https://github.com/github/template-parts) and [DCE](https://github.com/WICG/webcomponents/blob/gh-pages/proposals/Declarative-Custom-Elements-Strawman.md) give hope, but quite distant and stuck with HTML quirks [1](https://github.com/github/template-parts/issues/24), [2](https://github.com/github/template-parts/issues/25), [3](https://shopify.github.io/liquid/tags/template/#raw).
653
+ Native [template-parts](https://github.com/github/template-parts) and [DCE](https://github.com/WICG/webcomponents/blob/gh-pages/proposals/Declarative-Custom-Elements-Strawman.md) give distant hope, but stuck with HTML quirks [1](https://github.com/github/template-parts/issues/24), [2](https://github.com/github/template-parts/issues/25), [3](https://shopify.github.io/liquid/tags/template/#raw).
654
654
 
655
- [Alpine](https://github.com/alpinejs/alpine) and [petite-vue](https://github.com/vuejs/petite-vue) offer progressive enhancement, but introduce invalid syntax `@click`, bloated API, opaque reactivity, [self-encapsulation](https://github.com/alpinejs/alpine/discussions/3223), limited extensibility, size / performance afterthoughts.
655
+ [Alpine](https://github.com/alpinejs/alpine) and [petite-vue](https://github.com/vuejs/petite-vue) offer PE / GD, but have API inconsistencies (x-, @, $, etc.), tend to [self-encapsulate](https://github.com/alpinejs/alpine/discussions/3223), limit extensibility and disregard performance / size.
656
656
 
657
657
  _Sprae_ holds open, safe, minimalistic philosophy:
658
658
 
659
- * One `:` prefix. Valid HTML. Zero magic.
660
- * Signals reactivity. (preact-signals compatible)
661
- * Plugggable: signals, eval, directives, modifiers.
662
- * Build-free, ecosystem-agnostic: `<script src>`, JSX, anything.
659
+ * One `:` prefix. Zero magic.
660
+ * Valid HTML. Non-obtrusive.
661
+ * Signals for reactivity. (preact-signals compatible)
662
+ * Configurable signals, evaluator, directives, modifiers.
663
+ * Build-free, ecosystem-agnostic.
663
664
  * Small, safe & fast.
664
665
  * 🫰 developers
665
666
 
667
+ Perfect for small websites, static pages, prototypes, landings, SPA, PWA, JSX / SSR, micro-frontends, github pages, or anywhere where you need lightweight UI.
666
668
 
667
669
  <!--
668
670
  | | [AlpineJS](https://github.com/alpinejs/alpine) | [Petite-Vue](https://github.com/vuejs/petite-vue) | Sprae |
@@ -722,6 +724,7 @@ npm ci]
722
724
  cd ../webdriver-ts
723
725
  npm run results
724
726
  ```
727
+ See results at localhost:8080/
725
728
  </details>
726
729
  -->
727
730
 
package/sprae.js CHANGED
@@ -79,11 +79,13 @@ Object.assign(modifier, {
79
79
  capture: fn => (fn.capture = true, fn),
80
80
 
81
81
  // target
82
- window: fn => (fn.target = window, fn),
83
- document: fn => (fn.target = document, fn),
82
+ window: fn => (fn.target = fn.target.ownerDocument.defaultView, fn),
83
+ document: fn => (fn.target = fn.target.ownerDocument, fn),
84
+ root: fn => (fn.target = fn.target.ownerDocument.documentElement, fn),
85
+ body: fn => (fn.target = fn.target.ownerDocument.body, fn),
84
86
  parent: fn => (fn.target = fn.target.parentNode, fn),
85
87
 
86
- // test
88
+ // testers
87
89
  self: (fn) => (e) => (e.target === fn.target && fn(e)),
88
90
 
89
91
  outside: (fn) => (e, _target) => (