sprae 11.3.0 → 11.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/core.js CHANGED
@@ -24,11 +24,11 @@ export const dir = (name, create, p = parse) => directive[name] = (el, expr, sta
24
24
  /**
25
25
  * Applies directives to an HTML element and manages its reactive state.
26
26
  *
27
- * @param {Element} el - The target HTML element to apply directives to.
27
+ * @param {Element} [el=document.body] - The target HTML element to apply directives to.
28
28
  * @param {Object} [values] - Initial values to populate the element's reactive state.
29
29
  * @returns {Object} The reactive state object associated with the element.
30
30
  */
31
- export const sprae = (el, values) => {
31
+ export const sprae = (el=document.body, values) => {
32
32
  // repeated call can be caused by eg. :each with new objects with old keys
33
33
  if (el[_state]) return Object.assign(el[_state], values)
34
34
 
@@ -0,0 +1,636 @@
1
+ (function (g, f) {if ("object" == typeof exports && "object" == typeof module) {module.exports = f();} else if ("function" == typeof define && define.amd) {define("sprae", [], f);} else if ("object" == typeof exports) {exports["sprae"] = f();} else {g["sprae"] = f();}}(typeof self !== 'undefined' ? self : typeof globalThis !== 'undefined' ? globalThis : this, () => {var exports = {};var module = { exports };
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __esm = (fn, res) => function __init() {
7
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
8
+ };
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
+
23
+ // signal.js
24
+ var current, signal, effect, computed, batch, untracked, use;
25
+ var init_signal = __esm({
26
+ "signal.js"() {
27
+ signal = (v, s, obs = /* @__PURE__ */ new Set()) => (s = {
28
+ get value() {
29
+ current?.deps.push(obs.add(current));
30
+ return v;
31
+ },
32
+ set value(val) {
33
+ if (val === v) return;
34
+ v = val;
35
+ for (let sub of obs) sub();
36
+ },
37
+ peek() {
38
+ return v;
39
+ }
40
+ }, s.toJSON = s.then = s.toString = s.valueOf = () => s.value, s);
41
+ effect = (fn, teardown, fx, deps) => (fx = (prev) => {
42
+ teardown?.call?.();
43
+ prev = current, current = fx;
44
+ try {
45
+ teardown = fn();
46
+ } finally {
47
+ current = prev;
48
+ }
49
+ }, deps = fx.deps = [], fx(), (dep) => {
50
+ teardown?.call?.();
51
+ while (dep = deps.pop()) dep.delete(fx);
52
+ });
53
+ computed = (fn, s = signal(), c, e) => (c = {
54
+ get value() {
55
+ e || (e = effect(() => s.value = fn()));
56
+ return s.value;
57
+ },
58
+ peek: s.peek
59
+ }, c.toJSON = c.then = c.toString = c.valueOf = () => c.value, c);
60
+ batch = (fn) => fn();
61
+ untracked = batch;
62
+ use = (s) => (signal = s.signal, effect = s.effect, computed = s.computed, batch = s.batch || batch, untracked = s.untracked || untracked);
63
+ }
64
+ });
65
+
66
+ // store.js
67
+ var _signals, _change, store, list, mut, set, store_default;
68
+ var init_store = __esm({
69
+ "store.js"() {
70
+ init_signal();
71
+ _signals = Symbol("signals");
72
+ _change = Symbol("change");
73
+ store = (values, parent) => {
74
+ if (!values) return values;
75
+ if (values[_signals] || values[Symbol.toStringTag]) return values;
76
+ if (values.constructor !== Object) return Array.isArray(values) ? list(values) : values;
77
+ let signals = { ...parent?.[_signals] }, _len = signal(Object.values(values).length), state = new Proxy(signals, {
78
+ get: (_, key) => key === _change ? _len : key === _signals ? signals : signals[key]?.valueOf(),
79
+ set: (_, key, v, s) => (s = signals[key], set(signals, key, v), s ?? ++_len.value, 1),
80
+ // bump length for new signal
81
+ deleteProperty: (_, key) => (signals[key] && (signals[key][Symbol.dispose]?.(), delete signals[key], _len.value--), 1),
82
+ // subscribe to length when object is spread
83
+ ownKeys: () => (_len.value, Reflect.ownKeys(signals))
84
+ }), descs = Object.getOwnPropertyDescriptors(values), desc;
85
+ for (let key in values) {
86
+ if ((desc = descs[key])?.get)
87
+ (signals[key] = computed(desc.get.bind(state)))._set = desc.set?.bind(state);
88
+ else
89
+ signals[key] = null, set(signals, key, values[key]);
90
+ }
91
+ return state;
92
+ };
93
+ list = (values) => {
94
+ let lastProp, _len = signal(values.length), signals = Array(values.length).fill(), state = new Proxy(signals, {
95
+ get(_, key) {
96
+ if (typeof key === "symbol") return key === _change ? _len : key === _signals ? signals : signals[key];
97
+ if (key === "length") return mut.includes(lastProp) ? _len.peek() : _len.value;
98
+ lastProp = key;
99
+ if (signals[key]) return signals[key].valueOf();
100
+ if (key < signals.length) return (signals[key] = signal(store(values[key]))).value;
101
+ },
102
+ set(_, key, v) {
103
+ if (key === "length") {
104
+ for (let i = v; i < signals.length; i++) delete state[i];
105
+ _len.value = signals.length = v;
106
+ } else {
107
+ set(signals, key, v);
108
+ if (key >= _len.peek()) _len.value = signals.length = +key + 1;
109
+ }
110
+ return 1;
111
+ },
112
+ deleteProperty: (_, key) => (signals[key]?.[Symbol.dispose]?.(), delete signals[key], 1)
113
+ });
114
+ return state;
115
+ };
116
+ mut = ["push", "pop", "shift", "unshift", "splice"];
117
+ set = (signals, key, v) => {
118
+ let s = signals[key], cur;
119
+ if (key[0] === "_") signals[key] = v;
120
+ else if (!s) signals[key] = s = v?.peek ? v : signal(store(v));
121
+ else if (v === (cur = s.peek())) ;
122
+ else if (s._set) s._set(v);
123
+ else if (Array.isArray(v) && Array.isArray(cur)) {
124
+ if (cur[_change]) batch(() => {
125
+ for (let i = 0; i < v.length; i++) cur[i] = v[i];
126
+ cur.length = v.length;
127
+ });
128
+ else s.value = v;
129
+ } else s.value = store(v);
130
+ };
131
+ store_default = store;
132
+ }
133
+ });
134
+
135
+ // core.js
136
+ var _dispose, _state, _on, _off, directive, dir, sprae, parse, memo, err, compile, prefix, frag, core_default;
137
+ var init_core = __esm({
138
+ "core.js"() {
139
+ init_signal();
140
+ init_store();
141
+ _dispose = Symbol.dispose || (Symbol.dispose = Symbol("dispose"));
142
+ _state = Symbol("state");
143
+ _on = Symbol("on");
144
+ _off = Symbol("off");
145
+ directive = {};
146
+ dir = (name, create, p = parse) => directive[name] = (el, expr, state, name2, update, evaluate) => (evaluate = p(expr), update = create(el, state, expr, name2, evaluate), () => update(evaluate(state)));
147
+ sprae = (el = document.body, values) => {
148
+ if (el[_state]) return Object.assign(el[_state], values);
149
+ let state = store(values || {}), offs = [], fx = [], init = (el2, attrs = el2.attributes) => {
150
+ if (attrs) for (let i = 0; i < attrs.length; ) {
151
+ let { name, value } = attrs[i], update, dir2;
152
+ if (name.startsWith(prefix)) {
153
+ el2.removeAttribute(name);
154
+ for (dir2 of name.slice(prefix.length).split(":")) {
155
+ update = (directive[dir2] || directive.default)(el2, value, state, dir2);
156
+ fx.push(update), offs.push(effect(update));
157
+ if (el2[_state] === null) return;
158
+ }
159
+ } else i++;
160
+ }
161
+ for (let child of el2.childNodes) child.nodeType == 1 && init(child);
162
+ };
163
+ init(el);
164
+ if (!(_state in el)) {
165
+ el[_state] = state;
166
+ el[_off] = () => (offs.map((off) => off()), offs = []);
167
+ el[_on] = () => offs = fx.map((f) => effect(f));
168
+ el[_dispose] = () => (el[_off](), el[_off] = el[_on] = el[_dispose] = el[_state] = null);
169
+ }
170
+ return state;
171
+ };
172
+ sprae.use = (s) => (s.signal && use(s), s.compile && (compile = s.compile), s.prefix && (prefix = s.prefix));
173
+ parse = (expr, dir2, fn) => {
174
+ if (fn = memo[expr = expr.trim()]) return fn;
175
+ try {
176
+ fn = compile(expr);
177
+ } catch (e) {
178
+ err(e, dir2, expr);
179
+ }
180
+ return memo[expr] = fn;
181
+ };
182
+ memo = {};
183
+ err = (e, dir2 = "", expr = "") => {
184
+ throw Object.assign(e, { message: `\u2234 ${e.message}
185
+
186
+ ${dir2}${expr ? `="${expr}"
187
+
188
+ ` : ""}`, expr });
189
+ };
190
+ prefix = ":";
191
+ frag = (tpl) => {
192
+ if (!tpl.nodeType) return tpl;
193
+ let content = tpl.content.cloneNode(true), attributes = [...tpl.attributes], ref = document.createTextNode(""), childNodes = (content.append(ref), [...content.childNodes]);
194
+ return {
195
+ // get parentNode() { return childNodes[0].parentNode },
196
+ childNodes,
197
+ content,
198
+ remove: () => content.append(...childNodes),
199
+ replaceWith(el) {
200
+ if (el === ref) return;
201
+ ref.before(el);
202
+ content.append(...childNodes);
203
+ },
204
+ attributes,
205
+ removeAttribute(name) {
206
+ attributes.splice(attributes.findIndex((a) => a.name === name), 1);
207
+ }
208
+ // setAttributeNode() { }
209
+ };
210
+ };
211
+ core_default = sprae;
212
+ }
213
+ });
214
+
215
+ // directive/if.js
216
+ var _prevIf;
217
+ var init_if = __esm({
218
+ "directive/if.js"() {
219
+ init_core();
220
+ _prevIf = Symbol("if");
221
+ dir("if", (el, state) => {
222
+ let holder = document.createTextNode("");
223
+ let next = el.nextElementSibling, curEl, ifEl, elseEl;
224
+ el.replaceWith(holder);
225
+ ifEl = el.content ? frag(el) : el;
226
+ ifEl[_state] = null;
227
+ if (next?.hasAttribute(":else")) {
228
+ next.removeAttribute(":else");
229
+ if (!next.hasAttribute(":if")) next.remove(), elseEl = next.content ? frag(next) : next, elseEl[_state] = null;
230
+ }
231
+ return (value, newEl = value ? ifEl : el[_prevIf] ? null : elseEl) => {
232
+ if (next) next[_prevIf] = newEl === ifEl;
233
+ if (curEl != newEl) {
234
+ if (curEl) curEl.remove(), curEl[_off]?.();
235
+ if (curEl = newEl) {
236
+ holder.before(curEl.content || curEl);
237
+ curEl[_state] === null ? (delete curEl[_state], core_default(curEl, state)) : curEl[_on]();
238
+ }
239
+ }
240
+ };
241
+ });
242
+ }
243
+ });
244
+
245
+ // directive/each.js
246
+ var init_each = __esm({
247
+ "directive/each.js"() {
248
+ init_core();
249
+ init_store();
250
+ init_signal();
251
+ dir(
252
+ "each",
253
+ (tpl, state, expr) => {
254
+ let [itemVar, idxVar = "$"] = expr.split(/\bin\b/)[0].trim().split(/\s*,\s*/);
255
+ let holder = document.createTextNode("");
256
+ let cur, keys2, items, prevl = 0;
257
+ let update = () => {
258
+ var _a, _b;
259
+ let i = 0, newItems = items, newl = newItems.length;
260
+ if (cur && !cur[_change]) {
261
+ for (let s of cur[_signals] || []) s[Symbol.dispose]();
262
+ cur = null, prevl = 0;
263
+ }
264
+ if (newl < prevl) cur.length = newl;
265
+ else {
266
+ if (!cur) cur = newItems;
267
+ else while (i < prevl) cur[i] = newItems[i++];
268
+ for (; i < newl; i++) {
269
+ cur[i] = newItems[i];
270
+ let idx = i, scope = store_default({
271
+ [itemVar]: cur[_signals]?.[idx] || cur[idx],
272
+ [idxVar]: keys2 ? keys2[idx] : idx
273
+ }, state), el = tpl.content ? frag(tpl) : tpl.cloneNode(true);
274
+ holder.before(el.content || el);
275
+ core_default(el, scope);
276
+ ((_b = cur[_a = _signals] || (cur[_a] = []))[i] || (_b[i] = {}))[Symbol.dispose] = () => {
277
+ el[Symbol.dispose]?.(), el.remove();
278
+ };
279
+ }
280
+ }
281
+ prevl = newl;
282
+ };
283
+ tpl.replaceWith(holder);
284
+ tpl[_state] = null;
285
+ return (value) => {
286
+ keys2 = null;
287
+ if (typeof value === "number") items = Array.from({ length: value }, (_, i) => i + 1);
288
+ else if (value?.constructor === Object) keys2 = Object.keys(value), items = Object.values(value);
289
+ else items = value || [];
290
+ let planned = 0;
291
+ return effect(() => {
292
+ items[_change]?.value;
293
+ if (!planned++) update(), queueMicrotask(() => (planned > 1 && update(), planned = 0));
294
+ });
295
+ };
296
+ },
297
+ // redefine evaluator to take second part of expression
298
+ (expr) => parse(expr.split(/\bin\b/)[1])
299
+ );
300
+ }
301
+ });
302
+
303
+ // directive/default.js
304
+ var mods, keys, throttle, debounce, attr, dashcase;
305
+ var init_default = __esm({
306
+ "directive/default.js"() {
307
+ init_core();
308
+ dir("default", (target, state, expr, name) => {
309
+ if (!name.startsWith("on"))
310
+ return name ? (value) => attr(target, name, value) : (value) => {
311
+ for (let key in value) attr(target, dashcase(key), value[key]);
312
+ };
313
+ let ctxs = name.split("..").map((e) => {
314
+ let ctx = { evt: "", target, test: () => true };
315
+ ctx.evt = (e.startsWith("on") ? e.slice(2) : e).replace(
316
+ /\.(\w+)?-?([-\w]+)?/g,
317
+ (_, mod, param = "") => (ctx.test = mods[mod]?.(ctx, ...param.split("-")) || ctx.test, "")
318
+ );
319
+ return ctx;
320
+ });
321
+ let addListener = (fn, { evt, target: target2, test, defer, stop, prevent, immediate, ...opts }, cb) => {
322
+ if (defer) fn = defer(fn);
323
+ cb = (e) => {
324
+ try {
325
+ test(e) && (stop && (immediate ? e.stopImmediatePropagation() : e.stopPropagation()), prevent && e.preventDefault(), fn?.call(state, e));
326
+ } catch (error) {
327
+ err(error, `:on${evt}`, fn);
328
+ }
329
+ };
330
+ target2.addEventListener(evt, cb, opts);
331
+ return () => target2.removeEventListener(evt, cb, opts);
332
+ };
333
+ if (ctxs.length == 1) return (v) => addListener(v, ctxs[0]);
334
+ let startFn, nextFn, off, idx = 0;
335
+ let nextListener = (fn) => {
336
+ off = addListener((e) => (off(), nextFn = fn?.(e), (idx = ++idx % ctxs.length) ? nextListener(nextFn) : startFn && nextListener(startFn)), ctxs[idx]);
337
+ };
338
+ return (value) => (startFn = value, !off && nextListener(startFn), () => startFn = null);
339
+ });
340
+ mods = {
341
+ // actions
342
+ prevent(ctx) {
343
+ ctx.prevent = true;
344
+ },
345
+ stop(ctx) {
346
+ ctx.stop = true;
347
+ },
348
+ immediate(ctx) {
349
+ ctx.immediate = true;
350
+ },
351
+ // options
352
+ once(ctx) {
353
+ ctx.once = true;
354
+ },
355
+ passive(ctx) {
356
+ ctx.passive = true;
357
+ },
358
+ capture(ctx) {
359
+ ctx.capture = true;
360
+ },
361
+ // target
362
+ window(ctx) {
363
+ ctx.target = window;
364
+ },
365
+ document(ctx) {
366
+ ctx.target = document;
367
+ },
368
+ parent(ctx) {
369
+ ctx.target = ctx.target.parentNode;
370
+ },
371
+ throttle(ctx, limit = 108) {
372
+ ctx.defer = (fn) => throttle(fn, limit);
373
+ },
374
+ debounce(ctx, wait = 108) {
375
+ ctx.defer = (fn) => debounce(fn, wait);
376
+ },
377
+ // test
378
+ outside: (ctx) => (e) => {
379
+ let target = ctx.target;
380
+ if (target.contains(e.target)) return false;
381
+ if (e.target.isConnected === false) return false;
382
+ if (target.offsetWidth < 1 && target.offsetHeight < 1) return false;
383
+ return true;
384
+ },
385
+ self: (ctx) => (e) => e.target === ctx.target,
386
+ // keyboard
387
+ ctrl: (_, ...param) => (e) => keys.ctrl(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
388
+ shift: (_, ...param) => (e) => keys.shift(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
389
+ alt: (_, ...param) => (e) => keys.alt(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
390
+ meta: (_, ...param) => (e) => keys.meta(e) && param.every((p) => keys[p] ? keys[p](e) : e.key === p),
391
+ // NOTE: we don't expose up/left/right/down as too verbose: can and better be handled/differentiated at once
392
+ arrow: () => keys.arrow,
393
+ enter: () => keys.enter,
394
+ esc: () => keys.esc,
395
+ tab: () => keys.tab,
396
+ space: () => keys.space,
397
+ delete: () => keys.delete,
398
+ digit: () => keys.digit,
399
+ letter: () => keys.letter,
400
+ char: () => keys.char
401
+ };
402
+ keys = {
403
+ ctrl: (e) => e.ctrlKey || e.key === "Control" || e.key === "Ctrl",
404
+ shift: (e) => e.shiftKey || e.key === "Shift",
405
+ alt: (e) => e.altKey || e.key === "Alt",
406
+ meta: (e) => e.metaKey || e.key === "Meta" || e.key === "Command",
407
+ arrow: (e) => e.key.startsWith("Arrow"),
408
+ enter: (e) => e.key === "Enter",
409
+ esc: (e) => e.key.startsWith("Esc"),
410
+ tab: (e) => e.key === "Tab",
411
+ space: (e) => e.key === "\xA0" || e.key === "Space" || e.key === " ",
412
+ delete: (e) => e.key === "Delete" || e.key === "Backspace",
413
+ digit: (e) => /^\d$/.test(e.key),
414
+ letter: (e) => /^\p{L}$/gu.test(e.key),
415
+ char: (e) => /^\S$/.test(e.key)
416
+ };
417
+ throttle = (fn, limit) => {
418
+ let pause, planned, block = (e) => {
419
+ pause = true;
420
+ setTimeout(() => {
421
+ pause = false;
422
+ if (planned) return planned = false, block(e), fn(e);
423
+ }, limit);
424
+ };
425
+ return (e) => {
426
+ if (pause) return planned = true;
427
+ block(e);
428
+ return fn(e);
429
+ };
430
+ };
431
+ debounce = (fn, wait) => {
432
+ let timeout;
433
+ return (e) => {
434
+ clearTimeout(timeout);
435
+ timeout = setTimeout(() => {
436
+ timeout = null;
437
+ fn(e);
438
+ }, wait);
439
+ };
440
+ };
441
+ attr = (el, name, v) => {
442
+ if (v == null || v === false) el.removeAttribute(name);
443
+ else el.setAttribute(name, v === true ? "" : typeof v === "number" || typeof v === "string" ? v : "");
444
+ };
445
+ dashcase = (str) => {
446
+ return str.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g, (match, i) => (i ? "-" : "") + match.toLowerCase());
447
+ };
448
+ }
449
+ });
450
+
451
+ // directive/value.js
452
+ var setter, ensure;
453
+ var init_value = __esm({
454
+ "directive/value.js"() {
455
+ init_core();
456
+ init_core();
457
+ init_default();
458
+ dir("value", (el, state, expr) => {
459
+ 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) => (
460
+ // we retain selection in input
461
+ (from = el.selectionStart, to = el.selectionEnd, el.setAttribute("value", el.value = value == null ? "" : value), from && el.setSelectionRange(from, to))
462
+ ) : el.type === "checkbox" ? (value) => (el.checked = value, attr(el, "checked", value)) : el.type === "select-one" ? (value) => {
463
+ for (let o of el.options)
464
+ o.value == value ? o.setAttribute("selected", "") : o.removeAttribute("selected");
465
+ el.value = value;
466
+ } : el.type === "select-multiple" ? (value) => {
467
+ for (let o of el.options) o.removeAttribute("selected");
468
+ for (let v of value) el.querySelector(`[value="${v}"]`).setAttribute("selected", "");
469
+ } : (value) => el.value = value;
470
+ ensure(state, expr);
471
+ try {
472
+ const set2 = setter(expr);
473
+ const handleChange = el.type === "checkbox" ? () => set2(state, el.checked) : el.type === "select-multiple" ? () => set2(state, [...el.selectedOptions].map((o) => o.value)) : () => set2(state, el.selectedIndex < 0 ? null : el.value);
474
+ el.oninput = el.onchange = handleChange;
475
+ if (el.type?.startsWith("select")) {
476
+ new MutationObserver(handleChange).observe(el, { childList: true, subtree: true, attributes: true });
477
+ core_default(el, state);
478
+ }
479
+ } catch {
480
+ }
481
+ return update;
482
+ });
483
+ setter = (expr, set2 = parse(`${expr}=__`)) => (
484
+ // FIXME: if there's a simpler way to set value in justin?
485
+ (state, value) => (state.__ = value, set2(state, value), delete state.__)
486
+ );
487
+ ensure = (state, expr, name = expr.match(/^\w+(?=\s*(?:\.|\[|$))/)) => {
488
+ var _a;
489
+ return name && (state[_a = name[0]] ?? (state[_a] = null));
490
+ };
491
+ }
492
+ });
493
+
494
+ // directive/ref.js
495
+ var init_ref = __esm({
496
+ "directive/ref.js"() {
497
+ init_core();
498
+ init_value();
499
+ dir("ref", (el, state, expr, _, ev) => (ensure(state, expr), ev(state) == null ? (setter(expr)(state, el), (_2) => _2) : (v) => v.call(null, el)));
500
+ }
501
+ });
502
+
503
+ // directive/with.js
504
+ var init_with = __esm({
505
+ "directive/with.js"() {
506
+ init_core();
507
+ init_store();
508
+ dir("with", (el, rootState, state) => (state = null, (values) => core_default(el, state ? values : state = store_default(values, rootState))));
509
+ }
510
+ });
511
+
512
+ // directive/text.js
513
+ var init_text = __esm({
514
+ "directive/text.js"() {
515
+ init_core();
516
+ dir("text", (el) => (
517
+ // <template :text="a"/> or previously initialized template
518
+ (el.content && el.replaceWith(el = frag(el).childNodes[0]), (value) => el.textContent = value == null ? "" : value)
519
+ ));
520
+ }
521
+ });
522
+
523
+ // directive/class.js
524
+ var init_class = __esm({
525
+ "directive/class.js"() {
526
+ init_core();
527
+ dir(
528
+ "class",
529
+ (el, cur) => (cur = /* @__PURE__ */ new Set(), (v) => {
530
+ let clsx = /* @__PURE__ */ new Set();
531
+ if (v) {
532
+ if (typeof v === "string") v.split(" ").map((cls) => clsx.add(cls));
533
+ else if (Array.isArray(v)) v.map((v2) => v2 && clsx.add(v2));
534
+ else Object.entries(v).map(([k, v2]) => v2 && clsx.add(k));
535
+ }
536
+ for (let cls of cur) if (clsx.has(cls)) clsx.delete(cls);
537
+ else el.classList.remove(cls);
538
+ for (let cls of cur = clsx) el.classList.add(cls);
539
+ })
540
+ );
541
+ }
542
+ });
543
+
544
+ // directive/style.js
545
+ var init_style = __esm({
546
+ "directive/style.js"() {
547
+ init_core();
548
+ dir(
549
+ "style",
550
+ (el, initStyle) => (initStyle = el.getAttribute("style"), (v) => {
551
+ if (typeof v === "string") el.setAttribute("style", initStyle + (initStyle.endsWith(";") ? "" : "; ") + v);
552
+ else {
553
+ if (initStyle) el.setAttribute("style", initStyle);
554
+ for (let k in v) k[0] == "-" ? el.style.setProperty(k, v[k]) : el.style[k] = v[k];
555
+ }
556
+ })
557
+ );
558
+ }
559
+ });
560
+
561
+ // directive/fx.js
562
+ var init_fx = __esm({
563
+ "directive/fx.js"() {
564
+ init_core();
565
+ dir("fx", (_) => (_2) => _2);
566
+ }
567
+ });
568
+
569
+ // directive/aria.js
570
+ var init_aria = __esm({
571
+ "directive/aria.js"() {
572
+ init_core();
573
+ init_default();
574
+ dir("aria", (el) => (value) => {
575
+ for (let key in value) attr(el, "aria-" + dashcase(key), value[key] == null ? null : value[key] + "");
576
+ });
577
+ }
578
+ });
579
+
580
+ // directive/data.js
581
+ var init_data = __esm({
582
+ "directive/data.js"() {
583
+ init_core();
584
+ dir("data", (el) => (value) => {
585
+ for (let key in value) el.dataset[key] = value[key];
586
+ });
587
+ }
588
+ });
589
+
590
+ // sprae.js
591
+ var sprae_exports = {};
592
+ __export(sprae_exports, {
593
+ default: () => sprae_default
594
+ });
595
+ var sprae_default;
596
+ var init_sprae = __esm({
597
+ "sprae.js"() {
598
+ init_core();
599
+ init_if();
600
+ init_each();
601
+ init_ref();
602
+ init_with();
603
+ init_text();
604
+ init_class();
605
+ init_style();
606
+ init_value();
607
+ init_fx();
608
+ init_default();
609
+ init_aria();
610
+ init_data();
611
+ core_default.use({ compile: (expr) => core_default.constructor(`with (arguments[0]) { return ${expr} };`) });
612
+ sprae_default = core_default;
613
+ }
614
+ });
615
+
616
+ // <stdin>
617
+ var sprae2 = (init_sprae(), __toCommonJS(sprae_exports)).default;
618
+ sprae2.use({ prefix: document.currentScript.getAttribute("prefix") });
619
+ document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", () => sprae2()) : sprae2();
620
+ ;if (typeof module.exports == "object" && typeof exports == "object") {
621
+ var __cp = (to, from, except, desc) => {
622
+ if ((from && typeof from === "object") || typeof from === "function") {
623
+ for (let key of Object.getOwnPropertyNames(from)) {
624
+ if (!Object.prototype.hasOwnProperty.call(to, key) && key !== except)
625
+ Object.defineProperty(to, key, {
626
+ get: () => from[key],
627
+ enumerable: !(desc = Object.getOwnPropertyDescriptor(from, key)) || desc.enumerable,
628
+ });
629
+ }
630
+ }
631
+ return to;
632
+ };
633
+ module.exports = __cp(module.exports, exports);
634
+ }
635
+ return module.exports;
636
+ }))