sprae 12.0.2 → 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"),
@@ -51,8 +52,7 @@ const sprae = (el = document.body, state) => {
51
52
  el.removeAttribute(name)
52
53
 
53
54
  // directive initializer can be redefined
54
- fx.push(fn = initDirective(el, name, value, state))
55
- offs.push(fn())
55
+ if (fn = initDirective(el, name, value, state)) fx.push(fn), offs.push(fn())
56
56
 
57
57
  // stop after subsprae like :each, :if, :scope etc.
58
58
  if (_state in el) return
@@ -76,73 +76,82 @@ const sprae = (el = document.body, state) => {
76
76
  return state;
77
77
  }
78
78
 
79
+ sprae.version = pkg.version;
79
80
 
80
81
  /**
81
82
  * Initializes directive (defined by sprae build), returns "on" function that enables it
82
83
  * Multiprop sequences initializer, eg. :a:b..c:d
83
84
  * @type {(el: HTMLElement, name:string, value:string, state:Object) => Function}
84
85
  * */
85
- const initDirective = (el, attrName, expr, state) => {
86
+ const initDirective = (el, dirName, expr, state) => {
86
87
  let cur, // current step callback
87
88
  off // current step disposal
88
89
 
89
- let steps = attrName.slice(prefix.length).split('..').map((step, i, { length }) => (
90
+ let steps = dirName.slice(prefix.length).split('..').map((step, i, { length }) => (
90
91
  // multiple attributes like :id:for=""
91
92
  step.split(prefix).reduce((prev, str) => {
92
93
  let [name, ...mods] = str.split('.');
93
94
  let evaluate = parse(expr, directive[currentDir = name]?.parse)
94
95
 
95
- // events have no effects and can be sequenced
96
+ // a hack, but events have no signal-effects and can be sequenced
97
+ // FIXME: events are molded into core, but should be an optional directive
96
98
  if (name.startsWith('on')) {
97
99
  let type = name.slice(2),
98
- first = e => (call(evaluate(state), e)),
99
100
  fn = applyMods(
100
- Object.assign(
101
+ sx(
101
102
  // single event vs chain
102
- length == 1 ? first :
103
- e => (cur = (!i ? first : cur)(e), off(), off = steps[(i + 1) % length]()),
104
- { target: el, type }
103
+ length == 1 ? e => evaluate(state, (fn) => call(fn, e)) :
104
+ (e => (cur = (!i ? e => call(evaluate(state), e) : cur)(e), off(), off = steps[(i + 1) % length]())),
105
+ { target: el }
105
106
  ),
106
107
  mods);
107
108
 
108
109
  return (_poff) => (_poff = prev?.(), fn.target.addEventListener(type, fn, fn), () => (_poff?.(), fn.target.removeEventListener(type, fn)))
109
110
  }
110
111
 
111
- // props have no sequences and can be sync
112
- let update = (directive[name] || directive['*'])(el, state, expr, name)
113
-
114
- // no-modifiers shortcut
115
- if (!mods.length && !prev) return () => update && effect(() => evaluate(state, update))
112
+ let fn, dispose, change, count;
116
113
 
117
- let dispose,
114
+ if (mods.length) {
118
115
  change = signal(-1), // signal authorized to trigger effect: 0 = init; >0 = trigger
119
- count = -1, // called effect count
116
+ count = -1 // called effect count
120
117
 
121
118
  // effect applier - first time it applies the effect, next times effect is triggered by change signal
122
- fn = throttle(applyMods(() => {
123
- if (++change.value) return // all calls except for the first one are handled by effect
124
- dispose = effect(() => update && (
125
- change.value == count ? fn() : // separate tick makes sure planner effect call is finished before real eval call
126
- (count = change.value, evaluate(state, update)) // if changed more than effect called - call it
127
- ));
128
- }, mods))
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
+
131
+ // props have no sequences and can be sync
132
+ // it's nice to see directive as taking some part of current context and returning new or updated context
133
+ let update = (directive[name] || directive['*'])(fn.target, state, expr, name)
134
+
135
+ // some directives are effect-less
136
+ if (!update) return
137
+
138
+ // take over state if directive created it (mainly :scope)
139
+ if (el[_state]) state = el[_state]
129
140
 
130
141
  return (_poff) => (
131
142
  _poff = prev?.(),
132
143
  // console.log('ON', name),
133
144
  fn(),
134
- ({
135
- [name]: () => (
136
- // console.log('OFF', name, el),
137
- _poff?.(), dispose(), change.value = -1, count = dispose = null
138
- )
139
- })[name]
145
+ () => (
146
+ // console.log('OFF', name, el),
147
+ _poff?.(), dispose?.(), change && (change.value = -1, count = dispose = null)
148
+ )
140
149
  )
141
150
  }, null)
142
151
  ));
143
152
 
144
153
  // off can be changed on the go
145
- return () => (off = steps[0]())
154
+ return () => (off = steps[0]?.())
146
155
  }
147
156
 
148
157
 
@@ -204,7 +213,7 @@ export const parse = (expr, prepare, _fn) => {
204
213
  if (prepare) _expr = prepare(_expr)
205
214
 
206
215
  // if, const, let - no return
207
- if (/^(if|let|const)\b/.test(_expr) || /;/.test(_expr)) ;
216
+ if (/^(if|let|const)\b/.test(_expr) || /;(?![^{]*})/.test(_expr)) ;
208
217
  else _expr = `return ${_expr}`
209
218
 
210
219
  // async expression
@@ -220,7 +229,7 @@ export const parse = (expr, prepare, _fn) => {
220
229
  return parse.cache[expr] = (state, cb, _out) => {
221
230
  try {
222
231
  let result = _fn?.(state)
223
- // if cb is given - call it with result and return function that returns last cb result - needed for effect cleanup
232
+ // if cb is given (to handle asyncs) - call it with result and return function that returns last cb result - needed for effect cleanup
224
233
  if (cb) return result?.then ? result.then(v => _out = cb(v)) : _out = cb(result), () => call(_out)
225
234
  else return result
226
235
  } catch (e) {
package/directive/else.js CHANGED
@@ -15,8 +15,5 @@ export default (el, state, _el, _, _prev=el) => {
15
15
 
16
16
  _el._holder._clauses.push(_el._clause = [_el, true])
17
17
 
18
- return() => {
19
- // console.log(':else update', _el)
20
- _el._holder.update()
21
- }
18
+ return _el._holder.update
22
19
  }
package/directive/fx.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import { call } from "../core.js"
2
2
 
3
- export default () => v => (call(v))
3
+ export default () => call
package/directive/ref.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { parse } from "../core.js"
2
2
  // import { setter } from "./value.js"
3
3
 
4
- export default (el, state, expr, name, _prev, _set) => (
5
- typeof parse(expr)(state) == 'function' ?
6
- v => (v(el)) :
7
- // 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")
8
- // (setter(expr)(state, el))
9
- (Object.defineProperty(state, expr, { value: el, configurable: true }), () => {})
10
- )
4
+ export default (el, state, expr, name, _prev, _set) => {
5
+ // FIXME: we call eval twice here - once to check if it's fn, second for update (from core)
6
+ if (typeof parse(expr)(state) == 'function') return v => (v(el))
7
+
8
+ // 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")
9
+ // (setter(expr)(state, el))
10
+ Object.defineProperty(state, expr, { value: el, configurable: true })
11
+ }
@@ -1,17 +1,29 @@
1
- import sprae, { store, call, untracked, _state } from '../core.js'
1
+ import sprae, { store, call, untracked, _state, _signals, signal } from '../core.js'
2
2
 
3
- export default (el, rootState, _scope) => (
4
- // prevent subsequent effects
5
- el[_state] = null,
3
+ export default (el, rootState) => {
6
4
  // 0 run pre-creates state to provide scope for the first effect - it can write vars in it, so we should already have it
7
- _scope = store({}, rootState),
5
+ // el[_state] even replaces own :scope effect state
6
+ let subscope = el[_state] = store({}, rootState), init = false;
7
+
8
8
  // 1st run spraes subtree with values from scope - it can be postponed by modifiers (we isolate reads from parent effect)
9
- // 2nd+ runs update _scope
10
- values => {
11
- let ext = call(values, _scope);
12
- // we bind to _scope to alleviate friction of using scope method directly
13
- for (let k in ext) _scope[k] = typeof ext[k] === 'function' ? ext[k].bind(_scope) : ext[k];
14
- // Object.assign(_scope, call(values, _scope))
15
- return el[_state] ?? (delete el[_state], untracked(() => sprae(el, _scope)))
9
+ // 2nd+ runs update subscope
10
+ return values => {
11
+ values = call(values, subscope);
12
+
13
+ // we bind to subscope to alleviate friction using scope method directly
14
+ // also returned props should force-create signals in subscope, not overwriting parent
15
+ if (values !== subscope) {
16
+ for (let k in values) {
17
+ // _add forces new prop, instead of checking parent
18
+ let v = typeof values[k] === 'function' ? values[k].bind(subscope) : values[k]
19
+ // update
20
+ if (k in subscope[_signals]) subscope[k] = v
21
+ // create
22
+ else (subscope[_signals][k] = (k[0] == '_' || v?.peek) ? v : signal(store(v)))
23
+ }
24
+ }
25
+
26
+ // Object.assign(subscope, call(values, subscope))
27
+ return !init && (init = true, delete el[_state], untracked(() => sprae(el, subscope)))
16
28
  }
17
- )
29
+ }
package/dist/sprae.js CHANGED
@@ -1,5 +1,5 @@
1
- var B=Symbol.dispose||(Symbol.dispose=Symbol("dispose")),u=Symbol("state"),H=Symbol("on"),K=Symbol("off"),z=Symbol("add"),N=":",$,I,Q,X=e=>e(),R=X,q={},F={},G=null,ne=(e=document.body,r)=>{if(e[u])return Object.assign(e[u],r);r=J(r||{});let t=[],o=[],n,s=()=>!o&&(o=t.map(a=>a())),i=()=>(o?.map(a=>a()),o=null);e[H]=s,e[K]=i,e[B]||(e[B]=()=>(e[K](),e[K]=e[H]=e[B]=e[u]=e[z]=null));let c=(a,f=a.attributes)=>{if(f)for(let d=0;d<f.length;){let{name:l,value:m}=f[d];if(l.startsWith(N)){if(a.removeAttribute(l),t.push(n=we(a,l,m,r)),o.push(n()),u in a)return}else d++}for(let d of[...a.childNodes])d.nodeType==1&&c(d)};return e[z]=c,c(e),e[u]===void 0&&(e[u]=r),r},we=(e,r,t,o)=>{let n,s,i=r.slice(N.length).split("..").map((c,a,{length:f})=>c.split(N).reduce((d,l)=>{let[m,...h]=l.split("."),C=S(t,q[G=m]?.parse);if(m.startsWith("on")){let P=m.slice(2),re=M=>y(C(o),M),L=oe(Object.assign(f==1?re:M=>(n=(a?n:re)(M),s(),s=i[(a+1)%f]()),{target:e,type:P}),h);return M=>(M=d?.(),L.target.addEventListener(P,L,L),()=>(M?.(),L.target.removeEventListener(P,L)))}let j=(q[m]||q["*"])(e,o,t,m);if(!h.length&&!d)return()=>j&&I(()=>C(o,j));let g,W=$(-1),x=-1,V=w(oe(()=>{++W.value||(g=I(()=>j&&(W.value==x?V():(x=W.value,C(o,j)))))},h));return P=>(P=d?.(),V(),{[m]:()=>(P?.(),g(),W.value=-1,x=g=null)}[m])},null));return()=>s=i[0]()},U=e=>(e.compile&&(ie=e.compile),e.prefix&&(N=e.prefix),e.signal&&($=e.signal),e.effect&&(I=e.effect),e.computed&&(Q=e.computed),e.batch&&(X=e.batch),e.untracked&&(R=e.untracked)),se=(e=document.body,r)=>{let t=J(r);return ne(e,t),new MutationObserver(n=>{for(let s of n)for(let i of s.addedNodes)if(i.nodeType===1&&i[u]===void 0){for(let c of i.attributes)if(c.name.startsWith(N)){e[z](i);break}}}).observe(e,{childList:!0,subtree:!0}),t},ie,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=ie(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
- ${N+G}="${e}"`)}return S.cache[e]=(n,s,i)=>{try{let c=t?.(n);return s?(c?.then?c.then(a=>i=s(a)):i=s(c),()=>y(i)):c}catch(c){console.error(`\u2234 ${c}
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
- ${N+G}="${e}"`)}}};S.cache={};var oe=(e,r)=>{for(;r.length;){let[t,...o]=r.pop().split("-");e=Te(F[t]?.(e,...o)??e,e)}return e},Te=(e,r)=>{if(e!=r)for(let t in r)e[t]??(e[t]=r[t]);return e},O=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(s){s!==o&&(o.before(s),r.append(...n))},attributes:t,removeAttribute(s){t.splice(t.findIndex(i=>i.name===s),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()),b=(e,r,t)=>t==null||t===!1?e.removeAttribute(r):e.setAttribute(r,t===!0?"":t),Y=(e,r=[])=>e?typeof e=="string"?e:(Array.isArray(e)?e.map(Y):Object.entries(e).reduce((t,[o,n])=>n?[...t,o]:t,[])).join(" "):"",w=(e,r=queueMicrotask)=>{let t=0,o=n=>{t++||(e(n),r((s=t>1)=>(t=0,s&&o(n))))};return o},ce=(e,r=queueMicrotask,t=0)=>(o,n=++t)=>r(()=>n==t&&e(o)),p=ne;var T=Symbol("signals"),A=Symbol("change"),v=Symbol("set"),D=(e,r=globalThis)=>{if(!e||e[Symbol.toStringTag]||e[T])return e;if(e.constructor!==Object)return Array.isArray(e)?Ce(e):e;let t=Object.keys(e).length,o={},n=new Proxy(Object.assign(o,{[A]:$(t),[T]:o}),{get:(i,c)=>c in o?o[c]?o[c].valueOf():o[c]:r[c],set:(i,c,a,f)=>(c in o?le(o,c,a):(Z(o,c,a),o[A].value=++t),1),deleteProperty:(i,c)=>(c in o&&(c[0]!="_"&&o[c]?.[Symbol.dispose]?.(),delete o[c],o[A].value=--t),1),ownKeys:()=>(o[A].value,Reflect.ownKeys(o)),has:i=>1}),s=Object.getOwnPropertyDescriptors(e);for(let i in e)s[i]?.get?(o[i]=Q(s[i].get.bind(n)))[v]=s[i].set?.bind(n):Z(o,i,e[i]);return n};var Ce=(e,r=globalThis)=>{let t=Array(e.length).fill(null),o=!1,n=c=>function(){return o=!0,c.apply(this,arguments)},s=$(e.length),i=new Proxy(Object.assign(t,{[A]:s,[T]:t,push:n(t.push),pop:n(t.pop),shift:n(t.shift),unshift:n(t.unshift),splice:n(t.splice)}),{get(c,a){return a==="length"?o?(o=!1,t.length):s.value:typeof a=="symbol"||isNaN(a)?t[a]?.valueOf()??r[a]:(t[a]??(t[a]=$(D(e[a])))).valueOf()},set(c,a,f){if(a==="length"){for(let d=f;d<t.length;d++)delete i[d];s.value=t.length=f}else a>=t.length?(Z(t,a,f),i.length=+a+1):t[a]?le(t,a,f):Z(t,a,f);return 1},deleteProperty:(c,a)=>(t[a]?.[Symbol.dispose]?.(),delete t[a],1)});return i},Z=(e,r,t)=>e[r]=r[0]=="_"||t?.peek?t:$(D(t)),le=(e,r,t,o,n)=>r[0]==="_"?e[r]=t:t!==(n=(o=e[r]).peek())&&(o[v]?o[v](t):Array.isArray(t)&&Array.isArray(n)?A in n?R(()=>X(()=>{for(let s=0;s<t.length;s++)n[s]=t[s];n.length=t.length})):o.value=t:o.value=D(t)),J=D;var k,ue=0,E,_=(e,r,t=new Set,o=()=>r.value)=>r={get value(){return k?.deps.push(t.add(k)),e},set value(n){if(n!==e){e=n;for(let s of t)E?E.add(s):s()}},peek(){return e},toJSON:o,then:o,toString:o,valueOf:o},ee=(e,r,t,o,n)=>(t=s=>{if(n=r,r=null,n?.call?.(),s=k,k=t,ue++>10)throw"Cycle detected";try{r=e()}finally{k=s,ue--}},o=t.deps=[],t(),s=>{for(r?.call?.();s=o.pop();)s.delete(t)}),fe=(e,r=_(),t,o,n=()=>t.value)=>t={get value(){return o||(o=ee(()=>r.value=e())),r.value},peek:r.peek,toJSON:n,then:n,toString:n,valueOf:n},pe=(e,r=!E)=>{E??(E=new Set);try{e()}finally{if(r){for(let t of E)t();E=null}}},de=(e,r,t)=>(r=k,k=null,t=e(),k=r,t);var me=(e,r,t,o,n)=>{var s;return e._holder?p(o=e,r):(e[s=u]??(e[s]=null),o=e.content?O(e):e,e.replaceWith(t=document.createTextNode("")),o._holder=t._holder=t,t._clauses=[o._clause=[o,!1]],t.update=w(()=>{let i=t._clauses.find(([,c])=>c);i!=n&&(n?.[0].remove(),n?.[0][K]?.(),(n=i)&&(t.before(n[0].content||n[0]),n[0][u]?n[0][H]?.():(delete n[0][u],p(n[0],r))))})),i=>{o._clause[1]=i,o._holder.update()}};var ye=(e,r,t,o,n=e)=>{for(t=e.content?O(e):e;n&&!(t._holder=n._holder);)n=n.previousSibling;return e.remove(),e[u]=null,t._holder._clauses.push(t._clause=[t,!0]),()=>{t._holder.update()}};var he=e=>(e.content&&e.replaceWith(e=O(e).childNodes[0]),r=>(r=y(r,e.textContent),e.textContent=r??""));var be=(e,r,t)=>(r=new Set,o=>{t=new Set,o&&Y(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 ge=(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 xe=()=>e=>y(e);var We=(e,r=S(`${e}=__`))=>(t,o)=>{t.__=o,r(t),delete t.__},Se=(e,r,t,o)=>{try{let n=We(t),s=e.type==="checkbox"?()=>n(r,e.checked):e.type==="select-multiple"?()=>n(r,[...e.selectedOptions].map(i=>i.value)):()=>n(r,e.selectedIndex<0?null:e.value);e.oninput=e.onchange=s,e.type?.startsWith("select")&&(new MutationObserver(s).observe(e,{childList:!0,subtree:!0,attributes:!0}),p(e,r)),S(t)(r)??s()}catch{}return e.type==="text"||e.type===""?n=>e.setAttribute("value",e.value=n??""):e.tagName==="TEXTAREA"||e.type==="text"||e.type===""?(n,s,i)=>(s=e.selectionStart,i=e.selectionEnd,e.setAttribute("value",e.value=n??""),s&&e.setSelectionRange(s,i)):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 s of e.options)s.value==n?s.setAttribute("selected",""):s.removeAttribute("selected");e.value=n}:e.type==="select-multiple"?n=>{for(let s of e.options)s.removeAttribute("selected");for(let s of n)e.querySelector(`[value="${s}"]`).setAttribute("selected","")}:n=>e.value=n};var Ae=(e,r,t,o,n,s)=>typeof S(t)(r)=="function"?i=>i(e):(Object.defineProperty(r,t,{value:e,configurable:!0}),()=>{});var Oe=(e,r,t)=>(e[u]=null,t=D({},r),o=>{let n=y(o,t);for(let s in n)t[s]=typeof n[s]=="function"?n[s].bind(t):n[s];return e[u]??(delete e[u],R(()=>p(e,t)))});var ke=(e,r,t)=>{let[o,n="$"]=t.split(/\bin\b/)[0].trim().replace(/\(|\)/g,"").split(/\s*,\s*/),s=document.createTextNode(""),i,c,a,f=0,d=w(()=>{var C,j;let l=0,m=a,h=m.length;if(i&&!i[A]){for(let g of i[T]||[])g[Symbol.dispose]();i=null,f=0}if(h<f)i.length=h;else{if(!i)i=m;else for(;l<f;)i[l]=m[l++];for(;l<h;l++){i[l]=m[l];let g=l,W=Object.create(r,{[o]:{get:()=>i[g]},[n]:{value:c?c[g]:g}}),x=e.content?O(e):e.cloneNode(!0);s.before(x.content||x),p(x,W);let V=((j=i[C=T]||(i[C]=[]))[l]||(j[l]={}))[Symbol.dispose];i[T][l][Symbol.dispose]=()=>{V?.(),x[Symbol.dispose]?.(),x.remove()}}}f=h});return e.replaceWith(s),e[u]=null,l=>(c=null,typeof l=="number"?a=Array.from({length:l},(m,h)=>h+1):l?.constructor===Object?(c=Object.keys(l),a=Object.values(l)):a=l||[],I(()=>{a[A]?.value,d()}))};ke.parse=e=>e.split(/\bin\b/)[1].trim();var je=ke;var Ne=(e,r,t,o)=>n=>b(e,o,y(n,e.getAttribute(o)));var $e=e=>r=>{for(let t in r)b(e,ae(t),r[t])};Object.assign(q,{"*":Ne,"":$e,class:be,text:he,style:ge,fx:xe,value:Se,ref:Ae,scope:Oe,if:me,else:ye,each:je});Object.assign(F,{debounce:(e,r=250,t=r==="tick"?queueMicrotask:r==="raf"?requestAnimationFrame:r==="idle"?requestIdleCallback:n=>setTimeout(n,r),o=0)=>ce(e,t),throttle:(e,r=250,t=r==="tick"?queueMicrotask:r==="raf"?requestAnimationFrame:o=>setTimeout(o,r))=>w(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 te={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 te)F[e]=(r,...t)=>o=>te[e](o)&&t.every(n=>te[n]?.(o)??o.key===n)&&r(o);U({compile:e=>p.constructor(`with (arguments[0]) { ${e} }`),signal:_,effect:ee,computed:fe,batch:pe,untracked:de});p.use=U;p.store=J;p.directive=q;p.modifier=F;p.start=se;var qt=p;export{pe as batch,fe as computed,qt as default,ee as effect,_ as signal,p as sprae,se as start,J as store,de as untracked,U 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};