sprae 10.10.6 → 10.11.2
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/directive/value.js +1 -1
- package/dist/sprae.js +124 -201
- package/dist/sprae.js.map +4 -4
- package/dist/sprae.min.js +2 -2
- package/dist/sprae.min.js.map +3 -3
- package/dist/sprae.umd.js +126 -201
- package/dist/sprae.umd.js.map +4 -4
- package/dist/sprae.umd.min.js +2 -2
- package/dist/sprae.umd.min.js.map +3 -3
- package/package.json +1 -4
- package/readme.md +11 -9
- package/signal.js +55 -1
- package/sprae.js +0 -5
package/dist/sprae.umd.js
CHANGED
|
@@ -28,26 +28,70 @@ function use(s) {
|
|
|
28
28
|
batch = s.batch || ((fn) => fn());
|
|
29
29
|
untracked = s.untracked || batch;
|
|
30
30
|
}
|
|
31
|
-
var signal, effect,
|
|
31
|
+
var current, batched, signal, effect, computed, batch, untracked;
|
|
32
32
|
var init_signal = __esm({
|
|
33
33
|
"signal.js"() {
|
|
34
|
+
signal = (v, s, obs = /* @__PURE__ */ new Set()) => (s = {
|
|
35
|
+
get value() {
|
|
36
|
+
current?.deps.push(obs.add(current));
|
|
37
|
+
return v;
|
|
38
|
+
},
|
|
39
|
+
set value(val) {
|
|
40
|
+
if (val === v) return;
|
|
41
|
+
v = val;
|
|
42
|
+
for (let sub of obs) batched ? batched.add(sub) : sub();
|
|
43
|
+
},
|
|
44
|
+
peek() {
|
|
45
|
+
return v;
|
|
46
|
+
}
|
|
47
|
+
}, s.toJSON = s.then = s.toString = s.valueOf = () => s.value, s);
|
|
48
|
+
effect = (fn, teardown, fx, deps) => (fx = (prev) => {
|
|
49
|
+
teardown?.call?.();
|
|
50
|
+
prev = current, current = fx;
|
|
51
|
+
try {
|
|
52
|
+
teardown = fn();
|
|
53
|
+
} finally {
|
|
54
|
+
current = prev;
|
|
55
|
+
}
|
|
56
|
+
}, deps = fx.deps = [], fx(), (dep) => {
|
|
57
|
+
teardown?.call?.();
|
|
58
|
+
while (dep = deps.pop()) dep.delete(fx);
|
|
59
|
+
});
|
|
60
|
+
computed = (fn, s = signal(), c, e) => (c = {
|
|
61
|
+
get value() {
|
|
62
|
+
e || (e = effect(() => s.value = fn()));
|
|
63
|
+
return s.value;
|
|
64
|
+
},
|
|
65
|
+
peek: s.peek
|
|
66
|
+
}, c.toJSON = c.then = c.toString = c.valueOf = () => c.value, c);
|
|
67
|
+
batch = (fn) => {
|
|
68
|
+
let fxs = batched;
|
|
69
|
+
if (!fxs) batched = /* @__PURE__ */ new Set();
|
|
70
|
+
try {
|
|
71
|
+
fn();
|
|
72
|
+
} finally {
|
|
73
|
+
if (!fxs) {
|
|
74
|
+
fxs = batched;
|
|
75
|
+
batched = null;
|
|
76
|
+
for (const fx of fxs) fx();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
untracked = (fn, prev, v) => (prev = current, current = null, v = fn(), current = prev, v);
|
|
34
81
|
}
|
|
35
82
|
});
|
|
36
83
|
|
|
37
84
|
// store.js
|
|
38
85
|
function store(values, parent) {
|
|
39
|
-
if (!values)
|
|
40
|
-
|
|
41
|
-
if (values
|
|
42
|
-
|
|
43
|
-
if (Array.isArray(values))
|
|
44
|
-
return list(values);
|
|
45
|
-
if (values.constructor !== Object)
|
|
46
|
-
return values;
|
|
86
|
+
if (!values) return values;
|
|
87
|
+
if (values[_signals]) return values;
|
|
88
|
+
if (Array.isArray(values)) return list(values);
|
|
89
|
+
if (values.constructor !== Object) return values;
|
|
47
90
|
let signals = { ...parent?.[_signals] }, _len = signal(Object.values(values).length);
|
|
48
91
|
const state = new Proxy(signals, {
|
|
49
92
|
get: (_, key) => key === _change ? _len : key === _signals ? signals : signals[key]?.valueOf(),
|
|
50
93
|
set: (_, key, v, s) => (s = signals[key], set(signals, key, v), s ?? ++_len.value, 1),
|
|
94
|
+
// bump length for new signal
|
|
51
95
|
deleteProperty: (_, key) => (signals[key] && (del(signals, key), _len.value--), 1),
|
|
52
96
|
ownKeys() {
|
|
53
97
|
_len.value;
|
|
@@ -67,31 +111,24 @@ function store(values, parent) {
|
|
|
67
111
|
}
|
|
68
112
|
function list(values) {
|
|
69
113
|
let lastProp;
|
|
70
|
-
if (values[_signals])
|
|
71
|
-
return values;
|
|
114
|
+
if (values[_signals]) return values;
|
|
72
115
|
let _len = signal(values.length), signals = Array(values.length).fill();
|
|
73
116
|
const state = new Proxy(signals, {
|
|
74
117
|
get(_, key) {
|
|
75
|
-
if (typeof key === "symbol")
|
|
76
|
-
|
|
77
|
-
if (key === "length")
|
|
78
|
-
return mut[lastProp] ? _len.peek() : _len.value;
|
|
118
|
+
if (typeof key === "symbol") return key === _change ? _len : key === _signals ? signals : signals[key];
|
|
119
|
+
if (key === "length") return mut[lastProp] ? _len.peek() : _len.value;
|
|
79
120
|
lastProp = key;
|
|
80
|
-
if (signals[key])
|
|
81
|
-
|
|
82
|
-
if (key < signals.length)
|
|
83
|
-
return (signals[key] = signal(store(values[key]))).value;
|
|
121
|
+
if (signals[key]) return signals[key].valueOf();
|
|
122
|
+
if (key < signals.length) return (signals[key] = signal(store(values[key]))).value;
|
|
84
123
|
},
|
|
85
124
|
set(_, key, v) {
|
|
86
125
|
if (key === "length") {
|
|
87
|
-
for (let i = v, l = signals.length; i < l; i++)
|
|
88
|
-
delete state[i];
|
|
126
|
+
for (let i = v, l = signals.length; i < l; i++) delete state[i];
|
|
89
127
|
_len.value = signals.length = v;
|
|
90
128
|
return true;
|
|
91
129
|
}
|
|
92
130
|
set(signals, key, v);
|
|
93
|
-
if (key >= _len.peek())
|
|
94
|
-
_len.value = signals.length = Number(key) + 1;
|
|
131
|
+
if (key >= _len.peek()) _len.value = signals.length = Number(key) + 1;
|
|
95
132
|
return true;
|
|
96
133
|
},
|
|
97
134
|
deleteProperty: (_, key) => (signals[key] && del(signals, key), 1)
|
|
@@ -100,25 +137,20 @@ function list(values) {
|
|
|
100
137
|
}
|
|
101
138
|
function set(signals, key, v) {
|
|
102
139
|
let s = signals[key];
|
|
103
|
-
if (key[0] === "_")
|
|
104
|
-
signals[key] = v;
|
|
140
|
+
if (key[0] === "_") signals[key] = v;
|
|
105
141
|
else if (!s) {
|
|
106
142
|
signals[key] = s = v?.peek ? v : signal(store(v));
|
|
107
|
-
} else if (v === s.peek())
|
|
108
|
-
|
|
109
|
-
else if (s._set)
|
|
110
|
-
s._set(v);
|
|
143
|
+
} else if (v === s.peek()) ;
|
|
144
|
+
else if (s._set) s._set(v);
|
|
111
145
|
else if (Array.isArray(v) && Array.isArray(s.peek())) {
|
|
112
146
|
const cur = s.peek();
|
|
113
|
-
if (cur[_change])
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
cur[i] = v[i];
|
|
119
|
-
cur.length = l;
|
|
120
|
-
});
|
|
147
|
+
if (cur[_change]) untracked(() => {
|
|
148
|
+
batch(() => {
|
|
149
|
+
let i = 0, l = v.length;
|
|
150
|
+
for (; i < l; i++) cur[i] = v[i];
|
|
151
|
+
cur.length = l;
|
|
121
152
|
});
|
|
153
|
+
});
|
|
122
154
|
else {
|
|
123
155
|
s.value = v;
|
|
124
156
|
}
|
|
@@ -128,8 +160,7 @@ function set(signals, key, v) {
|
|
|
128
160
|
}
|
|
129
161
|
function del(signals, key) {
|
|
130
162
|
const s = signals[key], del2 = s[Symbol.dispose];
|
|
131
|
-
if (del2)
|
|
132
|
-
delete s[Symbol.dispose];
|
|
163
|
+
if (del2) delete s[Symbol.dispose];
|
|
133
164
|
delete signals[key];
|
|
134
165
|
del2?.();
|
|
135
166
|
}
|
|
@@ -145,24 +176,20 @@ var init_store = __esm({
|
|
|
145
176
|
|
|
146
177
|
// core.js
|
|
147
178
|
function sprae(el, values) {
|
|
148
|
-
if (!el?.childNodes)
|
|
149
|
-
return;
|
|
179
|
+
if (!el?.childNodes) return;
|
|
150
180
|
if (memo.has(el)) {
|
|
151
181
|
return Object.assign(memo.get(el), values);
|
|
152
182
|
}
|
|
153
183
|
const state = store(values || {}), disposes = [];
|
|
154
184
|
init2(el);
|
|
155
|
-
if (!memo.has(el))
|
|
156
|
-
memo.set(el, state);
|
|
185
|
+
if (!memo.has(el)) memo.set(el, state);
|
|
157
186
|
el[_dispose] = () => {
|
|
158
|
-
while (disposes.length)
|
|
159
|
-
disposes.pop()();
|
|
187
|
+
while (disposes.length) disposes.pop()();
|
|
160
188
|
memo.delete(el);
|
|
161
189
|
};
|
|
162
190
|
return state;
|
|
163
191
|
function init2(el2, parent = el2.parentNode) {
|
|
164
|
-
if (!el2.childNodes)
|
|
165
|
-
return;
|
|
192
|
+
if (!el2.childNodes) return;
|
|
166
193
|
for (let i = 0; i < el2.attributes?.length; ) {
|
|
167
194
|
let attr2 = el2.attributes[i];
|
|
168
195
|
if (attr2.name[0] === ":") {
|
|
@@ -172,18 +199,13 @@ function sprae(el, values) {
|
|
|
172
199
|
let dir = directive[name] || directive.default;
|
|
173
200
|
let evaluate = (dir.parse || parse)(attr2.value);
|
|
174
201
|
let dispose = dir(el2, evaluate, state, name);
|
|
175
|
-
if (dispose)
|
|
176
|
-
disposes.push(dispose);
|
|
202
|
+
if (dispose) disposes.push(dispose);
|
|
177
203
|
}
|
|
178
|
-
if (memo.has(el2))
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
return;
|
|
182
|
-
} else
|
|
183
|
-
i++;
|
|
204
|
+
if (memo.has(el2)) return el2[_dispose] && disposes.push(el2[_dispose]);
|
|
205
|
+
if (el2.parentNode !== parent) return;
|
|
206
|
+
} else i++;
|
|
184
207
|
}
|
|
185
|
-
for (let child of [...el2.childNodes])
|
|
186
|
-
init2(child, el2);
|
|
208
|
+
for (let child of [...el2.childNodes]) init2(child, el2);
|
|
187
209
|
}
|
|
188
210
|
;
|
|
189
211
|
}
|
|
@@ -197,8 +219,7 @@ var init_core = __esm({
|
|
|
197
219
|
memo = /* @__PURE__ */ new WeakMap();
|
|
198
220
|
evalMemo = {};
|
|
199
221
|
parse = (expr, dir, fn) => {
|
|
200
|
-
if (fn = evalMemo[expr = expr.trim()])
|
|
201
|
-
return fn;
|
|
222
|
+
if (fn = evalMemo[expr = expr.trim()]) return fn;
|
|
202
223
|
try {
|
|
203
224
|
fn = compile(expr);
|
|
204
225
|
} catch (e) {
|
|
@@ -218,16 +239,14 @@ ${dir}${expr ? `="${expr}"
|
|
|
218
239
|
s.compile && (compile = s.compile);
|
|
219
240
|
};
|
|
220
241
|
frag = (tpl) => {
|
|
221
|
-
if (!tpl.nodeType)
|
|
222
|
-
return tpl;
|
|
242
|
+
if (!tpl.nodeType) return tpl;
|
|
223
243
|
let content = tpl.content.cloneNode(true), attributes = [...tpl.attributes], ref = document.createTextNode(""), childNodes = (content.append(ref), [...content.childNodes]);
|
|
224
244
|
return {
|
|
225
245
|
childNodes,
|
|
226
246
|
content,
|
|
227
247
|
remove: () => content.append(...childNodes),
|
|
228
248
|
replaceWith(el) {
|
|
229
|
-
if (el === ref)
|
|
230
|
-
return;
|
|
249
|
+
if (el === ref) return;
|
|
231
250
|
ref.before(el);
|
|
232
251
|
content.append(...childNodes);
|
|
233
252
|
},
|
|
@@ -240,73 +259,6 @@ ${dir}${expr ? `="${expr}"
|
|
|
240
259
|
}
|
|
241
260
|
});
|
|
242
261
|
|
|
243
|
-
// node_modules/ulive/dist/ulive.es.js
|
|
244
|
-
var ulive_es_exports = {};
|
|
245
|
-
__export(ulive_es_exports, {
|
|
246
|
-
batch: () => batch2,
|
|
247
|
-
computed: () => computed2,
|
|
248
|
-
effect: () => effect2,
|
|
249
|
-
signal: () => signal2,
|
|
250
|
-
untracked: () => untracked2
|
|
251
|
-
});
|
|
252
|
-
var current, batched, signal2, effect2, computed2, batch2, untracked2;
|
|
253
|
-
var init_ulive_es = __esm({
|
|
254
|
-
"node_modules/ulive/dist/ulive.es.js"() {
|
|
255
|
-
signal2 = (v, s, obs = /* @__PURE__ */ new Set()) => (s = {
|
|
256
|
-
get value() {
|
|
257
|
-
current?.deps.push(obs.add(current));
|
|
258
|
-
return v;
|
|
259
|
-
},
|
|
260
|
-
set value(val) {
|
|
261
|
-
if (val === v)
|
|
262
|
-
return;
|
|
263
|
-
v = val;
|
|
264
|
-
for (let sub of obs)
|
|
265
|
-
batched ? batched.add(sub) : sub();
|
|
266
|
-
},
|
|
267
|
-
peek() {
|
|
268
|
-
return v;
|
|
269
|
-
}
|
|
270
|
-
}, s.toJSON = s.then = s.toString = s.valueOf = () => s.value, s);
|
|
271
|
-
effect2 = (fn, teardown, fx, deps) => (fx = (prev) => {
|
|
272
|
-
teardown?.call?.();
|
|
273
|
-
prev = current, current = fx;
|
|
274
|
-
try {
|
|
275
|
-
teardown = fn();
|
|
276
|
-
} finally {
|
|
277
|
-
current = prev;
|
|
278
|
-
}
|
|
279
|
-
}, deps = fx.deps = [], fx(), (dep) => {
|
|
280
|
-
teardown?.call?.();
|
|
281
|
-
while (dep = deps.pop())
|
|
282
|
-
dep.delete(fx);
|
|
283
|
-
});
|
|
284
|
-
computed2 = (fn, s = signal2(), c, e) => (c = {
|
|
285
|
-
get value() {
|
|
286
|
-
e || (e = effect2(() => s.value = fn()));
|
|
287
|
-
return s.value;
|
|
288
|
-
},
|
|
289
|
-
peek: s.peek
|
|
290
|
-
}, c.toJSON = c.then = c.toString = c.valueOf = () => c.value, c);
|
|
291
|
-
batch2 = (fn) => {
|
|
292
|
-
let fxs = batched;
|
|
293
|
-
if (!fxs)
|
|
294
|
-
batched = /* @__PURE__ */ new Set();
|
|
295
|
-
try {
|
|
296
|
-
fn();
|
|
297
|
-
} finally {
|
|
298
|
-
if (!fxs) {
|
|
299
|
-
fxs = batched;
|
|
300
|
-
batched = null;
|
|
301
|
-
for (const fx of fxs)
|
|
302
|
-
fx();
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
};
|
|
306
|
-
untracked2 = (fn, prev, v) => (prev = current, current = null, v = fn(), current = prev, v);
|
|
307
|
-
}
|
|
308
|
-
});
|
|
309
|
-
|
|
310
262
|
// directive/if.js
|
|
311
263
|
var _prevIf;
|
|
312
264
|
var init_if = __esm({
|
|
@@ -321,13 +273,11 @@ var init_if = __esm({
|
|
|
321
273
|
memo.set(ifEl, null);
|
|
322
274
|
if (next?.hasAttribute(":else")) {
|
|
323
275
|
next.removeAttribute(":else");
|
|
324
|
-
if (!next.hasAttribute(":if"))
|
|
325
|
-
next.remove(), elseEl = next.content ? frag(next) : next, memo.set(elseEl, null);
|
|
276
|
+
if (!next.hasAttribute(":if")) next.remove(), elseEl = next.content ? frag(next) : next, memo.set(elseEl, null);
|
|
326
277
|
}
|
|
327
278
|
return effect(() => {
|
|
328
279
|
const newEl = evaluate(state) ? ifEl : el[_prevIf] ? null : elseEl;
|
|
329
|
-
if (next)
|
|
330
|
-
next[_prevIf] = newEl === ifEl;
|
|
280
|
+
if (next) next[_prevIf] = newEl === ifEl;
|
|
331
281
|
if (curEl != newEl) {
|
|
332
282
|
curEl?.remove();
|
|
333
283
|
if (curEl = newEl) {
|
|
@@ -354,10 +304,8 @@ var init_each = __esm({
|
|
|
354
304
|
const items = computed(() => {
|
|
355
305
|
keys2 = null;
|
|
356
306
|
let items2 = evaluate(state);
|
|
357
|
-
if (typeof items2 === "number")
|
|
358
|
-
|
|
359
|
-
if (items2?.constructor === Object)
|
|
360
|
-
keys2 = Object.keys(items2), items2 = Object.values(items2);
|
|
307
|
+
if (typeof items2 === "number") items2 = Array.from({ length: items2 }, (_, i) => i + 1);
|
|
308
|
+
if (items2?.constructor === Object) keys2 = Object.keys(items2), items2 = Object.values(items2);
|
|
361
309
|
return items2 || [];
|
|
362
310
|
});
|
|
363
311
|
const update = () => {
|
|
@@ -402,8 +350,7 @@ var init_each = __esm({
|
|
|
402
350
|
if (!planned) {
|
|
403
351
|
update();
|
|
404
352
|
queueMicrotask(() => (planned && update(), planned = 0));
|
|
405
|
-
} else
|
|
406
|
-
planned++;
|
|
353
|
+
} else planned++;
|
|
407
354
|
});
|
|
408
355
|
};
|
|
409
356
|
directive.each.parse = (expr) => {
|
|
@@ -449,8 +396,7 @@ var init_html = __esm({
|
|
|
449
396
|
init_core();
|
|
450
397
|
directive.html = (el, evaluate, state) => {
|
|
451
398
|
let tpl = evaluate(state);
|
|
452
|
-
if (!tpl)
|
|
453
|
-
return;
|
|
399
|
+
if (!tpl) return;
|
|
454
400
|
let content = (tpl.content || tpl).cloneNode(true);
|
|
455
401
|
el.replaceChildren(content);
|
|
456
402
|
sprae(el, state);
|
|
@@ -464,8 +410,7 @@ var init_text = __esm({
|
|
|
464
410
|
init_core();
|
|
465
411
|
init_signal();
|
|
466
412
|
directive.text = (el, evaluate, state) => {
|
|
467
|
-
if (el.content)
|
|
468
|
-
el.replaceWith(el = frag(el).childNodes[0]);
|
|
413
|
+
if (el.content) el.replaceWith(el = frag(el).childNodes[0]);
|
|
469
414
|
return effect(() => {
|
|
470
415
|
let value = evaluate(state);
|
|
471
416
|
el.textContent = value == null ? "" : value;
|
|
@@ -485,20 +430,13 @@ var init_class = __esm({
|
|
|
485
430
|
let v = evaluate(state);
|
|
486
431
|
let clsx = /* @__PURE__ */ new Set();
|
|
487
432
|
if (v) {
|
|
488
|
-
if (typeof v === "string")
|
|
489
|
-
|
|
490
|
-
else
|
|
491
|
-
v.map((v2) => v2 && clsx.add(v2));
|
|
492
|
-
else
|
|
493
|
-
Object.entries(v).map(([k, v2]) => v2 && clsx.add(k));
|
|
433
|
+
if (typeof v === "string") v.split(" ").map((cls) => clsx.add(cls));
|
|
434
|
+
else if (Array.isArray(v)) v.map((v2) => v2 && clsx.add(v2));
|
|
435
|
+
else Object.entries(v).map(([k, v2]) => v2 && clsx.add(k));
|
|
494
436
|
}
|
|
495
|
-
for (let cls of cur)
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
else
|
|
499
|
-
el.classList.remove(cls);
|
|
500
|
-
for (let cls of cur = clsx)
|
|
501
|
-
el.classList.add(cls);
|
|
437
|
+
for (let cls of cur) if (clsx.has(cls)) clsx.delete(cls);
|
|
438
|
+
else el.classList.remove(cls);
|
|
439
|
+
for (let cls of cur = clsx) el.classList.add(cls);
|
|
502
440
|
});
|
|
503
441
|
};
|
|
504
442
|
}
|
|
@@ -513,13 +451,10 @@ var init_style = __esm({
|
|
|
513
451
|
let initStyle = el.getAttribute("style");
|
|
514
452
|
return effect(() => {
|
|
515
453
|
let v = evaluate(state);
|
|
516
|
-
if (typeof v === "string")
|
|
517
|
-
el.setAttribute("style", initStyle + (initStyle.endsWith(";") ? "" : "; ") + v);
|
|
454
|
+
if (typeof v === "string") el.setAttribute("style", initStyle + (initStyle.endsWith(";") ? "" : "; ") + v);
|
|
518
455
|
else {
|
|
519
|
-
if (initStyle)
|
|
520
|
-
|
|
521
|
-
for (let k in v)
|
|
522
|
-
k[0] == "-" ? el.style.setProperty(k, v[k]) : el.style[k] = v[k];
|
|
456
|
+
if (initStyle) el.setAttribute("style", initStyle);
|
|
457
|
+
for (let k in v) k[0] == "-" ? el.style.setProperty(k, v[k]) : el.style[k] = v[k];
|
|
523
458
|
}
|
|
524
459
|
});
|
|
525
460
|
};
|
|
@@ -533,15 +468,11 @@ var init_default = __esm({
|
|
|
533
468
|
init_core();
|
|
534
469
|
init_signal();
|
|
535
470
|
directive.default = (target, evaluate, state, name) => {
|
|
536
|
-
if (!name.startsWith("on"))
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
else
|
|
542
|
-
for (let key in value)
|
|
543
|
-
attr(target, dashcase(key), value[key]);
|
|
544
|
-
});
|
|
471
|
+
if (!name.startsWith("on")) return effect(() => {
|
|
472
|
+
let value = evaluate(state);
|
|
473
|
+
if (name) attr(target, name, value);
|
|
474
|
+
else for (let key in value) attr(target, dashcase(key), value[key]);
|
|
475
|
+
});
|
|
545
476
|
const ctxs = name.split("..").map((e) => {
|
|
546
477
|
let ctx = { evt: "", target, test: () => true };
|
|
547
478
|
ctx.evt = (e.startsWith("on") ? e.slice(2) : e).replace(
|
|
@@ -550,16 +481,14 @@ var init_default = __esm({
|
|
|
550
481
|
);
|
|
551
482
|
return ctx;
|
|
552
483
|
});
|
|
553
|
-
if (ctxs.length == 1)
|
|
554
|
-
return effect(() => addListener(evaluate(state), ctxs[0]));
|
|
484
|
+
if (ctxs.length == 1) return effect(() => addListener(evaluate(state), ctxs[0]));
|
|
555
485
|
let startFn, nextFn, off, idx = 0;
|
|
556
486
|
const nextListener = (fn) => {
|
|
557
487
|
off = addListener((e) => (off(), nextFn = fn?.(e), (idx = ++idx % ctxs.length) ? nextListener(nextFn) : startFn && nextListener(startFn)), ctxs[idx]);
|
|
558
488
|
};
|
|
559
489
|
return effect(() => (startFn = evaluate(state), !off && nextListener(startFn), () => startFn = null));
|
|
560
490
|
function addListener(fn, { evt, target: target2, test, defer, stop, prevent, immediate, ...opts }) {
|
|
561
|
-
if (defer)
|
|
562
|
-
fn = defer(fn);
|
|
491
|
+
if (defer) fn = defer(fn);
|
|
563
492
|
const cb = (e) => {
|
|
564
493
|
try {
|
|
565
494
|
test(e) && (stop && (immediate ? e.stopImmediatePropagation() : e.stopPropagation()), prevent && e.preventDefault(), fn?.(e));
|
|
@@ -573,6 +502,7 @@ var init_default = __esm({
|
|
|
573
502
|
;
|
|
574
503
|
};
|
|
575
504
|
mods = {
|
|
505
|
+
// actions
|
|
576
506
|
prevent(ctx) {
|
|
577
507
|
ctx.prevent = true;
|
|
578
508
|
},
|
|
@@ -582,6 +512,7 @@ var init_default = __esm({
|
|
|
582
512
|
immediate(ctx) {
|
|
583
513
|
ctx.immediate = true;
|
|
584
514
|
},
|
|
515
|
+
// options
|
|
585
516
|
once(ctx) {
|
|
586
517
|
ctx.once = true;
|
|
587
518
|
},
|
|
@@ -591,6 +522,7 @@ var init_default = __esm({
|
|
|
591
522
|
capture(ctx) {
|
|
592
523
|
ctx.capture = true;
|
|
593
524
|
},
|
|
525
|
+
// target
|
|
594
526
|
window(ctx) {
|
|
595
527
|
ctx.target = window;
|
|
596
528
|
},
|
|
@@ -603,21 +535,21 @@ var init_default = __esm({
|
|
|
603
535
|
debounce(ctx, wait) {
|
|
604
536
|
ctx.defer = (fn) => debounce(fn, wait ? Number(wait) || 0 : 108);
|
|
605
537
|
},
|
|
538
|
+
// test
|
|
606
539
|
outside: (ctx) => (e) => {
|
|
607
540
|
let target = ctx.target;
|
|
608
|
-
if (target.contains(e.target))
|
|
609
|
-
|
|
610
|
-
if (
|
|
611
|
-
return false;
|
|
612
|
-
if (target.offsetWidth < 1 && target.offsetHeight < 1)
|
|
613
|
-
return false;
|
|
541
|
+
if (target.contains(e.target)) return false;
|
|
542
|
+
if (e.target.isConnected === false) return false;
|
|
543
|
+
if (target.offsetWidth < 1 && target.offsetHeight < 1) return false;
|
|
614
544
|
return true;
|
|
615
545
|
},
|
|
616
546
|
self: (ctx) => (e) => e.target === ctx.target,
|
|
547
|
+
// keyboard
|
|
617
548
|
ctrl: (_, ...param) => (e) => keys.ctrl(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
|
|
618
549
|
shift: (_, ...param) => (e) => keys.shift(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
|
|
619
550
|
alt: (_, ...param) => (e) => keys.alt(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
|
|
620
551
|
meta: (_, ...param) => (e) => keys.meta(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
|
|
552
|
+
// NOTE: we don't expose up/left/right/down as too verbose: can and better be handled/differentiated at once
|
|
621
553
|
arrow: () => keys.arrow,
|
|
622
554
|
enter: () => keys.enter,
|
|
623
555
|
esc: () => keys.esc,
|
|
@@ -644,23 +576,19 @@ var init_default = __esm({
|
|
|
644
576
|
char: (e) => /^\S$/.test(e.key)
|
|
645
577
|
};
|
|
646
578
|
attr = (el, name, v) => {
|
|
647
|
-
if (v == null || v === false)
|
|
648
|
-
|
|
649
|
-
else
|
|
650
|
-
el.setAttribute(name, v === true ? "" : typeof v === "number" || typeof v === "string" ? v : "");
|
|
579
|
+
if (v == null || v === false) el.removeAttribute(name);
|
|
580
|
+
else el.setAttribute(name, v === true ? "" : typeof v === "number" || typeof v === "string" ? v : "");
|
|
651
581
|
};
|
|
652
582
|
throttle = (fn, limit) => {
|
|
653
583
|
let pause, planned, block = (e) => {
|
|
654
584
|
pause = true;
|
|
655
585
|
setTimeout(() => {
|
|
656
586
|
pause = false;
|
|
657
|
-
if (planned)
|
|
658
|
-
return planned = false, block(e), fn(e);
|
|
587
|
+
if (planned) return planned = false, block(e), fn(e);
|
|
659
588
|
}, limit);
|
|
660
589
|
};
|
|
661
590
|
return (e) => {
|
|
662
|
-
if (pause)
|
|
663
|
-
return planned = true;
|
|
591
|
+
if (pause) return planned = true;
|
|
664
592
|
block(e);
|
|
665
593
|
return fn(e);
|
|
666
594
|
};
|
|
@@ -688,9 +616,11 @@ var init_value = __esm({
|
|
|
688
616
|
init_default();
|
|
689
617
|
init_signal();
|
|
690
618
|
directive.value = (el, [getValue, setValue], state) => {
|
|
691
|
-
const update = el.type === "text" || el.type === "" ? (value) => el.setAttribute("value", el.value = value == null ? "" : value) : el.tagName === "TEXTAREA" || el.type === "text" || el.type === "" ? (value, from, to) => (
|
|
692
|
-
|
|
693
|
-
|
|
619
|
+
const update = el.type === "text" || el.type === "" ? (value) => el.setAttribute("value", el.value = value == null ? "" : value) : el.tagName === "TEXTAREA" || el.type === "text" || el.type === "" ? (value, from, to) => (
|
|
620
|
+
// we retain selection in input
|
|
621
|
+
(from = el.selectionStart, to = el.selectionEnd, el.setAttribute("value", el.value = value == null ? "" : value), from && el.setSelectionRange(from, to))
|
|
622
|
+
) : el.type === "checkbox" ? (value) => (el.checked = value, attr(el, "checked", value)) : el.type === "select-one" ? (value) => {
|
|
623
|
+
for (let option of el.options) option.removeAttribute("selected");
|
|
694
624
|
el.value = value;
|
|
695
625
|
el.selectedOptions[0]?.setAttribute("selected", "");
|
|
696
626
|
} : (value) => el.value = value;
|
|
@@ -736,7 +666,6 @@ var sprae_default;
|
|
|
736
666
|
var init_sprae = __esm({
|
|
737
667
|
"sprae.js"() {
|
|
738
668
|
init_core();
|
|
739
|
-
init_ulive_es();
|
|
740
669
|
init_if();
|
|
741
670
|
init_each();
|
|
742
671
|
init_ref();
|
|
@@ -748,7 +677,6 @@ var init_sprae = __esm({
|
|
|
748
677
|
init_value();
|
|
749
678
|
init_fx();
|
|
750
679
|
init_default();
|
|
751
|
-
sprae.use(ulive_es_exports);
|
|
752
680
|
sprae.use({ compile: (expr) => sprae.constructor(`with (arguments[0]) { return ${expr} };`) });
|
|
753
681
|
sprae_default = sprae;
|
|
754
682
|
}
|
|
@@ -763,8 +691,7 @@ var init_data = __esm({
|
|
|
763
691
|
directive["data"] = (el, evaluate, state) => {
|
|
764
692
|
return effect(() => {
|
|
765
693
|
let value = evaluate(state);
|
|
766
|
-
for (let key in value)
|
|
767
|
-
el.dataset[key] = value[key];
|
|
694
|
+
for (let key in value) el.dataset[key] = value[key];
|
|
768
695
|
});
|
|
769
696
|
};
|
|
770
697
|
}
|
|
@@ -779,8 +706,7 @@ var init_aria = __esm({
|
|
|
779
706
|
init_signal();
|
|
780
707
|
directive["aria"] = (el, evaluate, state) => {
|
|
781
708
|
const update = (value) => {
|
|
782
|
-
for (let key in value)
|
|
783
|
-
attr(el, "aria-" + dashcase(key), value[key] == null ? null : value[key] + "");
|
|
709
|
+
for (let key in value) attr(el, "aria-" + dashcase(key), value[key] == null ? null : value[key] + "");
|
|
784
710
|
};
|
|
785
711
|
return effect(() => update(evaluate(state)));
|
|
786
712
|
};
|
|
@@ -794,8 +720,7 @@ init_aria();
|
|
|
794
720
|
init_html();
|
|
795
721
|
module.exports = sprae2;
|
|
796
722
|
var init = document.currentScript?.getAttribute("init") || null;
|
|
797
|
-
if (init)
|
|
798
|
-
sprae2(document.documentElement, JSON.parse(init));
|
|
723
|
+
if (init) sprae2(document.documentElement, JSON.parse(init));
|
|
799
724
|
;if (typeof module.exports == "object" && typeof exports == "object") {
|
|
800
725
|
var __cp = (to, from, except, desc) => {
|
|
801
726
|
if ((from && typeof from === "object") || typeof from === "function") {
|