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 +42 -33
- package/directive/else.js +1 -4
- package/directive/fx.js +1 -1
- package/directive/ref.js +8 -7
- package/directive/scope.js +25 -13
- package/dist/sprae.js +3 -3
- package/dist/sprae.js.map +4 -4
- package/dist/sprae.umd.js +3 -3
- package/dist/sprae.umd.js.map +4 -4
- package/package.json +1 -1
- package/readme.md +26 -23
- package/sprae.js +8 -3
- package/store.js +72 -24
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
|
-
|
|
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,
|
|
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 =
|
|
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
|
-
|
|
101
|
+
sx(
|
|
101
102
|
// single event vs chain
|
|
102
|
-
length == 1 ?
|
|
103
|
-
e => (cur = (!i ?
|
|
104
|
-
{ target: el
|
|
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
|
-
|
|
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
|
-
|
|
114
|
+
if (mods.length) {
|
|
118
115
|
change = signal(-1), // signal authorized to trigger effect: 0 = init; >0 = trigger
|
|
119
|
-
count = -1
|
|
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(
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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) ||
|
|
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
package/directive/fx.js
CHANGED
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
+
}
|
package/directive/scope.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
10
|
-
values => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
//
|
|
15
|
-
|
|
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
|
|
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
|
-
${
|
|
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
|
-
${
|
|
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};
|