sprae 2.14.2 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/sprae.js CHANGED
@@ -1,503 +1,150 @@
1
- // node_modules/@preact/signals-core/dist/signals-core.module.js
2
- function i() {
3
- throw new Error("Cycle detected");
4
- }
5
- function t() {
6
- if (!(s > 1)) {
7
- var i2, t2 = false;
8
- while (void 0 !== r) {
9
- var h2 = r;
10
- r = void 0;
11
- n++;
12
- while (void 0 !== h2) {
13
- var o2 = h2.o;
14
- h2.o = void 0;
15
- h2.f &= -3;
16
- if (!(8 & h2.f) && d(h2))
17
- try {
18
- h2.c();
19
- } catch (h3) {
20
- if (!t2) {
21
- i2 = h3;
22
- t2 = true;
23
- }
24
- }
25
- h2 = o2;
26
- }
27
- }
28
- n = 0;
29
- s--;
30
- if (t2)
31
- throw i2;
32
- } else
33
- s--;
34
- }
35
- function h(i2) {
36
- if (s > 0)
37
- return i2();
38
- s++;
39
- try {
40
- return i2();
41
- } finally {
42
- t();
43
- }
44
- }
45
- var o = void 0;
46
- var r = void 0;
47
- var s = 0;
48
- var n = 0;
49
- var f = 0;
50
- function v(i2) {
51
- if (void 0 !== o) {
52
- var t2 = i2.n;
53
- if (void 0 === t2 || t2.t !== o) {
54
- t2 = { i: 0, S: i2, p: o.s, n: void 0, t: o, e: void 0, x: void 0, r: t2 };
55
- if (void 0 !== o.s)
56
- o.s.n = t2;
57
- o.s = t2;
58
- i2.n = t2;
59
- if (32 & o.f)
60
- i2.S(t2);
61
- return t2;
62
- } else if (-1 === t2.i) {
63
- t2.i = 0;
64
- if (void 0 !== t2.n) {
65
- t2.n.p = t2.p;
66
- if (void 0 !== t2.p)
67
- t2.p.n = t2.n;
68
- t2.p = o.s;
69
- t2.n = void 0;
70
- o.s.n = t2;
71
- o.s = t2;
72
- }
73
- return t2;
74
- }
75
- }
76
- }
77
- function e(i2) {
78
- this.v = i2;
79
- this.i = 0;
80
- this.n = void 0;
81
- this.t = void 0;
82
- }
83
- e.prototype.h = function() {
84
- return true;
85
- };
86
- e.prototype.S = function(i2) {
87
- if (this.t !== i2 && void 0 === i2.e) {
88
- i2.x = this.t;
89
- if (void 0 !== this.t)
90
- this.t.e = i2;
91
- this.t = i2;
92
- }
93
- };
94
- e.prototype.U = function(i2) {
95
- if (void 0 !== this.t) {
96
- var t2 = i2.e, h2 = i2.x;
97
- if (void 0 !== t2) {
98
- t2.x = h2;
99
- i2.e = void 0;
100
- }
101
- if (void 0 !== h2) {
102
- h2.e = t2;
103
- i2.x = void 0;
1
+ // src/state.js
2
+ var currentFx;
3
+ var currentBatch;
4
+ var targetFxs = /* @__PURE__ */ new WeakMap();
5
+ var targetProxy = /* @__PURE__ */ new WeakMap();
6
+ var proxyTarget = /* @__PURE__ */ new WeakMap();
7
+ var _parent = Symbol("parent");
8
+ var sandbox = {
9
+ Array,
10
+ Object,
11
+ Number,
12
+ String,
13
+ Boolean,
14
+ Date,
15
+ console
16
+ };
17
+ var handler = {
18
+ has() {
19
+ return true;
20
+ },
21
+ get(target, prop) {
22
+ if (typeof prop === "symbol")
23
+ return target[prop];
24
+ if (!(prop in target))
25
+ return target[_parent]?.[prop];
26
+ if (Array.isArray(target) && prop in Array.prototype)
27
+ return target[prop];
28
+ let value = target[prop];
29
+ if (currentFx) {
30
+ let propFxs = targetFxs.get(target);
31
+ if (!propFxs)
32
+ targetFxs.set(target, propFxs = {});
33
+ if (!propFxs[prop])
34
+ propFxs[prop] = [currentFx];
35
+ else if (!propFxs[prop].includes(currentFx))
36
+ propFxs[prop].push(currentFx);
104
37
  }
105
- if (i2 === this.t)
106
- this.t = h2;
107
- }
108
- };
109
- e.prototype.subscribe = function(i2) {
110
- var t2 = this;
111
- return p(function() {
112
- var h2 = t2.value, o2 = 32 & this.f;
113
- this.f &= -33;
114
- try {
115
- i2(h2);
116
- } finally {
117
- this.f |= o2;
38
+ if (value && value.constructor === Object || Array.isArray(value)) {
39
+ let proxy = targetProxy.get(value);
40
+ if (!proxy)
41
+ targetProxy.set(value, proxy = new Proxy(value, handler));
42
+ return proxy;
118
43
  }
119
- });
120
- };
121
- e.prototype.valueOf = function() {
122
- return this.value;
123
- };
124
- e.prototype.toString = function() {
125
- return this.value + "";
126
- };
127
- e.prototype.peek = function() {
128
- return this.v;
129
- };
130
- Object.defineProperty(e.prototype, "value", { get: function() {
131
- var i2 = v(this);
132
- if (void 0 !== i2)
133
- i2.i = this.i;
134
- return this.v;
135
- }, set: function(h2) {
136
- if (h2 !== this.v) {
137
- if (n > 100)
138
- i();
139
- this.v = h2;
140
- this.i++;
141
- f++;
142
- s++;
143
- try {
144
- for (var o2 = this.t; void 0 !== o2; o2 = o2.x)
145
- o2.t.N();
146
- } finally {
147
- t();
148
- }
149
- }
150
- } });
151
- function u(i2) {
152
- return new e(i2);
153
- }
154
- function d(i2) {
155
- for (var t2 = i2.s; void 0 !== t2; t2 = t2.n)
156
- if (t2.S.i !== t2.i || !t2.S.h() || t2.S.i !== t2.i)
44
+ return value;
45
+ },
46
+ set(target, prop, value) {
47
+ if (!(prop in target) && (target[_parent] && prop in target[_parent]))
48
+ return target[_parent][prop] = value;
49
+ if (Array.isArray(target) && prop in Array.prototype)
50
+ return target[prop] = value;
51
+ const prev = target[prop];
52
+ if (Object.is(prev, value))
157
53
  return true;
158
- return false;
159
- }
160
- function c(i2) {
161
- for (var t2 = i2.s; void 0 !== t2; t2 = t2.n) {
162
- var h2 = t2.S.n;
163
- if (void 0 !== h2)
164
- t2.r = h2;
165
- t2.S.n = t2;
166
- t2.i = -1;
167
- if (void 0 === t2.n) {
168
- i2.s = t2;
169
- break;
170
- }
171
- }
172
- }
173
- function a(i2) {
174
- var t2 = i2.s, h2 = void 0;
175
- while (void 0 !== t2) {
176
- var o2 = t2.p;
177
- if (-1 === t2.i) {
178
- t2.S.U(t2);
179
- if (void 0 !== o2)
180
- o2.n = t2.n;
181
- if (void 0 !== t2.n)
182
- t2.n.p = o2;
183
- } else
184
- h2 = t2;
185
- t2.S.n = t2.r;
186
- if (void 0 !== t2.r)
187
- t2.r = void 0;
188
- t2 = o2;
189
- }
190
- i2.s = h2;
191
- }
192
- function l(i2) {
193
- e.call(this, void 0);
194
- this.x = i2;
195
- this.s = void 0;
196
- this.g = f - 1;
197
- this.f = 4;
198
- }
199
- (l.prototype = new e()).h = function() {
200
- this.f &= -3;
201
- if (1 & this.f)
202
- return false;
203
- if (32 == (36 & this.f))
54
+ target[prop] = value;
55
+ let propFxs = targetFxs.get(target)?.[prop];
56
+ if (propFxs)
57
+ for (let fx2 of propFxs)
58
+ currentBatch ? currentBatch.add(fx2) : fx2.call();
204
59
  return true;
205
- this.f &= -5;
206
- if (this.g === f)
207
- return true;
208
- this.g = f;
209
- this.f |= 1;
210
- if (this.i > 0 && !d(this)) {
211
- this.f &= -2;
60
+ },
61
+ deleteProperty(target, prop) {
62
+ target[prop] = void 0;
63
+ delete target[prop];
212
64
  return true;
213
65
  }
214
- var i2 = o;
215
- try {
216
- c(this);
217
- o = this;
218
- var t2 = this.x();
219
- if (16 & this.f || this.v !== t2 || 0 === this.i) {
220
- this.v = t2;
221
- this.f &= -17;
222
- this.i++;
223
- }
224
- } catch (i3) {
225
- this.v = i3;
226
- this.f |= 16;
227
- this.i++;
228
- }
229
- o = i2;
230
- a(this);
231
- this.f &= -2;
232
- return true;
233
- };
234
- l.prototype.S = function(i2) {
235
- if (void 0 === this.t) {
236
- this.f |= 36;
237
- for (var t2 = this.s; void 0 !== t2; t2 = t2.n)
238
- t2.S.S(t2);
239
- }
240
- e.prototype.S.call(this, i2);
241
- };
242
- l.prototype.U = function(i2) {
243
- if (void 0 !== this.t) {
244
- e.prototype.U.call(this, i2);
245
- if (void 0 === this.t) {
246
- this.f &= -33;
247
- for (var t2 = this.s; void 0 !== t2; t2 = t2.n)
248
- t2.S.U(t2);
249
- }
250
- }
251
- };
252
- l.prototype.N = function() {
253
- if (!(2 & this.f)) {
254
- this.f |= 6;
255
- for (var i2 = this.t; void 0 !== i2; i2 = i2.x)
256
- i2.t.N();
257
- }
258
- };
259
- l.prototype.peek = function() {
260
- if (!this.h())
261
- i();
262
- if (16 & this.f)
263
- throw this.v;
264
- return this.v;
265
- };
266
- Object.defineProperty(l.prototype, "value", { get: function() {
267
- if (1 & this.f)
268
- i();
269
- var t2 = v(this);
270
- this.h();
271
- if (void 0 !== t2)
272
- t2.i = this.i;
273
- if (16 & this.f)
274
- throw this.v;
275
- return this.v;
276
- } });
277
- function w(i2) {
278
- return new l(i2);
279
- }
280
- function y(i2) {
281
- var h2 = i2.u;
282
- i2.u = void 0;
283
- if ("function" == typeof h2) {
284
- s++;
285
- var r2 = o;
286
- o = void 0;
287
- try {
288
- h2();
289
- } catch (t2) {
290
- i2.f &= -2;
291
- i2.f |= 8;
292
- _(i2);
293
- throw t2;
294
- } finally {
295
- o = r2;
296
- t();
297
- }
298
- }
299
- }
300
- function _(i2) {
301
- for (var t2 = i2.s; void 0 !== t2; t2 = t2.n)
302
- t2.S.U(t2);
303
- i2.x = void 0;
304
- i2.s = void 0;
305
- y(i2);
306
- }
307
- function g(i2) {
308
- if (o !== this)
309
- throw new Error("Out-of-order effect");
310
- a(this);
311
- o = i2;
312
- this.f &= -2;
313
- if (8 & this.f)
314
- _(this);
315
- t();
316
- }
317
- function b(i2) {
318
- this.x = i2;
319
- this.u = void 0;
320
- this.s = void 0;
321
- this.o = void 0;
322
- this.f = 32;
323
- }
324
- b.prototype.c = function() {
325
- var i2 = this.S();
326
- try {
327
- if (!(8 & this.f) && void 0 !== this.x)
328
- this.u = this.x();
329
- } finally {
330
- i2();
331
- }
332
66
  };
333
- b.prototype.S = function() {
334
- if (1 & this.f)
335
- i();
336
- this.f |= 1;
337
- this.f &= -9;
338
- y(this);
339
- c(this);
340
- s++;
341
- var t2 = o;
342
- o = this;
343
- return g.bind(this, t2);
344
- };
345
- b.prototype.N = function() {
346
- if (!(2 & this.f)) {
347
- this.f |= 2;
348
- this.o = r;
349
- r = this;
350
- }
351
- };
352
- b.prototype.d = function() {
353
- this.f |= 8;
354
- if (!(1 & this.f))
355
- _(this);
67
+ var state = (obj, parent) => {
68
+ if (targetProxy.has(obj))
69
+ return targetProxy.get(obj);
70
+ if (proxyTarget.has(obj))
71
+ return obj;
72
+ let proxy = new Proxy(obj, handler);
73
+ targetProxy.set(obj, proxy);
74
+ proxyTarget.set(proxy, obj);
75
+ obj[_parent] = parent ? state(parent) : sandbox;
76
+ return proxy;
77
+ };
78
+ var fx = (fn) => {
79
+ const call = () => {
80
+ let prev = currentFx;
81
+ currentFx = call;
82
+ fn();
83
+ currentFx = prev;
84
+ };
85
+ call();
86
+ return call;
87
+ };
88
+ var batch = (fn) => {
89
+ let prevBatch = currentBatch;
90
+ currentBatch = /* @__PURE__ */ new Set();
91
+ fn();
92
+ for (let fx2 of currentBatch)
93
+ fx2.call();
94
+ currentBatch.clear();
95
+ currentBatch = prevBatch;
356
96
  };
357
- function p(i2) {
358
- var t2 = new b(i2);
359
- try {
360
- t2.c();
361
- } catch (i3) {
362
- t2.d();
363
- throw i3;
364
- }
365
- return t2.d.bind(t2);
366
- }
367
-
368
- // node_modules/sube/sube.js
369
- Symbol.observable ||= Symbol("observable");
370
- var observable = (arg) => arg && !!(arg[Symbol.observable] || arg[Symbol.asyncIterator] || arg.call && arg.set || arg.subscribe || arg.then);
371
- var registry = new FinalizationRegistry((unsub) => unsub.call?.());
372
- var unsubr = (sub) => sub && (() => sub.unsubscribe?.());
373
- var sube_default = (target, next, error, complete, stop, unsub) => target && (unsub = unsubr((target[Symbol.observable]?.() || target).subscribe?.(next, error, complete)) || target.set && target.call?.(stop, next) || (target.then?.((v2) => (!stop && next(v2), complete?.()), error) || (async (v2) => {
374
- try {
375
- for await (v2 of target) {
376
- if (stop)
377
- return;
378
- next(v2);
379
- }
380
- complete?.();
381
- } catch (err) {
382
- error?.(err);
383
- }
384
- })()) && ((_2) => stop = 1), registry.register(target, unsub), unsub);
385
-
386
- // node_modules/signal-struct/signal-struct.js
387
- var isSignal = (v2) => v2 && v2.peek;
388
- var isStruct = (v2) => v2 && v2[_struct];
389
- var _struct = Symbol("signal-struct");
390
- signalStruct.isStruct = isStruct;
391
- function signalStruct(values, proto) {
392
- if (isStruct(values) && !proto)
393
- return values;
394
- if (isObject(values)) {
395
- const state = Object.create(proto || Object.getPrototypeOf(values)), signals = {}, descs = Object.getOwnPropertyDescriptors(values);
396
- for (let key in descs) {
397
- let desc = descs[key];
398
- if (desc.get) {
399
- let s2 = signals[key] = w(desc.get.bind(state));
400
- Object.defineProperty(state, key, {
401
- get() {
402
- return s2.value;
403
- },
404
- set: desc.set?.bind(state),
405
- configurable: false,
406
- enumerable: true
407
- });
408
- } else {
409
- let value = desc.value;
410
- let isObservable = observable(value), s2 = signals[key] = isSignal(value) ? value : u(
411
- isObservable ? void 0 : isObject(value) ? Object.seal(signalStruct(value)) : Array.isArray(value) ? signalStruct(value) : value
412
- );
413
- if (isObservable)
414
- sube_default(value, (v2) => s2.value = v2);
415
- Object.defineProperty(state, key, {
416
- get() {
417
- return s2.value;
418
- },
419
- set(v2) {
420
- if (isObject(v2)) {
421
- if (isObject(s2.value))
422
- try {
423
- Object.assign(s2.value, v2);
424
- return;
425
- } catch (e2) {
426
- }
427
- s2.value = Object.seal(signalStruct(v2));
428
- } else if (Array.isArray(v2))
429
- s2.value = signalStruct(v2);
430
- else
431
- s2.value = v2;
432
- },
433
- enumerable: true,
434
- configurable: false
435
- });
436
- }
437
- }
438
- Object.defineProperty(state, _struct, { configurable: false, enumerable: false, value: true });
439
- return state;
440
- }
441
- if (Array.isArray(values) && !isStruct(values[0])) {
442
- for (let i2 = 0; i2 < values.length; i2++)
443
- values[i2] = signalStruct(values[i2]);
444
- }
445
- return values;
446
- }
447
- function isObject(v2) {
448
- return v2 && v2.constructor === Object;
449
- }
450
97
 
451
98
  // src/domdiff.js
452
- function domdiff_default(parent, a2, b2, before) {
99
+ function domdiff_default(parent, a, b, before) {
453
100
  const aIdx = /* @__PURE__ */ new Map();
454
101
  const bIdx = /* @__PURE__ */ new Map();
455
- let i2;
102
+ let i;
456
103
  let j;
457
- for (i2 = 0; i2 < a2.length; i2++) {
458
- aIdx.set(a2[i2], i2);
104
+ for (i = 0; i < a.length; i++) {
105
+ aIdx.set(a[i], i);
459
106
  }
460
- for (i2 = 0; i2 < b2.length; i2++) {
461
- bIdx.set(b2[i2], i2);
107
+ for (i = 0; i < b.length; i++) {
108
+ bIdx.set(b[i], i);
462
109
  }
463
- for (i2 = j = 0; i2 !== a2.length || j !== b2.length; ) {
464
- var aElm = a2[i2], bElm = b2[j];
110
+ for (i = j = 0; i !== a.length || j !== b.length; ) {
111
+ var aElm = a[i], bElm = b[j];
465
112
  if (aElm === null) {
466
- i2++;
467
- } else if (b2.length <= j) {
468
- parent.removeChild(a2[i2]);
469
- i2++;
470
- } else if (a2.length <= i2) {
471
- parent.insertBefore(bElm, a2[i2] || before);
113
+ i++;
114
+ } else if (b.length <= j) {
115
+ parent.removeChild(a[i]);
116
+ i++;
117
+ } else if (a.length <= i) {
118
+ parent.insertBefore(bElm, a[i] || before);
472
119
  j++;
473
120
  } else if (aElm === bElm) {
474
- i2++;
121
+ i++;
475
122
  j++;
476
123
  } else {
477
124
  var curElmInNew = bIdx.get(aElm);
478
125
  var wantedElmInOld = aIdx.get(bElm);
479
126
  if (curElmInNew === void 0) {
480
- parent.removeChild(a2[i2]);
481
- i2++;
127
+ parent.removeChild(a[i]);
128
+ i++;
482
129
  } else if (wantedElmInOld === void 0) {
483
130
  parent.insertBefore(
484
131
  bElm,
485
- a2[i2] || before
132
+ a[i] || before
486
133
  );
487
134
  j++;
488
135
  } else {
489
136
  parent.insertBefore(
490
- a2[wantedElmInOld],
491
- a2[i2] || before
137
+ a[wantedElmInOld],
138
+ a[i] || before
492
139
  );
493
- a2[wantedElmInOld] = null;
494
- if (wantedElmInOld > i2 + 1)
495
- i2++;
140
+ a[wantedElmInOld] = null;
141
+ if (wantedElmInOld > i + 1)
142
+ i++;
496
143
  j++;
497
144
  }
498
145
  }
499
146
  }
500
- return b2;
147
+ return b;
501
148
  }
502
149
 
503
150
  // src/weakish-map.js
@@ -552,18 +199,20 @@ primary["if"] = (el, expr) => {
552
199
  break;
553
200
  }
554
201
  el.replaceWith(cur = holder);
555
- return (state) => {
556
- let i2 = clauses.findIndex((f2) => f2(state));
557
- if (els[i2] != cur) {
202
+ return (state2) => {
203
+ let i = clauses.findIndex((f) => f(state2));
204
+ if (els[i] != cur) {
558
205
  ;
559
- (cur[_each] || cur).replaceWith(cur = els[i2] || holder);
560
- sprae(cur, state);
206
+ (cur[_each] || cur).replaceWith(cur = els[i] || holder);
207
+ sprae(cur, state2);
561
208
  }
562
209
  };
563
210
  };
564
211
  primary["with"] = (el, expr, rootState) => {
565
212
  let evaluate = parseExpr(el, expr, "with");
566
- sprae(el, signalStruct(evaluate(rootState), rootState));
213
+ const localState = evaluate(rootState);
214
+ let state2 = state(localState, rootState);
215
+ sprae(el, state2);
567
216
  };
568
217
  var _each = Symbol(":each");
569
218
  primary["each"] = (tpl, expr) => {
@@ -576,17 +225,18 @@ primary["each"] = (tpl, expr) => {
576
225
  const keyExpr = tpl.getAttribute(":key");
577
226
  const itemKey = keyExpr ? parseExpr(null, keyExpr) : null;
578
227
  tpl.removeAttribute(":key");
228
+ const refExpr = tpl.getAttribute(":ref");
579
229
  const scopes = new WeakishMap();
580
230
  const itemEls = new WeakishMap();
581
231
  let curEls = [];
582
- return (state) => {
583
- let list = evaluate(state);
232
+ return (state2) => {
233
+ let list = evaluate(state2);
584
234
  if (!list)
585
235
  list = [];
586
236
  else if (typeof list === "number")
587
- list = Array.from({ length: list }, (_2, i2) => [i2, i2 + 1]);
237
+ list = Array.from({ length: list }, (_, i) => [i, i + 1]);
588
238
  else if (Array.isArray(list))
589
- list = list.map((item, i2) => [i2 + 1, item]);
239
+ list = list.map((item, i) => [i + 1, item]);
590
240
  else if (typeof list === "object")
591
241
  list = Object.entries(list);
592
242
  else
@@ -600,7 +250,7 @@ primary["each"] = (tpl, expr) => {
600
250
  (el = itemEls.get(key)) || itemEls.set(key, el = tpl.cloneNode(true));
601
251
  newEls.push(el);
602
252
  if (key == null || !(scope = scopes.get(key))) {
603
- scope = signalStruct({ [each[0]]: item, [each[1]]: idx }, state);
253
+ scope = state({ [each[0]]: item, [refExpr || ""]: null, [each[1]]: idx }, state2);
604
254
  if (key != null)
605
255
  scopes.set(key, scope);
606
256
  } else
@@ -609,8 +259,8 @@ primary["each"] = (tpl, expr) => {
609
259
  }
610
260
  domdiff_default(holder.parentNode, curEls, newEls, holder);
611
261
  curEls = newEls;
612
- for (let i2 = 0; i2 < newEls.length; i2++) {
613
- sprae(newEls[i2], elScopes[i2]);
262
+ for (let i = 0; i < newEls.length; i++) {
263
+ sprae(newEls[i], elScopes[i]);
614
264
  }
615
265
  };
616
266
  };
@@ -632,20 +282,20 @@ function parseForExpression(expression) {
632
282
  ];
633
283
  return [item, "", items];
634
284
  }
635
- secondary["ref"] = (el, expr, state) => {
636
- state[expr] = el;
285
+ secondary["ref"] = (el, expr, state2) => {
286
+ state2[expr] = el;
637
287
  };
638
288
  secondary["id"] = (el, expr) => {
639
289
  let evaluate = parseExpr(el, expr, ":id");
640
- const update = (v2) => el.id = v2 || v2 === 0 ? v2 : "";
641
- return (state) => update(evaluate(state));
290
+ const update = (v) => el.id = v || v === 0 ? v : "";
291
+ return (state2) => update(evaluate(state2));
642
292
  };
643
293
  secondary["class"] = (el, expr) => {
644
294
  let evaluate = parseExpr(el, expr, ":class");
645
295
  let initClassName = el.className;
646
- return (state) => {
647
- let v2 = evaluate(state);
648
- let className = typeof v2 === "string" ? v2 : (Array.isArray(v2) ? v2 : Object.entries(v2).map(([k, v3]) => v3 ? k : "")).filter(Boolean).join(" ");
296
+ return (state2) => {
297
+ let v = evaluate(state2);
298
+ let className = typeof v === "string" ? v : (Array.isArray(v) ? v : Object.entries(v).map(([k, v2]) => v2 ? k : "")).filter(Boolean).join(" ");
649
299
  el.className = [initClassName, className].filter(Boolean).join(" ");
650
300
  };
651
301
  };
@@ -654,28 +304,28 @@ secondary["style"] = (el, expr) => {
654
304
  let initStyle = el.getAttribute("style") || "";
655
305
  if (!initStyle.endsWith(";"))
656
306
  initStyle += "; ";
657
- return (state) => {
658
- let v2 = evaluate(state);
659
- if (typeof v2 === "string")
660
- el.setAttribute("style", initStyle + v2);
307
+ return (state2) => {
308
+ let v = evaluate(state2);
309
+ if (typeof v === "string")
310
+ el.setAttribute("style", initStyle + v);
661
311
  else {
662
312
  el.setAttribute("style", initStyle);
663
- for (let k in v2)
664
- el.style.setProperty(k, v2[k]);
313
+ for (let k in v)
314
+ el.style.setProperty(k, v[k]);
665
315
  }
666
316
  };
667
317
  };
668
318
  secondary["text"] = (el, expr) => {
669
319
  let evaluate = parseExpr(el, expr, ":text");
670
- return (state) => {
671
- let value = evaluate(state);
320
+ return (state2) => {
321
+ let value = evaluate(state2);
672
322
  el.textContent = value == null ? "" : value;
673
323
  };
674
324
  };
675
325
  secondary["data"] = (el, expr) => {
676
326
  let evaluate = parseExpr(el, expr, ":data");
677
- return (state) => {
678
- let value = evaluate(state);
327
+ return (state2) => {
328
+ let value = evaluate(state2);
679
329
  for (let key in value)
680
330
  el.dataset[key] = value[key];
681
331
  };
@@ -686,13 +336,13 @@ secondary["aria"] = (el, expr) => {
686
336
  for (let key in value)
687
337
  attr(el, "aria-" + dashcase(key), value[key] == null ? null : value[key] + "");
688
338
  };
689
- return (state) => update(evaluate(state));
339
+ return (state2) => update(evaluate(state2));
690
340
  };
691
341
  secondary[""] = (el, expr) => {
692
342
  let evaluate = parseExpr(el, expr, ":");
693
343
  if (evaluate)
694
- return (state) => {
695
- let value = evaluate(state);
344
+ return (state2) => {
345
+ let value = evaluate(state2);
696
346
  for (let key in value)
697
347
  attr(el, dashcase(key), value[key]);
698
348
  };
@@ -706,12 +356,12 @@ secondary["value"] = (el, expr) => {
706
356
  el.value = value;
707
357
  el.selectedOptions[0]?.setAttribute("selected", "");
708
358
  } : (value) => el.value = value;
709
- return (state) => update(evaluate(state));
359
+ return (state2) => update(evaluate(state2));
710
360
  };
711
361
  secondary["on"] = (el, expr) => {
712
362
  let evaluate = parseExpr(el, expr, ":on");
713
- return (state) => {
714
- let listeners = evaluate(state);
363
+ return (state2) => {
364
+ let listeners = evaluate(state2);
715
365
  let offs = [];
716
366
  for (let evt in listeners)
717
367
  offs.push(on(el, evt, listeners[evt]));
@@ -721,25 +371,25 @@ secondary["on"] = (el, expr) => {
721
371
  };
722
372
  };
723
373
  };
724
- var directives_default = (el, expr, state, name) => {
374
+ var directives_default = (el, expr, state2, name) => {
725
375
  let evt = name.startsWith("on") && name.slice(2);
726
376
  let evaluate = parseExpr(el, expr, ":" + name);
727
377
  if (!evaluate)
728
378
  return;
729
379
  if (evt)
730
- return (state2) => {
731
- let value = evaluate(state2) || (() => {
380
+ return (state3) => {
381
+ let value = evaluate(state3) || (() => {
732
382
  });
733
383
  return on(el, evt, value);
734
384
  };
735
- return (state2) => attr(el, name, evaluate(state2));
385
+ return (state3) => attr(el, name, evaluate(state3));
736
386
  };
737
387
  var on = (target, evt, origFn) => {
738
388
  if (!origFn)
739
389
  return;
740
- let ctxs = evt.split("..").map((e2) => {
390
+ let ctxs = evt.split("..").map((e) => {
741
391
  let ctx = { evt: "", target, test: () => true };
742
- ctx.evt = (e2.startsWith("on") ? e2.slice(2) : e2).replace(
392
+ ctx.evt = (e.startsWith("on") ? e.slice(2) : e).replace(
743
393
  /\.(\w+)?-?([-\w]+)?/g,
744
394
  (match, mod, param = "") => (ctx.test = mods[mod]?.(ctx, ...param.split("-")) || ctx.test, "")
745
395
  );
@@ -749,10 +399,10 @@ var on = (target, evt, origFn) => {
749
399
  return addListenerWithMods(origFn, ctxs[0]);
750
400
  const onFn = (fn, cur = 0) => {
751
401
  let off;
752
- let curListener = (e2) => {
402
+ let curListener = (e) => {
753
403
  if (cur)
754
404
  off();
755
- let nextFn = fn.call(target, e2);
405
+ let nextFn = fn.call(target, e);
756
406
  if (typeof nextFn !== "function")
757
407
  nextFn = () => {
758
408
  };
@@ -766,7 +416,7 @@ var on = (target, evt, origFn) => {
766
416
  function addListenerWithMods(fn, { evt: evt2, target: target2, test, defer, stop, prevent, ...opts }) {
767
417
  if (defer)
768
418
  fn = defer(fn);
769
- let cb = (e2) => test(e2) && (stop && e2.stopPropagation(), prevent && e2.preventDefault(), fn.call(target2, e2));
419
+ let cb = (e) => test(e) && (stop && e.stopPropagation(), prevent && e.preventDefault(), fn.call(target2, e));
770
420
  target2.addEventListener(evt2, cb, opts);
771
421
  return () => target2.removeEventListener(evt2, cb, opts);
772
422
  }
@@ -795,7 +445,7 @@ var mods = {
795
445
  ctx.target = document;
796
446
  },
797
447
  toggle(ctx) {
798
- ctx.defer = (fn, out) => (e2) => out ? (out.call?.(ctx.target, e2), out = null) : out = fn();
448
+ ctx.defer = (fn, out) => (e) => out ? (out.call?.(ctx.target, e), out = null) : out = fn();
799
449
  },
800
450
  throttle(ctx, limit) {
801
451
  ctx.defer = (fn) => throttle(fn, limit ? Number(limit) || 0 : 108);
@@ -803,21 +453,21 @@ var mods = {
803
453
  debounce(ctx, wait) {
804
454
  ctx.defer = (fn) => debounce(fn, wait ? Number(wait) || 0 : 108);
805
455
  },
806
- outside: (ctx) => (e2) => {
456
+ outside: (ctx) => (e) => {
807
457
  let target = ctx.target;
808
- if (target.contains(e2.target))
458
+ if (target.contains(e.target))
809
459
  return false;
810
- if (e2.target.isConnected === false)
460
+ if (e.target.isConnected === false)
811
461
  return false;
812
462
  if (target.offsetWidth < 1 && target.offsetHeight < 1)
813
463
  return false;
814
464
  return true;
815
465
  },
816
- self: (ctx) => (e2) => e2.target === ctx.target,
817
- ctrl: (ctx, ...param) => (e2) => keys.ctrl(e2) && param.every((p2) => keys[p2] ? keys[p2](e2) : e2.key === p2),
818
- shift: (ctx, ...param) => (e2) => keys.shift(e2) && param.every((p2) => keys[p2] ? keys[p2](e2) : e2.key === p2),
819
- alt: (ctx, ...param) => (e2) => keys.alt(e2) && param.every((p2) => keys[p2] ? keys[p2](e2) : e2.key === p2),
820
- meta: (ctx, ...param) => (e2) => keys.meta(e2) && param.every((p2) => keys[p2] ? keys[p2](e2) : e2.key === p2),
466
+ self: (ctx) => (e) => e.target === ctx.target,
467
+ ctrl: (ctx, ...param) => (e) => keys.ctrl(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
468
+ shift: (ctx, ...param) => (e) => keys.shift(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
469
+ alt: (ctx, ...param) => (e) => keys.alt(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
470
+ meta: (ctx, ...param) => (e) => keys.meta(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
821
471
  arrow: (ctx) => keys.arrow,
822
472
  enter: (ctx) => keys.enter,
823
473
  escape: (ctx) => keys.escape,
@@ -830,52 +480,52 @@ var mods = {
830
480
  character: (ctx) => keys.character
831
481
  };
832
482
  var keys = {
833
- ctrl: (e2) => e2.ctrlKey || e2.key === "Control" || e2.key === "Ctrl",
834
- shift: (e2) => e2.shiftKey || e2.key === "Shift",
835
- alt: (e2) => e2.altKey || e2.key === "Alt",
836
- meta: (e2) => e2.metaKey || e2.key === "Meta" || e2.key === "Command",
837
- arrow: (e2) => e2.key.startsWith("Arrow"),
838
- enter: (e2) => e2.key === "Enter",
839
- escape: (e2) => e2.key.startsWith("Esc"),
840
- tab: (e2) => e2.key === "Tab",
841
- space: (e2) => e2.key === "\xA0" || e2.key === "Space" || e2.key === " ",
842
- backspace: (e2) => e2.key === "Backspace",
843
- delete: (e2) => e2.key === "Delete",
844
- digit: (e2) => /^\d$/.test(e2.key),
845
- letter: (e2) => /^[a-zA-Z]$/.test(e2.key),
846
- character: (e2) => /^\S$/.test(e2.key)
483
+ ctrl: (e) => e.ctrlKey || e.key === "Control" || e.key === "Ctrl",
484
+ shift: (e) => e.shiftKey || e.key === "Shift",
485
+ alt: (e) => e.altKey || e.key === "Alt",
486
+ meta: (e) => e.metaKey || e.key === "Meta" || e.key === "Command",
487
+ arrow: (e) => e.key.startsWith("Arrow"),
488
+ enter: (e) => e.key === "Enter",
489
+ escape: (e) => e.key.startsWith("Esc"),
490
+ tab: (e) => e.key === "Tab",
491
+ space: (e) => e.key === "\xA0" || e.key === "Space" || e.key === " ",
492
+ backspace: (e) => e.key === "Backspace",
493
+ delete: (e) => e.key === "Delete",
494
+ digit: (e) => /^\d$/.test(e.key),
495
+ letter: (e) => /^[a-zA-Z]$/.test(e.key),
496
+ character: (e) => /^\S$/.test(e.key)
847
497
  };
848
498
  var throttle = (fn, limit) => {
849
- let pause, planned, block = (e2) => {
499
+ let pause, planned, block = (e) => {
850
500
  pause = true;
851
501
  setTimeout(() => {
852
502
  pause = false;
853
503
  if (planned)
854
- return planned = false, block(e2), fn(e2);
504
+ return planned = false, block(e), fn(e);
855
505
  }, limit);
856
506
  };
857
- return (e2) => {
507
+ return (e) => {
858
508
  if (pause)
859
509
  return planned = true;
860
- block(e2);
861
- return fn(e2);
510
+ block(e);
511
+ return fn(e);
862
512
  };
863
513
  };
864
514
  var debounce = (fn, wait) => {
865
515
  let timeout;
866
- return (e2) => {
516
+ return (e) => {
867
517
  clearTimeout(timeout);
868
518
  timeout = setTimeout(() => {
869
519
  timeout = null;
870
- fn(e2);
520
+ fn(e);
871
521
  }, wait);
872
522
  };
873
523
  };
874
- var attr = (el, name, v2) => {
875
- if (v2 == null || v2 === false)
524
+ var attr = (el, name, v) => {
525
+ if (v == null || v === false)
876
526
  el.removeAttribute(name);
877
527
  else
878
- el.setAttribute(name, v2 === true ? "" : typeof v2 === "number" || typeof v2 === "string" ? v2 : "");
528
+ el.setAttribute(name, v === true ? "" : typeof v === "number" || typeof v === "string" ? v : "");
879
529
  };
880
530
  var evaluatorMemo = {};
881
531
  function parseExpr(el, expression, dir) {
@@ -884,16 +534,16 @@ function parseExpr(el, expression, dir) {
884
534
  let rightSideSafeExpression = /^[\n\s]*if.*\(.*\)/.test(expression) || /\b(let|const)\s/.test(expression) && !dir.startsWith(":on") ? `(() => {${expression}})()` : expression;
885
535
  try {
886
536
  evaluate = evaluatorMemo[expression] = new Function(`__scope`, `with (__scope) { return ${rightSideSafeExpression.trim()} };`);
887
- } catch (e2) {
888
- return exprError(e2, el, expression, dir);
537
+ } catch (e) {
538
+ return exprError(e, el, expression, dir);
889
539
  }
890
540
  }
891
- return (state) => {
541
+ return (state2) => {
892
542
  let result;
893
543
  try {
894
- result = evaluate.call(el, state);
895
- } catch (e2) {
896
- return exprError(e2, el, expression, dir);
544
+ result = evaluate.call(el, state2);
545
+ } catch (e) {
546
+ return exprError(e, el, expression, dir);
897
547
  }
898
548
  return result;
899
549
  };
@@ -905,7 +555,7 @@ function exprError(error, element, expression, dir) {
905
555
  ${dir}=${expression ? `"${expression}"
906
556
 
907
557
  ` : ""}`, element);
908
- setTimeout(() => {
558
+ queueMicrotask(() => {
909
559
  throw error;
910
560
  }, 0);
911
561
  }
@@ -914,16 +564,17 @@ function dashcase(str) {
914
564
  }
915
565
 
916
566
  // src/core.js
567
+ sprae.globals = sandbox;
917
568
  var memo = /* @__PURE__ */ new WeakMap();
918
569
  function sprae(container, values) {
919
570
  if (!container.children)
920
571
  return;
921
572
  if (memo.has(container)) {
922
- let state2 = memo.get(container);
923
- h(() => Object.assign(state2, values));
924
- return state2;
573
+ let state3 = memo.get(container);
574
+ batch(() => Object.assign(state3, values));
575
+ return state3;
925
576
  }
926
- const state = signalStruct(values || {});
577
+ const state2 = state(values || {});
927
578
  const updates = [];
928
579
  const init = (el, parent = el.parentNode) => {
929
580
  for (let name in primary) {
@@ -931,16 +582,16 @@ function sprae(container, values) {
931
582
  if (el.hasAttribute?.(attrName)) {
932
583
  let expr = el.getAttribute(attrName);
933
584
  el.removeAttribute(attrName);
934
- updates.push(primary[name](el, expr, state, name));
585
+ updates.push(primary[name](el, expr, state2, name));
935
586
  if (memo.has(el) || el.parentNode !== parent)
936
587
  return false;
937
588
  }
938
589
  }
939
590
  if (el.attributes) {
940
- for (let i2 = 0; i2 < el.attributes.length; ) {
941
- let attr2 = el.attributes[i2];
591
+ for (let i = 0; i < el.attributes.length; ) {
592
+ let attr2 = el.attributes[i];
942
593
  if (attr2.name[0] !== ":") {
943
- i2++;
594
+ i++;
944
595
  continue;
945
596
  }
946
597
  el.removeAttribute(attr2.name);
@@ -948,30 +599,29 @@ function sprae(container, values) {
948
599
  let attrNames = attr2.name.slice(1).split(":");
949
600
  for (let attrName of attrNames) {
950
601
  let dir = secondary[attrName] || directives_default;
951
- updates.push(dir(el, expr, state, attrName));
602
+ updates.push(dir(el, expr, state2, attrName));
952
603
  if (memo.has(el) || el.parentNode !== parent)
953
604
  return false;
954
605
  }
955
606
  }
956
607
  }
957
- for (let i2 = 0, child; child = el.children[i2]; i2++) {
608
+ for (let i = 0, child; child = el.children[i]; i++) {
958
609
  if (init(child, el) === false)
959
- i2--;
610
+ i--;
960
611
  }
961
612
  };
962
613
  init(container);
963
614
  for (let update of updates)
964
615
  if (update) {
965
616
  let teardown;
966
- p(() => {
617
+ fx(() => {
967
618
  if (typeof teardown === "function")
968
619
  teardown();
969
- teardown = update(state);
620
+ teardown = update(state2);
970
621
  });
971
622
  }
972
- Object.seal(state);
973
- memo.set(container, state);
974
- return state;
623
+ memo.set(container, state2);
624
+ return state2;
975
625
  }
976
626
 
977
627
  // src/index.js