@ktjs/core 0.36.2 → 0.37.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -5
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +88 -43
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,14 +17,17 @@
|
|
|
17
17
|
|
|
18
18
|
## Recent Updates
|
|
19
19
|
|
|
20
|
-
1. 0.
|
|
20
|
+
1. 0.37.x - fixes and refactors
|
|
21
|
+
1. fix schedulers clear issue. Which would occur when some handler throws an error.
|
|
22
|
+
2. `Fragment` is refactored. Fixes memory leak issues and makes it more robust.
|
|
23
|
+
2. 0.36.x - override 0.35.x. Now refs and computeds have 2 new apis:
|
|
21
24
|
1. `get(...keys)`: create a `KTSubComputed` object. It is a light version of computed, used to bind values
|
|
22
25
|
2. `subref(...keys)`: create a `KTSubRef` object. It is a light version of ref, used to bind values and also support two-way binding with `k-model`.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
3. 0.34.x - `ref.notify()` no-longer has an optional argument.
|
|
27
|
+
4. 0.33.x - `ref.value` remains the standard read API, and it can also replace the whole outer value with `ref.value = nextValue`.
|
|
28
|
+
5. 0.33.x - `ref.draft` is the deep-mutation entry for literally any objects. Just use `someRef.draft.a = someValue`, and kt.js will add it to microqueue and redraw it on the next tick. Works for `Map`, `Set`, `Array`, `Date` and your custom objects.
|
|
26
29
|
1. `ref.draft` itself is **not assignable**.
|
|
27
|
-
|
|
30
|
+
6. `addOnChange((newValue, oldValue) => ...)` keeps `oldValue` as the previous reference, not a deep snapshot.
|
|
28
31
|
|
|
29
32
|
## Community
|
|
30
33
|
|
package/dist/index.d.ts
CHANGED
|
@@ -89,6 +89,7 @@ declare abstract class KTSubReactive<T> extends KTReactiveLike<T> {
|
|
|
89
89
|
get value(): T;
|
|
90
90
|
addOnChange(handler: ChangeHandler<T>, key?: any): this;
|
|
91
91
|
removeOnChange(key: any): this;
|
|
92
|
+
notify(): this;
|
|
92
93
|
}
|
|
93
94
|
|
|
94
95
|
declare class KTRef<T> extends KTReactive<T> {
|
|
@@ -140,6 +141,7 @@ declare class KTSubRef<T> extends KTSubReactive<T> {
|
|
|
140
141
|
get value(): T;
|
|
141
142
|
set value(newValue: T);
|
|
142
143
|
get draft(): T;
|
|
144
|
+
notify(): this;
|
|
143
145
|
}
|
|
144
146
|
/**
|
|
145
147
|
* Create a reactive reference to a value. The returned object has a single property `value` that holds the internal value.
|
package/dist/index.mjs
CHANGED
|
@@ -94,18 +94,27 @@ function applyAttr(element, attr) {
|
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
const
|
|
97
|
+
const CANNOT_MOUNT = "undefined" == typeof document || "undefined" == typeof Node, COMMENT_FILTER = "undefined" == typeof NodeFilter ? 128 : NodeFilter.SHOW_COMMENT, mountIfFragmentAnchor = node => {
|
|
98
|
+
const anchor = node;
|
|
99
|
+
!0 === anchor.isKTAnchor && "function" == typeof anchor.mount && anchor.mount();
|
|
100
|
+
}, mountFragmentAnchors = node => {
|
|
101
|
+
if (CANNOT_MOUNT || !(node instanceof Node)) return;
|
|
102
|
+
if (mountIfFragmentAnchor(node), node.nodeType !== Node.ELEMENT_NODE && node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) return;
|
|
103
|
+
const walker = document.createTreeWalker(node, COMMENT_FILTER);
|
|
104
|
+
let current = walker.nextNode();
|
|
105
|
+
for (;current; ) mountIfFragmentAnchor(current), current = walker.nextNode();
|
|
106
|
+
}, assureNode = o => $isNode(o) ? o : document.createTextNode(o);
|
|
98
107
|
|
|
99
108
|
function apdSingle(element, c) {
|
|
100
109
|
if (null != c && !1 !== c) if (isKT(c)) {
|
|
101
110
|
let node = assureNode(c.value);
|
|
102
|
-
element.appendChild(node), c.addOnChange((newValue, _oldValue) => {
|
|
111
|
+
element.appendChild(node), mountFragmentAnchors(node), c.addOnChange((newValue, _oldValue) => {
|
|
103
112
|
const oldNode = node;
|
|
104
|
-
node = assureNode(newValue), oldNode.replaceWith(node);
|
|
113
|
+
node = assureNode(newValue), oldNode.replaceWith(node), mountFragmentAnchors(node);
|
|
105
114
|
});
|
|
106
115
|
} else {
|
|
107
116
|
const node = assureNode(c);
|
|
108
|
-
element.appendChild(node);
|
|
117
|
+
element.appendChild(node), mountFragmentAnchors(node);
|
|
109
118
|
const list = node.__kt_for_list__;
|
|
110
119
|
$isArray(list) && apd(element, list);
|
|
111
120
|
}
|
|
@@ -116,7 +125,9 @@ function apd(element, c) {
|
|
|
116
125
|
const ci = c[i];
|
|
117
126
|
if ($isThenable(ci)) {
|
|
118
127
|
const comment = document.createComment("ktjs-promise-placeholder");
|
|
119
|
-
element.appendChild(comment), ci.then(awaited =>
|
|
128
|
+
element.appendChild(comment), mountFragmentAnchors(comment), ci.then(awaited => {
|
|
129
|
+
comment.replaceWith(awaited), mountFragmentAnchors(awaited);
|
|
130
|
+
});
|
|
120
131
|
} else apdSingle(element, ci);
|
|
121
132
|
} else apdSingle(element, c);
|
|
122
133
|
}
|
|
@@ -144,7 +155,7 @@ function applyKModel(element, valueRef) {
|
|
|
144
155
|
* ## About
|
|
145
156
|
* @package @ktjs/core
|
|
146
157
|
* @author Kasukabe Tsumugi <futami16237@gmail.com>
|
|
147
|
-
* @version 0.
|
|
158
|
+
* @version 0.37.1 (Last Update: 2026.03.31 22:21:10.912)
|
|
148
159
|
* @license MIT
|
|
149
160
|
* @link https://github.com/baendlorel/kt.js
|
|
150
161
|
* @link https://baendlorel.github.io/ Welcome to my site!
|
|
@@ -234,6 +245,9 @@ class KTSubReactive extends KTReactiveLike {
|
|
|
234
245
|
removeOnChange(key) {
|
|
235
246
|
return this.source.removeOnChange(key), this;
|
|
236
247
|
}
|
|
248
|
+
notify() {
|
|
249
|
+
return this.source.notify(), this;
|
|
250
|
+
}
|
|
237
251
|
}
|
|
238
252
|
|
|
239
253
|
const reactiveToOldValue = new Map;
|
|
@@ -245,7 +259,11 @@ const markMutation = reactive => {
|
|
|
245
259
|
if (reactiveToOldValue.set(reactive, reactive._value), scheduled) return;
|
|
246
260
|
scheduled = !0, Promise.resolve().then(() => {
|
|
247
261
|
scheduled = !1, reactiveToOldValue.forEach((oldValue, reactive) => {
|
|
248
|
-
|
|
262
|
+
try {
|
|
263
|
+
reactive._changeHandlers.forEach(handler => handler(reactive.value, oldValue));
|
|
264
|
+
} catch (error) {
|
|
265
|
+
console.error("[@ktjs/core error]", "KTScheduler:", error);
|
|
266
|
+
}
|
|
249
267
|
}), reactiveToOldValue.clear();
|
|
250
268
|
});
|
|
251
269
|
}
|
|
@@ -298,6 +316,9 @@ class KTSubRef extends KTSubReactive {
|
|
|
298
316
|
get draft() {
|
|
299
317
|
return markMutation(this.source), this._getter(this.source._value);
|
|
300
318
|
}
|
|
319
|
+
notify() {
|
|
320
|
+
return this.source.notify(), this;
|
|
321
|
+
}
|
|
301
322
|
}
|
|
302
323
|
|
|
303
324
|
const ref = value => new KTRef(value), assertModel = (props, defaultValue) => {
|
|
@@ -370,21 +391,48 @@ function effect(effectFn, reactives, options) {
|
|
|
370
391
|
|
|
371
392
|
const toReactive = o => isKT(o) ? o : ref(o), dereactive = value => isKT(value) ? value.value : value;
|
|
372
393
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
return "function" == typeof mount && mount(), result;
|
|
379
|
-
};
|
|
380
|
-
const originInsertBefore = Node.prototype.insertBefore;
|
|
381
|
-
Node.prototype.insertBefore = function(node, child) {
|
|
382
|
-
const result = originInsertBefore.call(this, node, child), mount = node.__kt_fragment_mount__;
|
|
383
|
-
return "function" == typeof mount && mount(), result;
|
|
384
|
-
};
|
|
385
|
-
}
|
|
394
|
+
var AnchorType;
|
|
395
|
+
|
|
396
|
+
!function(AnchorType) {
|
|
397
|
+
AnchorType[AnchorType.Fragment = 1] = "Fragment";
|
|
398
|
+
}(AnchorType || (AnchorType = {}));
|
|
386
399
|
|
|
387
|
-
const jsxh = (tag, props) => "function" == typeof tag ? tag(props) : h(tag, props, props.children), placeholder = data => document.createComment(data);
|
|
400
|
+
const jsxh = (tag, props) => "function" == typeof tag ? tag(props) : h(tag, props, props.children), placeholder = data => document.createComment(data), CANNOT_OBSERVE = "undefined" == typeof MutationObserver || "undefined" == typeof document, pendingAnchors = new Set;
|
|
401
|
+
|
|
402
|
+
let pendingAnchorObserver;
|
|
403
|
+
|
|
404
|
+
const flushPendingAnchors = () => {
|
|
405
|
+
if (0 === pendingAnchors.size) return pendingAnchorObserver?.disconnect(), void (pendingAnchorObserver = void 0);
|
|
406
|
+
pendingAnchors.forEach(anchor => anchor.mount()), 0 === pendingAnchors.size && (pendingAnchorObserver?.disconnect(),
|
|
407
|
+
pendingAnchorObserver = void 0);
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
class FragmentAnchor extends Comment {
|
|
411
|
+
isKTAnchor=!0;
|
|
412
|
+
type=AnchorType.Fragment;
|
|
413
|
+
list=[];
|
|
414
|
+
mountCallback;
|
|
415
|
+
constructor() {
|
|
416
|
+
super("kt-fragment");
|
|
417
|
+
}
|
|
418
|
+
mount() {
|
|
419
|
+
this.parentNode && this.mountCallback?.();
|
|
420
|
+
}
|
|
421
|
+
queueMount() {
|
|
422
|
+
pendingAnchors.add(this), pendingAnchorObserver || CANNOT_OBSERVE || !document.body || (pendingAnchorObserver = new MutationObserver(flushPendingAnchors),
|
|
423
|
+
pendingAnchorObserver.observe(document.body, {
|
|
424
|
+
childList: !0,
|
|
425
|
+
subtree: !0
|
|
426
|
+
}));
|
|
427
|
+
}
|
|
428
|
+
unqueueMount() {
|
|
429
|
+
pendingAnchors.delete(this), 0 === pendingAnchors.size && (pendingAnchorObserver?.disconnect(),
|
|
430
|
+
pendingAnchorObserver = void 0);
|
|
431
|
+
}
|
|
432
|
+
removeElements() {
|
|
433
|
+
for (let i = 0; i < this.list.length; i++) this.list[i].remove();
|
|
434
|
+
}
|
|
435
|
+
}
|
|
388
436
|
|
|
389
437
|
function create(creator, tag, props) {
|
|
390
438
|
if (props.ref && isComputedLike(props.ref)) throw new Error("[@ktjs/core error] Cannot assign a computed value to an element.");
|
|
@@ -414,24 +462,24 @@ function Fragment(props) {
|
|
|
414
462
|
return processChild(children), elements;
|
|
415
463
|
}(children);
|
|
416
464
|
return function(props) {
|
|
417
|
-
const
|
|
418
|
-
let
|
|
465
|
+
const anchor = new FragmentAnchor, elements = anchor.list;
|
|
466
|
+
let inserted = !1;
|
|
419
467
|
const redraw = () => {
|
|
420
468
|
const newElements = childrenRef.value, parent = anchor.parentNode;
|
|
421
469
|
if (!parent) {
|
|
422
470
|
elements.length = 0;
|
|
423
471
|
for (let i = 0; i < newElements.length; i++) elements.push(newElements[i]);
|
|
424
|
-
return
|
|
472
|
+
return;
|
|
425
473
|
}
|
|
426
|
-
|
|
474
|
+
anchor.removeElements();
|
|
427
475
|
const fragment = document.createDocumentFragment();
|
|
428
476
|
elements.length = 0;
|
|
429
477
|
for (let i = 0; i < newElements.length; i++) {
|
|
430
478
|
const element = newElements[i];
|
|
431
479
|
elements.push(element), fragment.appendChild(element);
|
|
432
480
|
}
|
|
433
|
-
parent.insertBefore(fragment, anchor.nextSibling),
|
|
434
|
-
|
|
481
|
+
parent.insertBefore(fragment, anchor.nextSibling), mountFragmentAnchors(fragment),
|
|
482
|
+
inserted = !0, anchor.mountCallback = void 0, anchor.unqueueMount();
|
|
435
483
|
}, childrenRef = toReactive(props.children).addOnChange(redraw);
|
|
436
484
|
return (() => {
|
|
437
485
|
const current = childrenRef.value;
|
|
@@ -441,17 +489,12 @@ function Fragment(props) {
|
|
|
441
489
|
const element = current[i];
|
|
442
490
|
elements.push(element), fragment.appendChild(element);
|
|
443
491
|
}
|
|
444
|
-
anchor.__kt_fragment_list__ = elements;
|
|
445
492
|
const parent = anchor.parentNode;
|
|
446
|
-
parent && !inserted && (parent.insertBefore(fragment, anchor.nextSibling),
|
|
447
|
-
|
|
493
|
+
parent && !inserted && (parent.insertBefore(fragment, anchor.nextSibling), mountFragmentAnchors(fragment),
|
|
494
|
+
inserted = !0, anchor.unqueueMount());
|
|
495
|
+
})(), anchor.mountCallback = () => {
|
|
448
496
|
!inserted && anchor.parentNode && redraw();
|
|
449
|
-
},
|
|
450
|
-
anchor.parentNode && !inserted && (redraw(), observer?.disconnect(), observer = void 0);
|
|
451
|
-
}), observer.observe(document.body, {
|
|
452
|
-
childList: !0,
|
|
453
|
-
subtree: !0
|
|
454
|
-
}), $initRef(props, anchor), anchor;
|
|
497
|
+
}, inserted || anchor.queueMount(), $initRef(props, anchor), anchor;
|
|
455
498
|
}({
|
|
456
499
|
children: elements
|
|
457
500
|
});
|
|
@@ -462,8 +505,9 @@ const jsxDEV = (...args) => jsx(...args), jsxs = jsx;
|
|
|
462
505
|
function KTAsync(props) {
|
|
463
506
|
const raw = props.component(props);
|
|
464
507
|
let comp = props.skeleton ?? document.createComment("ktjs-suspense-placeholder");
|
|
465
|
-
return $isThenable(raw) ? raw.then(resolved =>
|
|
466
|
-
|
|
508
|
+
return $isThenable(raw) ? raw.then(resolved => {
|
|
509
|
+
comp.replaceWith(resolved), mountFragmentAnchors(resolved);
|
|
510
|
+
}) : comp = raw, comp;
|
|
467
511
|
}
|
|
468
512
|
|
|
469
513
|
function KTFor(props) {
|
|
@@ -487,8 +531,8 @@ function KTFor(props) {
|
|
|
487
531
|
const item = newList[i], itemKey = currentKey(item, i, newList), node = currentMap(item, i, newList);
|
|
488
532
|
nodeMap.set(itemKey, node), newElements.push(node), fragment.appendChild(node);
|
|
489
533
|
}
|
|
490
|
-
return parent.insertBefore(fragment, anchor.nextSibling),
|
|
491
|
-
anchor;
|
|
534
|
+
return parent.insertBefore(fragment, anchor.nextSibling), mountFragmentAnchors(fragment),
|
|
535
|
+
anchor.__kt_for_list__ = newElements, anchor;
|
|
492
536
|
}
|
|
493
537
|
const newKeyToNewIndex = new Map, newElements = new Array(newLength);
|
|
494
538
|
for (let i = 0; i < newLength; i++) {
|
|
@@ -503,7 +547,7 @@ function KTFor(props) {
|
|
|
503
547
|
let currentNode = anchor.nextSibling;
|
|
504
548
|
for (let i = 0; i < newLength; i++) {
|
|
505
549
|
const node = newElements[i];
|
|
506
|
-
currentNode !== node ? parent.insertBefore(node, currentNode) : currentNode = currentNode.nextSibling;
|
|
550
|
+
currentNode !== node ? (parent.insertBefore(node, currentNode), mountFragmentAnchors(node)) : currentNode = currentNode.nextSibling;
|
|
507
551
|
}
|
|
508
552
|
nodeMap.clear();
|
|
509
553
|
for (let i = 0; i < newLength; i++) {
|
|
@@ -525,7 +569,8 @@ function KTConditional(condition, tagIf, propsIf, tagElse, propsElse) {
|
|
|
525
569
|
let current = condition.value ? jsxh(tagIf, propsIf) : jsxh(tagElse, propsElse);
|
|
526
570
|
return condition.addOnChange(newValue => {
|
|
527
571
|
const old = current;
|
|
528
|
-
current = newValue ? jsxh(tagIf, propsIf) : jsxh(tagElse, propsElse), old.replaceWith(current)
|
|
572
|
+
current = newValue ? jsxh(tagIf, propsIf) : jsxh(tagElse, propsElse), old.replaceWith(current),
|
|
573
|
+
mountFragmentAnchors(current);
|
|
529
574
|
}), current;
|
|
530
575
|
}
|
|
531
576
|
{
|
|
@@ -533,7 +578,7 @@ function KTConditional(condition, tagIf, propsIf, tagElse, propsElse) {
|
|
|
533
578
|
let current = condition.value ? jsxh(tagIf, propsIf) : dummy;
|
|
534
579
|
return condition.addOnChange(newValue => {
|
|
535
580
|
const old = current;
|
|
536
|
-
current = newValue ? jsxh(tagIf, propsIf) : dummy, old.replaceWith(current);
|
|
581
|
+
current = newValue ? jsxh(tagIf, propsIf) : dummy, old.replaceWith(current), mountFragmentAnchors(current);
|
|
537
582
|
}), current;
|
|
538
583
|
}
|
|
539
584
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/reactable/common.ts","../src/h/attr-helpers.ts","../src/h/attr.ts","../src/h/content.ts","../src/h/model.ts","../src/h/index.ts","../src/reactable/reactive.ts","../src/reactable/scheduler.ts","../src/reactable/ref.ts","../src/reactable/computed.ts","../src/reactable/effect.ts","../src/reactable/index.ts","../src/jsx/fragment.ts","../src/jsx/common.ts","../src/jsx/jsx-runtime.ts","../src/jsx/async.ts","../src/jsx/for.ts","../src/jsx/if.ts"],"sourcesContent":["import { KTReactiveLike, KTReactiveType, type KTReactive } from './reactive.js';\nimport type { KTRef, KTRefLike, KTSubRef } from './ref.js';\nimport type { KTComputed, KTComputedLike, KTSubComputed } from './computed.js';\n\n// # type guards\nexport function isKT<T = any>(obj: any): obj is KTReactiveLike<T> {\n return typeof obj?.kid === 'number';\n}\nexport function isReactiveLike<T = any>(obj: any): obj is KTReactiveLike<T> {\n if (typeof obj.ktype === 'number') {\n return (obj.ktype & KTReactiveType.ReactiveLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isRef<T = any>(obj: any): obj is KTRef<T> {\n if (typeof obj.ktype === 'number') {\n return obj.ktype === KTReactiveType.Ref;\n } else {\n return false;\n }\n}\n\nexport function isSubRef<T = any>(obj: any): obj is KTSubRef<T> {\n if (typeof obj.ktype === 'number') {\n return obj.ktype === KTReactiveType.SubRef;\n } else {\n return false;\n }\n}\n\nexport function isRefLike<T = any>(obj: any): obj is KTRefLike<T> {\n if (typeof obj.ktype === 'number') {\n return (obj.ktype & KTReactiveType.RefLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isComputed<T = any>(obj: any): obj is KTComputed<T> {\n if (typeof obj.ktype === 'number') {\n return obj.ktype === KTReactiveType.Computed;\n } else {\n return false;\n }\n}\n\nexport function isSubComputed<T = any>(obj: any): obj is KTSubComputed<T> {\n if (typeof obj.ktype === 'number') {\n return obj.ktype === KTReactiveType.SubComputed;\n } else {\n return false;\n }\n}\n\nexport function isComputedLike<T = any>(obj: any): obj is KTComputedLike<T> {\n if (typeof obj.ktype === 'number') {\n return (obj.ktype & KTReactiveType.ComputedLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isReactive<T = any>(obj: any): obj is KTReactive<T> {\n if (typeof obj.ktype === 'number') {\n return (obj.ktype & KTReactiveType.Reactive) !== 0;\n } else {\n return false;\n }\n}\n\n// # sub getter/setter factory\n\ntype SubGetter = (s: any) => any;\ntype SubSetter = (s: any, newValue: any) => void;\nconst _getters = new Map<string, SubGetter>();\nconst _setters = new Map<string, SubSetter>();\n\nexport const $createSubGetter = (path: string): SubGetter => {\n const exist = _getters.get(path);\n if (exist) {\n return exist;\n } else {\n const cache = new Function('s', `return s${path}`) as SubGetter;\n _getters.set(path, cache);\n return cache;\n }\n};\n\nexport const $createSubSetter = (path: string): SubSetter => {\n const exist = _setters.get(path);\n if (exist) {\n return exist;\n } else {\n const cache = new Function('s', 'v', `s${path}=v`) as SubSetter;\n _setters.set(path, cache);\n return cache;\n }\n};\n","const booleanHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => {\n if (key in element) {\n (element as any)[key] = !!value;\n } else {\n element.setAttribute(key, value);\n }\n};\n\nconst valueHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => {\n if (key in element) {\n (element as any)[key] = value;\n } else {\n element.setAttribute(key, value);\n }\n};\n\n// Attribute handlers map for optimized lookup\nexport const handlers: Record<\n string,\n (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => void\n> = {\n checked: booleanHandler,\n selected: booleanHandler,\n value: valueHandler,\n valueAsDate: valueHandler,\n valueAsNumber: valueHandler,\n defaultValue: valueHandler,\n defaultChecked: booleanHandler,\n defaultSelected: booleanHandler,\n disabled: booleanHandler,\n readOnly: booleanHandler,\n multiple: booleanHandler,\n required: booleanHandler,\n autofocus: booleanHandler,\n open: booleanHandler,\n controls: booleanHandler,\n autoplay: booleanHandler,\n loop: booleanHandler,\n muted: booleanHandler,\n defer: booleanHandler,\n async: booleanHandler,\n hidden: (element, _key, value) => ((element as HTMLElement).hidden = !!value),\n};\n","import type { KTReactifyProps } from '../reactable/types.js';\nimport type { KTRawAttr, KTAttribute } from '../types/h.js';\nimport { isKT } from '../reactable/common.js';\nimport { handlers } from './attr-helpers.js';\n\nconst defaultHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) =>\n element.setAttribute(key, value);\n\nconst setElementStyle = (\n element: HTMLElement | SVGElement | MathMLElement,\n style: Partial<CSSStyleDeclaration> | string,\n) => {\n if (typeof style === 'string') {\n (element as HTMLElement).style.cssText = style;\n return;\n }\n\n for (const key in style) {\n (element as any).style[key as any] = style[key];\n }\n};\n\nfunction attrIsObject(element: HTMLElement | SVGElement | MathMLElement, attr: KTReactifyProps<KTAttribute>) {\n const classValue = attr.class || attr.className;\n if (classValue !== undefined) {\n if (isKT<string>(classValue)) {\n element.setAttribute('class', classValue.value);\n classValue.addOnChange((v) => element.setAttribute('class', v));\n } else {\n element.setAttribute('class', classValue);\n }\n }\n\n const style = attr.style;\n if (style) {\n if (typeof style === 'string') {\n element.setAttribute('style', style);\n } else if (typeof style === 'object') {\n if (isKT(style)) {\n setElementStyle(element, style.value);\n style.addOnChange((v: Partial<CSSStyleDeclaration> | string) => setElementStyle(element, v));\n } else {\n setElementStyle(element, style as Partial<CSSStyleDeclaration>);\n }\n }\n }\n\n // ! Security: `k-html` is an explicit raw HTML escape hatch. kt.js intentionally does not sanitize here; callers must pass only trusted HTML.\n if ('k-html' in attr) {\n const html = attr['k-html'];\n if (isKT(html)) {\n element.innerHTML = html.value;\n html.addOnChange((v) => (element.innerHTML = v));\n } else {\n element.innerHTML = html;\n }\n }\n\n for (const key in attr) {\n // & Arranged in order of usage frequency\n if (\n // key === 'k-if' ||\n // key === 'k-else' ||\n key === 'k-model' ||\n key === 'k-for' ||\n key === 'k-key' ||\n key === 'ref' ||\n key === 'class' ||\n key === 'className' ||\n key === 'style' ||\n key === 'children' ||\n key === 'k-html'\n ) {\n continue;\n }\n\n const o = attr[key];\n\n // normal event handler\n if (key.startsWith('on:')) {\n if (o) {\n element.addEventListener(key.slice(3), o); // chop off the `on:`\n }\n continue;\n }\n\n // normal attributes\n // Security: all non-`on:` attributes are forwarded as-is.\n // Dangerous values such as raw `on*`, `href`, `src`, `srcdoc`, SVG href, etc.\n // remain the caller's responsibility.\n const handler = handlers[key] || defaultHandler;\n if (isKT(o)) {\n handler(element, key, o.value);\n o.addOnChange((v) => handler(element, key, v));\n } else {\n handler(element, key, o);\n }\n }\n}\n\nexport function applyAttr(element: HTMLElement | SVGElement | MathMLElement, attr: KTRawAttr) {\n if (!attr) {\n return;\n }\n if (typeof attr === 'object' && attr !== null) {\n attrIsObject(element, attr as KTAttribute);\n } else {\n $throw('attr must be an object.');\n }\n}\n","import { $isArray, $isNode, $isThenable } from '@ktjs/shared';\nimport type { KTAvailableContent, KTRawContent } from '../types/h.js';\nimport { isKT } from '../reactable/common.js';\n\nconst assureNode = (o: any) => ($isNode(o) ? o : document.createTextNode(o));\n\nfunction apdSingle(element: HTMLElement | DocumentFragment | SVGElement | MathMLElement, c: KTAvailableContent) {\n // & Ignores falsy values, consistent with React's behavior\n if (c === undefined || c === null || c === false) {\n return;\n }\n\n if (isKT(c)) {\n let node = assureNode(c.value);\n element.appendChild(node);\n c.addOnChange((newValue, _oldValue) => {\n const oldNode = node;\n node = assureNode(newValue);\n oldNode.replaceWith(node);\n });\n } else {\n const node = assureNode(c);\n element.appendChild(node);\n // Handle KTFor anchor\n const list = (node as any).__kt_for_list__ as any[];\n if ($isArray(list)) {\n apd(element, list);\n }\n }\n}\n\nfunction apd(element: HTMLElement | DocumentFragment | SVGElement | MathMLElement, c: KTAvailableContent) {\n if ($isThenable(c)) {\n c.then((r) => apd(element, r));\n } else if ($isArray(c)) {\n for (let i = 0; i < c.length; i++) {\n // & might be thenable here too\n const ci = c[i];\n if ($isThenable(ci)) {\n const comment = document.createComment('ktjs-promise-placeholder');\n element.appendChild(comment);\n ci.then((awaited) => comment.replaceWith(awaited));\n } else {\n apdSingle(element, ci);\n }\n }\n } else {\n // & here is thened, so must be a simple elementj\n apdSingle(element, c);\n }\n}\n\nexport function applyContent(element: HTMLElement | SVGElement | MathMLElement, content: KTRawContent): void {\n if ($isArray(content)) {\n for (let i = 0; i < content.length; i++) {\n apd(element, content[i]);\n }\n } else {\n apd(element, content as KTAvailableContent);\n }\n}\n","import type { InputElementTag } from '@ktjs/shared';\nimport type { KTRefLike } from '../reactable/ref.js';\n\nimport { static_cast } from 'type-narrow';\nimport { isRefLike } from '../reactable/common.js';\n\nexport function applyKModel(element: HTMLElementTagNameMap[InputElementTag], valueRef: KTRefLike<any>) {\n if (!isRefLike(valueRef)) {\n $throw('k-model value must be a KTRefLike.');\n }\n\n if (element.tagName === 'INPUT') {\n static_cast<HTMLInputElement>(element);\n if (element.type === 'radio' || element.type === 'checkbox') {\n element.checked = Boolean(valueRef.value);\n element.addEventListener('change', () => (valueRef.value = element.checked));\n valueRef.addOnChange((newValue) => (element.checked = newValue));\n } else {\n element.value = valueRef.value ?? '';\n element.addEventListener('input', () => (valueRef.value = element.value));\n valueRef.addOnChange((newValue) => (element.value = newValue));\n }\n return;\n }\n\n if (element.tagName === 'SELECT' || element.tagName === 'TEXTAREA') {\n element.value = valueRef.value ?? '';\n element.addEventListener('change', () => (valueRef.value = element.value));\n valueRef.addOnChange((newValue) => (element.value = newValue));\n return;\n }\n\n $warn('not supported element for k-model:');\n}\n","import type { HTMLTag, MathMLTag, SVGTag } from '@ktjs/shared';\nimport type { KTRawAttr, KTRawContent, HTML } from '../types/h.js';\n\nimport { applyAttr } from './attr.js';\nimport { applyContent } from './content.js';\nimport { applyKModel } from './model.js';\n\n/**\n * Create an enhanced HTMLElement.\n * - Only supports HTMLElements, **NOT** SVGElements or other Elements.\n * @param tag tag of an `HTMLElement`\n * @param attr attribute object or className\n * @param content a string or an array of HTMLEnhancedElement as child nodes\n *\n * __PKG_INFO__\n */\nexport const h = <T extends HTMLTag | SVGTag | MathMLTag>(\n tag: T,\n attr?: KTRawAttr,\n content?: KTRawContent,\n): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElement(tag) as HTML<T>;\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n return element;\n};\n\nexport const svg = <T extends SVGTag>(tag: T, attr?: KTRawAttr, content?: KTRawContent): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElementNS('http://www.w3.org/2000/svg', tag) as HTML<T>;\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n return element;\n};\n\nexport const mathml = <T extends MathMLTag>(tag: T, attr?: KTRawAttr, content?: KTRawContent): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElementNS('http://www.w3.org/1998/Math/MathML', tag) as HTML<T>;\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n return element;\n};\n","import type { KTComputed, KTSubComputed } from './computed.js';\n\nimport { $stringify } from '@ktjs/shared';\nimport { $createSubGetter } from './common.js';\n\nexport type ChangeHandler<T> = (newValue: T, oldValue: T) => void;\n\nexport const enum KTReactiveType {\n ReactiveLike = 0b00001,\n Ref = 0b00010,\n SubRef = 0b00100,\n RefLike = Ref | SubRef,\n Computed = 0b01000,\n SubComputed = 0b10000,\n ComputedLike = Computed | SubComputed,\n Reactive = Ref | Computed,\n}\n\nlet kid = 1;\nlet handlerId = 1;\n\nexport abstract class KTReactiveLike<T> {\n readonly kid = kid++;\n\n abstract readonly ktype: KTReactiveType;\n\n abstract get value(): T;\n\n abstract addOnChange(handler: ChangeHandler<T>, key?: any): this;\n\n abstract removeOnChange(key: any): this;\n\n /**\n * Create a computed value via current reactive value.\n * - No matter `this` is added to `dependencies` or not, it is always listened.\n * @param calculator A function that generates a new value based on current value.\n * @param dependencies optional other dependencies that the computed value depends on.\n */\n map<U>(calculator: (value: T) => U, dependencies?: Array<KTReactiveLike<any>>): KTComputed<U> {\n return null as any;\n }\n}\n\nexport abstract class KTReactive<T> extends KTReactiveLike<T> {\n /**\n * @internal\n */\n protected _value: T;\n\n /**\n * @internal\n */\n protected readonly _changeHandlers = new Map<any, ChangeHandler<any>>();\n\n constructor(value: T) {\n super();\n this._value = value;\n }\n\n get value() {\n return this._value;\n }\n\n set value(_newValue: T) {\n $warn('Setting value to a non-ref instance takes no effect.');\n }\n\n /**\n * @internal\n */\n protected _emit(newValue: T, oldValue: T): this {\n this._changeHandlers.forEach((handler) => handler(newValue, oldValue));\n return this;\n }\n\n addOnChange(handler: ChangeHandler<T>, key?: any): this {\n key ??= handlerId++;\n if (this._changeHandlers.has(key)) {\n $throw(`Overriding existing change handler with key ${$stringify(key)}.`);\n }\n this._changeHandlers.set(key, handler);\n return this;\n }\n\n removeOnChange(key: any): this {\n this._changeHandlers.delete(key);\n return this;\n }\n\n clearOnChange(): this {\n this._changeHandlers.clear();\n return this;\n }\n\n notify(): this {\n return this._emit(this._value, this._value);\n }\n\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<\n K0 extends keyof T,\n K1 extends keyof T[K0],\n K2 extends keyof T[K0][K1],\n K3 extends keyof T[K0][K1][K2],\n K4 extends keyof T[K0][K1][K2][K3],\n >(key0: K0, key1: K1, key2: K2, key3: K3, key4: K4): KTSubComputed<T[K0][K1][K2][K3][K4]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1], K3 extends keyof T[K0][K1][K2]>(\n key0: K0,\n key1: K1,\n key2: K2,\n key3: K3,\n ): KTSubComputed<T[K0][K1][K2][K3]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1]>(\n key0: K0,\n key1: K1,\n key2: K2,\n ): KTSubComputed<T[K0][K1][K2]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0]>(key0: K0, key1: K1): KTSubComputed<T[K0][K1]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T>(key0: K0): KTSubComputed<T[K0]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get(..._keys: Array<string | number>): KTSubComputed<any> {\n // & Will be implemented in computed.ts to avoid circular dependency\n return null as any;\n }\n}\n\nexport abstract class KTSubReactive<T> extends KTReactiveLike<T> {\n readonly source: KTReactive<any>;\n\n /**\n * @internal\n */\n protected readonly _getter: (sv: KTReactive<any>['value']) => T;\n\n constructor(source: KTReactive<any>, paths: string) {\n super();\n this.source = source;\n this._getter = $createSubGetter(paths);\n }\n\n get value() {\n // @ts-expect-error _value is private\n return this._getter(this.source._value);\n }\n\n addOnChange(handler: ChangeHandler<T>, key?: any): this {\n this.source.addOnChange((newSourceValue, oldSourceValue) => {\n const oldValue = this._getter(oldSourceValue);\n const newValue = this._getter(newSourceValue);\n handler(newValue, oldValue);\n }, key);\n return this;\n }\n\n removeOnChange(key: any): this {\n this.source.removeOnChange(key);\n return this;\n }\n}\n","// Use microqueue to schedule the flush of pending reactions\n\nimport type { KTRef } from './ref.js';\n\nconst reactiveToOldValue = new Map<KTRef<any>, any>();\n\nlet scheduled = false;\n\nexport const markMutation = (reactive: KTRef<any>) => {\n if (!reactiveToOldValue.has(reactive)) {\n // @ts-expect-error accessing protected property\n reactiveToOldValue.set(reactive, reactive._value);\n\n // # schedule by microqueue\n if (scheduled) {\n return;\n }\n\n scheduled = true;\n Promise.resolve().then(() => {\n scheduled = false;\n reactiveToOldValue.forEach((oldValue, reactive) => {\n // @ts-expect-error accessing protected property\n reactive._changeHandlers.forEach((handler) => handler(reactive.value, oldValue));\n });\n reactiveToOldValue.clear();\n });\n }\n};\n","import { $emptyFn, $is, $stringify } from '@ktjs/shared';\nimport { KTReactive, KTReactiveType, KTSubReactive } from './reactive.js';\nimport { KTComputed } from './computed.js';\nimport { markMutation } from './scheduler.js';\nimport { $createSubSetter, isRefLike } from './common.js';\n\nexport class KTRef<T> extends KTReactive<T> {\n readonly ktype = KTReactiveType.Ref;\n\n constructor(_value: T) {\n super(_value);\n }\n\n // ! Cannot be omitted, otherwise this will override `KTReactive` with only setter. And getter will return undefined.\n get value() {\n return this._value;\n }\n\n set value(newValue: T) {\n if ($is(newValue, this._value)) {\n return;\n }\n const oldValue = this._value;\n this._value = newValue;\n this._emit(newValue, oldValue);\n }\n\n /**\n * Used to mutate the value in-place.\n * - internal value is changed instantly, but the change handlers will be called in the next microtask.\n */\n get draft() {\n markMutation(this);\n return this._value;\n }\n\n notify(): this {\n return this._emit(this._value, this._value);\n }\n\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<\n K0 extends keyof T,\n K1 extends keyof T[K0],\n K2 extends keyof T[K0][K1],\n K3 extends keyof T[K0][K1][K2],\n K4 extends keyof T[K0][K1][K2][K3],\n >(key0: K0, key1: K1, key2: K2, key3: K3, key4: K4): KTSubRef<T[K0][K1][K2][K3][K4]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1], K3 extends keyof T[K0][K1][K2]>(\n key0: K0,\n key1: K1,\n key2: K2,\n key3: K3,\n ): KTSubRef<T[K0][K1][K2][K3]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1]>(\n key0: K0,\n key1: K1,\n key2: K2,\n ): KTSubRef<T[K0][K1][K2]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0]>(key0: K0, key1: K1): KTSubRef<T[K0][K1]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T>(key0: K0): KTSubRef<T[K0]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref(...keys: Array<string | number>): KTSubRef<any> {\n if (keys.length === 0) {\n $throw('At least one key is required to get a sub-ref.');\n }\n return new KTSubRef(this, keys.map((key) => `[${$stringify(key)}]`).join(''));\n }\n}\n\nexport class KTSubRef<T> extends KTSubReactive<T> {\n readonly ktype = KTReactiveType.SubRef;\n declare readonly source: KTRef<any>;\n\n /**\n * @internal\n */\n protected readonly _setter: (s: object, newValue: T) => void;\n\n constructor(source: KTRef<any>, paths: string) {\n super(source, paths);\n this._setter = $createSubSetter(paths);\n }\n\n get value() {\n // @ts-expect-error _value is private\n return this._getter(this.source._value);\n }\n\n set value(newValue: T) {\n // @ts-expect-error _value is private\n this._setter(this.source._value, newValue);\n this.source.notify();\n }\n\n get draft() {\n // Same implementation as `draft` in `KTRef`\n markMutation(this.source);\n // @ts-expect-error _value is private\n return this._getter(this.source._value);\n }\n}\n\n/**\n * Create a reactive reference to a value. The returned object has a single property `value` that holds the internal value.\n * @param value listened value\n */\nexport const ref = <T>(value?: T): KTRef<T> => new KTRef(value as any);\n\n/**\n * Assert `k-model` to be a ref-like object\n */\nexport const assertModel = <T = any>(props: any, defaultValue?: T): KTRefLike<T> => {\n // & props is an object. Won't use it in any other place\n if ('k-model' in props) {\n const kmodel = props['k-model'];\n if (isRefLike(kmodel)) {\n return kmodel;\n } else {\n $throw(`k-model data must be a KTRef object, please use 'ref(...)' to wrap it.`);\n }\n }\n return ref(defaultValue) as KTRef<T>;\n};\n\nconst $refSetter = <T>(props: { ref?: KTRef<T> }, node: T) => (props.ref!.value = node);\ntype RefSetter<T> = (props: { ref?: KTRef<T> }, node: T) => void;\n\nexport type KTRefLike<T> = KTRef<T> | KTSubRef<T>;\n\n/**\n * Whether `props.ref` is a `KTRef` only needs to be checked in the initial render\n */\nexport const $initRef = <T extends Node>(props: { ref?: KTRefLike<T> }, node: T): RefSetter<T> => {\n if (!('ref' in props)) {\n return $emptyFn;\n }\n\n const r = props.ref;\n if (isRefLike(r)) {\n r.value = node;\n return $refSetter;\n } else {\n $throw('Fragment: ref must be a KTRef');\n }\n};\n","import { $is, $stringify } from '@ktjs/shared';\nimport { KTReactive, KTReactiveLike, KTReactiveType, KTSubReactive } from './reactive.js';\n\nexport class KTComputed<T> extends KTReactive<T> {\n readonly ktype = KTReactiveType.Computed;\n\n private readonly _calculator: () => T;\n\n private _recalculate(forced: boolean = false): this {\n const newValue = this._calculator();\n const oldValue = this._value;\n if (!$is(oldValue, newValue) || forced) {\n this._value = newValue;\n this._emit(newValue, oldValue);\n }\n return this;\n }\n\n constructor(calculator: () => T, dependencies: Array<KTReactiveLike<any>>) {\n super(calculator());\n this._calculator = calculator;\n const recalculate = () => this._recalculate();\n for (let i = 0; i < dependencies.length; i++) {\n dependencies[i].addOnChange(recalculate);\n }\n }\n\n notify(): this {\n return this._recalculate(true);\n }\n}\n\nKTReactiveLike.prototype.map = function <U>(\n this: KTReactive<unknown>,\n c: (value: unknown) => U,\n dep?: Array<KTReactiveLike<any>>,\n) {\n return new KTComputed(() => c(this.value), dep ? [this, ...dep] : [this]);\n};\n\nKTReactive.prototype.get = function <T>(this: KTReactive<T>, ...keys: Array<string | number>) {\n if (keys.length === 0) {\n $throw('At least one key is required to get a sub-computed.');\n }\n return new KTSubComputed(this, keys.map((key) => `[${$stringify(key)}]`).join(''));\n};\n\nexport class KTSubComputed<T> extends KTSubReactive<T> {\n readonly ktype = KTReactiveType.SubComputed;\n}\n\nexport type KTComputedLike<T> = KTComputed<T> | KTSubComputed<T>;\n\n/**\n * Create a computed value that automatically updates when its dependencies change.\n * @param calculator synchronous function that calculates the value of the computed. It should not have side effects.\n * @param dependencies an array of reactive dependencies that the computed value depends on. The computed value will automatically update when any of these dependencies change.\n */\nexport const computed = <T>(calculator: () => T, dependencies: Array<KTReactiveLike<any>>): KTComputed<T> =>\n new KTComputed(calculator, dependencies);\n","import { $emptyFn } from '@ktjs/shared';\nimport type { KTReactiveLike } from './reactive.js';\n\ninterface KTEffectOptions {\n lazy: boolean;\n onCleanup: () => void;\n debugName: string;\n}\n\n/**\n * Register a reactive effect with options.\n * @param effectFn The effect function to run when dependencies change\n * @param reactives The reactive dependencies\n * @param options Effect options: lazy, onCleanup, debugName\n * @returns stop function to remove all listeners\n */\nexport function effect(\n effectFn: () => void,\n reactives: Array<KTReactiveLike<any>>,\n options?: Partial<KTEffectOptions>,\n) {\n const { lazy = false, onCleanup = $emptyFn, debugName = '' } = Object(options);\n const listenerKeys: Array<string | number> = [];\n\n let active = true;\n\n const run = () => {\n if (!active) {\n return;\n }\n\n // cleanup before rerun\n onCleanup();\n\n try {\n effectFn();\n } catch (err) {\n $debug('effect error:', debugName, err);\n }\n };\n\n // subscribe to dependencies\n for (let i = 0; i < reactives.length; i++) {\n listenerKeys[i] = i;\n reactives[i].addOnChange(run, effectFn);\n }\n\n // auto run unless lazy\n if (!lazy) {\n run();\n }\n\n // stop function\n return () => {\n if (!active) {\n return;\n }\n active = false;\n\n for (let i = 0; i < reactives.length; i++) {\n reactives[i].removeOnChange(effectFn);\n }\n\n // final cleanup\n onCleanup();\n };\n}\n","import type { KTReactive, KTReactiveLike } from './reactive.js';\nimport { isKT } from './common.js';\nimport { ref } from './ref.js';\n\n/**\n * Ensure a value is reactive. If it's already `KTReactiveLike`, return it as is; otherwise, wrap it in a `ref`.\n */\nexport const toReactive = <T>(o: T | KTReactiveLike<T>): KTReactiveLike<T> =>\n isKT(o) ? o : (ref(o as T) as KTReactive<T>);\n\n/**\n * Extracts the value from a KTReactive, or returns the value directly if it's not reactive.\n */\nexport const dereactive = <T>(value: T | KTReactiveLike<T>): T => (isKT<T>(value) ? value.value : value);\n\nexport type { KTRef, KTSubRef, KTRefLike } from './ref.js';\nexport { ref, assertModel } from './ref.js';\nexport type { KTComputed, KTSubComputed, KTComputedLike } from './computed.js';\nexport { computed } from './computed.js';\nexport { KTReactiveType } from './reactive.js';\nexport type * from './reactive.js';\n\nexport {\n isKT,\n isReactiveLike,\n isRef,\n isSubRef,\n isRefLike,\n isComputed,\n isSubComputed,\n isComputedLike,\n isReactive,\n} from './common.js';\nexport { effect } from './effect.js';\nexport type * from './types.js';\n","import type { KTReactiveLike } from '../reactable/reactive.js';\nimport type { KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport { $initRef, type KTRefLike } from '../reactable/ref.js';\n\nimport { $forEach, $isArray } from '@ktjs/shared';\nimport { isKT, toReactive } from '../reactable/index.js';\n\nconst FRAGMENT_MOUNT_PATCHED = '__kt_fragment_mount_patched__';\nconst FRAGMENT_MOUNT = '__kt_fragment_mount__';\n\nif (typeof Node !== 'undefined' && !(globalThis as any)[FRAGMENT_MOUNT_PATCHED]) {\n (globalThis as any)[FRAGMENT_MOUNT_PATCHED] = true;\n\n const originAppendChild = Node.prototype.appendChild;\n Node.prototype.appendChild = function (node) {\n const result = originAppendChild.call(this, node);\n const mount = (node as any)[FRAGMENT_MOUNT];\n if (typeof mount === 'function') {\n mount();\n }\n return result as any;\n };\n\n const originInsertBefore = Node.prototype.insertBefore;\n Node.prototype.insertBefore = function (node: Node, child: Node | null) {\n const result = originInsertBefore.call(this, node, child);\n const mount = (node as any)[FRAGMENT_MOUNT];\n if (typeof mount === 'function') {\n mount();\n }\n return result as any;\n };\n}\n\nexport interface FragmentProps<T extends JSX.Element = JSX.Element> {\n /** Array of child elements, supports reactive arrays */\n children: T[] | KTReactiveLike<T[]>;\n\n /** element key function for optimization (future enhancement) */\n key?: (element: T, index: number, array: T[]) => any;\n\n /** ref to get the anchor node */\n ref?: KTRefLike<JSX.Element>;\n}\n\n/**\n * Fragment - Container component for managing arrays of child elements\n *\n * Features:\n * 1. Returns a comment anchor node, child elements are inserted after the anchor\n * 2. Supports reactive arrays, automatically updates DOM when array changes\n * 3. Basic version uses simple replacement algorithm (remove all old elements, insert all new elements)\n * 4. Future enhancement: key-based optimization\n *\n * Usage example:\n * ```tsx\n * const children = ref([<div>A</div>, <div>B</div>]);\n * const fragment = <Fragment children={children} />;\n * document.body.appendChild(fragment);\n *\n * // Automatic update\n * children.value = [<div>C</div>, <div>D</div>];\n * ```\n */\nexport function Fragment<T extends JSX.Element = JSX.Element>(props: FragmentProps<T>): JSX.Element {\n const elements: T[] = [];\n const anchor = document.createComment('kt-fragment') as unknown as JSX.Element;\n let inserted = false;\n let observer: MutationObserver | undefined;\n\n const redraw = () => {\n const newElements = childrenRef.value;\n const parent = anchor.parentNode;\n\n if (!parent) {\n elements.length = 0;\n for (let i = 0; i < newElements.length; i++) {\n elements.push(newElements[i]);\n }\n (anchor as any).__kt_fragment_list__ = elements;\n return;\n }\n\n for (let i = 0; i < elements.length; i++) {\n elements[i].remove();\n }\n\n const fragment = document.createDocumentFragment();\n elements.length = 0;\n\n for (let i = 0; i < newElements.length; i++) {\n const element = newElements[i];\n elements.push(element);\n fragment.appendChild(element);\n }\n\n parent.insertBefore(fragment, anchor.nextSibling);\n inserted = true;\n delete (anchor as any)[FRAGMENT_MOUNT];\n observer?.disconnect();\n observer = undefined;\n (anchor as any).__kt_fragment_list__ = elements;\n };\n\n const childrenRef = toReactive(props.children).addOnChange(redraw);\n\n const renderInitial = () => {\n const current = childrenRef.value;\n elements.length = 0;\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < current.length; i++) {\n const element = current[i];\n elements.push(element);\n fragment.appendChild(element);\n }\n\n (anchor as any).__kt_fragment_list__ = elements;\n\n const parent = anchor.parentNode;\n if (parent && !inserted) {\n parent.insertBefore(fragment, anchor.nextSibling);\n inserted = true;\n }\n };\n\n renderInitial();\n\n (anchor as any)[FRAGMENT_MOUNT] = () => {\n if (!inserted && anchor.parentNode) {\n redraw();\n }\n };\n\n observer = new MutationObserver(() => {\n if (anchor.parentNode && !inserted) {\n redraw();\n observer?.disconnect();\n observer = undefined;\n }\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n\n $initRef(props, anchor);\n\n return anchor;\n}\n\n/**\n * Convert KTRawContent to HTMLElement array\n */\nexport function convertChildrenToElements(children: KTRawContent): Element[] {\n const elements: Element[] = [];\n\n const processChild = (child: any): void => {\n if (child === undefined || child === null || child === false || child === true) {\n // Ignore null, undefined, false, true\n return;\n }\n\n if ($isArray(child)) {\n // Recursively process array\n $forEach(child, processChild);\n return;\n }\n\n if (typeof child === 'string' || typeof child === 'number') {\n const span = document.createElement('span');\n span.textContent = String(child);\n elements.push(span);\n return;\n }\n\n if (child instanceof Element) {\n elements.push(child);\n return;\n }\n\n if (isKT(child)) {\n processChild(child.value);\n return;\n }\n\n $warn('Fragment: unsupported child type', child);\n if (process.env.IS_DEV) {\n throw new Error(`Fragment: unsupported child type`);\n }\n };\n\n processChild(children);\n return elements;\n}\n","import type { JSXTag } from '@ktjs/shared';\nimport type { KTAttribute } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport { h } from '../h/index';\n\nexport const jsxh = (tag: JSXTag, props: KTAttribute): JSX.Element =>\n (typeof tag === 'function' ? tag(props) : h(tag, props, props.children)) as JSX.Element;\n\nexport const placeholder = (data: string): JSX.Element => document.createComment(data) as unknown as JSX.Element;\n","import type { JSXTag, MathMLTag, SVGTag } from '@ktjs/shared';\nimport type { KTAttribute, KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\n\nimport { h, mathml as _mathml, svg as _svg } from '../h/index.js';\nimport { $initRef } from '../reactable/ref.js';\nimport { isComputedLike } from '../reactable/common.js';\n\nimport { convertChildrenToElements, Fragment as FragmentArray } from './fragment.js';\nimport { jsxh, placeholder } from './common.js';\n\nfunction create(\n creator: (tag: any, props: KTAttribute, content?: KTRawContent) => JSX.Element,\n tag: any,\n props: KTAttribute,\n) {\n if (props.ref && isComputedLike(props.ref)) {\n $throw('Cannot assign a computed value to an element.');\n }\n const el = creator(tag, props, props.children);\n $initRef(props, el);\n return el;\n}\n\nexport const jsx = (tag: JSXTag, props: KTAttribute): JSX.Element => create(jsxh, tag, props);\nexport const svg = (tag: SVGTag, props: KTAttribute): JSX.Element => create(_svg, tag, props);\nexport const mathml = (tag: MathMLTag, props: KTAttribute): JSX.Element => create(_mathml, tag, props);\nexport { svg as svgRuntime, mathml as mathmlRuntime };\n\n/**\n * Fragment support - returns an array of children\n * Enhanced Fragment component that manages arrays of elements\n */\nexport function Fragment(props: { children?: KTRawContent }): JSX.Element {\n const { children } = props ?? {};\n\n if (!children) {\n return placeholder('kt-fragment-empty');\n }\n\n const elements = convertChildrenToElements(children);\n\n return FragmentArray({ children: elements });\n}\n\n/**\n * JSX Development runtime - same as jsx but with additional dev checks\n */\nexport const jsxDEV: typeof jsx = (...args) => {\n // console.log('JSX DEV called:', ...args);\n // console.log('children', (args[1] as any)?.children);\n return jsx(...args);\n};\n\n/**\n * JSX runtime for React 17+ automatic runtime\n * This is called when using jsx: \"react-jsx\" or \"react-jsxdev\"\n */\nexport const jsxs = jsx;\n\n// Export h as the classic JSX factory for backward compatibility\nexport { h, h as createElement };\n","import { $isThenable } from '@ktjs/shared';\nimport type { KTComponent, KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport type { KTRef } from '../reactable/ref.js';\n\n/**\n * Extract component props type (excluding ref and children)\n */\ntype ExtractComponentProps<T> = T extends (props: infer P) => any ? Omit<P, 'ref' | 'children'> : {};\n\nexport function KTAsync<T extends KTComponent>(\n props: {\n ref?: KTRef<JSX.Element>;\n skeleton?: JSX.Element;\n component: T;\n children?: KTRawContent;\n } & ExtractComponentProps<T>,\n): JSX.Element {\n const raw = props.component(props);\n let comp: JSX.Element =\n props.skeleton ?? (document.createComment('ktjs-suspense-placeholder') as unknown as JSX.Element);\n\n if ($isThenable(raw)) {\n raw.then((resolved) => comp.replaceWith(resolved));\n } else {\n comp = raw as JSX.Element;\n }\n\n return comp;\n}\n","import type { JSX } from '../types/jsx.js';\nimport type { KTRefLike } from '../reactable/ref.js';\nimport type { KTReactiveLike } from '../reactable/reactive.js';\n\nimport { $identity } from '@ktjs/shared';\nimport { toReactive } from '../reactable/index.js';\nimport { $initRef } from '../reactable/ref.js';\n\nexport type KTForElement = JSX.Element;\n\nexport interface KTForProps<T> {\n ref?: KTRefLike<KTForElement>;\n list: T[] | KTReactiveLike<T[]>;\n key?: (item: T, index: number, array: T[]) => any;\n map?: (item: T, index: number, array: T[]) => JSX.Element;\n}\n\n// TASK 对于template标签的for和if,会编译为fragment,可特殊处理,让它们保持原样\n/**\n * KTFor - List rendering component with key-based optimization\n * Returns a Comment anchor node with rendered elements in __kt_for_list__\n */\nexport function KTFor<T>(props: KTForProps<T>): KTForElement {\n const redraw = () => {\n const newList = listRef.value;\n\n const parent = anchor.parentNode;\n if (!parent) {\n // If not in DOM yet, just rebuild the list\n const newElements: KTForElement[] = [];\n nodeMap.clear();\n for (let index = 0; index < newList.length; index++) {\n const item = newList[index];\n const itemKey = currentKey(item, index, newList);\n const node = currentMap(item, index, newList);\n nodeMap.set(itemKey, node);\n newElements.push(node);\n }\n (anchor as any).__kt_for_list__ = newElements;\n return anchor;\n }\n\n const oldLength = (anchor as any).__kt_for_list__.length;\n const newLength = newList.length;\n\n // Fast path: empty list\n if (newLength === 0) {\n nodeMap.forEach((node) => node.remove());\n nodeMap.clear();\n (anchor as any).__kt_for_list__ = [];\n return anchor;\n }\n\n // Fast path: all new items\n if (oldLength === 0) {\n const newElements: KTForElement[] = [];\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < newLength; i++) {\n const item = newList[i];\n const itemKey = currentKey(item, i, newList);\n const node = currentMap(item, i, newList);\n nodeMap.set(itemKey, node);\n newElements.push(node);\n fragment.appendChild(node);\n }\n parent.insertBefore(fragment, anchor.nextSibling);\n (anchor as any).__kt_for_list__ = newElements;\n return anchor;\n }\n\n // Build key index map and new elements array in one pass\n const newKeyToNewIndex = new Map<any, number>();\n const newElements: KTForElement[] = new Array(newLength);\n for (let i = 0; i < newLength; i++) {\n const item = newList[i];\n const itemKey = currentKey(item, i, newList);\n newKeyToNewIndex.set(itemKey, i);\n\n if (nodeMap.has(itemKey)) {\n // Reuse existing node\n newElements[i] = nodeMap.get(itemKey)!;\n } else {\n // Create new node\n newElements[i] = currentMap(item, i, newList);\n }\n }\n\n // Remove nodes not in new list\n const toRemove: KTForElement[] = [];\n nodeMap.forEach((node, key) => {\n if (!newKeyToNewIndex.has(key)) {\n toRemove.push(node);\n }\n });\n for (let i = 0; i < toRemove.length; i++) {\n toRemove[i].remove();\n }\n\n // Reorder existing nodes and insert new nodes in a single pass.\n let currentNode = anchor.nextSibling;\n for (let i = 0; i < newLength; i++) {\n const node = newElements[i];\n if (currentNode !== node) {\n parent.insertBefore(node, currentNode);\n } else {\n currentNode = currentNode.nextSibling;\n }\n }\n\n // Update maps\n nodeMap.clear();\n for (let i = 0; i < newLength; i++) {\n const itemKey = currentKey(newList[i], i, newList);\n nodeMap.set(itemKey, newElements[i]);\n }\n (anchor as any).__kt_for_list__ = newElements;\n return anchor;\n };\n\n const currentKey: NonNullable<KTForProps<T>['key']> = props.key ?? ((item: T) => item);\n const currentMap: NonNullable<KTForProps<T>['map']> =\n props.map ?? ((item: T) => $identity(item) as unknown as KTForElement);\n const listRef = toReactive(props.list).addOnChange(redraw);\n const anchor = document.createComment('kt-for') as unknown as KTForElement;\n\n // Map to track rendered nodes by key\n const nodeMap = new Map<any, KTForElement>();\n\n // Render initial list\n const elements: KTForElement[] = [];\n for (let index = 0; index < listRef.value.length; index++) {\n const item = listRef.value[index];\n const itemKey = currentKey(item, index, listRef.value);\n const node = currentMap(item, index, listRef.value);\n nodeMap.set(itemKey, node);\n elements.push(node);\n }\n\n (anchor as any).__kt_for_list__ = elements;\n\n $initRef(props, anchor);\n\n return anchor;\n}\n","import type { JSXTag } from '@ktjs/shared';\nimport type { KTAttribute } from '../types/h.js';\nimport type { KTReactiveLike } from '../reactable/reactive.js';\n\nimport { isKT } from '../reactable/index.js';\nimport { jsxh, placeholder } from './common.js';\n\nexport function KTConditional(\n condition: any | KTReactiveLike<any>,\n tagIf: JSXTag,\n propsIf: KTAttribute,\n tagElse?: JSXTag,\n propsElse?: KTAttribute,\n) {\n if (!isKT(condition)) {\n return condition ? jsxh(tagIf, propsIf) : tagElse ? jsxh(tagElse, propsElse!) : placeholder('kt-conditional');\n }\n\n if (tagElse) {\n let current = condition.value ? jsxh(tagIf, propsIf) : jsxh(tagElse!, propsElse!);\n condition.addOnChange((newValue) => {\n const old = current;\n current = newValue ? jsxh(tagIf, propsIf) : jsxh(tagElse!, propsElse!);\n old.replaceWith(current);\n });\n return current;\n } else {\n const dummy = placeholder('kt-conditional') as HTMLElement;\n let current = condition.value ? jsxh(tagIf, propsIf) : dummy;\n condition.addOnChange((newValue) => {\n const old = current;\n current = newValue ? jsxh(tagIf, propsIf) : dummy;\n old.replaceWith(current);\n });\n return current;\n }\n}\n"],"names":["isKT","obj","kid","isReactiveLike","ktype","isRef","isSubRef","isRefLike","isComputed","isSubComputed","isComputedLike","isReactive","_getters","Map","_setters","booleanHandler","element","key","value","setAttribute","valueHandler","handlers","checked","selected","valueAsDate","valueAsNumber","defaultValue","defaultChecked","defaultSelected","disabled","readOnly","multiple","required","autofocus","open","controls","autoplay","loop","muted","defer","async","hidden","_key","defaultHandler","setElementStyle","style","cssText","applyAttr","attr","Error","classValue","class","className","undefined","addOnChange","v","html","innerHTML","o","startsWith","addEventListener","slice","handler","attrIsObject","assureNode","$isNode","document","createTextNode","apdSingle","c","node","appendChild","newValue","_oldValue","oldNode","replaceWith","list","__kt_for_list__","$isArray","apd","$isThenable","then","r","i","length","ci","comment","createComment","awaited","applyContent","content","applyKModel","valueRef","tagName","console","type","Boolean","h","tag","createElement","svg","createElementNS","mathml","handlerId","KTReactiveLike","map","calculator","dependencies","KTReactive","_value","_changeHandlers","constructor","super","this","_newValue","warn","_emit","oldValue","forEach","has","$stringify","set","removeOnChange","delete","clearOnChange","clear","notify","get","_keys","KTSubReactive","source","_getter","paths","path","exist","cache","Function","$createSubGetter","newSourceValue","oldSourceValue","reactiveToOldValue","scheduled","markMutation","reactive","Promise","resolve","KTRef","$is","draft","subref","keys","KTSubRef","join","_setter","$createSubSetter","ref","assertModel","props","kmodel","$refSetter","$initRef","$emptyFn","KTComputed","_calculator","_recalculate","forced","recalculate","prototype","dep","KTSubComputed","computed","effect","effectFn","reactives","options","lazy","onCleanup","debugName","Object","active","run","err","debug","toReactive","dereactive","Node","globalThis","originAppendChild","result","call","mount","originInsertBefore","insertBefore","child","jsxh","children","placeholder","data","create","creator","el","jsx","_svg","_mathml","Fragment","elements","processChild","$forEach","span","textContent","String","push","Element","convertChildrenToElements","anchor","observer","inserted","redraw","newElements","childrenRef","parent","parentNode","__kt_fragment_list__","remove","fragment","createDocumentFragment","nextSibling","disconnect","current","renderInitial","MutationObserver","observe","body","childList","subtree","FragmentArray","jsxDEV","args","jsxs","KTAsync","raw","component","comp","skeleton","resolved","KTFor","currentKey","item","currentMap","$identity","listRef","newList","nodeMap","index","itemKey","oldLength","newLength","newKeyToNewIndex","Array","toRemove","currentNode","KTConditional","condition","tagIf","propsIf","tagElse","propsElse","old","dummy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/reactable/common.ts","../src/h/attr-helpers.ts","../src/h/attr.ts","../src/jsx/anchor-mount.ts","../src/h/content.ts","../src/h/model.ts","../src/h/index.ts","../src/reactable/reactive.ts","../src/reactable/scheduler.ts","../src/reactable/ref.ts","../src/reactable/computed.ts","../src/reactable/effect.ts","../src/reactable/index.ts","../src/jsx/common.ts","../src/jsx/fragment.ts","../src/jsx/jsx-runtime.ts","../src/jsx/async.ts","../src/jsx/for.ts","../src/jsx/if.ts"],"sourcesContent":["import { KTReactiveLike, KTReactiveType, type KTReactive } from './reactive.js';\nimport type { KTRef, KTRefLike, KTSubRef } from './ref.js';\nimport type { KTComputed, KTComputedLike, KTSubComputed } from './computed.js';\n\n// # type guards\nexport function isKT<T = any>(obj: any): obj is KTReactiveLike<T> {\n return typeof obj?.kid === 'number';\n}\nexport function isReactiveLike<T = any>(obj: any): obj is KTReactiveLike<T> {\n if (typeof obj.ktype === 'number') {\n return (obj.ktype & KTReactiveType.ReactiveLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isRef<T = any>(obj: any): obj is KTRef<T> {\n if (typeof obj.ktype === 'number') {\n return obj.ktype === KTReactiveType.Ref;\n } else {\n return false;\n }\n}\n\nexport function isSubRef<T = any>(obj: any): obj is KTSubRef<T> {\n if (typeof obj.ktype === 'number') {\n return obj.ktype === KTReactiveType.SubRef;\n } else {\n return false;\n }\n}\n\nexport function isRefLike<T = any>(obj: any): obj is KTRefLike<T> {\n if (typeof obj.ktype === 'number') {\n return (obj.ktype & KTReactiveType.RefLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isComputed<T = any>(obj: any): obj is KTComputed<T> {\n if (typeof obj.ktype === 'number') {\n return obj.ktype === KTReactiveType.Computed;\n } else {\n return false;\n }\n}\n\nexport function isSubComputed<T = any>(obj: any): obj is KTSubComputed<T> {\n if (typeof obj.ktype === 'number') {\n return obj.ktype === KTReactiveType.SubComputed;\n } else {\n return false;\n }\n}\n\nexport function isComputedLike<T = any>(obj: any): obj is KTComputedLike<T> {\n if (typeof obj.ktype === 'number') {\n return (obj.ktype & KTReactiveType.ComputedLike) !== 0;\n } else {\n return false;\n }\n}\n\nexport function isReactive<T = any>(obj: any): obj is KTReactive<T> {\n if (typeof obj.ktype === 'number') {\n return (obj.ktype & KTReactiveType.Reactive) !== 0;\n } else {\n return false;\n }\n}\n\n// # sub getter/setter factory\n\ntype SubGetter = (s: any) => any;\ntype SubSetter = (s: any, newValue: any) => void;\nconst _getters = new Map<string, SubGetter>();\nconst _setters = new Map<string, SubSetter>();\n\nexport const $createSubGetter = (path: string): SubGetter => {\n const exist = _getters.get(path);\n if (exist) {\n return exist;\n } else {\n const cache = new Function('s', `return s${path}`) as SubGetter;\n _getters.set(path, cache);\n return cache;\n }\n};\n\nexport const $createSubSetter = (path: string): SubSetter => {\n const exist = _setters.get(path);\n if (exist) {\n return exist;\n } else {\n const cache = new Function('s', 'v', `s${path}=v`) as SubSetter;\n _setters.set(path, cache);\n return cache;\n }\n};\n","const booleanHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => {\n if (key in element) {\n (element as any)[key] = !!value;\n } else {\n element.setAttribute(key, value);\n }\n};\n\nconst valueHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => {\n if (key in element) {\n (element as any)[key] = value;\n } else {\n element.setAttribute(key, value);\n }\n};\n\n// Attribute handlers map for optimized lookup\nexport const handlers: Record<\n string,\n (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) => void\n> = {\n checked: booleanHandler,\n selected: booleanHandler,\n value: valueHandler,\n valueAsDate: valueHandler,\n valueAsNumber: valueHandler,\n defaultValue: valueHandler,\n defaultChecked: booleanHandler,\n defaultSelected: booleanHandler,\n disabled: booleanHandler,\n readOnly: booleanHandler,\n multiple: booleanHandler,\n required: booleanHandler,\n autofocus: booleanHandler,\n open: booleanHandler,\n controls: booleanHandler,\n autoplay: booleanHandler,\n loop: booleanHandler,\n muted: booleanHandler,\n defer: booleanHandler,\n async: booleanHandler,\n hidden: (element, _key, value) => ((element as HTMLElement).hidden = !!value),\n};\n","import type { KTReactifyProps } from '../reactable/types.js';\nimport type { KTRawAttr, KTAttribute } from '../types/h.js';\nimport { isKT } from '../reactable/common.js';\nimport { handlers } from './attr-helpers.js';\n\nconst defaultHandler = (element: HTMLElement | SVGElement | MathMLElement, key: string, value: any) =>\n element.setAttribute(key, value);\n\nconst setElementStyle = (\n element: HTMLElement | SVGElement | MathMLElement,\n style: Partial<CSSStyleDeclaration> | string,\n) => {\n if (typeof style === 'string') {\n (element as HTMLElement).style.cssText = style;\n return;\n }\n\n for (const key in style) {\n (element as any).style[key as any] = style[key];\n }\n};\n\nfunction attrIsObject(element: HTMLElement | SVGElement | MathMLElement, attr: KTReactifyProps<KTAttribute>) {\n const classValue = attr.class || attr.className;\n if (classValue !== undefined) {\n if (isKT<string>(classValue)) {\n element.setAttribute('class', classValue.value);\n classValue.addOnChange((v) => element.setAttribute('class', v));\n } else {\n element.setAttribute('class', classValue);\n }\n }\n\n const style = attr.style;\n if (style) {\n if (typeof style === 'string') {\n element.setAttribute('style', style);\n } else if (typeof style === 'object') {\n if (isKT(style)) {\n setElementStyle(element, style.value);\n style.addOnChange((v: Partial<CSSStyleDeclaration> | string) => setElementStyle(element, v));\n } else {\n setElementStyle(element, style as Partial<CSSStyleDeclaration>);\n }\n }\n }\n\n // ! Security: `k-html` is an explicit raw HTML escape hatch. kt.js intentionally does not sanitize here; callers must pass only trusted HTML.\n if ('k-html' in attr) {\n const html = attr['k-html'];\n if (isKT(html)) {\n element.innerHTML = html.value;\n html.addOnChange((v) => (element.innerHTML = v));\n } else {\n element.innerHTML = html;\n }\n }\n\n for (const key in attr) {\n // & Arranged in order of usage frequency\n if (\n // key === 'k-if' ||\n // key === 'k-else' ||\n key === 'k-model' ||\n key === 'k-for' ||\n key === 'k-key' ||\n key === 'ref' ||\n key === 'class' ||\n key === 'className' ||\n key === 'style' ||\n key === 'children' ||\n key === 'k-html'\n ) {\n continue;\n }\n\n const o = attr[key];\n\n // normal event handler\n if (key.startsWith('on:')) {\n if (o) {\n element.addEventListener(key.slice(3), o); // chop off the `on:`\n }\n continue;\n }\n\n // normal attributes\n // Security: all non-`on:` attributes are forwarded as-is.\n // Dangerous values such as raw `on*`, `href`, `src`, `srcdoc`, SVG href, etc.\n // remain the caller's responsibility.\n const handler = handlers[key] || defaultHandler;\n if (isKT(o)) {\n handler(element, key, o.value);\n o.addOnChange((v) => handler(element, key, v));\n } else {\n handler(element, key, o);\n }\n }\n}\n\nexport function applyAttr(element: HTMLElement | SVGElement | MathMLElement, attr: KTRawAttr) {\n if (!attr) {\n return;\n }\n if (typeof attr === 'object' && attr !== null) {\n attrIsObject(element, attr as KTAttribute);\n } else {\n $throw('attr must be an object.');\n }\n}\n","type MountableFragmentAnchor = Node & {\n isKTAnchor?: true;\n mount?: () => void;\n};\n\nconst CANNOT_MOUNT = typeof document === 'undefined' || typeof Node === 'undefined';\nconst COMMENT_FILTER = typeof NodeFilter === 'undefined' ? 0x80 : NodeFilter.SHOW_COMMENT;\n\nconst mountIfFragmentAnchor = (node: Node) => {\n const anchor = node as MountableFragmentAnchor;\n if (anchor.isKTAnchor === true && typeof anchor.mount === 'function') {\n anchor.mount();\n }\n};\n\nexport const mountFragmentAnchors = (node: unknown) => {\n if (CANNOT_MOUNT || !(node instanceof Node)) {\n return;\n }\n\n mountIfFragmentAnchor(node);\n\n if (node.nodeType !== Node.ELEMENT_NODE && node.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) {\n return;\n }\n\n const walker = document.createTreeWalker(node, COMMENT_FILTER);\n let current = walker.nextNode();\n while (current) {\n mountIfFragmentAnchor(current);\n current = walker.nextNode();\n }\n};\n","import { $isArray, $isNode, $isThenable } from '@ktjs/shared';\nimport type { KTAvailableContent, KTRawContent } from '../types/h.js';\nimport { isKT } from '../reactable/common.js';\nimport { mountFragmentAnchors } from '../jsx/anchor-mount.js';\n\nconst assureNode = (o: any) => ($isNode(o) ? o : document.createTextNode(o));\n\nfunction apdSingle(element: HTMLElement | DocumentFragment | SVGElement | MathMLElement, c: KTAvailableContent) {\n // & Ignores falsy values, consistent with React's behavior\n if (c === undefined || c === null || c === false) {\n return;\n }\n\n if (isKT(c)) {\n let node = assureNode(c.value);\n element.appendChild(node);\n mountFragmentAnchors(node); // ^ Explicitly deal with FragmentAnchors\n c.addOnChange((newValue, _oldValue) => {\n const oldNode = node;\n node = assureNode(newValue);\n oldNode.replaceWith(node);\n mountFragmentAnchors(node); // ^ Explicitly deal with FragmentAnchors\n });\n } else {\n const node = assureNode(c);\n element.appendChild(node);\n mountFragmentAnchors(node); // ^ Explicitly deal with FragmentAnchors\n // Handle KTFor anchor\n const list = (node as any).__kt_for_list__ as any[];\n if ($isArray(list)) {\n apd(element, list);\n }\n }\n}\n\nfunction apd(element: HTMLElement | DocumentFragment | SVGElement | MathMLElement, c: KTAvailableContent) {\n if ($isThenable(c)) {\n c.then((r) => apd(element, r));\n } else if ($isArray(c)) {\n for (let i = 0; i < c.length; i++) {\n // & might be thenable here too\n const ci = c[i];\n if ($isThenable(ci)) {\n const comment = document.createComment('ktjs-promise-placeholder');\n element.appendChild(comment);\n mountFragmentAnchors(comment); // ^ Explicitly deal with FragmentAnchors\n ci.then((awaited) => {\n comment.replaceWith(awaited);\n mountFragmentAnchors(awaited); // ^ Explicitly deal with FragmentAnchors\n });\n } else {\n apdSingle(element, ci);\n }\n }\n } else {\n // & here is thened, so must be a simple elementj\n apdSingle(element, c);\n }\n}\n\nexport function applyContent(element: HTMLElement | SVGElement | MathMLElement, content: KTRawContent): void {\n if ($isArray(content)) {\n for (let i = 0; i < content.length; i++) {\n apd(element, content[i]);\n }\n } else {\n apd(element, content as KTAvailableContent);\n }\n}\n","import type { InputElementTag } from '@ktjs/shared';\nimport type { KTRefLike } from '../reactable/ref.js';\n\nimport { static_cast } from 'type-narrow';\nimport { isRefLike } from '../reactable/common.js';\n\nexport function applyKModel(element: HTMLElementTagNameMap[InputElementTag], valueRef: KTRefLike<any>) {\n if (!isRefLike(valueRef)) {\n $throw('k-model value must be a KTRefLike.');\n }\n\n if (element.tagName === 'INPUT') {\n static_cast<HTMLInputElement>(element);\n if (element.type === 'radio' || element.type === 'checkbox') {\n element.checked = Boolean(valueRef.value);\n element.addEventListener('change', () => (valueRef.value = element.checked));\n valueRef.addOnChange((newValue) => (element.checked = newValue));\n } else {\n element.value = valueRef.value ?? '';\n element.addEventListener('input', () => (valueRef.value = element.value));\n valueRef.addOnChange((newValue) => (element.value = newValue));\n }\n return;\n }\n\n if (element.tagName === 'SELECT' || element.tagName === 'TEXTAREA') {\n element.value = valueRef.value ?? '';\n element.addEventListener('change', () => (valueRef.value = element.value));\n valueRef.addOnChange((newValue) => (element.value = newValue));\n return;\n }\n\n $warn('not supported element for k-model:');\n}\n","import type { HTMLTag, MathMLTag, SVGTag } from '@ktjs/shared';\nimport type { KTRawAttr, KTRawContent, HTML } from '../types/h.js';\n\nimport { applyAttr } from './attr.js';\nimport { applyContent } from './content.js';\nimport { applyKModel } from './model.js';\n\n/**\n * Create an enhanced HTMLElement.\n * - Only supports HTMLElements, **NOT** SVGElements or other Elements.\n * @param tag tag of an `HTMLElement`\n * @param attr attribute object or className\n * @param content a string or an array of HTMLEnhancedElement as child nodes\n *\n * __PKG_INFO__\n */\nexport const h = <T extends HTMLTag | SVGTag | MathMLTag>(\n tag: T,\n attr?: KTRawAttr,\n content?: KTRawContent,\n): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElement(tag) as HTML<T>;\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n return element;\n};\n\nexport const svg = <T extends SVGTag>(tag: T, attr?: KTRawAttr, content?: KTRawContent): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElementNS('http://www.w3.org/2000/svg', tag) as HTML<T>;\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n return element;\n};\n\nexport const mathml = <T extends MathMLTag>(tag: T, attr?: KTRawAttr, content?: KTRawContent): HTML<T> => {\n if (typeof tag !== 'string') {\n $throw('tagName must be a string.');\n }\n\n // * start creating the element\n const element = document.createElementNS('http://www.w3.org/1998/Math/MathML', tag) as HTML<T>;\n\n // * Handle content\n applyAttr(element, attr);\n applyContent(element, content);\n\n if (typeof attr === 'object' && attr !== null && 'k-model' in attr) {\n applyKModel(element as any, attr['k-model'] as any);\n }\n\n return element;\n};\n","import type { KTComputed, KTSubComputed } from './computed.js';\n\nimport { $stringify } from '@ktjs/shared';\nimport { $createSubGetter } from './common.js';\n\nexport type ChangeHandler<T> = (newValue: T, oldValue: T) => void;\n\nexport const enum KTReactiveType {\n ReactiveLike = 0b00001,\n Ref = 0b00010,\n SubRef = 0b00100,\n RefLike = Ref | SubRef,\n Computed = 0b01000,\n SubComputed = 0b10000,\n ComputedLike = Computed | SubComputed,\n Reactive = Ref | Computed,\n}\n\nlet kid = 1;\nlet handlerId = 1;\n\nexport abstract class KTReactiveLike<T> {\n readonly kid = kid++;\n\n abstract readonly ktype: KTReactiveType;\n\n abstract get value(): T;\n\n abstract addOnChange(handler: ChangeHandler<T>, key?: any): this;\n\n abstract removeOnChange(key: any): this;\n\n /**\n * Create a computed value via current reactive value.\n * - No matter `this` is added to `dependencies` or not, it is always listened.\n * @param calculator A function that generates a new value based on current value.\n * @param dependencies optional other dependencies that the computed value depends on.\n */\n map<U>(calculator: (value: T) => U, dependencies?: Array<KTReactiveLike<any>>): KTComputed<U> {\n return null as any;\n }\n}\n\nexport abstract class KTReactive<T> extends KTReactiveLike<T> {\n /**\n * @internal\n */\n protected _value: T;\n\n /**\n * @internal\n */\n protected readonly _changeHandlers = new Map<any, ChangeHandler<any>>();\n\n constructor(value: T) {\n super();\n this._value = value;\n }\n\n get value() {\n return this._value;\n }\n\n set value(_newValue: T) {\n $warn('Setting value to a non-ref instance takes no effect.');\n }\n\n /**\n * @internal\n */\n protected _emit(newValue: T, oldValue: T): this {\n this._changeHandlers.forEach((handler) => handler(newValue, oldValue));\n return this;\n }\n\n addOnChange(handler: ChangeHandler<T>, key?: any): this {\n key ??= handlerId++;\n if (this._changeHandlers.has(key)) {\n $throw(`Overriding existing change handler with key ${$stringify(key)}.`);\n }\n this._changeHandlers.set(key, handler);\n return this;\n }\n\n removeOnChange(key: any): this {\n this._changeHandlers.delete(key);\n return this;\n }\n\n clearOnChange(): this {\n this._changeHandlers.clear();\n return this;\n }\n\n notify(): this {\n return this._emit(this._value, this._value);\n }\n\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<\n K0 extends keyof T,\n K1 extends keyof T[K0],\n K2 extends keyof T[K0][K1],\n K3 extends keyof T[K0][K1][K2],\n K4 extends keyof T[K0][K1][K2][K3],\n >(key0: K0, key1: K1, key2: K2, key3: K3, key4: K4): KTSubComputed<T[K0][K1][K2][K3][K4]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1], K3 extends keyof T[K0][K1][K2]>(\n key0: K0,\n key1: K1,\n key2: K2,\n key3: K3,\n ): KTSubComputed<T[K0][K1][K2][K3]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1]>(\n key0: K0,\n key1: K1,\n key2: K2,\n ): KTSubComputed<T[K0][K1][K2]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T, K1 extends keyof T[K0]>(key0: K0, key1: K1): KTSubComputed<T[K0][K1]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get<K0 extends keyof T>(key0: K0): KTSubComputed<T[K0]>;\n /**\n * Generate a sub-computed value based on this reactive, using keys to access nested properties.\n * - `reactive.get('a', 'b')` means a sub-computed value to `this.value.a.b`.\n * - `KTSubComputed` is lighter than `KTComputed` because it only listens to changes on the source reactive, while `KTComputed` listens to all its dependencies. So it's better to use `get` when you only need to access nested properties without doing any calculation.\n */\n get(..._keys: Array<string | number>): KTSubComputed<any> {\n // & Will be implemented in computed.ts to avoid circular dependency\n return null as any;\n }\n}\n\nexport abstract class KTSubReactive<T> extends KTReactiveLike<T> {\n readonly source: KTReactive<any>;\n\n /**\n * @internal\n */\n protected readonly _getter: (sv: KTReactive<any>['value']) => T;\n\n constructor(source: KTReactive<any>, paths: string) {\n super();\n this.source = source;\n this._getter = $createSubGetter(paths);\n }\n\n get value() {\n // @ts-expect-error _value is private\n return this._getter(this.source._value);\n }\n\n addOnChange(handler: ChangeHandler<T>, key?: any): this {\n this.source.addOnChange((newSourceValue, oldSourceValue) => {\n const oldValue = this._getter(oldSourceValue);\n const newValue = this._getter(newSourceValue);\n handler(newValue, oldValue);\n }, key);\n return this;\n }\n\n removeOnChange(key: any): this {\n this.source.removeOnChange(key);\n return this;\n }\n\n notify(): this {\n this.source.notify();\n return this;\n }\n}\n","// Use microqueue to schedule the flush of pending reactions\n\nimport type { KTRef } from './ref.js';\n\nconst reactiveToOldValue = new Map<KTRef<any>, any>();\n\nlet scheduled = false;\n\nexport const markMutation = (reactive: KTRef<any>) => {\n if (!reactiveToOldValue.has(reactive)) {\n // @ts-expect-error accessing protected property\n reactiveToOldValue.set(reactive, reactive._value);\n\n // # schedule by microqueue\n if (scheduled) {\n return;\n }\n\n scheduled = true;\n Promise.resolve().then(() => {\n scheduled = false;\n reactiveToOldValue.forEach((oldValue, reactive) => {\n try {\n // @ts-expect-error accessing protected property\n reactive._changeHandlers.forEach((handler) => handler(reactive.value, oldValue));\n } catch (error) {\n $error('KTScheduler:', error);\n }\n });\n reactiveToOldValue.clear();\n });\n }\n};\n","import { $emptyFn, $is, $stringify } from '@ktjs/shared';\nimport { KTReactive, KTReactiveType, KTSubReactive } from './reactive.js';\nimport { markMutation } from './scheduler.js';\nimport { $createSubSetter, isRefLike } from './common.js';\n\nexport class KTRef<T> extends KTReactive<T> {\n readonly ktype = KTReactiveType.Ref;\n\n constructor(_value: T) {\n super(_value);\n }\n\n // ! Cannot be omitted, otherwise this will override `KTReactive` with only setter. And getter will return undefined.\n get value() {\n return this._value;\n }\n\n set value(newValue: T) {\n if ($is(newValue, this._value)) {\n return;\n }\n const oldValue = this._value;\n this._value = newValue;\n this._emit(newValue, oldValue);\n }\n\n /**\n * Used to mutate the value in-place.\n * - internal value is changed instantly, but the change handlers will be called in the next microtask.\n */\n get draft() {\n markMutation(this);\n return this._value;\n }\n\n notify(): this {\n return this._emit(this._value, this._value);\n }\n\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<\n K0 extends keyof T,\n K1 extends keyof T[K0],\n K2 extends keyof T[K0][K1],\n K3 extends keyof T[K0][K1][K2],\n K4 extends keyof T[K0][K1][K2][K3],\n >(key0: K0, key1: K1, key2: K2, key3: K3, key4: K4): KTSubRef<T[K0][K1][K2][K3][K4]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1], K3 extends keyof T[K0][K1][K2]>(\n key0: K0,\n key1: K1,\n key2: K2,\n key3: K3,\n ): KTSubRef<T[K0][K1][K2][K3]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0], K2 extends keyof T[K0][K1]>(\n key0: K0,\n key1: K1,\n key2: K2,\n ): KTSubRef<T[K0][K1][K2]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T, K1 extends keyof T[K0]>(key0: K0, key1: K1): KTSubRef<T[K0][K1]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref<K0 extends keyof T>(key0: K0): KTSubRef<T[K0]>;\n /**\n * Derive a lighter sub-ref from this ref, using keys to access nested properties.\n * - `ref.subref('a', 'b')` means a sub-ref to `this.value.a.b`. Change it will also change `this.value` and trigger the handlers.\n * - `KTSubRef` is lighter than `KTRef`.\n */\n subref(...keys: Array<string | number>): KTSubRef<any> {\n if (keys.length === 0) {\n $throw('At least one key is required to get a sub-ref.');\n }\n return new KTSubRef(this, keys.map((key) => `[${$stringify(key)}]`).join(''));\n }\n}\n\nexport class KTSubRef<T> extends KTSubReactive<T> {\n readonly ktype = KTReactiveType.SubRef;\n declare readonly source: KTRef<any>;\n\n /**\n * @internal\n */\n protected readonly _setter: (s: object, newValue: T) => void;\n\n constructor(source: KTRef<any>, paths: string) {\n super(source, paths);\n this._setter = $createSubSetter(paths);\n }\n\n get value() {\n // @ts-expect-error _value is private\n return this._getter(this.source._value);\n }\n\n set value(newValue: T) {\n // @ts-expect-error _value is private\n this._setter(this.source._value, newValue);\n this.source.notify();\n }\n\n get draft() {\n // Same implementation as `draft` in `KTRef`\n markMutation(this.source);\n // @ts-expect-error _value is private\n return this._getter(this.source._value);\n }\n\n notify(): this {\n this.source.notify();\n return this;\n }\n}\n\n/**\n * Create a reactive reference to a value. The returned object has a single property `value` that holds the internal value.\n * @param value listened value\n */\nexport const ref = <T>(value?: T): KTRef<T> => new KTRef(value as any);\n\n/**\n * Assert `k-model` to be a ref-like object\n */\nexport const assertModel = <T = any>(props: any, defaultValue?: T): KTRefLike<T> => {\n // & props is an object. Won't use it in any other place\n if ('k-model' in props) {\n const kmodel = props['k-model'];\n if (isRefLike(kmodel)) {\n return kmodel;\n } else {\n $throw(`k-model data must be a KTRef object, please use 'ref(...)' to wrap it.`);\n }\n }\n return ref(defaultValue) as KTRef<T>;\n};\n\nconst $refSetter = <T>(props: { ref?: KTRef<T> }, node: T) => (props.ref!.value = node);\ntype RefSetter<T> = (props: { ref?: KTRef<T> }, node: T) => void;\n\nexport type KTRefLike<T> = KTRef<T> | KTSubRef<T>;\n\n/**\n * Whether `props.ref` is a `KTRef` only needs to be checked in the initial render\n */\nexport const $initRef = <T extends Node>(props: { ref?: KTRefLike<T> }, node: T): RefSetter<T> => {\n if (!('ref' in props)) {\n return $emptyFn;\n }\n\n const r = props.ref;\n if (isRefLike(r)) {\n r.value = node;\n return $refSetter;\n } else {\n $throw('Fragment: ref must be a KTRef');\n }\n};\n","import { $is, $stringify } from '@ktjs/shared';\nimport { KTReactive, KTReactiveLike, KTReactiveType, KTSubReactive } from './reactive.js';\n\nexport class KTComputed<T> extends KTReactive<T> {\n readonly ktype = KTReactiveType.Computed;\n\n private readonly _calculator: () => T;\n\n private _recalculate(forced: boolean = false): this {\n const newValue = this._calculator();\n const oldValue = this._value;\n if (!$is(oldValue, newValue) || forced) {\n this._value = newValue;\n this._emit(newValue, oldValue);\n }\n return this;\n }\n\n constructor(calculator: () => T, dependencies: Array<KTReactiveLike<any>>) {\n super(calculator());\n this._calculator = calculator;\n const recalculate = () => this._recalculate();\n for (let i = 0; i < dependencies.length; i++) {\n dependencies[i].addOnChange(recalculate);\n }\n }\n\n notify(): this {\n return this._recalculate(true);\n }\n}\n\nKTReactiveLike.prototype.map = function <U>(\n this: KTReactive<unknown>,\n c: (value: unknown) => U,\n dep?: Array<KTReactiveLike<any>>,\n) {\n return new KTComputed(() => c(this.value), dep ? [this, ...dep] : [this]);\n};\n\nKTReactive.prototype.get = function <T>(this: KTReactive<T>, ...keys: Array<string | number>) {\n if (keys.length === 0) {\n $throw('At least one key is required to get a sub-computed.');\n }\n return new KTSubComputed(this, keys.map((key) => `[${$stringify(key)}]`).join(''));\n};\n\nexport class KTSubComputed<T> extends KTSubReactive<T> {\n readonly ktype = KTReactiveType.SubComputed;\n}\n\nexport type KTComputedLike<T> = KTComputed<T> | KTSubComputed<T>;\n\n/**\n * Create a computed value that automatically updates when its dependencies change.\n * @param calculator synchronous function that calculates the value of the computed. It should not have side effects.\n * @param dependencies an array of reactive dependencies that the computed value depends on. The computed value will automatically update when any of these dependencies change.\n */\nexport const computed = <T>(calculator: () => T, dependencies: Array<KTReactiveLike<any>>): KTComputed<T> =>\n new KTComputed(calculator, dependencies);\n","import { $emptyFn } from '@ktjs/shared';\nimport type { KTReactiveLike } from './reactive.js';\n\ninterface KTEffectOptions {\n lazy: boolean;\n onCleanup: () => void;\n debugName: string;\n}\n\n/**\n * Register a reactive effect with options.\n * @param effectFn The effect function to run when dependencies change\n * @param reactives The reactive dependencies\n * @param options Effect options: lazy, onCleanup, debugName\n * @returns stop function to remove all listeners\n */\nexport function effect(\n effectFn: () => void,\n reactives: Array<KTReactiveLike<any>>,\n options?: Partial<KTEffectOptions>,\n) {\n const { lazy = false, onCleanup = $emptyFn, debugName = '' } = Object(options);\n const listenerKeys: Array<string | number> = [];\n\n let active = true;\n\n const run = () => {\n if (!active) {\n return;\n }\n\n // cleanup before rerun\n onCleanup();\n\n try {\n effectFn();\n } catch (err) {\n $debug('effect error:', debugName, err);\n }\n };\n\n // subscribe to dependencies\n for (let i = 0; i < reactives.length; i++) {\n listenerKeys[i] = i;\n reactives[i].addOnChange(run, effectFn);\n }\n\n // auto run unless lazy\n if (!lazy) {\n run();\n }\n\n // stop function\n return () => {\n if (!active) {\n return;\n }\n active = false;\n\n for (let i = 0; i < reactives.length; i++) {\n reactives[i].removeOnChange(effectFn);\n }\n\n // final cleanup\n onCleanup();\n };\n}\n","import type { KTReactive, KTReactiveLike } from './reactive.js';\nimport { isKT } from './common.js';\nimport { ref } from './ref.js';\n\n/**\n * Ensure a value is reactive. If it's already `KTReactiveLike`, return it as is; otherwise, wrap it in a `ref`.\n */\nexport const toReactive = <T>(o: T | KTReactiveLike<T>): KTReactiveLike<T> =>\n isKT(o) ? o : (ref(o as T) as KTReactive<T>);\n\n/**\n * Extracts the value from a KTReactive, or returns the value directly if it's not reactive.\n */\nexport const dereactive = <T>(value: T | KTReactiveLike<T>): T => (isKT<T>(value) ? value.value : value);\n\nexport type { KTRef, KTSubRef, KTRefLike } from './ref.js';\nexport { ref, assertModel } from './ref.js';\nexport type { KTComputed, KTSubComputed, KTComputedLike } from './computed.js';\nexport { computed } from './computed.js';\nexport { KTReactiveType } from './reactive.js';\nexport type * from './reactive.js';\n\nexport {\n isKT,\n isReactiveLike,\n isRef,\n isSubRef,\n isRefLike,\n isComputed,\n isSubComputed,\n isComputedLike,\n isReactive,\n} from './common.js';\nexport { effect } from './effect.js';\nexport type * from './types.js';\n","import type { JSXTag } from '@ktjs/shared';\nimport type { KTAttribute } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport { h } from '../h/index';\n\nexport enum AnchorType {\n Fragment = 1,\n}\n\nexport const jsxh = (tag: JSXTag, props: KTAttribute): JSX.Element =>\n (typeof tag === 'function' ? tag(props) : h(tag, props, props.children)) as JSX.Element;\n\nexport const placeholder = (data: string): JSX.Element => document.createComment(data) as unknown as JSX.Element;\n","import type { KTReactiveLike } from '../reactable/reactive.js';\nimport type { KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport { $initRef, type KTRefLike } from '../reactable/ref.js';\n\nimport { $forEach, $isArray } from '@ktjs/shared';\nimport { isKT, toReactive } from '../reactable/index.js';\nimport { AnchorType } from './common.js';\nimport { mountFragmentAnchors } from './anchor-mount.js';\n\nconst FRAGMENT_MOUNT_PATCHED = '__kt_fragment_mount_patched__';\n\nconst CANNOT_OBSERVE = typeof MutationObserver === 'undefined' || typeof document === 'undefined';\n\nconst collectAnchors = (node: Node): FragmentAnchor[] => {\n if (typeof document === 'undefined') {\n return [];\n }\n\n const anchors: FragmentAnchor[] = [];\n if (node instanceof FragmentAnchor) {\n anchors.push(node);\n return anchors;\n }\n\n if (node.nodeType === Node.ELEMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n const walker = document.createTreeWalker(node, NodeFilter.SHOW_COMMENT);\n let current = walker.nextNode();\n while (current) {\n if (current instanceof FragmentAnchor) {\n anchors.push(current);\n }\n current = walker.nextNode();\n }\n }\n return anchors;\n};\n\nconst pendingAnchors = new Set<FragmentAnchor>();\nlet pendingAnchorObserver: MutationObserver | undefined;\n\nconst flushPendingAnchors = () => {\n if (pendingAnchors.size === 0) {\n pendingAnchorObserver?.disconnect();\n pendingAnchorObserver = undefined;\n return;\n }\n\n pendingAnchors.forEach((anchor) => anchor.mount());\n\n if (pendingAnchors.size === 0) {\n pendingAnchorObserver?.disconnect();\n pendingAnchorObserver = undefined;\n }\n};\n\nexport class FragmentAnchor extends Comment {\n readonly isKTAnchor: true = true;\n readonly type = AnchorType.Fragment;\n readonly list: Node[] = [];\n mountCallback?: () => void;\n\n constructor() {\n super('kt-fragment');\n }\n\n mount() {\n if (this.parentNode) {\n this.mountCallback?.();\n }\n }\n\n queueMount() {\n pendingAnchors.add(this);\n\n if (pendingAnchorObserver || CANNOT_OBSERVE || !document.body) {\n return;\n }\n\n pendingAnchorObserver = new MutationObserver(flushPendingAnchors);\n pendingAnchorObserver.observe(document.body, { childList: true, subtree: true });\n }\n\n unqueueMount() {\n pendingAnchors.delete(this);\n if (pendingAnchors.size === 0) {\n pendingAnchorObserver?.disconnect();\n pendingAnchorObserver = undefined;\n }\n }\n\n /**\n * Remove elements in the list\n */\n removeElements() {\n for (let i = 0; i < this.list.length; i++) {\n (this.list[i] as ChildNode).remove();\n }\n }\n}\n\nexport interface FragmentProps<T extends Node = Node> {\n /** Array of child elements, supports reactive arrays */\n children: T[] | KTReactiveLike<T[]>;\n\n /** element key function for optimization (future enhancement) */\n key?: (element: T, index: number, array: T[]) => any;\n\n /** ref to get the anchor node */\n ref?: KTRefLike<JSX.Element>;\n}\n\n/**\n * Fragment - Container component for managing arrays of child elements\n *\n * Features:\n * 1. Returns a comment anchor node, child elements are inserted after the anchor\n * 2. Supports reactive arrays, automatically updates DOM when array changes\n * 3. Basic version uses simple replacement algorithm (remove all old elements, insert all new elements)\n * 4. Future enhancement: key-based optimization\n *\n * Usage example:\n * ```tsx\n * const children = ref([<div>A</div>, <div>B</div>]);\n * const fragment = <Fragment children={children} />;\n * document.body.appendChild(fragment);\n *\n * // Automatic update\n * children.value = [<div>C</div>, <div>D</div>];\n * ```\n */\nexport function Fragment<T extends Node = Node>(props: FragmentProps<T>): JSX.Element & FragmentAnchor {\n const anchor = new FragmentAnchor();\n const elements = anchor.list as T[];\n let inserted = false;\n\n const redraw = () => {\n const newElements = childrenRef.value;\n const parent = anchor.parentNode;\n\n if (!parent) {\n elements.length = 0;\n for (let i = 0; i < newElements.length; i++) {\n elements.push(newElements[i]);\n }\n return;\n }\n\n anchor.removeElements();\n\n const fragment = document.createDocumentFragment();\n elements.length = 0;\n\n for (let i = 0; i < newElements.length; i++) {\n const element = newElements[i];\n elements.push(element);\n fragment.appendChild(element);\n }\n\n parent.insertBefore(fragment, anchor.nextSibling);\n mountFragmentAnchors(fragment); // ^ Explicitly deal with FragmentAnchors\n inserted = true;\n anchor.mountCallback = undefined;\n anchor.unqueueMount();\n };\n\n const childrenRef = toReactive(props.children).addOnChange(redraw);\n\n const renderInitial = () => {\n const current = childrenRef.value;\n elements.length = 0;\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < current.length; i++) {\n const element = current[i];\n elements.push(element);\n fragment.appendChild(element);\n }\n\n const parent = anchor.parentNode;\n if (parent && !inserted) {\n parent.insertBefore(fragment, anchor.nextSibling);\n mountFragmentAnchors(fragment); // ^ Explicitly deal with FragmentAnchors\n inserted = true;\n anchor.unqueueMount();\n }\n };\n\n renderInitial();\n\n anchor.mountCallback = () => {\n if (!inserted && anchor.parentNode) {\n redraw();\n }\n };\n\n if (!inserted) {\n anchor.queueMount();\n }\n\n $initRef(props as { ref?: KTRefLike<Node> }, anchor);\n\n return anchor as unknown as JSX.Element & FragmentAnchor;\n}\n\n/**\n * Convert KTRawContent to HTMLElement array\n */\nexport function convertChildrenToElements(children: KTRawContent): Element[] {\n const elements: Element[] = [];\n\n const processChild = (child: any): void => {\n if (child === undefined || child === null || child === false || child === true) {\n // Ignore null, undefined, false, true\n return;\n }\n\n if ($isArray(child)) {\n // Recursively process array\n $forEach(child, processChild);\n return;\n }\n\n if (typeof child === 'string' || typeof child === 'number') {\n const span = document.createElement('span');\n span.textContent = String(child);\n elements.push(span);\n return;\n }\n\n if (child instanceof Element) {\n elements.push(child);\n return;\n }\n\n if (isKT(child)) {\n processChild(child.value);\n return;\n }\n\n $warn('Fragment: unsupported child type', child);\n if (process.env.IS_DEV) {\n throw new Error(`Fragment: unsupported child type`);\n }\n };\n\n processChild(children);\n return elements;\n}\n","import type { JSXTag, MathMLTag, SVGTag } from '@ktjs/shared';\nimport type { KTAttribute, KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\n\nimport { h, mathml as _mathml, svg as _svg } from '../h/index.js';\nimport { $initRef } from '../reactable/ref.js';\nimport { isComputedLike } from '../reactable/common.js';\n\nimport { convertChildrenToElements, Fragment as FragmentArray } from './fragment.js';\nimport { jsxh, placeholder } from './common.js';\n\nfunction create(\n creator: (tag: any, props: KTAttribute, content?: KTRawContent) => JSX.Element,\n tag: any,\n props: KTAttribute,\n) {\n if (props.ref && isComputedLike(props.ref)) {\n $throw('Cannot assign a computed value to an element.');\n }\n const el = creator(tag, props, props.children);\n $initRef(props, el);\n return el;\n}\n\nexport const jsx = (tag: JSXTag, props: KTAttribute): JSX.Element => create(jsxh, tag, props);\nexport const svg = (tag: SVGTag, props: KTAttribute): JSX.Element => create(_svg, tag, props);\nexport const mathml = (tag: MathMLTag, props: KTAttribute): JSX.Element => create(_mathml, tag, props);\nexport { svg as svgRuntime, mathml as mathmlRuntime };\n\n/**\n * Fragment support - returns an array of children\n * Enhanced Fragment component that manages arrays of elements\n */\nexport function Fragment(props: { children?: KTRawContent }): JSX.Element {\n const { children } = props ?? {};\n\n if (!children) {\n return placeholder('kt-fragment-empty');\n }\n\n const elements = convertChildrenToElements(children);\n\n return FragmentArray({ children: elements });\n}\n\n/**\n * JSX Development runtime - same as jsx but with additional dev checks\n */\nexport const jsxDEV: typeof jsx = (...args) => {\n // console.log('JSX DEV called:', ...args);\n // console.log('children', (args[1] as any)?.children);\n return jsx(...args);\n};\n\n/**\n * JSX runtime for React 17+ automatic runtime\n * This is called when using jsx: \"react-jsx\" or \"react-jsxdev\"\n */\nexport const jsxs = jsx;\n\n// Export h as the classic JSX factory for backward compatibility\nexport { h, h as createElement };\n","import { $isThenable } from '@ktjs/shared';\nimport type { KTComponent, KTRawContent } from '../types/h.js';\nimport type { JSX } from '../types/jsx.js';\nimport type { KTRef } from '../reactable/ref.js';\nimport { mountFragmentAnchors } from './anchor-mount.js';\n\n/**\n * Extract component props type (excluding ref and children)\n */\ntype ExtractComponentProps<T> = T extends (props: infer P) => any ? Omit<P, 'ref' | 'children'> : {};\n\nexport function KTAsync<T extends KTComponent>(\n props: {\n ref?: KTRef<JSX.Element>;\n skeleton?: JSX.Element;\n component: T;\n children?: KTRawContent;\n } & ExtractComponentProps<T>,\n): JSX.Element {\n const raw = props.component(props);\n let comp: JSX.Element =\n props.skeleton ?? (document.createComment('ktjs-suspense-placeholder') as unknown as JSX.Element);\n\n if ($isThenable(raw)) {\n raw.then((resolved) => {\n comp.replaceWith(resolved);\n mountFragmentAnchors(resolved); // ^ Explicitly deal with FragmentAnchors\n });\n } else {\n comp = raw as JSX.Element;\n }\n\n return comp;\n}\n","import type { JSX } from '../types/jsx.js';\nimport type { KTRefLike } from '../reactable/ref.js';\nimport type { KTReactiveLike } from '../reactable/reactive.js';\n\nimport { $identity } from '@ktjs/shared';\nimport { toReactive } from '../reactable/index.js';\nimport { $initRef } from '../reactable/ref.js';\nimport { mountFragmentAnchors } from './anchor-mount.js';\n\nexport type KTForElement = JSX.Element;\n\nexport interface KTForProps<T> {\n ref?: KTRefLike<KTForElement>;\n list: T[] | KTReactiveLike<T[]>;\n key?: (item: T, index: number, array: T[]) => any;\n map?: (item: T, index: number, array: T[]) => JSX.Element;\n}\n\n// TASK 对于template标签的for和if,会编译为fragment,可特殊处理,让它们保持原样\n/**\n * KTFor - List rendering component with key-based optimization\n * Returns a Comment anchor node with rendered elements in __kt_for_list__\n */\nexport function KTFor<T>(props: KTForProps<T>): KTForElement {\n const redraw = () => {\n const newList = listRef.value;\n\n const parent = anchor.parentNode;\n if (!parent) {\n // If not in DOM yet, just rebuild the list\n const newElements: KTForElement[] = [];\n nodeMap.clear();\n for (let index = 0; index < newList.length; index++) {\n const item = newList[index];\n const itemKey = currentKey(item, index, newList);\n const node = currentMap(item, index, newList);\n nodeMap.set(itemKey, node);\n newElements.push(node);\n }\n (anchor as any).__kt_for_list__ = newElements;\n return anchor;\n }\n\n const oldLength = (anchor as any).__kt_for_list__.length;\n const newLength = newList.length;\n\n // Fast path: empty list\n if (newLength === 0) {\n nodeMap.forEach((node) => node.remove());\n nodeMap.clear();\n (anchor as any).__kt_for_list__ = [];\n return anchor;\n }\n\n // Fast path: all new items\n if (oldLength === 0) {\n const newElements: KTForElement[] = [];\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < newLength; i++) {\n const item = newList[i];\n const itemKey = currentKey(item, i, newList);\n const node = currentMap(item, i, newList);\n nodeMap.set(itemKey, node);\n newElements.push(node);\n fragment.appendChild(node);\n }\n parent.insertBefore(fragment, anchor.nextSibling);\n mountFragmentAnchors(fragment); // ^ Explicitly deal with FragmentAnchors\n (anchor as any).__kt_for_list__ = newElements;\n return anchor;\n }\n\n // Build key index map and new elements array in one pass\n const newKeyToNewIndex = new Map<any, number>();\n const newElements: KTForElement[] = new Array(newLength);\n for (let i = 0; i < newLength; i++) {\n const item = newList[i];\n const itemKey = currentKey(item, i, newList);\n newKeyToNewIndex.set(itemKey, i);\n\n if (nodeMap.has(itemKey)) {\n // Reuse existing node\n newElements[i] = nodeMap.get(itemKey)!;\n } else {\n // Create new node\n newElements[i] = currentMap(item, i, newList);\n }\n }\n\n // Remove nodes not in new list\n const toRemove: KTForElement[] = [];\n nodeMap.forEach((node, key) => {\n if (!newKeyToNewIndex.has(key)) {\n toRemove.push(node);\n }\n });\n for (let i = 0; i < toRemove.length; i++) {\n toRemove[i].remove();\n }\n\n // Reorder existing nodes and insert new nodes in a single pass.\n let currentNode = anchor.nextSibling;\n for (let i = 0; i < newLength; i++) {\n const node = newElements[i];\n if (currentNode !== node) {\n parent.insertBefore(node, currentNode);\n mountFragmentAnchors(node); // ^ Explicitly deal with FragmentAnchors\n } else {\n currentNode = currentNode.nextSibling;\n }\n }\n\n // Update maps\n nodeMap.clear();\n for (let i = 0; i < newLength; i++) {\n const itemKey = currentKey(newList[i], i, newList);\n nodeMap.set(itemKey, newElements[i]);\n }\n (anchor as any).__kt_for_list__ = newElements;\n return anchor;\n };\n\n const currentKey: NonNullable<KTForProps<T>['key']> = props.key ?? ((item: T) => item);\n const currentMap: NonNullable<KTForProps<T>['map']> =\n props.map ?? ((item: T) => $identity(item) as unknown as KTForElement);\n const listRef = toReactive(props.list).addOnChange(redraw);\n const anchor = document.createComment('kt-for') as unknown as KTForElement;\n\n // Map to track rendered nodes by key\n const nodeMap = new Map<any, KTForElement>();\n\n // Render initial list\n const elements: KTForElement[] = [];\n for (let index = 0; index < listRef.value.length; index++) {\n const item = listRef.value[index];\n const itemKey = currentKey(item, index, listRef.value);\n const node = currentMap(item, index, listRef.value);\n nodeMap.set(itemKey, node);\n elements.push(node);\n }\n\n (anchor as any).__kt_for_list__ = elements;\n\n $initRef(props, anchor);\n\n return anchor;\n}\n","import type { JSXTag } from '@ktjs/shared';\nimport type { KTAttribute } from '../types/h.js';\nimport type { KTReactiveLike } from '../reactable/reactive.js';\n\nimport { isKT } from '../reactable/index.js';\nimport { mountFragmentAnchors } from './anchor-mount.js';\nimport { jsxh, placeholder } from './common.js';\n\nexport function KTConditional(\n condition: any | KTReactiveLike<any>,\n tagIf: JSXTag,\n propsIf: KTAttribute,\n tagElse?: JSXTag,\n propsElse?: KTAttribute,\n) {\n if (!isKT(condition)) {\n return condition ? jsxh(tagIf, propsIf) : tagElse ? jsxh(tagElse, propsElse!) : placeholder('kt-conditional');\n }\n\n if (tagElse) {\n let current = condition.value ? jsxh(tagIf, propsIf) : jsxh(tagElse!, propsElse!);\n condition.addOnChange((newValue) => {\n const old = current;\n current = newValue ? jsxh(tagIf, propsIf) : jsxh(tagElse!, propsElse!);\n old.replaceWith(current);\n mountFragmentAnchors(current); // ^ Explicitly deal with FragmentAnchors\n });\n return current;\n } else {\n const dummy = placeholder('kt-conditional') as HTMLElement;\n let current = condition.value ? jsxh(tagIf, propsIf) : dummy;\n condition.addOnChange((newValue) => {\n const old = current;\n current = newValue ? jsxh(tagIf, propsIf) : dummy;\n old.replaceWith(current);\n mountFragmentAnchors(current); // ^ Explicitly deal with FragmentAnchors\n });\n return current;\n }\n}\n"],"names":["isKT","obj","kid","isReactiveLike","ktype","isRef","isSubRef","isRefLike","isComputed","isSubComputed","isComputedLike","isReactive","_getters","Map","_setters","booleanHandler","element","key","value","setAttribute","valueHandler","handlers","checked","selected","valueAsDate","valueAsNumber","defaultValue","defaultChecked","defaultSelected","disabled","readOnly","multiple","required","autofocus","open","controls","autoplay","loop","muted","defer","async","hidden","_key","defaultHandler","setElementStyle","style","cssText","applyAttr","attr","Error","classValue","class","className","undefined","addOnChange","v","html","innerHTML","o","startsWith","addEventListener","slice","handler","attrIsObject","CANNOT_MOUNT","document","Node","COMMENT_FILTER","NodeFilter","SHOW_COMMENT","mountIfFragmentAnchor","node","anchor","isKTAnchor","mount","mountFragmentAnchors","nodeType","ELEMENT_NODE","DOCUMENT_FRAGMENT_NODE","walker","createTreeWalker","current","nextNode","assureNode","$isNode","createTextNode","apdSingle","c","appendChild","newValue","_oldValue","oldNode","replaceWith","list","__kt_for_list__","$isArray","apd","$isThenable","then","r","i","length","ci","comment","createComment","awaited","applyContent","content","applyKModel","valueRef","tagName","console","type","Boolean","h","tag","createElement","svg","createElementNS","mathml","handlerId","KTReactiveLike","map","calculator","dependencies","KTReactive","_value","_changeHandlers","constructor","super","this","_newValue","warn","_emit","oldValue","forEach","has","$stringify","set","removeOnChange","delete","clearOnChange","clear","notify","get","_keys","KTSubReactive","source","_getter","paths","path","exist","cache","Function","$createSubGetter","newSourceValue","oldSourceValue","reactiveToOldValue","scheduled","markMutation","reactive","Promise","resolve","error","KTRef","$is","draft","subref","keys","KTSubRef","join","_setter","$createSubSetter","ref","assertModel","props","kmodel","$refSetter","$initRef","$emptyFn","KTComputed","_calculator","_recalculate","forced","recalculate","prototype","dep","KTSubComputed","computed","effect","effectFn","reactives","options","lazy","onCleanup","debugName","Object","active","run","err","debug","toReactive","dereactive","AnchorType","jsxh","children","placeholder","data","CANNOT_OBSERVE","MutationObserver","pendingAnchors","Set","pendingAnchorObserver","flushPendingAnchors","size","disconnect","FragmentAnchor","Comment","Fragment","mountCallback","parentNode","queueMount","add","body","observe","childList","subtree","unqueueMount","removeElements","remove","create","creator","el","jsx","_svg","_mathml","elements","processChild","child","$forEach","span","textContent","String","push","Element","convertChildrenToElements","inserted","redraw","newElements","childrenRef","parent","fragment","createDocumentFragment","insertBefore","nextSibling","renderInitial","FragmentArray","jsxDEV","args","jsxs","KTAsync","raw","component","comp","skeleton","resolved","KTFor","currentKey","item","currentMap","$identity","listRef","newList","nodeMap","index","itemKey","oldLength","newLength","newKeyToNewIndex","Array","toRemove","currentNode","KTConditional","condition","tagIf","propsIf","tagElse","propsElse","old","dummy"],"mappings":";;AAKM,SAAUA,KAAcC;IAC5B,OAA2B,mBAAbA,KAAKC;AACrB;;AACM,SAAUC,eAAwBF;IACtC,OAAyB,mBAAdA,IAAIG,gBACLH,IAAIG;AAIhB;;AAEM,SAAUC,MAAeJ;IAC7B,OAAyB,mBAAdA,IAAIG,SACG,MAATH,IAAIG;AAIf;;AAEM,SAAUE,SAAkBL;IAChC,OAAyB,mBAAdA,IAAIG,SACG,MAATH,IAAIG;AAIf;;AAEM,SAAUG,UAAmBN;IACjC,OAAyB,mBAAdA,IAAIG,gBACLH,IAAIG;AAIhB;;AAEM,SAAUI,WAAoBP;IAClC,OAAyB,mBAAdA,IAAIG,SACG,MAATH,IAAIG;AAIf;;AAEM,SAAUK,cAAuBR;IACrC,OAAyB,mBAAdA,IAAIG,SACG,OAATH,IAAIG;AAIf;;AAEM,SAAUM,eAAwBT;IACtC,OAAyB,mBAAdA,IAAIG,iBACLH,IAAIG;AAIhB;;AAEM,SAAUO,WAAoBV;IAClC,OAAyB,mBAAdA,IAAIG,iBACLH,IAAIG;AAIhB;;AAMA,MAAMQ,WAAW,IAAIC,KACfC,WAAW,IAAID,KC7EfE,iBAAiB,CAACC,SAAmDC,KAAaC;IAClFD,OAAOD,UACRA,QAAgBC,SAASC,QAE1BF,QAAQG,aAAaF,KAAKC;GAIxBE,eAAe,CAACJ,SAAmDC,KAAaC;IAChFD,OAAOD,UACRA,QAAgBC,OAAOC,QAExBF,QAAQG,aAAaF,KAAKC;GAKjBG,WAGT;IACFC,SAASP;IACTQ,UAAUR;IACVG,OAAOE;IACPI,aAAaJ;IACbK,eAAeL;IACfM,cAAcN;IACdO,gBAAgBZ;IAChBa,iBAAiBb;IACjBc,UAAUd;IACVe,UAAUf;IACVgB,UAAUhB;IACViB,UAAUjB;IACVkB,WAAWlB;IACXmB,MAAMnB;IACNoB,UAAUpB;IACVqB,UAAUrB;IACVsB,MAAMtB;IACNuB,OAAOvB;IACPwB,OAAOxB;IACPyB,OAAOzB;IACP0B,QAAQ,CAACzB,SAAS0B,MAAMxB,UAAYF,QAAwByB,WAAWvB;GCpCnEyB,iBAAiB,CAAC3B,SAAmDC,KAAaC,UACtFF,QAAQG,aAAaF,KAAKC,QAEtB0B,kBAAkB,CACtB5B,SACA6B;IAEA,IAAqB,mBAAVA,OAKX,KAAK,MAAM5B,OAAO4B,OACf7B,QAAgB6B,MAAM5B,OAAc4B,MAAM5B,WAL1CD,QAAwB6B,MAAMC,UAAUD;;;AAuFvC,SAAUE,UAAU/B,SAAmDgC;IAC3E,IAAKA,MAAL;QAGA,IAAoB,mBAATA,QAA8B,SAATA,MAG9B,MAAA,IAAAC,MAAA;SArFJ,SAAsBjC,SAAmDgC;YACvE,MAAME,aAAaF,KAAKG,SAASH,KAAKI;iBACnBC,MAAfH,eACElD,KAAakD,eACflC,QAAQG,aAAa,SAAS+B,WAAWhC;YACzCgC,WAAWI,YAAaC,KAAMvC,QAAQG,aAAa,SAASoC,OAE5DvC,QAAQG,aAAa,SAAS+B;YAIlC,MAAML,QAAQG,KAAKH;YAenB,IAdIA,UACmB,mBAAVA,QACT7B,QAAQG,aAAa,SAAS0B,SACJ,mBAAVA,UACZ7C,KAAK6C,UACPD,gBAAgB5B,SAAS6B,MAAM3B;YAC/B2B,MAAMS,YAAaC,KAA6CX,gBAAgB5B,SAASuC,OAEzFX,gBAAgB5B,SAAS6B;YAM3B,YAAYG,MAAM;gBACpB,MAAMQ,OAAOR,KAAK;gBACdhD,KAAKwD,SACPxC,QAAQyC,YAAYD,KAAKtC,OACzBsC,KAAKF,YAAaC,KAAOvC,QAAQyC,YAAYF,MAE7CvC,QAAQyC,YAAYD;AAExB;YAEA,KAAK,MAAMvC,OAAO+B,MAAM;gBAEtB,IAGU,cAAR/B,OACQ,YAARA,OACQ,YAARA,OACQ,UAARA,OACQ,YAARA,OACQ,gBAARA,OACQ,YAARA,OACQ,eAARA,OACQ,aAARA,KAEA;gBAGF,MAAMyC,IAAIV,KAAK/B;gBAGf,IAAIA,IAAI0C,WAAW,QAAQ;oBACrBD,KACF1C,QAAQ4C,iBAAiB3C,IAAI4C,MAAM,IAAIH;oBAEzC;AACF;gBAMA,MAAMI,UAAUzC,SAASJ,QAAQ0B;gBAC7B3C,KAAK0D,MACPI,QAAQ9C,SAASC,KAAKyC,EAAExC,QACxBwC,EAAEJ,YAAaC,KAAMO,QAAQ9C,SAASC,KAAKsC,OAE3CO,QAAQ9C,SAASC,KAAKyC;AAE1B;AACF,SAOIK,CAAa/C,SAASgC;AAFxB;AAMF;;ACxGA,MAAMgB,eAAmC,sBAAbC,YAA4C,sBAATC,MACzDC,iBAAuC,sBAAfC,aAA6B,MAAOA,WAAWC,cAEvEC,wBAAyBC;IAC7B,MAAMC,SAASD;KACW,MAAtBC,OAAOC,cAA+C,qBAAjBD,OAAOE,SAC9CF,OAAOE;GAIEC,uBAAwBJ;IACnC,IAAIP,kBAAkBO,gBAAgBL,OACpC;IAKF,IAFAI,sBAAsBC,OAElBA,KAAKK,aAAaV,KAAKW,gBAAgBN,KAAKK,aAAaV,KAAKY,wBAChE;IAGF,MAAMC,SAASd,SAASe,iBAAiBT,MAAMJ;IAC/C,IAAIc,UAAUF,OAAOG;IACrB,MAAOD,WACLX,sBAAsBW,UACtBA,UAAUF,OAAOG;GCzBfC,aAAczB,KAAY0B,QAAQ1B,KAAKA,IAAIO,SAASoB,eAAe3B;;AAEzE,SAAS4B,UAAUtE,SAAsEuE;IAEvF,IAAIA,cAAuC,MAANA,GAIrC,IAAIvF,KAAKuF,IAAI;QACX,IAAIhB,OAAOY,WAAWI,EAAErE;QACxBF,QAAQwE,YAAYjB,OACpBI,qBAAqBJ,OACrBgB,EAAEjC,YAAY,CAACmC,UAAUC;YACvB,MAAMC,UAAUpB;YAChBA,OAAOY,WAAWM,WAClBE,QAAQC,YAAYrB,OACpBI,qBAAqBJ;;AAEzB,WAAO;QACL,MAAMA,OAAOY,WAAWI;QACxBvE,QAAQwE,YAAYjB,OACpBI,qBAAqBJ;QAErB,MAAMsB,OAAQtB,KAAauB;QACvBC,SAASF,SACXG,IAAIhF,SAAS6E;AAEjB;AACF;;AAEA,SAASG,IAAIhF,SAAsEuE;IACjF,IAAIU,YAAYV,IACdA,EAAEW,KAAMC,KAAMH,IAAIhF,SAASmF,UACtB,IAAIJ,SAASR,IAClB,KAAK,IAAIa,IAAI,GAAGA,IAAIb,EAAEc,QAAQD,KAAK;QAEjC,MAAME,KAAKf,EAAEa;QACb,IAAIH,YAAYK,KAAK;YACnB,MAAMC,UAAUtC,SAASuC,cAAc;YACvCxF,QAAQwE,YAAYe,UACpB5B,qBAAqB4B,UACrBD,GAAGJ,KAAMO;gBACPF,QAAQX,YAAYa,UACpB9B,qBAAqB8B;;AAEzB,eACEnB,UAAUtE,SAASsF;AAEvB,WAGAhB,UAAUtE,SAASuE;AAEvB;;AAEM,SAAUmB,aAAa1F,SAAmD2F;IAC9E,IAAIZ,SAASY,UACX,KAAK,IAAIP,IAAI,GAAGA,IAAIO,QAAQN,QAAQD,KAClCJ,IAAIhF,SAAS2F,QAAQP,UAGvBJ,IAAIhF,SAAS2F;AAEjB;;AC9DM,SAAUC,YAAY5F,SAAiD6F;IAC3E,KAAKtG,UAAUsG,WACb,MAAA,IAAA5D,MAAA;IAGF,IAAwB,YAApBjC,QAAQ8F,SAcZ,OAAwB,aAApB9F,QAAQ8F,WAA4C,eAApB9F,QAAQ8F,WAC1C9F,QAAQE,QAAQ2F,SAAS3F,SAAS;IAClCF,QAAQ4C,iBAAiB,UAAU,MAAOiD,SAAS3F,QAAQF,QAAQE,aACnE2F,SAASvD,YAAamC,YAAczE,QAAQE,QAAQuE,kBAItDsB,kCAAM;IAnBiB,YAAjB/F,QAAQgG,QAAqC,eAAjBhG,QAAQgG,QACtChG,QAAQM,UAAU2F,QAAQJ,SAAS3F;IACnCF,QAAQ4C,iBAAiB,UAAU,MAAOiD,SAAS3F,QAAQF,QAAQM,UACnEuF,SAASvD,YAAamC,YAAczE,QAAQM,UAAUmE,cAEtDzE,QAAQE,QAAQ2F,SAAS3F,SAAS;IAClCF,QAAQ4C,iBAAiB,SAAS,MAAOiD,SAAS3F,QAAQF,QAAQE,QAClE2F,SAASvD,YAAamC,YAAczE,QAAQE,QAAQuE;AAa1D;;;;;;;;;;;;;;;;;;GCjBO,OAAMyB,IAAI,CACfC,KACAnE,MACA2D;IAEA,IAAmB,mBAARQ,KACT,MAAA,IAAAlE,MAAA;IAIF,MAAMjC,UAAUiD,SAASmD,cAAcD;IASvC,OARoB,mBAATnE,QAA8B,SAATA,QAAiB,aAAaA,QAC5D4D,YAAY5F,SAAgBgC,KAAK;IAInCD,UAAU/B,SAASgC,OACnB0D,aAAa1F,SAAS2F,UAEf3F;GAGIqG,QAAM,CAAmBF,KAAQnE,MAAkB2D;IAC9D,IAAmB,mBAARQ,KACT,MAAA,IAAAlE,MAAA;IAIF,MAAMjC,UAAUiD,SAASqD,gBAAgB,8BAA8BH;IAUvE,OAPApE,UAAU/B,SAASgC,OACnB0D,aAAa1F,SAAS2F,UAEF,mBAAT3D,QAA8B,SAATA,QAAiB,aAAaA,QAC5D4D,YAAY5F,SAAgBgC,KAAK;IAG5BhC;GAGIuG,WAAS,CAAsBJ,KAAQnE,MAAkB2D;IACpE,IAAmB,mBAARQ,KACT,MAAA,IAAAlE,MAAA;IAIF,MAAMjC,UAAUiD,SAASqD,gBAAgB,sCAAsCH;IAU/E,OAPApE,UAAU/B,SAASgC,OACnB0D,aAAa1F,SAAS2F,UAEF,mBAAT3D,QAA8B,SAATA,QAAiB,aAAaA,QAC5D4D,YAAY5F,SAAgBgC,KAAK;IAG5BhC;;;ACvDT,IAAId,MAAM,GACNsH,YAAY;;MAEMC;IACXvH,IAAMA;IAgBf,GAAAwH,CAAOC,YAA6BC;QAClC,OAAO;AACT;;;AAGI,MAAgBC,mBAAsBJ;IAIhCK;IAKSC,gBAAkB,IAAIlH;IAEzC,WAAAmH,CAAY9G;QACV+G,SACAC,KAAKJ,SAAS5G;AAChB;IAEA,SAAIA;QACF,OAAOgH,KAAKJ;AACd;IAEA,SAAI5G,CAAMiH;QACRpB,QAAAqB,KAAA,qBAAM;AACR;IAKU,KAAAC,CAAM5C,UAAa6C;QAE3B,OADAJ,KAAKH,gBAAgBQ,QAASzE,WAAYA,QAAQ2B,UAAU6C,YACrDJ;AACT;IAEA,WAAA5E,CAAYQ,SAA2B7C;QAErC,IADAA,QAAQuG,aACJU,KAAKH,gBAAgBS,IAAIvH,MAC3B,MAAA,IAAAgC,MAAA,kEAAsDwF,WAAWxH;QAGnE,OADAiH,KAAKH,gBAAgBW,IAAIzH,KAAK6C,UACvBoE;AACT;IAEA,cAAAS,CAAe1H;QAEb,OADAiH,KAAKH,gBAAgBa,OAAO3H,MACrBiH;AACT;IAEA,aAAAW;QAEE,OADAX,KAAKH,gBAAgBe,SACdZ;AACT;IAEA,MAAAa;QACE,OAAOb,KAAKG,MAAMH,KAAKJ,QAAQI,KAAKJ;AACtC;IAoDA,GAAAkB,IAAOC;QAEL,OAAO;AACT;;;AAGI,MAAgBC,sBAAyBzB;IACpC0B;IAKUC;IAEnB,WAAApB,CAAYmB,QAAyBE;QACnCpB,SACAC,KAAKiB,SAASA,QACdjB,KAAKkB,UPtFuB,CAACE;YAC/B,MAAMC,QAAQ3I,SAASoI,IAAIM;YAC3B,IAAIC,OACF,OAAOA;YACF;gBACL,MAAMC,QAAQ,IAAIC,SAAS,KAAK,WAAWH;gBAE3C,OADA1I,SAAS8H,IAAIY,MAAME,QACZA;AACT;UO8EiBE,CAAiBL;AAClC;IAEA,SAAInI;QAEF,OAAOgH,KAAKkB,QAAQlB,KAAKiB,OAAOrB;AAClC;IAEA,WAAAxE,CAAYQ,SAA2B7C;QAMrC,OALAiH,KAAKiB,OAAO7F,YAAY,CAACqG,gBAAgBC;YACvC,MAAMtB,WAAWJ,KAAKkB,QAAQQ,iBACxBnE,WAAWyC,KAAKkB,QAAQO;YAC9B7F,QAAQ2B,UAAU6C;WACjBrH,MACIiH;AACT;IAEA,cAAAS,CAAe1H;QAEb,OADAiH,KAAKiB,OAAOR,eAAe1H,MACpBiH;AACT;IAEA,MAAAa;QAEE,OADAb,KAAKiB,OAAOJ,UACLb;AACT;;;AC1LF,MAAM2B,qBAAqB,IAAIhJ;;AAE/B,IAAIiJ,aAAY;;AAET,MAAMC,eAAgBC;IAC3B,KAAKH,mBAAmBrB,IAAIwB,WAAW;QAKrC,IAHAH,mBAAmBnB,IAAIsB,UAAUA,SAASlC,SAGtCgC,WACF;QAGFA,aAAY,GACZG,QAAQC,UAAUhE,KAAK;YACrB4D,aAAY,GACZD,mBAAmBtB,QAAQ,CAACD,UAAU0B;gBACpC;oBAEEA,SAASjC,gBAAgBQ,QAASzE,WAAYA,QAAQkG,SAAS9I,OAAOoH;AACxE,kBAAE,OAAO6B;oBACPpD,QAAAoD,MAAA,sBAAO,gBAAgBA;AACzB;gBAEFN,mBAAmBf;;AAEvB;;;AC1BI,MAAOsB,cAAiBvC;IACnBzH,MAAK;IAEd,WAAA4H,CAAYF;QACVG,MAAMH;AACR;IAGA,SAAI5G;QACF,OAAOgH,KAAKJ;AACd;IAEA,SAAI5G,CAAMuE;QACR,IAAI4E,IAAI5E,UAAUyC,KAAKJ,SACrB;QAEF,MAAMQ,WAAWJ,KAAKJ;QACtBI,KAAKJ,SAASrC,UACdyC,KAAKG,MAAM5C,UAAU6C;AACvB;IAMA,SAAIgC;QAEF,OADAP,aAAa7B,OACNA,KAAKJ;AACd;IAEA,MAAAiB;QACE,OAAOb,KAAKG,MAAMH,KAAKJ,QAAQI,KAAKJ;AACtC;IAoDA,MAAAyC,IAAUC;QACR,IAAoB,MAAhBA,KAAKnE,QACP,MAAA,IAAApD,MAAA;QAEF,OAAO,IAAIwH,SAASvC,MAAMsC,KAAK9C,IAAKzG,OAAQ,IAAIwH,WAAWxH,SAASyJ,KAAK;AAC3E;;;AAGI,MAAOD,iBAAoBvB;IACtB9I,MAAK;IAMKuK;IAEnB,WAAA3C,CAAYmB,QAAoBE;QAC9BpB,MAAMkB,QAAQE,QACdnB,KAAKyC,UTlBuB,CAACrB;YAC/B,MAAMC,QAAQzI,SAASkI,IAAIM;YAC3B,IAAIC,OACF,OAAOA;YACF;gBACL,MAAMC,QAAQ,IAAIC,SAAS,KAAK,KAAK,IAAIH;gBAEzC,OADAxI,SAAS4H,IAAIY,MAAME,QACZA;AACT;USUiBoB,CAAiBvB;AAClC;IAEA,SAAInI;QAEF,OAAOgH,KAAKkB,QAAQlB,KAAKiB,OAAOrB;AAClC;IAEA,SAAI5G,CAAMuE;QAERyC,KAAKyC,QAAQzC,KAAKiB,OAAOrB,QAAQrC,WACjCyC,KAAKiB,OAAOJ;AACd;IAEA,SAAIuB;QAIF,OAFAP,aAAa7B,KAAKiB,SAEXjB,KAAKkB,QAAQlB,KAAKiB,OAAOrB;AAClC;IAEA,MAAAiB;QAEE,OADAb,KAAKiB,OAAOJ,UACLb;AACT;;;AAOK,MAAM2C,MAAU3J,SAAwB,IAAIkJ,MAAMlJ,QAK5C4J,cAAc,CAAUC,OAAYrJ;IAE/C,IAAI,aAAaqJ,OAAO;QACtB,MAAMC,SAASD,MAAM;QACrB,IAAIxK,UAAUyK,SACZ,OAAOA;QAEP,MAAA,IAAA/H,MAAA;AAEJ;IACA,OAAO4H,IAAInJ;GAGPuJ,aAAa,CAAIF,OAA2BxG,SAAawG,MAAMF,IAAK3J,QAAQqD,MAQrE2G,WAAW,CAAiBH,OAA+BxG;IACtE,MAAM,SAASwG,QACb,OAAOI;IAGT,MAAMhF,IAAI4E,MAAMF;IAChB,IAAItK,UAAU4F,IAEZ,OADAA,EAAEjF,QAAQqD,MACH0G;IAEP,MAAA,IAAAhI,MAAA;;;AC5KE,MAAOmI,mBAAsBvD;IACxBzH,MAAK;IAEGiL;IAET,YAAAC,CAAaC,UAAkB;QACrC,MAAM9F,WAAWyC,KAAKmD,eAChB/C,WAAWJ,KAAKJ;QAKtB,OAJKuC,IAAI/B,UAAU7C,cAAa8F,WAC9BrD,KAAKJ,SAASrC,UACdyC,KAAKG,MAAM5C,UAAU6C;QAEhBJ;AACT;IAEA,WAAAF,CAAYL,YAAqBC;QAC/BK,MAAMN,eACNO,KAAKmD,cAAc1D;QACnB,MAAM6D,cAAc,MAAMtD,KAAKoD;QAC/B,KAAK,IAAIlF,IAAI,GAAGA,IAAIwB,aAAavB,QAAQD,KACvCwB,aAAaxB,GAAG9C,YAAYkI;AAEhC;IAEA,MAAAzC;QACE,OAAOb,KAAKoD,cAAa;AAC3B;;;AAGF7D,eAAegE,UAAU/D,MAAM,SAE7BnC,GACAmG;IAEA,OAAO,IAAIN,WAAW,MAAM7F,EAAE2C,KAAKhH,QAAQwK,MAAM,EAACxD,SAASwD,QAAO,EAACxD;AACrE,GAEAL,WAAW4D,UAAUzC,MAAM,YAAqCwB;IAC9D,IAAoB,MAAhBA,KAAKnE,QACP,MAAA,IAAApD,MAAA;IAEF,OAAO,IAAI0I,cAAczD,MAAMsC,KAAK9C,IAAKzG,OAAQ,IAAIwH,WAAWxH,SAASyJ,KAAK;AAChF;;AAEM,MAAOiB,sBAAyBzC;IAC3B9I,MAAK;;;AAUT,MAAMwL,WAAW,CAAIjE,YAAqBC,iBAC/C,IAAIwD,WAAWzD,YAAYC;;SC3CbiE,OACdC,UACAC,WACAC;IAEA,OAAMC,MAAEA,QAAO,GAAKC,WAAEA,YAAYf,UAAQgB,WAAEA,YAAY,MAAOC,OAAOJ;IAGtE,IAAIK,UAAS;IAEb,MAAMC,MAAM;QACV,IAAKD,QAAL;YAKAH;YAEA;gBACEJ;AACF,cAAE,OAAOS;gBACPxF,QAAAyF,MAAA,sBAAO,iBAAiBL,WAAWI;AACrC;AATA;;IAaF,KAAK,IAAInG,IAAI,GAAGA,IAAI2F,UAAU1F,QAAQD,KAEpC2F,UAAU3F,GAAG9C,YAAYgJ,KAAKR;IAShC,OALKG,QACHK,OAIK;QACL,IAAKD,QAAL;YAGAA,UAAS;YAET,KAAK,IAAIjG,IAAI,GAAGA,IAAI2F,UAAU1F,QAAQD,KACpC2F,UAAU3F,GAAGuC,eAAemD;YAI9BI;AARA;;AAUJ;;AC3DO,MAAMO,aAAiB/I,KAC5B1D,KAAK0D,KAAKA,IAAKmH,IAAInH,IAKRgJ,aAAiBxL,SAAqClB,KAAQkB,SAASA,MAAMA,QAAQA;;ACRlG,IAAYyL;;CAAZ,SAAYA;IACVA,WAAAA,WAAA,WAAA,KAAA;AACD,CAFD,CAAYA,eAAAA,aAAU,CAAA;;AAIf,MAAMC,OAAO,CAACzF,KAAa4D,UAChB,qBAAR5D,MAAqBA,IAAI4D,SAAS7D,EAAEC,KAAK4D,OAAOA,MAAM8B,WAEnDC,cAAeC,QAA8B9I,SAASuC,cAAcuG,OCA3EC,iBAA6C,sBAArBC,oBAAwD,sBAAbhJ,UA0BnEiJ,iBAAiB,IAAIC;;AAC3B,IAAIC;;AAEJ,MAAMC,sBAAsB;IAC1B,IAA4B,MAAxBH,eAAeI,MAGjB,OAFAF,uBAAuBG,oBACvBH,6BAAwB/J;IAI1B6J,eAAe3E,QAAS/D,UAAWA,OAAOE,UAEd,MAAxBwI,eAAeI,SACjBF,uBAAuBG;IACvBH,6BAAwB/J;;;AAItB,MAAOmK,uBAAuBC;IACzBhJ,YAAmB;IACnBuC,KAAO2F,WAAWe;IAClB7H,KAAe;IACxB8H;IAEA,WAAA3F;QACEC,MAAM;AACR;IAEA,KAAAvD;QACMwD,KAAK0F,cACP1F,KAAKyF;AAET;IAEA,UAAAE;QACEX,eAAeY,IAAI5F,OAEfkF,yBAAyBJ,mBAAmB/I,SAAS8J,SAIzDX,wBAAwB,IAAIH,iBAAiBI;QAC7CD,sBAAsBY,QAAQ/J,SAAS8J,MAAM;YAAEE,YAAW;YAAMC,UAAS;;AAC3E;IAEA,YAAAC;QACEjB,eAAetE,OAAOV,OACM,MAAxBgF,eAAeI,SACjBF,uBAAuBG;QACvBH,6BAAwB/J;AAE5B;IAKA,cAAA+K;QACE,KAAK,IAAIhI,IAAI,GAAGA,IAAI8B,KAAKrC,KAAKQ,QAAQD,KACnC8B,KAAKrC,KAAKO,GAAiBiI;AAEhC;;;ACvFF,SAASC,OACPC,SACApH,KACA4D;IAEA,IAAIA,MAAMF,OAAOnK,eAAeqK,MAAMF,MACpC,MAAA,IAAA5H,MAAA;IAEF,MAAMuL,KAAKD,QAAQpH,KAAK4D,OAAOA,MAAM8B;IAErC,OADA3B,SAASH,OAAOyD,KACTA;AACT;;AAEO,MAAMC,MAAM,CAACtH,KAAa4D,UAAoCuD,OAAO1B,MAAMzF,KAAK4D,QAC1E1D,MAAM,CAACF,KAAa4D,UAAoCuD,OAAOI,OAAMvH,KAAK4D,QAC1ExD,SAAS,CAACJ,KAAgB4D,UAAoCuD,OAAOK,UAASxH,KAAK4D;;AAO1F,SAAU2C,SAAS3C;IACvB,OAAM8B,UAAEA,YAAa9B,SAAS,CAAA;IAE9B,KAAK8B,UACH,OAAOC,YAAY;IAGrB,MAAM8B,WDwKF,SAAoC/B;QACxC,MAAM+B,WAAsB,IAEtBC,eAAgBC;YACpB,IAAIA,kBAAmD,MAAVA,UAA6B,MAAVA,OAKhE,IAAI/I,SAAS+I,QAEXC,SAASD,OAAOD,oBAFlB;gBAMA,IAAqB,mBAAVC,SAAuC,mBAAVA,OAAoB;oBAC1D,MAAME,OAAO/K,SAASmD,cAAc;oBAGpC,OAFA4H,KAAKC,cAAcC,OAAOJ,aAC1BF,SAASO,KAAKH;AAEhB;gBAEA,IAAIF,iBAAiBM,SACnBR,SAASO,KAAKL,aADhB;oBAKA,KAAI9O,KAAK8O,QAOP,MAFF/H,QAAAqB,KAAA,qBAAM,oCAAoC0G;oBAElC,IAAI7L,MAAM;oBANhB4L,aAAaC,MAAM5N;AAHrB;AAZA;;QA0BF,OADA2N,aAAahC,WACN+B;AACT,KChNmBS,CAA0BxC;IAE3C,ODyFI,SAA0C9B;QAC9C,MAAMvG,SAAS,IAAIgJ,gBACboB,WAAWpK,OAAOqB;QACxB,IAAIyJ,YAAW;QAEf,MAAMC,SAAS;YACb,MAAMC,cAAcC,YAAYvO,OAC1BwO,SAASlL,OAAOoJ;YAEtB,KAAK8B,QAAQ;gBACXd,SAASvI,SAAS;gBAClB,KAAK,IAAID,IAAI,GAAGA,IAAIoJ,YAAYnJ,QAAQD,KACtCwI,SAASO,KAAKK,YAAYpJ;gBAE5B;AACF;YAEA5B,OAAO4J;YAEP,MAAMuB,WAAW1L,SAAS2L;YAC1BhB,SAASvI,SAAS;YAElB,KAAK,IAAID,IAAI,GAAGA,IAAIoJ,YAAYnJ,QAAQD,KAAK;gBAC3C,MAAMpF,UAAUwO,YAAYpJ;gBAC5BwI,SAASO,KAAKnO,UACd2O,SAASnK,YAAYxE;AACvB;YAEA0O,OAAOG,aAAaF,UAAUnL,OAAOsL,cACrCnL,qBAAqBgL;YACrBL,YAAW,GACX9K,OAAOmJ,qBAAgBtK,GACvBmB,OAAO2J;WAGHsB,cAAchD,WAAW1B,MAAM8B,UAAUvJ,YAAYiM;QAoC3D,OAlCsB;YACpB,MAAMtK,UAAUwK,YAAYvO;YAC5B0N,SAASvI,SAAS;YAElB,MAAMsJ,WAAW1L,SAAS2L;YAC1B,KAAK,IAAIxJ,IAAI,GAAGA,IAAInB,QAAQoB,QAAQD,KAAK;gBACvC,MAAMpF,UAAUiE,QAAQmB;gBACxBwI,SAASO,KAAKnO,UACd2O,SAASnK,YAAYxE;AACvB;YAEA,MAAM0O,SAASlL,OAAOoJ;YAClB8B,WAAWJ,aACbI,OAAOG,aAAaF,UAAUnL,OAAOsL,cACrCnL,qBAAqBgL;YACrBL,YAAW,GACX9K,OAAO2J;UAIX4B,IAEAvL,OAAOmJ,gBAAgB;aAChB2B,YAAY9K,OAAOoJ,cACtB2B;WAICD,YACH9K,OAAOqJ,cAGT3C,SAASH,OAAoCvG,SAEtCA;AACT,KCjKSwL,CAAc;QAAEnD,UAAU+B;;AACnC;;MAKaqB,SAAqB,IAAIC,SAG7BzB,OAAOyB,OAOHC,OAAO1B;;AC/Cd,SAAU2B,QACdrF;IAOA,MAAMsF,MAAMtF,MAAMuF,UAAUvF;IAC5B,IAAIwF,OACFxF,MAAMyF,YAAavM,SAASuC,cAAc;IAW5C,OATIP,YAAYoK,OACdA,IAAInK,KAAMuK;QACRF,KAAK3K,YAAY6K,WACjB9L,qBAAqB8L;SAGvBF,OAAOF,KAGFE;AACT;;ACVM,SAAUG,MAAS3F;IACvB,MAkGM4F,aAAgD5F,MAAM9J,OAAG,CAAM2P,QAAYA,OAC3EC,aACJ9F,MAAMrD,OAAG,CAAMkJ,QAAYE,UAAUF,QACjCG,UAAUtE,WAAW1B,MAAMlF,MAAMvC,YArGxB;QACb,MAAM0N,UAAUD,QAAQ7P,OAElBwO,SAASlL,OAAOoJ;QACtB,KAAK8B,QAAQ;YAEX,MAAMF,cAA8B;YACpCyB,QAAQnI;YACR,KAAK,IAAIoI,QAAQ,GAAGA,QAAQF,QAAQ3K,QAAQ6K,SAAS;gBACnD,MAAMN,OAAOI,QAAQE,QACfC,UAAUR,WAAWC,MAAMM,OAAOF,UAClCzM,OAAOsM,WAAWD,MAAMM,OAAOF;gBACrCC,QAAQvI,IAAIyI,SAAS5M,OACrBiL,YAAYL,KAAK5K;AACnB;YAEA,OADCC,OAAesB,kBAAkB0J,aAC3BhL;AACT;QAEA,MAAM4M,YAAa5M,OAAesB,gBAAgBO,QAC5CgL,YAAYL,QAAQ3K;QAG1B,IAAkB,MAAdgL,WAIF,OAHAJ,QAAQ1I,QAAShE,QAASA,KAAK8J,WAC/B4C,QAAQnI;QACPtE,OAAesB,kBAAkB,IAC3BtB;QAIT,IAAkB,MAAd4M,WAAiB;YACnB,MAAM5B,cAA8B,IAC9BG,WAAW1L,SAAS2L;YAC1B,KAAK,IAAIxJ,IAAI,GAAGA,IAAIiL,WAAWjL,KAAK;gBAClC,MAAMwK,OAAOI,QAAQ5K,IACf+K,UAAUR,WAAWC,MAAMxK,GAAG4K,UAC9BzM,OAAOsM,WAAWD,MAAMxK,GAAG4K;gBACjCC,QAAQvI,IAAIyI,SAAS5M,OACrBiL,YAAYL,KAAK5K,OACjBoL,SAASnK,YAAYjB;AACvB;YAIA,OAHAmL,OAAOG,aAAaF,UAAUnL,OAAOsL,cACrCnL,qBAAqBgL;YACpBnL,OAAesB,kBAAkB0J,aAC3BhL;AACT;QAGA,MAAM8M,mBAAmB,IAAIzQ,KACvB2O,cAA8B,IAAI+B,MAAMF;QAC9C,KAAK,IAAIjL,IAAI,GAAGA,IAAIiL,WAAWjL,KAAK;YAClC,MAAMwK,OAAOI,QAAQ5K,IACf+K,UAAUR,WAAWC,MAAMxK,GAAG4K;YACpCM,iBAAiB5I,IAAIyI,SAAS/K,IAE1B6K,QAAQzI,IAAI2I,WAEd3B,YAAYpJ,KAAK6K,QAAQjI,IAAImI,WAG7B3B,YAAYpJ,KAAKyK,WAAWD,MAAMxK,GAAG4K;AAEzC;QAGA,MAAMQ,WAA2B;QACjCP,QAAQ1I,QAAQ,CAAChE,MAAMtD;YAChBqQ,iBAAiB9I,IAAIvH,QACxBuQ,SAASrC,KAAK5K;;QAGlB,KAAK,IAAI6B,IAAI,GAAGA,IAAIoL,SAASnL,QAAQD,KACnCoL,SAASpL,GAAGiI;QAId,IAAIoD,cAAcjN,OAAOsL;QACzB,KAAK,IAAI1J,IAAI,GAAGA,IAAIiL,WAAWjL,KAAK;YAClC,MAAM7B,OAAOiL,YAAYpJ;YACrBqL,gBAAgBlN,QAClBmL,OAAOG,aAAatL,MAAMkN,cAC1B9M,qBAAqBJ,SAErBkN,cAAcA,YAAY3B;AAE9B;QAGAmB,QAAQnI;QACR,KAAK,IAAI1C,IAAI,GAAGA,IAAIiL,WAAWjL,KAAK;YAClC,MAAM+K,UAAUR,WAAWK,QAAQ5K,IAAIA,GAAG4K;YAC1CC,QAAQvI,IAAIyI,SAAS3B,YAAYpJ;AACnC;QAEA,OADC5B,OAAesB,kBAAkB0J,aAC3BhL;QAOHA,SAASP,SAASuC,cAAc,WAGhCyK,UAAU,IAAIpQ,KAGd+N,WAA2B;IACjC,KAAK,IAAIsC,QAAQ,GAAGA,QAAQH,QAAQ7P,MAAMmF,QAAQ6K,SAAS;QACzD,MAAMN,OAAOG,QAAQ7P,MAAMgQ,QACrBC,UAAUR,WAAWC,MAAMM,OAAOH,QAAQ7P,QAC1CqD,OAAOsM,WAAWD,MAAMM,OAAOH,QAAQ7P;QAC7C+P,QAAQvI,IAAIyI,SAAS5M,OACrBqK,SAASO,KAAK5K;AAChB;IAMA,OAJCC,OAAesB,kBAAkB8I,UAElC1D,SAASH,OAAOvG,SAETA;AACT;;AC1IM,SAAUkN,cACdC,WACAC,OACAC,SACAC,SACAC;IAEA,KAAK/R,KAAK2R,YACR,OAAOA,YAAY/E,KAAKgF,OAAOC,WAAWC,UAAUlF,KAAKkF,SAASC,aAAcjF,YAAY;IAG9F,IAAIgF,SAAS;QACX,IAAI7M,UAAU0M,UAAUzQ,QAAQ0L,KAAKgF,OAAOC,WAAWjF,KAAKkF,SAAUC;QAOtE,OANAJ,UAAUrO,YAAamC;YACrB,MAAMuM,MAAM/M;YACZA,UAAUQ,WAAWmH,KAAKgF,OAAOC,WAAWjF,KAAKkF,SAAUC,YAC3DC,IAAIpM,YAAYX;YAChBN,qBAAqBM;YAEhBA;AACT;IAAO;QACL,MAAMgN,QAAQnF,YAAY;QAC1B,IAAI7H,UAAU0M,UAAUzQ,QAAQ0L,KAAKgF,OAAOC,WAAWI;QAOvD,OANAN,UAAUrO,YAAamC;YACrB,MAAMuM,MAAM/M;YACZA,UAAUQ,WAAWmH,KAAKgF,OAAOC,WAAWI,OAC5CD,IAAIpM,YAAYX,UAChBN,qBAAqBM;YAEhBA;AACT;AACF;;"}
|
package/package.json
CHANGED