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.
@@ -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 in el.options) option.removeAttribute("selected");
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 signal;
9
- var effect;
10
- var untracked;
11
- var batch;
12
- var computed;
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
- return values;
27
- if (values[_signals])
28
- return values;
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
- return key === _change ? _len : key === _signals ? signals : signals[key];
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
- return signals[key].valueOf();
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
- untracked(() => {
102
- batch(() => {
103
- let i = 0, l = v.length;
104
- for (; i < l; i++)
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
- return el2[_dispose] && disposes.push(el2[_dispose]);
161
- if (el2.parentNode !== parent)
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
- items2 = Array.from({ length: items2 }, (_, i) => i + 1);
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
- v.split(" ").map((cls) => clsx.add(cls));
416
- else if (Array.isArray(v))
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
- if (clsx.has(cls))
423
- clsx.delete(cls);
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
- el.setAttribute("style", initStyle);
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
- return effect(() => {
451
- let value = evaluate(state);
452
- if (name)
453
- attr(target, name, value);
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
- return false;
523
- if (e.target.isConnected === false)
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
- el.removeAttribute(name);
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) => (from = el.selectionStart, to = el.selectionEnd, el.setAttribute("value", el.value = value == null ? "" : value), from && el.setSelectionRange(from, to)) : el.type === "checkbox" ? (value) => (el.checked = value, attr(el, "checked", value)) : el.type === "select-one" ? (value) => {
598
- for (let option in el.options)
599
- option.removeAttribute("selected");
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 {