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/directive/value.js
CHANGED
|
@@ -16,7 +16,7 @@ directive.value = (el, [getValue, setValue], state) => {
|
|
|
16
16
|
)
|
|
17
17
|
: (el.type === "checkbox") ? (value) => (el.checked = value, attr(el, "checked", value))
|
|
18
18
|
: (el.type === "select-one") ? (value) => {
|
|
19
|
-
for (let option
|
|
19
|
+
for (let option of el.options) option.removeAttribute("selected");
|
|
20
20
|
el.value = value;
|
|
21
21
|
el.selectedOptions[0]?.setAttribute("selected", "");
|
|
22
22
|
}
|
package/dist/sprae.js
CHANGED
|
@@ -1,15 +1,53 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __export = (target, all) => {
|
|
3
|
-
for (var name in all)
|
|
4
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
-
};
|
|
6
|
-
|
|
7
1
|
// signal.js
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
|
|
2
|
+
var current;
|
|
3
|
+
var batched;
|
|
4
|
+
var signal = (v, s, obs = /* @__PURE__ */ new Set()) => (s = {
|
|
5
|
+
get value() {
|
|
6
|
+
current?.deps.push(obs.add(current));
|
|
7
|
+
return v;
|
|
8
|
+
},
|
|
9
|
+
set value(val) {
|
|
10
|
+
if (val === v) return;
|
|
11
|
+
v = val;
|
|
12
|
+
for (let sub of obs) batched ? batched.add(sub) : sub();
|
|
13
|
+
},
|
|
14
|
+
peek() {
|
|
15
|
+
return v;
|
|
16
|
+
}
|
|
17
|
+
}, s.toJSON = s.then = s.toString = s.valueOf = () => s.value, s);
|
|
18
|
+
var effect = (fn, teardown, fx, deps) => (fx = (prev) => {
|
|
19
|
+
teardown?.call?.();
|
|
20
|
+
prev = current, current = fx;
|
|
21
|
+
try {
|
|
22
|
+
teardown = fn();
|
|
23
|
+
} finally {
|
|
24
|
+
current = prev;
|
|
25
|
+
}
|
|
26
|
+
}, deps = fx.deps = [], fx(), (dep) => {
|
|
27
|
+
teardown?.call?.();
|
|
28
|
+
while (dep = deps.pop()) dep.delete(fx);
|
|
29
|
+
});
|
|
30
|
+
var computed = (fn, s = signal(), c, e) => (c = {
|
|
31
|
+
get value() {
|
|
32
|
+
e || (e = effect(() => s.value = fn()));
|
|
33
|
+
return s.value;
|
|
34
|
+
},
|
|
35
|
+
peek: s.peek
|
|
36
|
+
}, c.toJSON = c.then = c.toString = c.valueOf = () => c.value, c);
|
|
37
|
+
var batch = (fn) => {
|
|
38
|
+
let fxs = batched;
|
|
39
|
+
if (!fxs) batched = /* @__PURE__ */ new Set();
|
|
40
|
+
try {
|
|
41
|
+
fn();
|
|
42
|
+
} finally {
|
|
43
|
+
if (!fxs) {
|
|
44
|
+
fxs = batched;
|
|
45
|
+
batched = null;
|
|
46
|
+
for (const fx of fxs) fx();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var untracked = (fn, prev, v) => (prev = current, current = null, v = fn(), current = prev, v);
|
|
13
51
|
function use(s) {
|
|
14
52
|
signal = s.signal;
|
|
15
53
|
effect = s.effect;
|
|
@@ -22,18 +60,15 @@ function use(s) {
|
|
|
22
60
|
var _signals = Symbol("signals");
|
|
23
61
|
var _change = Symbol("length");
|
|
24
62
|
function store(values, parent) {
|
|
25
|
-
if (!values)
|
|
26
|
-
|
|
27
|
-
if (values
|
|
28
|
-
|
|
29
|
-
if (Array.isArray(values))
|
|
30
|
-
return list(values);
|
|
31
|
-
if (values.constructor !== Object)
|
|
32
|
-
return values;
|
|
63
|
+
if (!values) return values;
|
|
64
|
+
if (values[_signals]) return values;
|
|
65
|
+
if (Array.isArray(values)) return list(values);
|
|
66
|
+
if (values.constructor !== Object) return values;
|
|
33
67
|
let signals = { ...parent?.[_signals] }, _len = signal(Object.values(values).length);
|
|
34
68
|
const state = new Proxy(signals, {
|
|
35
69
|
get: (_, key) => key === _change ? _len : key === _signals ? signals : signals[key]?.valueOf(),
|
|
36
70
|
set: (_, key, v, s) => (s = signals[key], set(signals, key, v), s ?? ++_len.value, 1),
|
|
71
|
+
// bump length for new signal
|
|
37
72
|
deleteProperty: (_, key) => (signals[key] && (del(signals, key), _len.value--), 1),
|
|
38
73
|
ownKeys() {
|
|
39
74
|
_len.value;
|
|
@@ -54,31 +89,24 @@ function store(values, parent) {
|
|
|
54
89
|
var mut = { push: 1, pop: 1, shift: 1, unshift: 1, splice: 1 };
|
|
55
90
|
function list(values) {
|
|
56
91
|
let lastProp;
|
|
57
|
-
if (values[_signals])
|
|
58
|
-
return values;
|
|
92
|
+
if (values[_signals]) return values;
|
|
59
93
|
let _len = signal(values.length), signals = Array(values.length).fill();
|
|
60
94
|
const state = new Proxy(signals, {
|
|
61
95
|
get(_, key) {
|
|
62
|
-
if (typeof key === "symbol")
|
|
63
|
-
|
|
64
|
-
if (key === "length")
|
|
65
|
-
return mut[lastProp] ? _len.peek() : _len.value;
|
|
96
|
+
if (typeof key === "symbol") return key === _change ? _len : key === _signals ? signals : signals[key];
|
|
97
|
+
if (key === "length") return mut[lastProp] ? _len.peek() : _len.value;
|
|
66
98
|
lastProp = key;
|
|
67
|
-
if (signals[key])
|
|
68
|
-
|
|
69
|
-
if (key < signals.length)
|
|
70
|
-
return (signals[key] = signal(store(values[key]))).value;
|
|
99
|
+
if (signals[key]) return signals[key].valueOf();
|
|
100
|
+
if (key < signals.length) return (signals[key] = signal(store(values[key]))).value;
|
|
71
101
|
},
|
|
72
102
|
set(_, key, v) {
|
|
73
103
|
if (key === "length") {
|
|
74
|
-
for (let i = v, l = signals.length; i < l; i++)
|
|
75
|
-
delete state[i];
|
|
104
|
+
for (let i = v, l = signals.length; i < l; i++) delete state[i];
|
|
76
105
|
_len.value = signals.length = v;
|
|
77
106
|
return true;
|
|
78
107
|
}
|
|
79
108
|
set(signals, key, v);
|
|
80
|
-
if (key >= _len.peek())
|
|
81
|
-
_len.value = signals.length = Number(key) + 1;
|
|
109
|
+
if (key >= _len.peek()) _len.value = signals.length = Number(key) + 1;
|
|
82
110
|
return true;
|
|
83
111
|
},
|
|
84
112
|
deleteProperty: (_, key) => (signals[key] && del(signals, key), 1)
|
|
@@ -87,25 +115,20 @@ function list(values) {
|
|
|
87
115
|
}
|
|
88
116
|
function set(signals, key, v) {
|
|
89
117
|
let s = signals[key];
|
|
90
|
-
if (key[0] === "_")
|
|
91
|
-
signals[key] = v;
|
|
118
|
+
if (key[0] === "_") signals[key] = v;
|
|
92
119
|
else if (!s) {
|
|
93
120
|
signals[key] = s = v?.peek ? v : signal(store(v));
|
|
94
|
-
} else if (v === s.peek())
|
|
95
|
-
|
|
96
|
-
else if (s._set)
|
|
97
|
-
s._set(v);
|
|
121
|
+
} else if (v === s.peek()) ;
|
|
122
|
+
else if (s._set) s._set(v);
|
|
98
123
|
else if (Array.isArray(v) && Array.isArray(s.peek())) {
|
|
99
124
|
const cur = s.peek();
|
|
100
|
-
if (cur[_change])
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
cur[i] = v[i];
|
|
106
|
-
cur.length = l;
|
|
107
|
-
});
|
|
125
|
+
if (cur[_change]) untracked(() => {
|
|
126
|
+
batch(() => {
|
|
127
|
+
let i = 0, l = v.length;
|
|
128
|
+
for (; i < l; i++) cur[i] = v[i];
|
|
129
|
+
cur.length = l;
|
|
108
130
|
});
|
|
131
|
+
});
|
|
109
132
|
else {
|
|
110
133
|
s.value = v;
|
|
111
134
|
}
|
|
@@ -115,8 +138,7 @@ function set(signals, key, v) {
|
|
|
115
138
|
}
|
|
116
139
|
function del(signals, key) {
|
|
117
140
|
const s = signals[key], del2 = s[Symbol.dispose];
|
|
118
|
-
if (del2)
|
|
119
|
-
delete s[Symbol.dispose];
|
|
141
|
+
if (del2) delete s[Symbol.dispose];
|
|
120
142
|
delete signals[key];
|
|
121
143
|
del2?.();
|
|
122
144
|
}
|
|
@@ -126,24 +148,20 @@ var _dispose = Symbol.dispose || (Symbol.dispose = Symbol("dispose"));
|
|
|
126
148
|
var directive = {};
|
|
127
149
|
var memo = /* @__PURE__ */ new WeakMap();
|
|
128
150
|
function sprae(el, values) {
|
|
129
|
-
if (!el?.childNodes)
|
|
130
|
-
return;
|
|
151
|
+
if (!el?.childNodes) return;
|
|
131
152
|
if (memo.has(el)) {
|
|
132
153
|
return Object.assign(memo.get(el), values);
|
|
133
154
|
}
|
|
134
155
|
const state = store(values || {}), disposes = [];
|
|
135
156
|
init(el);
|
|
136
|
-
if (!memo.has(el))
|
|
137
|
-
memo.set(el, state);
|
|
157
|
+
if (!memo.has(el)) memo.set(el, state);
|
|
138
158
|
el[_dispose] = () => {
|
|
139
|
-
while (disposes.length)
|
|
140
|
-
disposes.pop()();
|
|
159
|
+
while (disposes.length) disposes.pop()();
|
|
141
160
|
memo.delete(el);
|
|
142
161
|
};
|
|
143
162
|
return state;
|
|
144
163
|
function init(el2, parent = el2.parentNode) {
|
|
145
|
-
if (!el2.childNodes)
|
|
146
|
-
return;
|
|
164
|
+
if (!el2.childNodes) return;
|
|
147
165
|
for (let i = 0; i < el2.attributes?.length; ) {
|
|
148
166
|
let attr2 = el2.attributes[i];
|
|
149
167
|
if (attr2.name[0] === ":") {
|
|
@@ -153,25 +171,19 @@ function sprae(el, values) {
|
|
|
153
171
|
let dir = directive[name] || directive.default;
|
|
154
172
|
let evaluate = (dir.parse || parse)(attr2.value);
|
|
155
173
|
let dispose = dir(el2, evaluate, state, name);
|
|
156
|
-
if (dispose)
|
|
157
|
-
disposes.push(dispose);
|
|
174
|
+
if (dispose) disposes.push(dispose);
|
|
158
175
|
}
|
|
159
|
-
if (memo.has(el2))
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
return;
|
|
163
|
-
} else
|
|
164
|
-
i++;
|
|
176
|
+
if (memo.has(el2)) return el2[_dispose] && disposes.push(el2[_dispose]);
|
|
177
|
+
if (el2.parentNode !== parent) return;
|
|
178
|
+
} else i++;
|
|
165
179
|
}
|
|
166
|
-
for (let child of [...el2.childNodes])
|
|
167
|
-
init(child, el2);
|
|
180
|
+
for (let child of [...el2.childNodes]) init(child, el2);
|
|
168
181
|
}
|
|
169
182
|
;
|
|
170
183
|
}
|
|
171
184
|
var evalMemo = {};
|
|
172
185
|
var parse = (expr, dir, fn) => {
|
|
173
|
-
if (fn = evalMemo[expr = expr.trim()])
|
|
174
|
-
return fn;
|
|
186
|
+
if (fn = evalMemo[expr = expr.trim()]) return fn;
|
|
175
187
|
try {
|
|
176
188
|
fn = compile(expr);
|
|
177
189
|
} catch (e) {
|
|
@@ -192,16 +204,14 @@ sprae.use = (s) => {
|
|
|
192
204
|
s.compile && (compile = s.compile);
|
|
193
205
|
};
|
|
194
206
|
var frag = (tpl) => {
|
|
195
|
-
if (!tpl.nodeType)
|
|
196
|
-
return tpl;
|
|
207
|
+
if (!tpl.nodeType) return tpl;
|
|
197
208
|
let content = tpl.content.cloneNode(true), attributes = [...tpl.attributes], ref = document.createTextNode(""), childNodes = (content.append(ref), [...content.childNodes]);
|
|
198
209
|
return {
|
|
199
210
|
childNodes,
|
|
200
211
|
content,
|
|
201
212
|
remove: () => content.append(...childNodes),
|
|
202
213
|
replaceWith(el) {
|
|
203
|
-
if (el === ref)
|
|
204
|
-
return;
|
|
214
|
+
if (el === ref) return;
|
|
205
215
|
ref.before(el);
|
|
206
216
|
content.append(...childNodes);
|
|
207
217
|
},
|
|
@@ -212,70 +222,6 @@ var frag = (tpl) => {
|
|
|
212
222
|
};
|
|
213
223
|
};
|
|
214
224
|
|
|
215
|
-
// node_modules/ulive/dist/ulive.es.js
|
|
216
|
-
var ulive_es_exports = {};
|
|
217
|
-
__export(ulive_es_exports, {
|
|
218
|
-
batch: () => batch2,
|
|
219
|
-
computed: () => computed2,
|
|
220
|
-
effect: () => effect2,
|
|
221
|
-
signal: () => signal2,
|
|
222
|
-
untracked: () => untracked2
|
|
223
|
-
});
|
|
224
|
-
var current;
|
|
225
|
-
var batched;
|
|
226
|
-
var signal2 = (v, s, obs = /* @__PURE__ */ new Set()) => (s = {
|
|
227
|
-
get value() {
|
|
228
|
-
current?.deps.push(obs.add(current));
|
|
229
|
-
return v;
|
|
230
|
-
},
|
|
231
|
-
set value(val) {
|
|
232
|
-
if (val === v)
|
|
233
|
-
return;
|
|
234
|
-
v = val;
|
|
235
|
-
for (let sub of obs)
|
|
236
|
-
batched ? batched.add(sub) : sub();
|
|
237
|
-
},
|
|
238
|
-
peek() {
|
|
239
|
-
return v;
|
|
240
|
-
}
|
|
241
|
-
}, s.toJSON = s.then = s.toString = s.valueOf = () => s.value, s);
|
|
242
|
-
var effect2 = (fn, teardown, fx, deps) => (fx = (prev) => {
|
|
243
|
-
teardown?.call?.();
|
|
244
|
-
prev = current, current = fx;
|
|
245
|
-
try {
|
|
246
|
-
teardown = fn();
|
|
247
|
-
} finally {
|
|
248
|
-
current = prev;
|
|
249
|
-
}
|
|
250
|
-
}, deps = fx.deps = [], fx(), (dep) => {
|
|
251
|
-
teardown?.call?.();
|
|
252
|
-
while (dep = deps.pop())
|
|
253
|
-
dep.delete(fx);
|
|
254
|
-
});
|
|
255
|
-
var computed2 = (fn, s = signal2(), c, e) => (c = {
|
|
256
|
-
get value() {
|
|
257
|
-
e || (e = effect2(() => s.value = fn()));
|
|
258
|
-
return s.value;
|
|
259
|
-
},
|
|
260
|
-
peek: s.peek
|
|
261
|
-
}, c.toJSON = c.then = c.toString = c.valueOf = () => c.value, c);
|
|
262
|
-
var batch2 = (fn) => {
|
|
263
|
-
let fxs = batched;
|
|
264
|
-
if (!fxs)
|
|
265
|
-
batched = /* @__PURE__ */ new Set();
|
|
266
|
-
try {
|
|
267
|
-
fn();
|
|
268
|
-
} finally {
|
|
269
|
-
if (!fxs) {
|
|
270
|
-
fxs = batched;
|
|
271
|
-
batched = null;
|
|
272
|
-
for (const fx of fxs)
|
|
273
|
-
fx();
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
};
|
|
277
|
-
var untracked2 = (fn, prev, v) => (prev = current, current = null, v = fn(), current = prev, v);
|
|
278
|
-
|
|
279
225
|
// directive/if.js
|
|
280
226
|
var _prevIf = Symbol("if");
|
|
281
227
|
directive.if = (el, evaluate, state) => {
|
|
@@ -285,13 +231,11 @@ directive.if = (el, evaluate, state) => {
|
|
|
285
231
|
memo.set(ifEl, null);
|
|
286
232
|
if (next?.hasAttribute(":else")) {
|
|
287
233
|
next.removeAttribute(":else");
|
|
288
|
-
if (!next.hasAttribute(":if"))
|
|
289
|
-
next.remove(), elseEl = next.content ? frag(next) : next, memo.set(elseEl, null);
|
|
234
|
+
if (!next.hasAttribute(":if")) next.remove(), elseEl = next.content ? frag(next) : next, memo.set(elseEl, null);
|
|
290
235
|
}
|
|
291
236
|
return effect(() => {
|
|
292
237
|
const newEl = evaluate(state) ? ifEl : el[_prevIf] ? null : elseEl;
|
|
293
|
-
if (next)
|
|
294
|
-
next[_prevIf] = newEl === ifEl;
|
|
238
|
+
if (next) next[_prevIf] = newEl === ifEl;
|
|
295
239
|
if (curEl != newEl) {
|
|
296
240
|
curEl?.remove();
|
|
297
241
|
if (curEl = newEl) {
|
|
@@ -311,10 +255,8 @@ directive.each = (tpl, [itemVar, idxVar, evaluate], state) => {
|
|
|
311
255
|
const items = computed(() => {
|
|
312
256
|
keys2 = null;
|
|
313
257
|
let items2 = evaluate(state);
|
|
314
|
-
if (typeof items2 === "number")
|
|
315
|
-
|
|
316
|
-
if (items2?.constructor === Object)
|
|
317
|
-
keys2 = Object.keys(items2), items2 = Object.values(items2);
|
|
258
|
+
if (typeof items2 === "number") items2 = Array.from({ length: items2 }, (_, i) => i + 1);
|
|
259
|
+
if (items2?.constructor === Object) keys2 = Object.keys(items2), items2 = Object.values(items2);
|
|
318
260
|
return items2 || [];
|
|
319
261
|
});
|
|
320
262
|
const update = () => {
|
|
@@ -359,8 +301,7 @@ directive.each = (tpl, [itemVar, idxVar, evaluate], state) => {
|
|
|
359
301
|
if (!planned) {
|
|
360
302
|
update();
|
|
361
303
|
queueMicrotask(() => (planned && update(), planned = 0));
|
|
362
|
-
} else
|
|
363
|
-
planned++;
|
|
304
|
+
} else planned++;
|
|
364
305
|
});
|
|
365
306
|
};
|
|
366
307
|
directive.each.parse = (expr) => {
|
|
@@ -387,8 +328,7 @@ directive.with = (el, evaluate, rootState) => {
|
|
|
387
328
|
// directive/html.js
|
|
388
329
|
directive.html = (el, evaluate, state) => {
|
|
389
330
|
let tpl = evaluate(state);
|
|
390
|
-
if (!tpl)
|
|
391
|
-
return;
|
|
331
|
+
if (!tpl) return;
|
|
392
332
|
let content = (tpl.content || tpl).cloneNode(true);
|
|
393
333
|
el.replaceChildren(content);
|
|
394
334
|
sprae(el, state);
|
|
@@ -396,8 +336,7 @@ directive.html = (el, evaluate, state) => {
|
|
|
396
336
|
|
|
397
337
|
// directive/text.js
|
|
398
338
|
directive.text = (el, evaluate, state) => {
|
|
399
|
-
if (el.content)
|
|
400
|
-
el.replaceWith(el = frag(el).childNodes[0]);
|
|
339
|
+
if (el.content) el.replaceWith(el = frag(el).childNodes[0]);
|
|
401
340
|
return effect(() => {
|
|
402
341
|
let value = evaluate(state);
|
|
403
342
|
el.textContent = value == null ? "" : value;
|
|
@@ -411,20 +350,13 @@ directive.class = (el, evaluate, state) => {
|
|
|
411
350
|
let v = evaluate(state);
|
|
412
351
|
let clsx = /* @__PURE__ */ new Set();
|
|
413
352
|
if (v) {
|
|
414
|
-
if (typeof v === "string")
|
|
415
|
-
|
|
416
|
-
else
|
|
417
|
-
v.map((v2) => v2 && clsx.add(v2));
|
|
418
|
-
else
|
|
419
|
-
Object.entries(v).map(([k, v2]) => v2 && clsx.add(k));
|
|
353
|
+
if (typeof v === "string") v.split(" ").map((cls) => clsx.add(cls));
|
|
354
|
+
else if (Array.isArray(v)) v.map((v2) => v2 && clsx.add(v2));
|
|
355
|
+
else Object.entries(v).map(([k, v2]) => v2 && clsx.add(k));
|
|
420
356
|
}
|
|
421
|
-
for (let cls of cur)
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
else
|
|
425
|
-
el.classList.remove(cls);
|
|
426
|
-
for (let cls of cur = clsx)
|
|
427
|
-
el.classList.add(cls);
|
|
357
|
+
for (let cls of cur) if (clsx.has(cls)) clsx.delete(cls);
|
|
358
|
+
else el.classList.remove(cls);
|
|
359
|
+
for (let cls of cur = clsx) el.classList.add(cls);
|
|
428
360
|
});
|
|
429
361
|
};
|
|
430
362
|
|
|
@@ -433,28 +365,21 @@ directive.style = (el, evaluate, state) => {
|
|
|
433
365
|
let initStyle = el.getAttribute("style");
|
|
434
366
|
return effect(() => {
|
|
435
367
|
let v = evaluate(state);
|
|
436
|
-
if (typeof v === "string")
|
|
437
|
-
el.setAttribute("style", initStyle + (initStyle.endsWith(";") ? "" : "; ") + v);
|
|
368
|
+
if (typeof v === "string") el.setAttribute("style", initStyle + (initStyle.endsWith(";") ? "" : "; ") + v);
|
|
438
369
|
else {
|
|
439
|
-
if (initStyle)
|
|
440
|
-
|
|
441
|
-
for (let k in v)
|
|
442
|
-
k[0] == "-" ? el.style.setProperty(k, v[k]) : el.style[k] = v[k];
|
|
370
|
+
if (initStyle) el.setAttribute("style", initStyle);
|
|
371
|
+
for (let k in v) k[0] == "-" ? el.style.setProperty(k, v[k]) : el.style[k] = v[k];
|
|
443
372
|
}
|
|
444
373
|
});
|
|
445
374
|
};
|
|
446
375
|
|
|
447
376
|
// directive/default.js
|
|
448
377
|
directive.default = (target, evaluate, state, name) => {
|
|
449
|
-
if (!name.startsWith("on"))
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
else
|
|
455
|
-
for (let key in value)
|
|
456
|
-
attr(target, dashcase(key), value[key]);
|
|
457
|
-
});
|
|
378
|
+
if (!name.startsWith("on")) return effect(() => {
|
|
379
|
+
let value = evaluate(state);
|
|
380
|
+
if (name) attr(target, name, value);
|
|
381
|
+
else for (let key in value) attr(target, dashcase(key), value[key]);
|
|
382
|
+
});
|
|
458
383
|
const ctxs = name.split("..").map((e) => {
|
|
459
384
|
let ctx = { evt: "", target, test: () => true };
|
|
460
385
|
ctx.evt = (e.startsWith("on") ? e.slice(2) : e).replace(
|
|
@@ -463,16 +388,14 @@ directive.default = (target, evaluate, state, name) => {
|
|
|
463
388
|
);
|
|
464
389
|
return ctx;
|
|
465
390
|
});
|
|
466
|
-
if (ctxs.length == 1)
|
|
467
|
-
return effect(() => addListener(evaluate(state), ctxs[0]));
|
|
391
|
+
if (ctxs.length == 1) return effect(() => addListener(evaluate(state), ctxs[0]));
|
|
468
392
|
let startFn, nextFn, off, idx = 0;
|
|
469
393
|
const nextListener = (fn) => {
|
|
470
394
|
off = addListener((e) => (off(), nextFn = fn?.(e), (idx = ++idx % ctxs.length) ? nextListener(nextFn) : startFn && nextListener(startFn)), ctxs[idx]);
|
|
471
395
|
};
|
|
472
396
|
return effect(() => (startFn = evaluate(state), !off && nextListener(startFn), () => startFn = null));
|
|
473
397
|
function addListener(fn, { evt, target: target2, test, defer, stop, prevent, immediate, ...opts }) {
|
|
474
|
-
if (defer)
|
|
475
|
-
fn = defer(fn);
|
|
398
|
+
if (defer) fn = defer(fn);
|
|
476
399
|
const cb = (e) => {
|
|
477
400
|
try {
|
|
478
401
|
test(e) && (stop && (immediate ? e.stopImmediatePropagation() : e.stopPropagation()), prevent && e.preventDefault(), fn?.(e));
|
|
@@ -486,6 +409,7 @@ directive.default = (target, evaluate, state, name) => {
|
|
|
486
409
|
;
|
|
487
410
|
};
|
|
488
411
|
var mods = {
|
|
412
|
+
// actions
|
|
489
413
|
prevent(ctx) {
|
|
490
414
|
ctx.prevent = true;
|
|
491
415
|
},
|
|
@@ -495,6 +419,7 @@ var mods = {
|
|
|
495
419
|
immediate(ctx) {
|
|
496
420
|
ctx.immediate = true;
|
|
497
421
|
},
|
|
422
|
+
// options
|
|
498
423
|
once(ctx) {
|
|
499
424
|
ctx.once = true;
|
|
500
425
|
},
|
|
@@ -504,6 +429,7 @@ var mods = {
|
|
|
504
429
|
capture(ctx) {
|
|
505
430
|
ctx.capture = true;
|
|
506
431
|
},
|
|
432
|
+
// target
|
|
507
433
|
window(ctx) {
|
|
508
434
|
ctx.target = window;
|
|
509
435
|
},
|
|
@@ -516,21 +442,21 @@ var mods = {
|
|
|
516
442
|
debounce(ctx, wait) {
|
|
517
443
|
ctx.defer = (fn) => debounce(fn, wait ? Number(wait) || 0 : 108);
|
|
518
444
|
},
|
|
445
|
+
// test
|
|
519
446
|
outside: (ctx) => (e) => {
|
|
520
447
|
let target = ctx.target;
|
|
521
|
-
if (target.contains(e.target))
|
|
522
|
-
|
|
523
|
-
if (
|
|
524
|
-
return false;
|
|
525
|
-
if (target.offsetWidth < 1 && target.offsetHeight < 1)
|
|
526
|
-
return false;
|
|
448
|
+
if (target.contains(e.target)) return false;
|
|
449
|
+
if (e.target.isConnected === false) return false;
|
|
450
|
+
if (target.offsetWidth < 1 && target.offsetHeight < 1) return false;
|
|
527
451
|
return true;
|
|
528
452
|
},
|
|
529
453
|
self: (ctx) => (e) => e.target === ctx.target,
|
|
454
|
+
// keyboard
|
|
530
455
|
ctrl: (_, ...param) => (e) => keys.ctrl(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
|
|
531
456
|
shift: (_, ...param) => (e) => keys.shift(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
|
|
532
457
|
alt: (_, ...param) => (e) => keys.alt(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
|
|
533
458
|
meta: (_, ...param) => (e) => keys.meta(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
|
|
459
|
+
// NOTE: we don't expose up/left/right/down as too verbose: can and better be handled/differentiated at once
|
|
534
460
|
arrow: () => keys.arrow,
|
|
535
461
|
enter: () => keys.enter,
|
|
536
462
|
esc: () => keys.esc,
|
|
@@ -557,23 +483,19 @@ var keys = {
|
|
|
557
483
|
char: (e) => /^\S$/.test(e.key)
|
|
558
484
|
};
|
|
559
485
|
var attr = (el, name, v) => {
|
|
560
|
-
if (v == null || v === false)
|
|
561
|
-
|
|
562
|
-
else
|
|
563
|
-
el.setAttribute(name, v === true ? "" : typeof v === "number" || typeof v === "string" ? v : "");
|
|
486
|
+
if (v == null || v === false) el.removeAttribute(name);
|
|
487
|
+
else el.setAttribute(name, v === true ? "" : typeof v === "number" || typeof v === "string" ? v : "");
|
|
564
488
|
};
|
|
565
489
|
var throttle = (fn, limit) => {
|
|
566
490
|
let pause, planned, block = (e) => {
|
|
567
491
|
pause = true;
|
|
568
492
|
setTimeout(() => {
|
|
569
493
|
pause = false;
|
|
570
|
-
if (planned)
|
|
571
|
-
return planned = false, block(e), fn(e);
|
|
494
|
+
if (planned) return planned = false, block(e), fn(e);
|
|
572
495
|
}, limit);
|
|
573
496
|
};
|
|
574
497
|
return (e) => {
|
|
575
|
-
if (pause)
|
|
576
|
-
return planned = true;
|
|
498
|
+
if (pause) return planned = true;
|
|
577
499
|
block(e);
|
|
578
500
|
return fn(e);
|
|
579
501
|
};
|
|
@@ -594,9 +516,11 @@ var dashcase = (str) => {
|
|
|
594
516
|
|
|
595
517
|
// directive/value.js
|
|
596
518
|
directive.value = (el, [getValue, setValue], state) => {
|
|
597
|
-
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) => (
|
|
598
|
-
|
|
599
|
-
|
|
519
|
+
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) => (
|
|
520
|
+
// we retain selection in input
|
|
521
|
+
(from = el.selectionStart, to = el.selectionEnd, el.setAttribute("value", el.value = value == null ? "" : value), from && el.setSelectionRange(from, to))
|
|
522
|
+
) : el.type === "checkbox" ? (value) => (el.checked = value, attr(el, "checked", value)) : el.type === "select-one" ? (value) => {
|
|
523
|
+
for (let option of el.options) option.removeAttribute("selected");
|
|
600
524
|
el.value = value;
|
|
601
525
|
el.selectedOptions[0]?.setAttribute("selected", "");
|
|
602
526
|
} : (value) => el.value = value;
|
|
@@ -626,7 +550,6 @@ directive.fx = (el, evaluate, state) => {
|
|
|
626
550
|
};
|
|
627
551
|
|
|
628
552
|
// sprae.js
|
|
629
|
-
sprae.use(ulive_es_exports);
|
|
630
553
|
sprae.use({ compile: (expr) => sprae.constructor(`with (arguments[0]) { return ${expr} };`) });
|
|
631
554
|
var sprae_default = sprae;
|
|
632
555
|
export {
|