@geajs/ui 0.2.9 → 0.2.10
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/dist/bind.mjs +74 -35
- package/dist/bind.mjs.map +1 -1
- package/dist/combobox.mjs +74 -6
- package/dist/combobox.mjs.map +1 -1
- package/dist/compiled-component.mjs +11 -9
- package/dist/compiled-component.mjs.map +1 -1
- package/dist/compiled-reactive-component.mjs +129 -31
- package/dist/compiled-reactive-component.mjs.map +1 -1
- package/dist/component-id.mjs +12 -1
- package/dist/component-id.mjs.map +1 -1
- package/dist/conditional.mjs.map +1 -1
- package/dist/delegate-event.mjs +9 -9
- package/dist/delegate-event.mjs.map +1 -1
- package/dist/disposer.mjs +30 -11
- package/dist/disposer.mjs.map +1 -1
- package/dist/draggable2.mjs +135 -32
- package/dist/draggable2.mjs.map +1 -1
- package/dist/file-upload.mjs +74 -6
- package/dist/file-upload.mjs.map +1 -1
- package/dist/hover-card.mjs +2 -2
- package/dist/hover-card.mjs.map +1 -1
- package/dist/input2.mjs +2 -2
- package/dist/input2.mjs.map +1 -1
- package/dist/item-obs.mjs +11 -48
- package/dist/item-obs.mjs.map +1 -1
- package/dist/keyed-list.mjs +90 -39
- package/dist/keyed-list.mjs.map +1 -1
- package/dist/menu.mjs +7 -7
- package/dist/menu.mjs.map +1 -1
- package/dist/pin-input.mjs +6 -6
- package/dist/pin-input.mjs.map +1 -1
- package/dist/progress.mjs +2 -2
- package/dist/progress.mjs.map +1 -1
- package/dist/rating-group.mjs +8 -8
- package/dist/rating-group.mjs.map +1 -1
- package/dist/reactive-attr.mjs +2 -2
- package/dist/reactive-attr.mjs.map +1 -1
- package/dist/reactive-bool.mjs +2 -2
- package/dist/reactive-bool.mjs.map +1 -1
- package/dist/reactive-class-name.mjs +2 -2
- package/dist/reactive-class-name.mjs.map +1 -1
- package/dist/reactive-class.mjs +5 -4
- package/dist/reactive-class.mjs.map +1 -1
- package/dist/reactive-style.mjs +15 -12
- package/dist/reactive-style.mjs.map +1 -1
- package/dist/reactive-text.mjs +4 -4
- package/dist/reactive-text.mjs.map +1 -1
- package/dist/tags-input.mjs +10 -10
- package/dist/tags-input.mjs.map +1 -1
- package/dist/tooltip.mjs +3 -3
- package/dist/tooltip.mjs.map +1 -1
- package/dist/zag-component.d.mts +1 -0
- package/dist/zag-component.mjs +10 -1
- package/dist/zag-component.mjs.map +1 -1
- package/package.json +1 -1
package/dist/hover-card.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hover-card.mjs","names":["GEA_CREATE_TEMPLATE","reactiveClass","
|
|
1
|
+
{"version":3,"file":"hover-card.mjs","names":["GEA_CREATE_TEMPLATE","reactiveClass","reactiveStyleProp","reactiveAttr","reactiveTextValue","reactiveText","hoverCard","normalizeProps","ZagComponent","_tpl0_root","_tpl0_create","t","document","createElement","innerHTML","content","firstChild","HoverCard","open","createMachine","_props","machine","getMachineProps","props","id","defaultOpen","openDelay","closeDelay","positioning","onOpenChange","details","OpenChangeDetails","connectApi","service","connect","getSpreadMap","syncState","api","d","root","cloneNode","el0","el1","el2","marker3","marker4","childNodes","class","href","t3","triggerLabel","t4","children"],"sources":["../src/components/hover-card.tsx"],"sourcesContent":["import * as hoverCard from '@zag-js/hover-card'\nimport { normalizeProps } from '@zag-js/vanilla'\nimport ZagComponent from '../primitives/zag-component'\n\nexport default class HoverCard extends ZagComponent {\n declare open: boolean\n\n createMachine(_props: any): any {\n return hoverCard.machine\n }\n\n getMachineProps(props: any) {\n return {\n id: this.id,\n open: props.open,\n defaultOpen: props.defaultOpen,\n openDelay: props.openDelay,\n closeDelay: props.closeDelay,\n positioning: props.positioning,\n onOpenChange: (details: hoverCard.OpenChangeDetails) => {\n this.open = details.open\n props.onOpenChange?.(details)\n },\n }\n }\n\n connectApi(service: any) {\n return hoverCard.connect(service, normalizeProps)\n }\n\n getSpreadMap() {\n return {\n '[data-part=\"trigger\"]': 'getTriggerProps',\n '[data-part=\"positioner\"]': 'getPositionerProps',\n '[data-part=\"content\"]': 'getContentProps',\n '[data-part=\"arrow\"]': 'getArrowProps',\n '[data-part=\"arrow-tip\"]': 'getArrowTipProps',\n }\n }\n\n syncState(api: any) {\n this.open = api.open\n }\n\n template(props: any) {\n return (\n <div class={props.class || ''} style={{ display: 'inline-block' }}>\n <a data-part=\"trigger\" href={props.href || '#'} class=\"hover-card-trigger inline-block\">\n {props.triggerLabel || 'Hover me'}\n </a>\n <div data-part=\"positioner\" class=\"hover-card-positioner\">\n <div\n data-part=\"content\"\n class=\"hover-card-content z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden\"\n >\n {props.children}\n </div>\n </div>\n </div>\n )\n }\n}\n"],"mappings":";;;;;;;;;AAIA,IAAIS,aAAa;AACjB,SAASC,eAAe;CACtB,MAAMC,IAAIC,SAASC,cAAc,WAAW;AAC5CF,GAAEG,YAAY;AACd,QAAOH,EAAEI,QAAQC;;AAEnB,IAAqBC,YAArB,cAAuCT,aAAa;CAElDW,cAAcC,QAAkB;AAC9B,SAAOd,UAAUe;;CAEnBC,gBAAgBC,OAAY;AAC1B,SAAO;GACLC,IAAI,KAAKA;GACTN,MAAMK,MAAML;GACZO,aAAaF,MAAME;GACnBC,WAAWH,MAAMG;GACjBC,YAAYJ,MAAMI;GAClBC,aAAaL,MAAMK;GACnBC,eAAeC,YAAyC;AACtD,SAAKZ,OAAOY,QAAQZ;AACpBK,UAAMM,eAAeC,QAAQ;;GAEhC;;CAEHE,WAAWC,SAAc;AACvB,SAAO3B,UAAU4B,QAAQD,SAAS1B,eAAe;;CAEnD4B,eAAe;AACb,SAAO;GACL,2BAAyB;GACzB,8BAA4B;GAC5B,2BAAyB;GACzB,yBAAuB;GACvB,6BAA2B;GAC5B;;CAEHC,UAAUC,KAAU;AAClB,OAAKnB,OAAOmB,IAAInB;;CAElB,CAAClB,qBAAqBsC,GAAG;EACvB,MAAMC,QAAQ9B,eAAeA,aAAaC,cAAc,GAAG8B,UAAU,KAAK;EAC1E,MAAMC,MAAMF;EACZ,MAAMG,MAAMD;EACZ,MAAME,MAAMJ,KAAKvB;EACjB,MAAM4B,UAAUL,KAAKvB,WAAWA;EAChC,MAAM6B,UAAUN,KAAKO,WAAW,GAAG9B,WAAWA;AAC9Cf,gBAAcwC,KAAKH,GAAG,YAAY,KAAKf,MAAMwB,SAAS,GAAG;AACzD7C,oBAAkBwC,KAAKJ,GAAG,MAAM,iBAAiB,eAAe;AAChEnC,eAAawC,KAAKL,GAAG,MAAM,cAAc,KAAKf,MAAMyB,QAAQ,IAAI;AAEhE5C,oBAAkB6C,SAAIX,GAAG,YAAY,KAAKf,MAAM2B,gBAAgB,WAAW;AAE3E7C,eAAa8C,SAAIb,GAAG,YAAY,KAAKf,MAAM6B,SAAS;AACpD,SAAOb"}
|
package/dist/input2.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { t as reactiveBoolAttr } from "./reactive-bool.mjs";
|
|
|
5
5
|
import { t as reactiveClass } from "./reactive-class.mjs";
|
|
6
6
|
import { t as delegateEvent } from "./delegate-event.mjs";
|
|
7
7
|
//#region ../gea/src/runtime/reactive-value.ts
|
|
8
|
-
|
|
8
|
+
function reactiveValueRead(el, d, root, pathOrGetter) {
|
|
9
9
|
let controlled = false;
|
|
10
10
|
const apply = (v) => {
|
|
11
11
|
if (v === void 0 && !controlled) return;
|
|
@@ -14,7 +14,7 @@ const reactiveValueRead = (el, d, root, pathOrGetter) => {
|
|
|
14
14
|
if (el.value !== s) el.value = s;
|
|
15
15
|
};
|
|
16
16
|
bind(d, root, pathOrGetter, apply);
|
|
17
|
-
}
|
|
17
|
+
}
|
|
18
18
|
//#endregion
|
|
19
19
|
//#region src/components/input.tsx
|
|
20
20
|
function _tpl0_create() {
|
package/dist/input2.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input2.mjs","names":["GEA_CREATE_TEMPLATE","reactiveClass","reactiveAttr","reactiveValueRead","reactiveBoolAttr","delegateEvent","CompiledComponent","Component","cn","_tpl0_create","e","document","createElement","Input","d","root","el0","el1","el2","el3","el4","el5","el6","evt7","props","class","type","placeholder","value","disabled","name","inputId","h7","Event","onInput","__v","undefined","__s","String"],"sources":["../../gea/src/runtime/reactive-value.ts","../src/components/input.tsx"],"sourcesContent":["import type { Disposer } from './disposer'\nimport { bind } from './bind'\n\ntype InputLike = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n\nexport
|
|
1
|
+
{"version":3,"file":"input2.mjs","names":["GEA_CREATE_TEMPLATE","reactiveClass","reactiveAttr","reactiveValueRead","reactiveBoolAttr","delegateEvent","CompiledComponent","Component","cn","_tpl0_create","e","document","createElement","Input","d","root","el0","el1","el2","el3","el4","el5","el6","evt7","props","class","type","placeholder","value","disabled","name","inputId","h7","Event","onInput","__v","undefined","__s","String"],"sources":["../../gea/src/runtime/reactive-value.ts","../src/components/input.tsx"],"sourcesContent":["import type { Disposer } from './disposer'\nimport { bind } from './bind'\n\ntype InputLike = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n\nexport function reactiveValueRead(\n el: InputLike,\n d: Disposer,\n root: any,\n pathOrGetter: readonly string[] | (() => unknown),\n): void {\n let controlled = false\n const apply = (v: unknown): void => {\n if (v === undefined && !controlled) return\n controlled = true\n const s = v == null ? '' : String(v)\n if (el.value !== s) el.value = s\n }\n bind(d, root, pathOrGetter, apply)\n}\n\nexport function reactiveValue(\n el: InputLike,\n d: Disposer,\n root: any,\n pathOrGetter: readonly string[] | (() => unknown),\n writeBack?: (v: string) => void,\n): void {\n reactiveValueRead(el, d, root, pathOrGetter)\n if (writeBack) {\n const onInput = (): void => {\n writeBack(el.value)\n }\n el.addEventListener('input', onInput)\n d.add(() => el.removeEventListener('input', onInput))\n }\n}\n","import { Component } from '@geajs/core'\nimport { cn } from '../utils/cn'\n\nexport default class Input extends Component {\n template(props: any) {\n return (\n <input\n class={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n props.class,\n )}\n type={props.type || 'text'}\n placeholder={props.placeholder}\n value={props.value}\n disabled={props.disabled}\n name={props.name}\n id={props.inputId}\n input={(e: Event) => props.onInput?.(e)}\n />\n )\n }\n}\n"],"mappings":";;;;;;;AAKA,SAAgB,kBACd,IACA,GACA,MACA,cACM;CACN,IAAI,aAAa;CACjB,MAAM,SAAS,MAAqB;AAClC,MAAI,MAAM,KAAA,KAAa,CAAC,WAAY;AACpC,eAAa;EACb,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO,EAAE;AACpC,MAAI,GAAG,UAAU,EAAG,IAAG,QAAQ;;AAEjC,MAAK,GAAG,MAAM,cAAc,MAAM;;;;ACfpC,SAASS,eAAe;AAEtB,QADUE,SAASC,cAAc,QACzB;;AAEV,IAAqBC,QAArB,cAAmCP,kBAAkB;CACnD,CAACN,qBAAqBc,GAAG;EACvB,MAAMC,OAAON,cAAc;EAC3B,MAAMO,MAAMD;EACZ,MAAME,MAAMD;EACZ,MAAME,MAAMF;EACZ,MAAMG,MAAMH;EACZ,MAAMI,MAAMJ;EACZ,MAAMK,MAAML;EACZ,MAAMM,MAAMN;EACZ,MAAMO,OAAOP;AACbf,gBAAce,KAAKF,GAAG,YAAYN,GAAG,6WAA6W,KAAKgB,MAAMC,MAAM,CAAC;AACpavB,eAAae,KAAKH,GAAG,MAAM,cAAc,KAAKU,MAAME,QAAQ,OAAO;AACnExB,eAAagB,KAAKJ,GAAG,MAAM,qBAAqB,KAAKU,MAAMG,YAAY;AACvExB,oBAAkBgB,KAAKL,GAAG,YAAY,KAAKU,MAAMI,MAAM;AACvDxB,mBAAiBgB,KAAKN,GAAG,MAAM,kBAAkB,KAAKU,MAAMK,SAAS;AACrE3B,eAAamB,KAAKP,GAAG,MAAM,cAAc,KAAKU,MAAMM,KAAK;AACzD5B,eAAaoB,KAAKR,GAAG,MAAM,YAAY,KAAKU,MAAMO,QAAQ;EAC1D,MAAMC,MAAKtB,MAAK;AACd,KAAEA,MAAa,KAAKc,MAAMU,UAAUxB,EAAE,EAAEA,EAAE;GAC1C,MAAMyB,MAAM,KAAKX,MAAMI;AACvB,OAAIO,QAAQC,KAAAA,GAAW;IACrB,MAAMC,MAAMF,OAAO,OAAO,KAAKG,OAAOH,IAAI;AAC1C,QAAIZ,KAAKK,UAAUS,IACjBd,MAAKK,QAAQS;;;AAInBhC,gBAAcU,MAAM,SAAS,CAAC,CAACQ,MAAMS,GAAG,CAAC,EAAElB,EAAE;AAC7C,SAAOC"}
|
package/dist/item-obs.mjs
CHANGED
|
@@ -1,68 +1,31 @@
|
|
|
1
|
-
import { n as trackRead
|
|
1
|
+
import { n as trackRead } from "./bind.mjs";
|
|
2
2
|
//#region ../gea/src/runtime/keyed-list/item-obs.ts
|
|
3
|
-
|
|
4
|
-
* Per-item observable for keyed-list rows that have item-rooted reactive
|
|
5
|
-
* bindings NOT extractable into patchRow (e.g., destructured item params,
|
|
6
|
-
* reactive getters referencing `item` inside createItem). Each row gets
|
|
7
|
-
* one `ItemObservable` and one Proxy wrapping it so that `trackRead` picks
|
|
8
|
-
* up a dep on the current item value.
|
|
9
|
-
*
|
|
10
|
-
* Elided at the keyed-list level when `cfg.noItemProxy` is true — the
|
|
11
|
-
* compiler sets that flag when it proves createItem has no such bindings.
|
|
12
|
-
*/
|
|
3
|
+
function _TOMBSTONE() {}
|
|
13
4
|
var ItemObs = class {
|
|
14
5
|
constructor(initial) {
|
|
15
6
|
this._o = [];
|
|
16
7
|
this.current = initial;
|
|
17
8
|
}
|
|
18
9
|
observe(_path, fn) {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
o.push(fn);
|
|
10
|
+
const idx = this._o.length;
|
|
11
|
+
this._o.push(fn);
|
|
22
12
|
return () => {
|
|
23
|
-
|
|
13
|
+
this._o[idx] = _TOMBSTONE;
|
|
24
14
|
};
|
|
25
15
|
}
|
|
26
16
|
_fire() {
|
|
27
|
-
|
|
28
|
-
for (let i = 0; i < o.length; i++) {
|
|
29
|
-
const fn = o[i];
|
|
30
|
-
if (fn) fn();
|
|
31
|
-
}
|
|
17
|
+
for (let i = 0; i < this._o.length; i++) this._o[i]();
|
|
32
18
|
}
|
|
33
19
|
};
|
|
34
20
|
function createItemObservable(initial) {
|
|
35
21
|
return new ItemObs(initial);
|
|
36
22
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
trackRead(obs, "current");
|
|
42
|
-
const cur = obs.current;
|
|
43
|
-
if (cur == null) return void 0;
|
|
44
|
-
return cur[prop];
|
|
45
|
-
},
|
|
46
|
-
has(_t, prop) {
|
|
47
|
-
const cur = obs.current;
|
|
48
|
-
return cur != null && prop in Object(cur);
|
|
49
|
-
},
|
|
50
|
-
ownKeys() {
|
|
51
|
-
const cur = obs.current;
|
|
52
|
-
return cur != null ? Reflect.ownKeys(Object(cur)) : [];
|
|
53
|
-
},
|
|
54
|
-
getOwnPropertyDescriptor(_t, prop) {
|
|
55
|
-
const cur = obs.current;
|
|
56
|
-
if (cur == null) return void 0;
|
|
57
|
-
return Object.getOwnPropertyDescriptor(Object(cur), prop) ?? {
|
|
58
|
-
enumerable: true,
|
|
59
|
-
configurable: true,
|
|
60
|
-
value: cur[prop]
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
});
|
|
23
|
+
/** Read a row's current value, including primitives, while recording its dependency. */
|
|
24
|
+
function readItem(obs) {
|
|
25
|
+
trackRead(obs, "current");
|
|
26
|
+
return obs.current;
|
|
64
27
|
}
|
|
65
28
|
//#endregion
|
|
66
|
-
export {
|
|
29
|
+
export { readItem as n, createItemObservable as t };
|
|
67
30
|
|
|
68
31
|
//# sourceMappingURL=item-obs.mjs.map
|
package/dist/item-obs.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-obs.mjs","names":[],"sources":["../../gea/src/runtime/keyed-list/item-obs.ts"],"sourcesContent":["/**\n * Per-item observable for keyed-list rows that have item-rooted reactive\n * bindings NOT extractable into patchRow (e.g., destructured item params,\n * reactive getters referencing `item` inside createItem). Each row gets\n * one `ItemObservable` and one Proxy wrapping it so that `trackRead` picks\n * up a dep on the current item value.\n *\n * Elided at the keyed-list level when `cfg.noItemProxy` is true — the\n * compiler sets that flag when it proves createItem has no such bindings.\n */\nimport { GEA_PROXY_RAW } from '../../symbols'\nimport { trackRead } from '../with-tracking'\nimport type { ItemObservable } from './types'\n\n// Class-based (prototype shares observe/_fire) + tombstone-array observer\n// list. Per-row savings: no per-instance method closures (was 2 per row),\n// and O(1) unsubscribe for teardown (was Set.delete hop + hash probe per\n// binding × rows on 09_clear1k).\nclass ItemObs implements ItemObservable {\n current:
|
|
1
|
+
{"version":3,"file":"item-obs.mjs","names":[],"sources":["../../gea/src/runtime/keyed-list/item-obs.ts"],"sourcesContent":["/**\n * Per-item observable for keyed-list rows that have item-rooted reactive\n * bindings NOT extractable into patchRow (e.g., destructured item params,\n * reactive getters referencing `item` inside createItem). Each row gets\n * one `ItemObservable` and one Proxy wrapping it so that `trackRead` picks\n * up a dep on the current item value.\n *\n * Elided at the keyed-list level when `cfg.noItemProxy` is true — the\n * compiler sets that flag when it proves createItem has no such bindings.\n */\nimport { GEA_PROXY_RAW } from '../../symbols'\nimport { trackRead } from '../with-tracking'\nimport type { ItemObservable } from './types'\n\n// Class-based (prototype shares observe/_fire) + tombstone-array observer\n// list. Per-row savings: no per-instance method closures (was 2 per row),\n// and O(1) unsubscribe for teardown (was Set.delete hop + hash probe per\n// binding × rows on 09_clear1k).\n// The tombstone is a shared no-op, not `null`. A `((() => void) | null)[]`\n// field gives geatsc two incompatible vector element representations for the\n// same class field (`vector<function...>` from the pushes, `vector<null>` from\n// the tombstone write) and it aborts with \"Static representation conflict for\n// class-field ... ItemObs:_o\". One element type keeps the field exact; the\n// unsubscribe is still O(1) and a fired tombstone is a single empty call.\nfunction _TOMBSTONE(): void {\n /* unsubscribed observer */\n}\n\nclass ItemObs<T> implements ItemObservable<T> {\n current: T\n _o: Array<() => void> = []\n constructor(initial: T) {\n this.current = initial\n }\n observe(_path: string | string[], fn: () => void): () => void {\n const idx = this._o.length\n this._o.push(fn)\n return () => {\n this._o[idx] = _TOMBSTONE\n }\n }\n _fire(): void {\n for (let i = 0; i < this._o.length; i++) {\n this._o[i]()\n }\n }\n}\n\nexport function createItemObservable<T>(initial: T): ItemObservable<T> {\n return new ItemObs(initial)\n}\n\n/** Read a row's current value, including primitives, while recording its dependency. */\nexport function readItem<T>(obs: ItemObservable<T>): T {\n trackRead(obs as object, 'current')\n return obs.current\n}\n\n/**\n * A live-reading proxy standing in for `obs.current` — property reads\n * forward to whatever the CURRENT item is (not the item at proxy-creation\n * time), so it's typed as `T` itself: everywhere it's used, it's meant to\n * read exactly like the item it wraps.\n */\nexport function createItemProxy<T>(obs: ItemObservable<T>): T {\n return new Proxy(\n {},\n {\n get(_t, prop) {\n if (prop === GEA_PROXY_RAW) return obs.current\n trackRead(obs as object, 'current')\n const cur = obs.current\n if (cur == null) return undefined\n return (cur as Record<PropertyKey, unknown>)[prop]\n },\n has(_t, prop) {\n const cur = obs.current\n return cur != null && prop in Object(cur)\n },\n ownKeys() {\n const cur = obs.current\n return cur != null ? Reflect.ownKeys(Object(cur)) : []\n },\n getOwnPropertyDescriptor(_t, prop) {\n const cur = obs.current\n if (cur == null) return undefined\n return (\n Object.getOwnPropertyDescriptor(Object(cur), prop) ?? {\n enumerable: true,\n configurable: true,\n value: (cur as Record<PropertyKey, unknown>)[prop],\n }\n )\n },\n },\n ) as T\n}\n"],"mappings":";;AAwBA,SAAS,aAAmB;AAI5B,IAAM,UAAN,MAA8C;CAG5C,YAAY,SAAY;YADA,EAAE;AAExB,OAAK,UAAU;;CAEjB,QAAQ,OAA0B,IAA4B;EAC5D,MAAM,MAAM,KAAK,GAAG;AACpB,OAAK,GAAG,KAAK,GAAG;AAChB,eAAa;AACX,QAAK,GAAG,OAAO;;;CAGnB,QAAc;AACZ,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,GAAG,QAAQ,IAClC,MAAK,GAAG,IAAI;;;AAKlB,SAAgB,qBAAwB,SAA+B;AACrE,QAAO,IAAI,QAAQ,QAAQ;;;AAI7B,SAAgB,SAAY,KAA2B;AACrD,WAAU,KAAe,UAAU;AACnC,QAAO,IAAI"}
|
package/dist/keyed-list.mjs
CHANGED
|
@@ -12,7 +12,7 @@ function lis(arr) {
|
|
|
12
12
|
if (n === 0) return [];
|
|
13
13
|
const vals = [];
|
|
14
14
|
const idxs = [];
|
|
15
|
-
for (let i = 0; i < n; i++) if (arr[i]
|
|
15
|
+
for (let i = 0; i < n; i++) if (arr[i] >= 0) {
|
|
16
16
|
vals.push(arr[i]);
|
|
17
17
|
idxs.push(i);
|
|
18
18
|
}
|
|
@@ -52,9 +52,12 @@ const _toFlush = /* @__PURE__ */ new Set();
|
|
|
52
52
|
const _live = /* @__PURE__ */ new WeakMap();
|
|
53
53
|
const _claimed = /* @__PURE__ */ new WeakSet();
|
|
54
54
|
const _claimable = /* @__PURE__ */ new WeakSet();
|
|
55
|
-
let
|
|
55
|
+
let _pendingBulkMaps = [];
|
|
56
|
+
let _pendingBulkEntries = [];
|
|
56
57
|
let _flushQueued = false;
|
|
57
|
-
|
|
58
|
+
function _unwrap(v) {
|
|
59
|
+
return v && typeof v === "object" && v[GEA_PROXY_RAW] || v;
|
|
60
|
+
}
|
|
58
61
|
function _liveFor(pending) {
|
|
59
62
|
let live = _live.get(pending);
|
|
60
63
|
if (!live) {
|
|
@@ -93,9 +96,10 @@ function _schedule() {
|
|
|
93
96
|
queueMicrotask(() => {
|
|
94
97
|
_flushQueued = false;
|
|
95
98
|
const drainMaps = Array.from(_toFlush);
|
|
96
|
-
const
|
|
99
|
+
const bulkEntries = _pendingBulkEntries;
|
|
97
100
|
_toFlush.clear();
|
|
98
|
-
|
|
101
|
+
_pendingBulkMaps = [];
|
|
102
|
+
_pendingBulkEntries = [];
|
|
99
103
|
for (let i = 0; i < drainMaps.length; i++) {
|
|
100
104
|
const m = drainMaps[i];
|
|
101
105
|
for (const e of m.values()) try {
|
|
@@ -103,12 +107,9 @@ function _schedule() {
|
|
|
103
107
|
} catch {}
|
|
104
108
|
m.clear();
|
|
105
109
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
batch[j].disposer.dispose();
|
|
110
|
-
} catch {}
|
|
111
|
-
}
|
|
110
|
+
for (let i = 0; i < bulkEntries.length; i++) try {
|
|
111
|
+
bulkEntries[i].disposer.dispose();
|
|
112
|
+
} catch {}
|
|
112
113
|
});
|
|
113
114
|
}
|
|
114
115
|
function _defer(pending, e) {
|
|
@@ -133,12 +134,10 @@ function _deferBulk(pending, entries) {
|
|
|
133
134
|
next.push(e);
|
|
134
135
|
}
|
|
135
136
|
if (next.length === 0) return;
|
|
136
|
-
|
|
137
|
-
pending
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
if (_pendingBulk) _pendingBulk.push(batch);
|
|
141
|
-
else _pendingBulk = [batch];
|
|
137
|
+
for (let i = 0; i < next.length; i++) {
|
|
138
|
+
_pendingBulkMaps.push(pending);
|
|
139
|
+
_pendingBulkEntries.push(next[i]);
|
|
140
|
+
}
|
|
142
141
|
_schedule();
|
|
143
142
|
}
|
|
144
143
|
function _rescue(pending, key, item) {
|
|
@@ -147,15 +146,15 @@ function _rescue(pending, key, item) {
|
|
|
147
146
|
pending.delete(key);
|
|
148
147
|
return e;
|
|
149
148
|
}
|
|
150
|
-
if (
|
|
151
|
-
for (let i = 0; i <
|
|
152
|
-
const
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
for (let j = 0; j < items.length; j++) target.set(String(items[j].key), items[j]);
|
|
149
|
+
if (_pendingBulkMaps.length > 0) {
|
|
150
|
+
for (let i = 0; i < _pendingBulkMaps.length; i++) {
|
|
151
|
+
const target = _pendingBulkMaps[i];
|
|
152
|
+
const bulkItem = _pendingBulkEntries[i];
|
|
153
|
+
target.set(String(bulkItem.key), bulkItem);
|
|
156
154
|
_toFlush.add(target);
|
|
157
155
|
}
|
|
158
|
-
|
|
156
|
+
_pendingBulkMaps = [];
|
|
157
|
+
_pendingBulkEntries = [];
|
|
159
158
|
const r = pending.get(key);
|
|
160
159
|
if (r) {
|
|
161
160
|
pending.delete(key);
|
|
@@ -178,9 +177,19 @@ function _rescue(pending, key, item) {
|
|
|
178
177
|
//#endregion
|
|
179
178
|
//#region ../gea/src/runtime/keyed-list.ts
|
|
180
179
|
/** Unwrap a proxy value to its raw target. */
|
|
181
|
-
|
|
180
|
+
function unwrap(v) {
|
|
181
|
+
return v && typeof v === "object" && v[GEA_PROXY_RAW] || v;
|
|
182
|
+
}
|
|
182
183
|
function keyedList(cfg) {
|
|
183
|
-
const
|
|
184
|
+
const container = cfg.container;
|
|
185
|
+
const anchor = cfg.anchor;
|
|
186
|
+
const disposer = cfg.disposer;
|
|
187
|
+
const root = cfg.root;
|
|
188
|
+
const path = cfg.path;
|
|
189
|
+
const keyFn = cfg.key;
|
|
190
|
+
const createEntry = cfg.createEntry;
|
|
191
|
+
const patchEntry = cfg.patchEntry;
|
|
192
|
+
const onItemRemove = cfg.onItemRemove;
|
|
184
193
|
const pending = cfg.pending ?? /* @__PURE__ */ new Map();
|
|
185
194
|
let entries = [];
|
|
186
195
|
const byKey = /* @__PURE__ */ new Map();
|
|
@@ -236,21 +245,58 @@ function keyedList(cfg) {
|
|
|
236
245
|
container.insertBefore(frag, anchor);
|
|
237
246
|
}
|
|
238
247
|
let prevArrRef = firstArr;
|
|
248
|
+
const patchDirtyItems = (arr) => {
|
|
249
|
+
let patched = false;
|
|
250
|
+
const raw = arr[GEA_PROXY_RAW] || arr;
|
|
251
|
+
for (let i = 0; i < raw.length; i++) {
|
|
252
|
+
const item = raw[i];
|
|
253
|
+
if (item && typeof item === "object" && item[_DIRTY]) {
|
|
254
|
+
patchEntry(entries[i], item, i);
|
|
255
|
+
item[_DIRTY] = false;
|
|
256
|
+
item[_DIRTY_PROPS]?.clear();
|
|
257
|
+
entries[i].item = item;
|
|
258
|
+
patched = true;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return patched;
|
|
262
|
+
};
|
|
239
263
|
const reconcile = (arr, changes) => {
|
|
240
264
|
if (arr === prevArrRef && entries.length === arr.length) {
|
|
241
265
|
let structural = false;
|
|
242
266
|
let aipuOnly = changes && changes.length > 0;
|
|
267
|
+
let itemDirtyOnly = changes && changes.length > 0;
|
|
243
268
|
if (changes && changes.length > 0) for (let i = 0; i < changes.length; i++) {
|
|
244
269
|
const c = changes[i];
|
|
245
270
|
if (c.type === "append" || c.type === "remove" || c.type === "delete" || c.type === "reorder") {
|
|
246
271
|
structural = true;
|
|
247
272
|
aipuOnly = false;
|
|
273
|
+
itemDirtyOnly = false;
|
|
248
274
|
break;
|
|
249
275
|
}
|
|
250
|
-
if (!c.aipu)
|
|
251
|
-
|
|
276
|
+
if (!c.aipu) {
|
|
277
|
+
aipuOnly = false;
|
|
278
|
+
itemDirtyOnly = false;
|
|
279
|
+
} else {
|
|
280
|
+
structural = true;
|
|
281
|
+
if (!c.itemDirty) itemDirtyOnly = false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (itemDirtyOnly) {
|
|
285
|
+
const raw = arr[GEA_PROXY_RAW] || arr;
|
|
286
|
+
let stableKeys = true;
|
|
287
|
+
for (let i = 0; i < changes.length; i++) {
|
|
288
|
+
const idx = changes[i].arix;
|
|
289
|
+
if (idx < 0 || idx >= entries.length || entries[idx].key !== keyFn(raw[idx], idx)) {
|
|
290
|
+
stableKeys = false;
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (stableKeys) {
|
|
295
|
+
patchDirtyItems(arr);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
252
298
|
}
|
|
253
|
-
if (aipuOnly && changes.length
|
|
299
|
+
if (aipuOnly && changes.length > 1 && changes.length < 3) {
|
|
254
300
|
const a = changes[0].arix;
|
|
255
301
|
const b = changes[1].arix;
|
|
256
302
|
if (a >= 0 && b >= 0 && a < entries.length && b < entries.length && a !== b) {
|
|
@@ -273,16 +319,21 @@ function keyedList(cfg) {
|
|
|
273
319
|
}
|
|
274
320
|
}
|
|
275
321
|
if (!structural) {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
322
|
+
patchDirtyItems(arr);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (entries.length === arr.length && changes && changes.length > 0) {
|
|
327
|
+
let structural = false;
|
|
328
|
+
for (let i = 0; i < changes.length; i++) {
|
|
329
|
+
const c = changes[i];
|
|
330
|
+
if (c.type === "append" || c.type === "remove" || c.type === "delete" || c.type === "reorder" || c.aipu) {
|
|
331
|
+
structural = true;
|
|
332
|
+
break;
|
|
285
333
|
}
|
|
334
|
+
}
|
|
335
|
+
if (!structural && patchDirtyItems(arr)) {
|
|
336
|
+
prevArrRef = arr;
|
|
286
337
|
return;
|
|
287
338
|
}
|
|
288
339
|
}
|
|
@@ -323,7 +374,7 @@ function keyedList(cfg) {
|
|
|
323
374
|
totalRemoved += c.count || 0;
|
|
324
375
|
}
|
|
325
376
|
if (onlyRemoves && entries.length - arr.length === totalRemoved) {
|
|
326
|
-
if (changes.length
|
|
377
|
+
if (changes.length < 2 && changes[0].count === 1) {
|
|
327
378
|
const idx = changes[0].start;
|
|
328
379
|
if (idx >= 0 && idx < entries.length) {
|
|
329
380
|
removeEntry(entries[idx]);
|
package/dist/keyed-list.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyed-list.mjs","names":["GEA_DIRTY","GEA_DIRTY_PROPS"],"sources":["../../gea/src/runtime/keyed-list/lis.ts","../../gea/src/runtime/keyed-list/rescue.ts","../../gea/src/runtime/keyed-list.ts"],"sourcesContent":["/**\n * Longest Increasing Subsequence — O(n log n). Input is `newToOld[]`\n * (index in new array → index in old array, or `-1` for new items). Output\n * is the set of new-indices that form the longest increasing run of old\n * indices, i.e. the set of entries that can stay put during a reorder.\n */\nexport function lis(arr: number[]): number[] {\n const n = arr.length\n if (n === 0) return []\n const vals: number[] = []\n const idxs: number[] = []\n for (let i = 0; i < n; i++) {\n if (arr[i] !== -1) {\n vals.push(arr[i])\n idxs.push(i)\n }\n }\n const m = vals.length\n if (m === 0) return []\n const tails: number[] = []\n const tIdx: number[] = []\n const pred = new Array(m).fill(-1)\n for (let i = 0; i < m; i++) {\n const v = vals[i]\n let lo = 0,\n hi = tails.length\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (tails[mid] < v) lo = mid + 1\n else hi = mid\n }\n if (lo === tails.length) {\n tails.push(v)\n tIdx.push(i)\n } else {\n tails[lo] = v\n tIdx[lo] = i\n }\n if (lo > 0) pred[i] = tIdx[lo - 1]\n }\n const out = new Array(tails.length)\n let k = tIdx[tails.length - 1]\n for (let i = tails.length - 1; i >= 0; i--) {\n out[i] = idxs[k]\n k = pred[k]\n }\n return out\n}\n","/**\n * Cross-list rescue. `removeEntry` queues `disposer.dispose()` to a microtask\n * instead of firing it synchronously. If the same `.map()` site's\n * `createEntry` sees the matching key before that microtask runs, it pulls\n * the entry back out — DOM + disposer + subscriptions transfer intact.\n *\n * The `pending` map is **per-site**: the compiler emits one `Map<string, Entry>`\n * literal per `.map()` site at module scope and threads it into every\n * `_defer` / `_deferBulk` / `_rescue` call. Two unrelated `.map()` sites\n * can't collide because they literally don't share a Map.\n */\nimport type { Entry } from './types'\nimport { GEA_PROXY_RAW } from '../symbols'\n\ntype Pending = Map<string, Entry>\ntype LiveEntries = Map<string, Set<Entry>>\n\ninterface PendingBulkBatch {\n pending: Pending\n entries: Entry[]\n}\n\nconst _toFlush = new Set<Pending>()\nconst _live = new WeakMap<Pending, LiveEntries>()\nconst _claimed = new WeakSet<Entry>()\nconst _claimable = new WeakSet<Entry>()\nlet _pendingBulk: PendingBulkBatch[] | null = null\nlet _flushQueued = false\n\nconst _unwrap = (v: any): any => (v && typeof v === 'object' && v[GEA_PROXY_RAW]) || v\n\nfunction _liveFor(pending: Pending): LiveEntries {\n let live = _live.get(pending)\n if (!live) {\n live = new Map()\n _live.set(pending, live)\n }\n return live\n}\n\nexport function _trackLive(pending: Pending, e: Entry): void {\n const key = String(e.key)\n const live = _liveFor(pending)\n let bucket = live.get(key)\n if (!bucket) live.set(key, (bucket = new Set()))\n bucket.add(e)\n}\n\nfunction _untrackLive(pending: Pending, e: Entry): void {\n _claimable.delete(e)\n const bucket = _live.get(pending)?.get(String(e.key))\n if (!bucket) return\n bucket.delete(e)\n if (bucket.size === 0) _live.get(pending)?.delete(String(e.key))\n}\n\nexport function _markClaimable(e: Entry, claimable: boolean): void {\n if (claimable) _claimable.add(e)\n else _claimable.delete(e)\n}\n\nexport function _consumeClaim(e: Entry): boolean {\n if (!_claimed.has(e)) return false\n _claimed.delete(e)\n _claimable.delete(e)\n return true\n}\n\nfunction _schedule(): void {\n if (_flushQueued) return\n _flushQueued = true\n queueMicrotask(() => {\n _flushQueued = false\n const drainMaps = Array.from(_toFlush)\n const bulk = _pendingBulk\n _toFlush.clear()\n _pendingBulk = null\n for (let i = 0; i < drainMaps.length; i++) {\n const m = drainMaps[i]\n for (const e of m.values()) {\n try {\n e.disposer.dispose()\n } catch {\n /* isolated */\n }\n }\n m.clear()\n }\n if (bulk) {\n for (let i = 0; i < bulk.length; i++) {\n const batch = bulk[i].entries\n for (let j = 0; j < batch.length; j++) {\n try {\n batch[j].disposer.dispose()\n } catch {\n /* isolated */\n }\n }\n }\n }\n })\n}\n\nexport function _defer(pending: Pending, e: Entry): void {\n _untrackLive(pending, e)\n pending.set(String(e.key), e)\n _toFlush.add(pending)\n _schedule()\n}\n\n/**\n * Queue a full batch of removed entries for deferred disposal. Cheaper than\n * per-row `_defer` for whole-list ops (clear, disjoint replace): no\n * `Map.set` per row. If a `_rescue` call arrives before the microtask\n * drains, the batch is materialized into its target `pending` map first.\n */\nexport function _deferBulk(pending: Pending, entries: Entry[]): void {\n if (entries.length === 0) return\n const next: Entry[] = []\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i]\n if (_consumeClaim(e)) continue\n _untrackLive(pending, e)\n next.push(e)\n }\n if (next.length === 0) return\n const batch: PendingBulkBatch = { pending, entries: next }\n if (_pendingBulk) _pendingBulk.push(batch)\n else _pendingBulk = [batch]\n _schedule()\n}\n\nexport function _rescue(pending: Pending, key: string, item?: any): Entry | null {\n const e = pending.get(key)\n if (e) {\n pending.delete(key)\n return e\n }\n\n // Lazy fallback: materialize any pending bulk batches into their target\n // pending maps so cross-site rescue still works without paying per-row\n // Map.set on the common no-rescue-needed bulk path.\n if (_pendingBulk) {\n for (let i = 0; i < _pendingBulk.length; i++) {\n const batch = _pendingBulk[i]\n const target = batch.pending\n const items = batch.entries\n for (let j = 0; j < items.length; j++) target.set(String(items[j].key), items[j])\n _toFlush.add(target)\n }\n _pendingBulk = null\n const r = pending.get(key)\n if (r) {\n pending.delete(key)\n return r\n }\n }\n\n if (arguments.length >= 3) {\n const raw = _unwrap(item)\n const bucket = _live.get(pending)?.get(key)\n if (bucket) {\n for (const live of bucket) {\n if (_claimable.has(live) && live.item === raw) {\n _claimed.add(live)\n _claimable.delete(live)\n return live\n }\n }\n }\n }\n return null\n}\n","/**\n * keyedList — compile-time-specialized keyed list reconciler.\n *\n * This module is the **diff kernel only**. It does not know about:\n * - item proxies (`ItemObs`, `createItemProxy`)\n * - row disposers (allocated or shared no-op)\n * - compiler analysis flags (`noItemProxy`, `skipInitialPatch`, etc.)\n * - the `createItem` / `patchRow` pair\n * - owner lifecycle hooks (`registerListState`, `onItemSync`)\n *\n * All that logic is inlined by the compiler at each `.map()` site via\n * three specialized closures:\n *\n * - `createEntry(item, idx) => Entry`:\n * Full per-row work — `_rescue` lookup, disposer allocation (or\n * not), `ItemObs` construction (or not), template clone + walks +\n * bindings + stamps, initial patch writes. Opaque to the kernel.\n * - `patchEntry(e, newItem, newIdx)`:\n * Per-row identity-change work — `e.item` update, `obs.fire` (if\n * proxied), direct DOM writes on dirty bindings, dirty-bit clear.\n * - `onItemRemove?(e)` (optional):\n * User-level cleanup on removal (relational-class map delete, etc.).\n * Omit entirely for rows with no cleanup.\n *\n * Apps whose sites never need item-proxies end up with zero references\n * to `ItemObs` / `createItemProxy` through the kernel's import graph\n * → tree-shaker drops them → bundle shrinks.\n */\n\nimport type { Disposer } from './disposer'\nimport { subscribe } from './subscribe'\nimport { withTracking } from './with-tracking'\nimport type { Change } from '../store'\nimport { GEA_DIRTY, GEA_DIRTY_PROPS } from './dirty-symbols'\nimport { GEA_PROXY_RAW } from './symbols'\nimport { lis } from './keyed-list/lis'\nimport type { Entry } from './keyed-list/types'\nimport { _consumeClaim, _defer, _deferBulk, _markClaimable, _trackLive } from './keyed-list/rescue'\nimport { GEA_DOM_ITEM, GEA_DOM_KEY } from './keyed-list-symbols'\n\n/** Unwrap a proxy value to its raw target. */\nconst unwrap = (v: any): any => (v && typeof v === 'object' && v[GEA_PROXY_RAW]) || v\n\nexport { GEA_DOM_ITEM, GEA_DOM_KEY } from './keyed-list-symbols'\n\nexport type { Entry, ItemObservable } from './keyed-list/types'\n\nexport interface KeyedListConfig {\n container: Element\n anchor: Comment\n disposer: Disposer\n root: any\n /**\n * Per-site rescue queue. The compiler emits one `Map<string, Entry>` literal\n * per `.map()` site at module scope and threads it through here so two\n * unrelated sites can't collide. Optional for hand-written callers (a fresh\n * map is allocated when omitted, disabling cross-render rescue but keeping\n * the disposer microtask intact).\n */\n pending?: Map<string, Entry>\n /** Either a static path on `root` (`['items']`) OR a getter returning the array. */\n path: readonly string[] | (() => any[])\n key: (item: any, idx: number) => string\n /** Compiler-specialized: create a new entry for this item at index `idx`. */\n createEntry: (item: any, idx: number) => Entry\n /** Compiler-specialized: apply a new item identity to an existing entry. */\n patchEntry: (e: Entry, newItem: any, newIdx: number) => void\n /** Optional: user-level cleanup on row removal (relational-class map delete). */\n onItemRemove?: (e: Entry) => void\n /** Optional: gives relational-class setup access to the kernel's byKey Map. */\n onByKeyCreated?: (byKey: Map<string, Entry>) => void\n}\n\nexport function keyedList(cfg: KeyedListConfig): void {\n const { container, anchor, disposer, root, path, key: keyFn, createEntry, patchEntry, onItemRemove } = cfg\n const pending: Map<string, Entry> = cfg.pending ?? new Map()\n\n let entries: Entry[] = []\n const byKey = new Map<string, Entry>()\n if (cfg.onByKeyCreated) cfg.onByKeyCreated(byKey)\n\n const resolveArr = (): any[] => {\n if (typeof path === 'function') {\n const v = (path as () => any[])()\n return Array.isArray(v) ? v : []\n }\n let v: any = root\n for (let i = 0; i < (path as readonly string[]).length; i++) {\n if (v == null) return []\n v = v[(path as readonly string[])[i]]\n }\n return Array.isArray(v) ? v : []\n }\n\n const removeEntry = (e: Entry): void => {\n if (onItemRemove) onItemRemove(e)\n byKey.delete(e.key)\n if (_consumeClaim(e)) return\n if (e.element.parentNode) e.element.parentNode.removeChild(e.element)\n _defer(pending, e)\n }\n\n const markEntriesLeaving = (next: any[]): void => {\n if (entries.length === 0) return\n const nextByKey = new Map<string, Set<any>>()\n for (let i = 0; i < next.length; i++) {\n const k = keyFn(next[i], i)\n let bucket = nextByKey.get(k)\n if (!bucket) nextByKey.set(k, (bucket = new Set()))\n bucket.add(unwrap(next[i]))\n }\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i]\n _markClaimable(e, !nextByKey.get(e.key)?.has(e.item))\n }\n }\n\n // ── First render ──────────────────────────────────────────────────────\n const firstArr = resolveArr()\n if (firstArr.length > 0) {\n const frag = container.ownerDocument!.createDocumentFragment()\n for (let i = 0; i < firstArr.length; i++) {\n const item = firstArr[i]\n const e = createEntry(item, i)\n entries.push(e)\n byKey.set(e.key, e)\n _trackLive(pending, e)\n frag.appendChild(e.element)\n if (item && typeof item === 'object') {\n ;(item as any)[GEA_DIRTY] = false\n ;(item as any)[GEA_DIRTY_PROPS]?.clear()\n }\n }\n container.insertBefore(frag, anchor)\n }\n\n let prevArrRef: any = firstArr\n\n // ── Reconciliation ────────────────────────────────────────────────────\n const reconcile = (arr: any[], changes?: Change[]): void => {\n // Same array ref + same length → structural no-op. Dirty-bit scan\n // picks up in-place item writes.\n if (arr === prevArrRef && entries.length === arr.length) {\n let structural = false\n let aipuOnly = changes && changes.length > 0\n if (changes && changes.length > 0) {\n for (let i = 0; i < changes.length; i++) {\n const c = changes[i]\n if (c.type === 'append' || c.type === 'remove' || c.type === 'delete' || c.type === 'reorder') {\n structural = true\n aipuOnly = false\n break\n }\n if (!c.aipu) aipuOnly = false\n else structural = true\n }\n }\n // aipu-only 2-swap: items[i]↔items[j] via two symmetric aipu records.\n if (aipuOnly && changes!.length === 2) {\n const a = changes![0].arix as number\n const b = changes![1].arix as number\n if (a >= 0 && b >= 0 && a < entries.length && b < entries.length && a !== b) {\n const eA = entries[a]\n const eB = entries[b]\n const newAKey = keyFn(arr[a], a)\n const newBKey = keyFn(arr[b], b)\n if (eA.key === newBKey && eB.key === newAKey) {\n const refB = eB.element.nextSibling\n container.insertBefore(eB.element, eA.element)\n if (refB) container.insertBefore(eA.element, refB)\n else container.appendChild(eA.element)\n entries[a] = eB\n entries[b] = eA\n if (unwrap(arr[a]) !== eB.item) patchEntry(eB, arr[a], a)\n if (unwrap(arr[b]) !== eA.item) patchEntry(eA, arr[b], b)\n prevArrRef = arr\n return\n }\n }\n }\n if (!structural) {\n // Dirty-aware patch pass. Same array ref + no structural change →\n // in-place item mutations (e.g. `store.items[i].label = 'X'`) only.\n // The store's nested-proxy set trap stamped `item[GEA_DIRTY]=true`;\n // walk the raw array and patch marked items. Runtime owns the\n // dirty-bit protocol — compiler-emitted patchEntry doesn't see it.\n const raw = (arr as any)[GEA_PROXY_RAW] || arr\n for (let i = 0; i < raw.length; i++) {\n const item = raw[i]\n if (item && typeof item === 'object' && item[GEA_DIRTY]) {\n patchEntry(entries[i], item, i)\n item[GEA_DIRTY] = false\n item[GEA_DIRTY_PROPS]?.clear()\n entries[i].item = item\n }\n }\n return\n }\n }\n\n // Append-only.\n if (changes && changes.length > 0 && entries.length < arr.length) {\n let onlyAppends = true\n let appendCount = 0\n for (let i = 0; i < changes.length; i++) {\n if (changes[i].type !== 'append') {\n onlyAppends = false\n break\n }\n appendCount += (changes[i].count as number) || 0\n }\n if (onlyAppends && appendCount === arr.length - entries.length) {\n const startIdx = entries.length\n const frag = container.ownerDocument!.createDocumentFragment()\n for (let i = startIdx; i < arr.length; i++) {\n const e = createEntry(arr[i], i)\n entries.push(e)\n byKey.set(e.key, e)\n _trackLive(pending, e)\n frag.appendChild(e.element)\n }\n container.insertBefore(frag, anchor)\n prevArrRef = arr\n return\n }\n }\n\n // Remove-only.\n if (changes && changes.length > 0 && entries.length > arr.length) {\n let onlyRemoves = true\n let totalRemoved = 0\n for (let i = 0; i < changes.length; i++) {\n const c = changes[i]\n if (c.type !== 'remove') {\n onlyRemoves = false\n break\n }\n totalRemoved += (c.count as number) || 0\n }\n if (onlyRemoves && entries.length - arr.length === totalRemoved) {\n if (changes.length === 1 && (changes[0].count as number) === 1) {\n const idx = changes[0].start as number\n if (idx >= 0 && idx < entries.length) {\n removeEntry(entries[idx])\n entries.splice(idx, 1)\n }\n prevArrRef = arr\n return\n }\n const rmIdx: number[] = []\n for (const c of changes) {\n const s = c.start as number\n const ct = c.count as number\n for (let k = 0; k < ct; k++) rmIdx.push(s + k)\n }\n rmIdx.sort((a, b) => b - a)\n for (let i = 0; i < rmIdx.length; i++) {\n const j = rmIdx[i]\n if (j >= 0 && j < entries.length) {\n removeEntry(entries[j])\n entries.splice(j, 1)\n }\n }\n prevArrRef = arr\n return\n }\n }\n\n // ── General keyed reconciliation ─────────────────────────────────\n const newLen = arr.length\n const oldLen = entries.length\n\n // Fresh-create fast path (09_clear1k_x8 per-cycle).\n if (oldLen === 0 && newLen > 0) {\n const freshEntries: Entry[] = new Array(newLen)\n const frag = container.ownerDocument!.createDocumentFragment()\n for (let i = 0; i < newLen; i++) {\n const e = createEntry(arr[i], i)\n freshEntries[i] = e\n byKey.set(e.key, e)\n _trackLive(pending, e)\n frag.appendChild(e.element)\n }\n container.insertBefore(frag, anchor)\n entries = freshEntries\n prevArrRef = arr\n return\n }\n\n const newKeys: string[] = new Array(newLen)\n for (let i = 0; i < newLen; i++) newKeys[i] = keyFn(arr[i], i)\n\n if (newLen === 0) {\n // Bulk clear.\n if (container.childNodes.length === oldLen + 1) {\n if (onItemRemove) {\n for (let i = 0; i < oldLen; i++) onItemRemove(entries[i])\n _deferBulk(pending, entries)\n } else {\n _deferBulk(pending, entries)\n }\n container.textContent = ''\n container.appendChild(anchor)\n } else {\n for (let i = oldLen - 1; i >= 0; i--) removeEntry(entries[i])\n }\n entries = []\n byKey.clear()\n prevArrRef = arr\n return\n }\n\n // Swap fast path (05_swap).\n if (newLen === oldLen) {\n let diffA = -1,\n diffB = -1,\n diffCount = 0\n for (let i = 0; i < newLen; i++) {\n if (entries[i].key !== newKeys[i]) {\n if (diffCount === 0) diffA = i\n else if (diffCount === 1) diffB = i\n diffCount++\n if (diffCount > 2) break\n }\n }\n if (diffCount === 2 && entries[diffA].key === newKeys[diffB] && entries[diffB].key === newKeys[diffA]) {\n const eA = entries[diffA],\n eB = entries[diffB]\n const refB = eB.element.nextSibling\n container.insertBefore(eB.element, eA.element)\n if (refB) container.insertBefore(eA.element, refB)\n else container.appendChild(eA.element)\n entries[diffA] = eB\n entries[diffB] = eA\n if (unwrap(arr[diffA]) !== eB.item) patchEntry(eB, arr[diffA], diffA)\n if (unwrap(arr[diffB]) !== eA.item) patchEntry(eA, arr[diffB], diffB)\n prevArrRef = arr\n return\n }\n }\n\n // Disjoint-replace (02_replace1k).\n if (oldLen > 0 && newLen > 0 && container.childNodes.length === oldLen + 1) {\n let disjoint = true\n for (let i = 0; i < newLen; i++) {\n if (byKey.has(newKeys[i])) {\n disjoint = false\n break\n }\n }\n if (disjoint) {\n if (onItemRemove) {\n for (let i = 0; i < oldLen; i++) onItemRemove(entries[i])\n _deferBulk(pending, entries)\n } else {\n _deferBulk(pending, entries)\n }\n byKey.clear()\n const newEntries: Entry[] = new Array(newLen)\n const newEls: Node[] = new Array(newLen + 1)\n for (let i = 0; i < newLen; i++) {\n const e = createEntry(arr[i], i)\n newEntries[i] = e\n newEls[i] = e.element\n byKey.set(e.key, e)\n _trackLive(pending, e)\n }\n newEls[newLen] = anchor\n ;(container as any).replaceChildren(...newEls)\n entries = newEntries\n prevArrRef = arr\n return\n }\n }\n\n // General LIS reconcile.\n for (let i = 0; i < oldLen; i++) (entries[i] as any)._i = i\n const newToOld = new Array(newLen)\n const seenOld = new Array(oldLen).fill(false)\n for (let i = 0; i < newLen; i++) {\n const existing = byKey.get(newKeys[i])\n if (existing) {\n const oldIdx = (existing as any)._i as number\n newToOld[i] = oldIdx\n seenOld[oldIdx] = true\n } else {\n newToOld[i] = -1\n }\n }\n\n for (let i = oldLen - 1; i >= 0; i--) {\n if (!seenOld[i]) removeEntry(entries[i])\n }\n\n const stable = new Set(lis(newToOld))\n\n const next: Entry[] = new Array(newLen)\n let nextRef: Node = anchor\n for (let i = newLen - 1; i >= 0; i--) {\n const oldIdx = newToOld[i]\n let e: Entry\n if (oldIdx === -1) {\n e = createEntry(arr[i], i)\n byKey.set(e.key, e)\n _trackLive(pending, e)\n container.insertBefore(e.element, nextRef)\n } else {\n e = entries[oldIdx]\n if (e.item !== unwrap(arr[i])) patchEntry(e, arr[i], i)\n if (e.element.parentNode !== container) container.insertBefore(e.element, nextRef)\n else if (!stable.has(i)) container.insertBefore(e.element, nextRef)\n }\n next[i] = e\n nextRef = e.element\n }\n\n entries = next\n prevArrRef = arr\n }\n\n // ── Subscribe for array updates ──────────────────────────────────────\n if (typeof path === 'function') {\n withTracking(disposer, root, () => {\n const arr = (path as () => any[])()\n const next = Array.isArray(arr) ? arr : []\n markEntriesLeaving(next)\n queueMicrotask(() => reconcile(next))\n })\n } else {\n const off = subscribe(root, path as readonly string[], (_v: any, changes?: Change[]) => {\n reconcile(resolveArr(), changes)\n })\n disposer.add(off)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"keyed-list.mjs","names":["GEA_DIRTY","GEA_DIRTY_PROPS"],"sources":["../../gea/src/runtime/keyed-list/lis.ts","../../gea/src/runtime/keyed-list/rescue.ts","../../gea/src/runtime/keyed-list.ts"],"sourcesContent":["/**\n * Longest Increasing Subsequence — O(n log n). Input is `newToOld[]`\n * (index in new array → index in old array, or `-1` for new items). Output\n * is the set of new-indices that form the longest increasing run of old\n * indices, i.e. the set of entries that can stay put during a reorder.\n */\nexport function lis(arr: number[]): number[] {\n const n = arr.length\n if (n === 0) return []\n const vals: number[] = []\n const idxs: number[] = []\n for (let i = 0; i < n; i++) {\n if (arr[i] >= 0) {\n vals.push(arr[i])\n idxs.push(i)\n }\n }\n const m = vals.length\n if (m === 0) return []\n const tails: number[] = []\n const tIdx: number[] = []\n const pred = new Array(m).fill(-1)\n for (let i = 0; i < m; i++) {\n const v = vals[i]\n let lo = 0,\n hi = tails.length\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (tails[mid] < v) lo = mid + 1\n else hi = mid\n }\n if (lo === tails.length) {\n tails.push(v)\n tIdx.push(i)\n } else {\n tails[lo] = v\n tIdx[lo] = i\n }\n if (lo > 0) pred[i] = tIdx[lo - 1]\n }\n const out = new Array(tails.length)\n let k = tIdx[tails.length - 1]\n for (let i = tails.length - 1; i >= 0; i--) {\n out[i] = idxs[k]\n k = pred[k]\n }\n return out\n}\n","/**\n * Cross-list rescue. `removeEntry` queues `disposer.dispose()` to a microtask\n * instead of firing it synchronously. If the same `.map()` site's\n * `createEntry` sees the matching key before that microtask runs, it pulls\n * the entry back out — DOM + disposer + subscriptions transfer intact.\n *\n * The `pending` map is **per-site**: the compiler emits one `Map<string, Entry<T>>`\n * literal per `.map()` site at module scope and threads it into every\n * `_defer` / `_deferBulk` / `_rescue` call. Two unrelated `.map()` sites\n * can't collide because they literally don't share a Map.\n */\nimport type { Entry } from './types'\nimport { GEA_PROXY_RAW } from '../symbols'\n\ntype Pending<T> = Map<string, Entry<T>>\ntype LiveEntries<T> = Map<string, Set<Entry<T>>>\n\n// Two parallel FLAT arrays instead of a `{ pending, entries }[]`. A record field\n// typed as a `Map` has no geatsc Representation (\"representation-plan coverage\n// gap for record field __gea_type_PendingBulkBatch.pending\"), and an `Entry[][]`\n// of per-batch lists has no frozen record shape either (\"missing-record-shape\n// [__gea_type_Entry] ... Entry[][]\"). One entry per index, with its target map\n// repeated alongside, keeps both vectors flat and exact.\n//\n// This module-level state is shared across EVERY `.map()` site in the app at\n// once, each with its own item type — no single `T` describes it (TypeScript\n// has no existential/wildcard generics for a registry instantiated\n// differently by each caller). So the registries below are declared once\n// against the erased `Pending<unknown>`/`Entry<unknown>`, and every EXPORTED\n// function is what actually carries each call's real `T` — the standard\n// type-erasure-at-the-registry-boundary shape for a shared heterogeneous\n// cache (the same idea as a global cache keyed by branded IDs across many\n// unrelated generic instantiations). `Entry<T>` is structurally covariant in\n// `T` here (a widening store, never narrowed back out except through the\n// exact `Pending<T>` the caller already holds), so storing/retrieving\n// through the erased type doesn't lose safety at the real, generic call\n// sites below — only this module-private cache itself is untyped in `T`.\nconst _toFlush: Set<Pending<unknown>> = new Set()\nconst _live: WeakMap<Pending<unknown>, LiveEntries<unknown>> = new WeakMap()\nconst _claimed: WeakSet<Entry<unknown>> = new WeakSet()\nconst _claimable: WeakSet<Entry<unknown>> = new WeakSet()\nlet _pendingBulkMaps: Pending<unknown>[] = []\nlet _pendingBulkEntries: Entry<unknown>[] = []\nlet _flushQueued = false\n\n// A top-level FUNCTION DECLARATION, not a `const` holding an arrow: an\n// unannotated module-scope callable const has no sealed binding subject\n// under geatsc (`representation-plan coverage gap for\n// VariableDeclaration`) because its `any -> any` signature admits no exact\n// ABI. A function declaration is its own emitted callable and needs no\n// value carrier. Body is unchanged.\nfunction _unwrap<V>(v: V): V {\n const rawTarget = v && typeof v === 'object' && (v as Record<symbol, unknown>)[GEA_PROXY_RAW]\n return (rawTarget as V) || v\n}\n\nfunction _liveFor(pending: Pending<unknown>): LiveEntries<unknown> {\n let live = _live.get(pending)\n if (!live) {\n live = new Map()\n _live.set(pending, live)\n }\n return live\n}\n\nexport function _trackLive<T>(pending: Pending<T>, e: Entry<T>): void {\n const key = String(e.key)\n const live = _liveFor(pending as Pending<unknown>)\n let bucket = live.get(key)\n if (!bucket) live.set(key, (bucket = new Set()))\n bucket.add(e as Entry<unknown>)\n}\n\nfunction _untrackLive<T>(pending: Pending<T>, e: Entry<T>): void {\n _claimable.delete(e as Entry<unknown>)\n const bucket = _live.get(pending as Pending<unknown>)?.get(String(e.key))\n if (!bucket) return\n bucket.delete(e as Entry<unknown>)\n if (bucket.size === 0) _live.get(pending as Pending<unknown>)?.delete(String(e.key))\n}\n\nexport function _markClaimable<T>(e: Entry<T>, claimable: boolean): void {\n if (claimable) _claimable.add(e as Entry<unknown>)\n else _claimable.delete(e as Entry<unknown>)\n}\n\nexport function _consumeClaim<T>(e: Entry<T>): boolean {\n if (!_claimed.has(e as Entry<unknown>)) return false\n _claimed.delete(e as Entry<unknown>)\n _claimable.delete(e as Entry<unknown>)\n return true\n}\n\nfunction _schedule(): void {\n if (_flushQueued) return\n _flushQueued = true\n queueMicrotask(() => {\n _flushQueued = false\n const drainMaps = Array.from(_toFlush)\n const bulkEntries = _pendingBulkEntries\n _toFlush.clear()\n _pendingBulkMaps = []\n _pendingBulkEntries = []\n for (let i = 0; i < drainMaps.length; i++) {\n const m = drainMaps[i]\n for (const e of m.values()) {\n try {\n e.disposer.dispose()\n } catch {\n /* isolated */\n }\n }\n m.clear()\n }\n for (let i = 0; i < bulkEntries.length; i++) {\n try {\n bulkEntries[i].disposer.dispose()\n } catch {\n /* isolated */\n }\n }\n })\n}\n\nexport function _defer<T>(pending: Pending<T>, e: Entry<T>): void {\n _untrackLive(pending, e)\n pending.set(String(e.key), e)\n _toFlush.add(pending as Pending<unknown>)\n _schedule()\n}\n\n/**\n * Queue a full batch of removed entries for deferred disposal. Cheaper than\n * per-row `_defer` for whole-list ops (clear, disjoint replace): no\n * `Map.set` per row. If a `_rescue` call arrives before the microtask\n * drains, the batch is materialized into its target `pending` map first.\n */\nexport function _deferBulk<T>(pending: Pending<T>, entries: Entry<T>[]): void {\n if (entries.length === 0) return\n const next: Entry<T>[] = []\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i]\n if (_consumeClaim(e)) continue\n _untrackLive(pending, e)\n next.push(e)\n }\n if (next.length === 0) return\n for (let i = 0; i < next.length; i++) {\n _pendingBulkMaps.push(pending as Pending<unknown>)\n _pendingBulkEntries.push(next[i] as Entry<unknown>)\n }\n _schedule()\n}\n\nexport function _rescue<T>(pending: Pending<T>, key: string, item?: T): Entry<T> | null {\n const e = pending.get(key)\n if (e) {\n pending.delete(key)\n return e\n }\n\n // Lazy fallback: materialize any pending bulk batches into their target\n // pending maps so cross-site rescue still works without paying per-row\n // Map.set on the common no-rescue-needed bulk path.\n if (_pendingBulkMaps.length > 0) {\n for (let i = 0; i < _pendingBulkMaps.length; i++) {\n const target = _pendingBulkMaps[i]\n const bulkItem = _pendingBulkEntries[i]\n target.set(String(bulkItem.key), bulkItem)\n _toFlush.add(target)\n }\n _pendingBulkMaps = []\n _pendingBulkEntries = []\n const r = pending.get(key)\n if (r) {\n pending.delete(key)\n return r\n }\n }\n\n if (arguments.length >= 3) {\n const raw = _unwrap(item)\n const bucket = _live.get(pending as Pending<unknown>)?.get(key)\n if (bucket) {\n for (const live of bucket) {\n if (_claimable.has(live) && live.item === raw) {\n _claimed.add(live)\n _claimable.delete(live)\n return live as Entry<T>\n }\n }\n }\n }\n return null\n}\n","/**\n * keyedList — compile-time-specialized keyed list reconciler.\n *\n * This module is the **diff kernel only**. It does not know about:\n * - item proxies (`ItemObs`, `createItemProxy`)\n * - row disposers (allocated or shared no-op)\n * - compiler analysis flags (`noItemProxy`, `skipInitialPatch`, etc.)\n * - the `createItem` / `patchRow` pair\n * - owner lifecycle hooks (`registerListState`, `onItemSync`)\n *\n * All that logic is inlined by the compiler at each `.map()` site via\n * three specialized closures:\n *\n * - `createEntry(item, idx) => Entry`:\n * Full per-row work — `_rescue` lookup, disposer allocation (or\n * not), `ItemObs` construction (or not), template clone + walks +\n * bindings + stamps, initial patch writes. Opaque to the kernel.\n * - `patchEntry(e, newItem, newIdx)`:\n * Per-row identity-change work — `e.item` update, `obs.fire` (if\n * proxied), direct DOM writes on dirty bindings, dirty-bit clear.\n * - `onItemRemove?(e)` (optional):\n * User-level cleanup on removal (relational-class map delete, etc.).\n * Omit entirely for rows with no cleanup.\n *\n * Apps whose sites never need item-proxies end up with zero references\n * to `ItemObs` / `createItemProxy` through the kernel's import graph\n * → tree-shaker drops them → bundle shrinks.\n */\n\nimport type { Disposer } from './disposer'\nimport { subscribe } from './subscribe'\nimport { withTracking } from './with-tracking'\nimport type { Change } from '../store'\nimport { GEA_DIRTY, GEA_DIRTY_PROPS } from './dirty-symbols'\nimport { GEA_PROXY_RAW } from './symbols'\nimport { lis } from './keyed-list/lis'\nimport type { Entry } from './keyed-list/types'\nimport { _consumeClaim, _defer, _deferBulk, _markClaimable, _trackLive } from './keyed-list/rescue'\nimport { GEA_DOM_ITEM, GEA_DOM_KEY } from './keyed-list-symbols'\n\n/** Unwrap a proxy value to its raw target. */\n// A top-level FUNCTION DECLARATION, not a `const` holding an arrow: an\n// unannotated module-scope callable const has no sealed binding subject\n// under geatsc (`representation-plan coverage gap for\n// VariableDeclaration`) because its `any -> any` signature admits no exact\n// ABI. A function declaration is its own emitted callable and needs no\n// value carrier. Body is unchanged.\nfunction unwrap<V>(v: V): V {\n const rawTarget = v && typeof v === 'object' && (v as Record<symbol, unknown>)[GEA_PROXY_RAW]\n return (rawTarget as V) || v\n}\n\nexport { GEA_DOM_ITEM, GEA_DOM_KEY } from './keyed-list-symbols'\n\nexport type { Entry, ItemObservable } from './keyed-list/types'\n\n/**\n * `T` is the list item's type — knowable at each `.map()` call site (the\n * compiler emits one `keyedList()` invocation per site, closed over the\n * source array's real element type). `root` stays a structural `any`: it's\n * whatever object `path`/getter reads through (a component instance, a\n * nested store, ...), and — unlike the item — resolving it further would\n * need the same path-typed machinery `subscribe()` documents as a genuine\n * dynamic boundary.\n */\nexport interface KeyedListConfig<T> {\n container: Element\n anchor: Comment\n disposer: Disposer\n root: any\n /**\n * Per-site rescue queue. The compiler emits one `Map<string, Entry<T>>`\n * literal per `.map()` site at module scope and threads it through here so\n * two unrelated sites can't collide. Optional for hand-written callers (a\n * fresh map is allocated when omitted, disabling cross-render rescue but\n * keeping the disposer microtask intact).\n */\n pending?: Map<string, Entry<T>>\n /** Either a static path on `root` (`['items']`) OR a getter returning the array. */\n path: readonly string[] | (() => T[])\n key: (item: T, idx: number) => string\n /** Compiler-specialized: create a new entry for this item at index `idx`. */\n createEntry: (item: T, idx: number) => Entry<T>\n /** Compiler-specialized: apply a new item identity to an existing entry. */\n patchEntry: (e: Entry<T>, newItem: T, newIdx: number) => void\n /** Optional: user-level cleanup on row removal (relational-class map delete). */\n onItemRemove?: (e: Entry<T>) => void\n /** Optional: gives relational-class setup access to the kernel's byKey Map. */\n onByKeyCreated?: (byKey: Map<string, Entry<T>>) => void\n}\n\nexport function keyedList<T>(cfg: KeyedListConfig<T>): void {\n const container = cfg.container\n const anchor = cfg.anchor\n const disposer = cfg.disposer\n const root = cfg.root\n const path = cfg.path\n const keyFn = cfg.key\n const createEntry = cfg.createEntry\n const patchEntry = cfg.patchEntry\n const onItemRemove = cfg.onItemRemove\n const pending: Map<string, Entry<T>> = cfg.pending ?? new Map()\n\n let entries: Entry<T>[] = []\n const byKey = new Map<string, Entry<T>>()\n if (cfg.onByKeyCreated) cfg.onByKeyCreated(byKey)\n\n const resolveArr = (): T[] => {\n if (typeof path === 'function') {\n const v = (path as () => T[])()\n return Array.isArray(v) ? v : []\n }\n let v: any = root\n for (let i = 0; i < (path as readonly string[]).length; i++) {\n if (v == null) return []\n v = v[(path as readonly string[])[i]]\n }\n return Array.isArray(v) ? v : []\n }\n\n const removeEntry = (e: Entry<T>): void => {\n if (onItemRemove) onItemRemove(e)\n byKey.delete(e.key)\n if (_consumeClaim(e)) return\n if (e.element.parentNode) e.element.parentNode.removeChild(e.element)\n _defer(pending, e)\n }\n\n const markEntriesLeaving = (next: T[]): void => {\n if (entries.length === 0) return\n const nextByKey = new Map<string, Set<T>>()\n for (let i = 0; i < next.length; i++) {\n const k = keyFn(next[i], i)\n let bucket = nextByKey.get(k)\n if (!bucket) nextByKey.set(k, (bucket = new Set()))\n bucket.add(unwrap(next[i]))\n }\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i]\n _markClaimable(e, !nextByKey.get(e.key)?.has(e.item))\n }\n }\n\n // ── First render ──────────────────────────────────────────────────────\n const firstArr = resolveArr()\n if (firstArr.length > 0) {\n const frag = container.ownerDocument!.createDocumentFragment()\n for (let i = 0; i < firstArr.length; i++) {\n const item = firstArr[i]\n const e = createEntry(item, i)\n entries.push(e)\n byKey.set(e.key, e)\n _trackLive(pending, e)\n frag.appendChild(e.element)\n if (item && typeof item === 'object') {\n ;(item as any)[GEA_DIRTY] = false\n ;(item as any)[GEA_DIRTY_PROPS]?.clear()\n }\n }\n container.insertBefore(frag, anchor)\n }\n\n let prevArrRef: T[] = firstArr\n\n const patchDirtyItems = (arr: T[]): boolean => {\n let patched = false\n const raw = (arr as any)[GEA_PROXY_RAW] || arr\n for (let i = 0; i < raw.length; i++) {\n const item = raw[i]\n if (item && typeof item === 'object' && item[GEA_DIRTY]) {\n patchEntry(entries[i], item, i)\n item[GEA_DIRTY] = false\n item[GEA_DIRTY_PROPS]?.clear()\n entries[i].item = item\n patched = true\n }\n }\n return patched\n }\n\n // ── Reconciliation ────────────────────────────────────────────────────\n const reconcile = (arr: T[], changes?: Change[]): void => {\n // Same array ref + same length → structural no-op. Dirty-bit scan\n // picks up in-place item writes.\n if (arr === prevArrRef && entries.length === arr.length) {\n let structural = false\n let aipuOnly = changes && changes.length > 0\n let itemDirtyOnly = changes && changes.length > 0\n if (changes && changes.length > 0) {\n for (let i = 0; i < changes.length; i++) {\n const c = changes[i]\n if (c.type === 'append' || c.type === 'remove' || c.type === 'delete' || c.type === 'reorder') {\n structural = true\n aipuOnly = false\n itemDirtyOnly = false\n break\n }\n if (!c.aipu) {\n aipuOnly = false\n itemDirtyOnly = false\n } else {\n structural = true\n if (!c.itemDirty) itemDirtyOnly = false\n }\n }\n }\n if (itemDirtyOnly) {\n const raw = (arr as any)[GEA_PROXY_RAW] || arr\n let stableKeys = true\n for (let i = 0; i < changes!.length; i++) {\n const idx = changes![i].arix as number\n if (idx < 0 || idx >= entries.length || entries[idx].key !== keyFn(raw[idx], idx)) {\n stableKeys = false\n break\n }\n }\n if (stableKeys) {\n patchDirtyItems(arr)\n return\n }\n }\n // aipu-only 2-swap: items[i]↔items[j] via two symmetric aipu records.\n if (aipuOnly && changes!.length > 1 && changes!.length < 3) {\n const a = changes![0].arix as number\n const b = changes![1].arix as number\n if (a >= 0 && b >= 0 && a < entries.length && b < entries.length && a !== b) {\n const eA = entries[a]\n const eB = entries[b]\n const newAKey = keyFn(arr[a], a)\n const newBKey = keyFn(arr[b], b)\n if (eA.key === newBKey && eB.key === newAKey) {\n const refB = eB.element.nextSibling\n container.insertBefore(eB.element, eA.element)\n if (refB) container.insertBefore(eA.element, refB)\n else container.appendChild(eA.element)\n entries[a] = eB\n entries[b] = eA\n if (unwrap(arr[a]) !== eB.item) patchEntry(eB, arr[a], a)\n if (unwrap(arr[b]) !== eA.item) patchEntry(eA, arr[b], b)\n prevArrRef = arr\n return\n }\n }\n }\n if (!structural) {\n // Dirty-aware patch pass. Same array ref + no structural change →\n // in-place item mutations (e.g. `store.items[i].label = 'X'`) only.\n // The store's nested-proxy set trap stamped `item[GEA_DIRTY]=true`;\n // walk the raw array and patch marked items. Runtime owns the\n // dirty-bit protocol — compiler-emitted patchEntry doesn't see it.\n patchDirtyItems(arr)\n return\n }\n }\n\n if (entries.length === arr.length && changes && changes.length > 0) {\n let structural = false\n for (let i = 0; i < changes.length; i++) {\n const c = changes[i]\n if (c.type === 'append' || c.type === 'remove' || c.type === 'delete' || c.type === 'reorder' || c.aipu) {\n structural = true\n break\n }\n }\n if (!structural && patchDirtyItems(arr)) {\n prevArrRef = arr\n return\n }\n }\n\n // Append-only.\n if (changes && changes.length > 0 && entries.length < arr.length) {\n let onlyAppends = true\n let appendCount = 0\n for (let i = 0; i < changes.length; i++) {\n if (changes[i].type !== 'append') {\n onlyAppends = false\n break\n }\n appendCount += (changes[i].count as number) || 0\n }\n if (onlyAppends && appendCount === arr.length - entries.length) {\n const startIdx = entries.length\n const frag = container.ownerDocument!.createDocumentFragment()\n for (let i = startIdx; i < arr.length; i++) {\n const e = createEntry(arr[i], i)\n entries.push(e)\n byKey.set(e.key, e)\n _trackLive(pending, e)\n frag.appendChild(e.element)\n }\n container.insertBefore(frag, anchor)\n prevArrRef = arr\n return\n }\n }\n\n // Remove-only.\n if (changes && changes.length > 0 && entries.length > arr.length) {\n let onlyRemoves = true\n let totalRemoved = 0\n for (let i = 0; i < changes.length; i++) {\n const c = changes[i]\n if (c.type !== 'remove') {\n onlyRemoves = false\n break\n }\n totalRemoved += (c.count as number) || 0\n }\n if (onlyRemoves && entries.length - arr.length === totalRemoved) {\n if (changes.length < 2 && (changes[0].count as number) === 1) {\n const idx = changes[0].start as number\n if (idx >= 0 && idx < entries.length) {\n removeEntry(entries[idx])\n entries.splice(idx, 1)\n }\n prevArrRef = arr\n return\n }\n const rmIdx: number[] = []\n for (const c of changes) {\n const s = c.start as number\n const ct = c.count as number\n for (let k = 0; k < ct; k++) rmIdx.push(s + k)\n }\n rmIdx.sort((a, b) => b - a)\n for (let i = 0; i < rmIdx.length; i++) {\n const j = rmIdx[i]\n if (j >= 0 && j < entries.length) {\n removeEntry(entries[j])\n entries.splice(j, 1)\n }\n }\n prevArrRef = arr\n return\n }\n }\n\n // ── General keyed reconciliation ─────────────────────────────────\n const newLen = arr.length\n const oldLen = entries.length\n\n // Fresh-create fast path (09_clear1k_x8 per-cycle).\n if (oldLen === 0 && newLen > 0) {\n const freshEntries: Entry<T>[] = new Array(newLen)\n const frag = container.ownerDocument!.createDocumentFragment()\n for (let i = 0; i < newLen; i++) {\n const e = createEntry(arr[i], i)\n freshEntries[i] = e\n byKey.set(e.key, e)\n _trackLive(pending, e)\n frag.appendChild(e.element)\n }\n container.insertBefore(frag, anchor)\n entries = freshEntries\n prevArrRef = arr\n return\n }\n\n const newKeys: string[] = new Array(newLen)\n for (let i = 0; i < newLen; i++) newKeys[i] = keyFn(arr[i], i)\n\n if (newLen === 0) {\n // Bulk clear.\n if (container.childNodes.length === oldLen + 1) {\n if (onItemRemove) {\n for (let i = 0; i < oldLen; i++) onItemRemove(entries[i])\n _deferBulk(pending, entries)\n } else {\n _deferBulk(pending, entries)\n }\n container.textContent = ''\n container.appendChild(anchor)\n } else {\n for (let i = oldLen - 1; i >= 0; i--) removeEntry(entries[i])\n }\n entries = []\n byKey.clear()\n prevArrRef = arr\n return\n }\n\n // Swap fast path (05_swap).\n if (newLen === oldLen) {\n let diffA = -1,\n diffB = -1,\n diffCount = 0\n for (let i = 0; i < newLen; i++) {\n if (entries[i].key !== newKeys[i]) {\n if (diffCount === 0) diffA = i\n else if (diffCount === 1) diffB = i\n diffCount++\n if (diffCount > 2) break\n }\n }\n if (diffCount === 2 && entries[diffA].key === newKeys[diffB] && entries[diffB].key === newKeys[diffA]) {\n const eA = entries[diffA],\n eB = entries[diffB]\n const refB = eB.element.nextSibling\n container.insertBefore(eB.element, eA.element)\n if (refB) container.insertBefore(eA.element, refB)\n else container.appendChild(eA.element)\n entries[diffA] = eB\n entries[diffB] = eA\n if (unwrap(arr[diffA]) !== eB.item) patchEntry(eB, arr[diffA], diffA)\n if (unwrap(arr[diffB]) !== eA.item) patchEntry(eA, arr[diffB], diffB)\n prevArrRef = arr\n return\n }\n }\n\n // Disjoint-replace (02_replace1k).\n if (oldLen > 0 && newLen > 0 && container.childNodes.length === oldLen + 1) {\n let disjoint = true\n for (let i = 0; i < newLen; i++) {\n if (byKey.has(newKeys[i])) {\n disjoint = false\n break\n }\n }\n if (disjoint) {\n if (onItemRemove) {\n for (let i = 0; i < oldLen; i++) onItemRemove(entries[i])\n _deferBulk(pending, entries)\n } else {\n _deferBulk(pending, entries)\n }\n byKey.clear()\n const newEntries: Entry<T>[] = new Array(newLen)\n const newEls: Node[] = new Array(newLen + 1)\n for (let i = 0; i < newLen; i++) {\n const e = createEntry(arr[i], i)\n newEntries[i] = e\n newEls[i] = e.element\n byKey.set(e.key, e)\n _trackLive(pending, e)\n }\n newEls[newLen] = anchor\n ;(container as any).replaceChildren(...newEls)\n entries = newEntries\n prevArrRef = arr\n return\n }\n }\n\n // General LIS reconcile.\n for (let i = 0; i < oldLen; i++) (entries[i] as any)._i = i\n const newToOld = new Array(newLen)\n const seenOld = new Array(oldLen).fill(false)\n for (let i = 0; i < newLen; i++) {\n const existing = byKey.get(newKeys[i])\n if (existing) {\n const oldIdx = (existing as any)._i as number\n newToOld[i] = oldIdx\n seenOld[oldIdx] = true\n } else {\n newToOld[i] = -1\n }\n }\n\n for (let i = oldLen - 1; i >= 0; i--) {\n if (!seenOld[i]) removeEntry(entries[i])\n }\n\n const stable = new Set(lis(newToOld))\n\n const next: Entry<T>[] = new Array(newLen)\n let nextRef: Node = anchor\n for (let i = newLen - 1; i >= 0; i--) {\n const oldIdx = newToOld[i]\n let e: Entry<T>\n if (oldIdx === -1) {\n e = createEntry(arr[i], i)\n byKey.set(e.key, e)\n _trackLive(pending, e)\n container.insertBefore(e.element, nextRef)\n } else {\n e = entries[oldIdx]\n if (e.item !== unwrap(arr[i])) patchEntry(e, arr[i], i)\n if (e.element.parentNode !== container) container.insertBefore(e.element, nextRef)\n else if (!stable.has(i)) container.insertBefore(e.element, nextRef)\n }\n next[i] = e\n nextRef = e.element\n }\n\n entries = next\n prevArrRef = arr\n }\n\n // ── Subscribe for array updates ──────────────────────────────────────\n if (typeof path === 'function') {\n withTracking(disposer, root, () => {\n const arr = (path as () => T[])()\n const next: T[] = Array.isArray(arr) ? arr : []\n markEntriesLeaving(next)\n queueMicrotask(() => reconcile(next))\n })\n } else {\n const off = subscribe(root, path as readonly string[], (_v: any, changes?: Change[]) => {\n reconcile(resolveArr(), changes)\n })\n disposer.add(off)\n }\n}\n"],"mappings":";;;;;;;;;AAMA,SAAgB,IAAI,KAAyB;CAC3C,MAAM,IAAI,IAAI;AACd,KAAI,MAAM,EAAG,QAAO,EAAE;CACtB,MAAM,OAAiB,EAAE;CACzB,MAAM,OAAiB,EAAE;AACzB,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IACrB,KAAI,IAAI,MAAM,GAAG;AACf,OAAK,KAAK,IAAI,GAAG;AACjB,OAAK,KAAK,EAAE;;CAGhB,MAAM,IAAI,KAAK;AACf,KAAI,MAAM,EAAG,QAAO,EAAE;CACtB,MAAM,QAAkB,EAAE;CAC1B,MAAM,OAAiB,EAAE;CACzB,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC,KAAK,GAAG;AAClC,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC1B,MAAM,IAAI,KAAK;EACf,IAAI,KAAK,GACP,KAAK,MAAM;AACb,SAAO,KAAK,IAAI;GACd,MAAM,MAAO,KAAK,MAAO;AACzB,OAAI,MAAM,OAAO,EAAG,MAAK,MAAM;OAC1B,MAAK;;AAEZ,MAAI,OAAO,MAAM,QAAQ;AACvB,SAAM,KAAK,EAAE;AACb,QAAK,KAAK,EAAE;SACP;AACL,SAAM,MAAM;AACZ,QAAK,MAAM;;AAEb,MAAI,KAAK,EAAG,MAAK,KAAK,KAAK,KAAK;;CAElC,MAAM,MAAM,IAAI,MAAM,MAAM,OAAO;CACnC,IAAI,IAAI,KAAK,MAAM,SAAS;AAC5B,MAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1C,MAAI,KAAK,KAAK;AACd,MAAI,KAAK;;AAEX,QAAO;;;;ACTT,MAAM,2BAAkC,IAAI,KAAK;AACjD,MAAM,wBAAyD,IAAI,SAAS;AAC5E,MAAM,2BAAoC,IAAI,SAAS;AACvD,MAAM,6BAAsC,IAAI,SAAS;AACzD,IAAI,mBAAuC,EAAE;AAC7C,IAAI,sBAAwC,EAAE;AAC9C,IAAI,eAAe;AAQnB,SAAS,QAAW,GAAS;AAE3B,QADkB,KAAK,OAAO,MAAM,YAAa,EAA8B,kBACpD;;AAG7B,SAAS,SAAS,SAAiD;CACjE,IAAI,OAAO,MAAM,IAAI,QAAQ;AAC7B,KAAI,CAAC,MAAM;AACT,yBAAO,IAAI,KAAK;AAChB,QAAM,IAAI,SAAS,KAAK;;AAE1B,QAAO;;AAGT,SAAgB,WAAc,SAAqB,GAAmB;CACpE,MAAM,MAAM,OAAO,EAAE,IAAI;CACzB,MAAM,OAAO,SAAS,QAA4B;CAClD,IAAI,SAAS,KAAK,IAAI,IAAI;AAC1B,KAAI,CAAC,OAAQ,MAAK,IAAI,KAAM,yBAAS,IAAI,KAAK,CAAE;AAChD,QAAO,IAAI,EAAoB;;AAGjC,SAAS,aAAgB,SAAqB,GAAmB;AAC/D,YAAW,OAAO,EAAoB;CACtC,MAAM,SAAS,MAAM,IAAI,QAA4B,EAAE,IAAI,OAAO,EAAE,IAAI,CAAC;AACzE,KAAI,CAAC,OAAQ;AACb,QAAO,OAAO,EAAoB;AAClC,KAAI,OAAO,SAAS,EAAG,OAAM,IAAI,QAA4B,EAAE,OAAO,OAAO,EAAE,IAAI,CAAC;;AAGtF,SAAgB,eAAkB,GAAa,WAA0B;AACvE,KAAI,UAAW,YAAW,IAAI,EAAoB;KAC7C,YAAW,OAAO,EAAoB;;AAG7C,SAAgB,cAAiB,GAAsB;AACrD,KAAI,CAAC,SAAS,IAAI,EAAoB,CAAE,QAAO;AAC/C,UAAS,OAAO,EAAoB;AACpC,YAAW,OAAO,EAAoB;AACtC,QAAO;;AAGT,SAAS,YAAkB;AACzB,KAAI,aAAc;AAClB,gBAAe;AACf,sBAAqB;AACnB,iBAAe;EACf,MAAM,YAAY,MAAM,KAAK,SAAS;EACtC,MAAM,cAAc;AACpB,WAAS,OAAO;AAChB,qBAAmB,EAAE;AACrB,wBAAsB,EAAE;AACxB,OAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;GACzC,MAAM,IAAI,UAAU;AACpB,QAAK,MAAM,KAAK,EAAE,QAAQ,CACxB,KAAI;AACF,MAAE,SAAS,SAAS;WACd;AAIV,KAAE,OAAO;;AAEX,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,IACtC,KAAI;AACF,eAAY,GAAG,SAAS,SAAS;UAC3B;GAIV;;AAGJ,SAAgB,OAAU,SAAqB,GAAmB;AAChE,cAAa,SAAS,EAAE;AACxB,SAAQ,IAAI,OAAO,EAAE,IAAI,EAAE,EAAE;AAC7B,UAAS,IAAI,QAA4B;AACzC,YAAW;;;;;;;;AASb,SAAgB,WAAc,SAAqB,SAA2B;AAC5E,KAAI,QAAQ,WAAW,EAAG;CAC1B,MAAM,OAAmB,EAAE;AAC3B,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,IAAI,QAAQ;AAClB,MAAI,cAAc,EAAE,CAAE;AACtB,eAAa,SAAS,EAAE;AACxB,OAAK,KAAK,EAAE;;AAEd,KAAI,KAAK,WAAW,EAAG;AACvB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,mBAAiB,KAAK,QAA4B;AAClD,sBAAoB,KAAK,KAAK,GAAqB;;AAErD,YAAW;;AAGb,SAAgB,QAAW,SAAqB,KAAa,MAA2B;CACtF,MAAM,IAAI,QAAQ,IAAI,IAAI;AAC1B,KAAI,GAAG;AACL,UAAQ,OAAO,IAAI;AACnB,SAAO;;AAMT,KAAI,iBAAiB,SAAS,GAAG;AAC/B,OAAK,IAAI,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK;GAChD,MAAM,SAAS,iBAAiB;GAChC,MAAM,WAAW,oBAAoB;AACrC,UAAO,IAAI,OAAO,SAAS,IAAI,EAAE,SAAS;AAC1C,YAAS,IAAI,OAAO;;AAEtB,qBAAmB,EAAE;AACrB,wBAAsB,EAAE;EACxB,MAAM,IAAI,QAAQ,IAAI,IAAI;AAC1B,MAAI,GAAG;AACL,WAAQ,OAAO,IAAI;AACnB,UAAO;;;AAIX,KAAI,UAAU,UAAU,GAAG;EACzB,MAAM,MAAM,QAAQ,KAAK;EACzB,MAAM,SAAS,MAAM,IAAI,QAA4B,EAAE,IAAI,IAAI;AAC/D,MAAI;QACG,MAAM,QAAQ,OACjB,KAAI,WAAW,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK;AAC7C,aAAS,IAAI,KAAK;AAClB,eAAW,OAAO,KAAK;AACvB,WAAO;;;;AAKf,QAAO;;;;;AClJT,SAAS,OAAU,GAAS;AAE1B,QADkB,KAAK,OAAO,MAAM,YAAa,EAA8B,kBACpD;;AA0C7B,SAAgB,UAAa,KAA+B;CAC1D,MAAM,YAAY,IAAI;CACtB,MAAM,SAAS,IAAI;CACnB,MAAM,WAAW,IAAI;CACrB,MAAM,OAAO,IAAI;CACjB,MAAM,OAAO,IAAI;CACjB,MAAM,QAAQ,IAAI;CAClB,MAAM,cAAc,IAAI;CACxB,MAAM,aAAa,IAAI;CACvB,MAAM,eAAe,IAAI;CACzB,MAAM,UAAiC,IAAI,2BAAW,IAAI,KAAK;CAE/D,IAAI,UAAsB,EAAE;CAC5B,MAAM,wBAAQ,IAAI,KAAuB;AACzC,KAAI,IAAI,eAAgB,KAAI,eAAe,MAAM;CAEjD,MAAM,mBAAwB;AAC5B,MAAI,OAAO,SAAS,YAAY;GAC9B,MAAM,IAAK,MAAoB;AAC/B,UAAO,MAAM,QAAQ,EAAE,GAAG,IAAI,EAAE;;EAElC,IAAI,IAAS;AACb,OAAK,IAAI,IAAI,GAAG,IAAK,KAA2B,QAAQ,KAAK;AAC3D,OAAI,KAAK,KAAM,QAAO,EAAE;AACxB,OAAI,EAAG,KAA2B;;AAEpC,SAAO,MAAM,QAAQ,EAAE,GAAG,IAAI,EAAE;;CAGlC,MAAM,eAAe,MAAsB;AACzC,MAAI,aAAc,cAAa,EAAE;AACjC,QAAM,OAAO,EAAE,IAAI;AACnB,MAAI,cAAc,EAAE,CAAE;AACtB,MAAI,EAAE,QAAQ,WAAY,GAAE,QAAQ,WAAW,YAAY,EAAE,QAAQ;AACrE,SAAO,SAAS,EAAE;;CAGpB,MAAM,sBAAsB,SAAoB;AAC9C,MAAI,QAAQ,WAAW,EAAG;EAC1B,MAAM,4BAAY,IAAI,KAAqB;AAC3C,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,IAAI,MAAM,KAAK,IAAI,EAAE;GAC3B,IAAI,SAAS,UAAU,IAAI,EAAE;AAC7B,OAAI,CAAC,OAAQ,WAAU,IAAI,GAAI,yBAAS,IAAI,KAAK,CAAE;AACnD,UAAO,IAAI,OAAO,KAAK,GAAG,CAAC;;AAE7B,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;GACvC,MAAM,IAAI,QAAQ;AAClB,kBAAe,GAAG,CAAC,UAAU,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;;;CAKzD,MAAM,WAAW,YAAY;AAC7B,KAAI,SAAS,SAAS,GAAG;EACvB,MAAM,OAAO,UAAU,cAAe,wBAAwB;AAC9D,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;GACxC,MAAM,OAAO,SAAS;GACtB,MAAM,IAAI,YAAY,MAAM,EAAE;AAC9B,WAAQ,KAAK,EAAE;AACf,SAAM,IAAI,EAAE,KAAK,EAAE;AACnB,cAAW,SAAS,EAAE;AACtB,QAAK,YAAY,EAAE,QAAQ;AAC3B,OAAI,QAAQ,OAAO,SAAS,UAAU;AAClC,SAAaA,UAAa;AAC1B,SAAaC,eAAkB,OAAO;;;AAG5C,YAAU,aAAa,MAAM,OAAO;;CAGtC,IAAI,aAAkB;CAEtB,MAAM,mBAAmB,QAAsB;EAC7C,IAAI,UAAU;EACd,MAAM,MAAO,IAAY,kBAAkB;AAC3C,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;GACnC,MAAM,OAAO,IAAI;AACjB,OAAI,QAAQ,OAAO,SAAS,YAAY,KAAKD,SAAY;AACvD,eAAW,QAAQ,IAAI,MAAM,EAAE;AAC/B,SAAKA,UAAa;AAClB,SAAKC,eAAkB,OAAO;AAC9B,YAAQ,GAAG,OAAO;AAClB,cAAU;;;AAGd,SAAO;;CAIT,MAAM,aAAa,KAAU,YAA6B;AAGxD,MAAI,QAAQ,cAAc,QAAQ,WAAW,IAAI,QAAQ;GACvD,IAAI,aAAa;GACjB,IAAI,WAAW,WAAW,QAAQ,SAAS;GAC3C,IAAI,gBAAgB,WAAW,QAAQ,SAAS;AAChD,OAAI,WAAW,QAAQ,SAAS,EAC9B,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;IACvC,MAAM,IAAI,QAAQ;AAClB,QAAI,EAAE,SAAS,YAAY,EAAE,SAAS,YAAY,EAAE,SAAS,YAAY,EAAE,SAAS,WAAW;AAC7F,kBAAa;AACb,gBAAW;AACX,qBAAgB;AAChB;;AAEF,QAAI,CAAC,EAAE,MAAM;AACX,gBAAW;AACX,qBAAgB;WACX;AACL,kBAAa;AACb,SAAI,CAAC,EAAE,UAAW,iBAAgB;;;AAIxC,OAAI,eAAe;IACjB,MAAM,MAAO,IAAY,kBAAkB;IAC3C,IAAI,aAAa;AACjB,SAAK,IAAI,IAAI,GAAG,IAAI,QAAS,QAAQ,KAAK;KACxC,MAAM,MAAM,QAAS,GAAG;AACxB,SAAI,MAAM,KAAK,OAAO,QAAQ,UAAU,QAAQ,KAAK,QAAQ,MAAM,IAAI,MAAM,IAAI,EAAE;AACjF,mBAAa;AACb;;;AAGJ,QAAI,YAAY;AACd,qBAAgB,IAAI;AACpB;;;AAIJ,OAAI,YAAY,QAAS,SAAS,KAAK,QAAS,SAAS,GAAG;IAC1D,MAAM,IAAI,QAAS,GAAG;IACtB,MAAM,IAAI,QAAS,GAAG;AACtB,QAAI,KAAK,KAAK,KAAK,KAAK,IAAI,QAAQ,UAAU,IAAI,QAAQ,UAAU,MAAM,GAAG;KAC3E,MAAM,KAAK,QAAQ;KACnB,MAAM,KAAK,QAAQ;KACnB,MAAM,UAAU,MAAM,IAAI,IAAI,EAAE;KAChC,MAAM,UAAU,MAAM,IAAI,IAAI,EAAE;AAChC,SAAI,GAAG,QAAQ,WAAW,GAAG,QAAQ,SAAS;MAC5C,MAAM,OAAO,GAAG,QAAQ;AACxB,gBAAU,aAAa,GAAG,SAAS,GAAG,QAAQ;AAC9C,UAAI,KAAM,WAAU,aAAa,GAAG,SAAS,KAAK;UAC7C,WAAU,YAAY,GAAG,QAAQ;AACtC,cAAQ,KAAK;AACb,cAAQ,KAAK;AACb,UAAI,OAAO,IAAI,GAAG,KAAK,GAAG,KAAM,YAAW,IAAI,IAAI,IAAI,EAAE;AACzD,UAAI,OAAO,IAAI,GAAG,KAAK,GAAG,KAAM,YAAW,IAAI,IAAI,IAAI,EAAE;AACzD,mBAAa;AACb;;;;AAIN,OAAI,CAAC,YAAY;AAMf,oBAAgB,IAAI;AACpB;;;AAIJ,MAAI,QAAQ,WAAW,IAAI,UAAU,WAAW,QAAQ,SAAS,GAAG;GAClE,IAAI,aAAa;AACjB,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;IACvC,MAAM,IAAI,QAAQ;AAClB,QAAI,EAAE,SAAS,YAAY,EAAE,SAAS,YAAY,EAAE,SAAS,YAAY,EAAE,SAAS,aAAa,EAAE,MAAM;AACvG,kBAAa;AACb;;;AAGJ,OAAI,CAAC,cAAc,gBAAgB,IAAI,EAAE;AACvC,iBAAa;AACb;;;AAKJ,MAAI,WAAW,QAAQ,SAAS,KAAK,QAAQ,SAAS,IAAI,QAAQ;GAChE,IAAI,cAAc;GAClB,IAAI,cAAc;AAClB,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,QAAI,QAAQ,GAAG,SAAS,UAAU;AAChC,mBAAc;AACd;;AAEF,mBAAgB,QAAQ,GAAG,SAAoB;;AAEjD,OAAI,eAAe,gBAAgB,IAAI,SAAS,QAAQ,QAAQ;IAC9D,MAAM,WAAW,QAAQ;IACzB,MAAM,OAAO,UAAU,cAAe,wBAAwB;AAC9D,SAAK,IAAI,IAAI,UAAU,IAAI,IAAI,QAAQ,KAAK;KAC1C,MAAM,IAAI,YAAY,IAAI,IAAI,EAAE;AAChC,aAAQ,KAAK,EAAE;AACf,WAAM,IAAI,EAAE,KAAK,EAAE;AACnB,gBAAW,SAAS,EAAE;AACtB,UAAK,YAAY,EAAE,QAAQ;;AAE7B,cAAU,aAAa,MAAM,OAAO;AACpC,iBAAa;AACb;;;AAKJ,MAAI,WAAW,QAAQ,SAAS,KAAK,QAAQ,SAAS,IAAI,QAAQ;GAChE,IAAI,cAAc;GAClB,IAAI,eAAe;AACnB,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;IACvC,MAAM,IAAI,QAAQ;AAClB,QAAI,EAAE,SAAS,UAAU;AACvB,mBAAc;AACd;;AAEF,oBAAiB,EAAE,SAAoB;;AAEzC,OAAI,eAAe,QAAQ,SAAS,IAAI,WAAW,cAAc;AAC/D,QAAI,QAAQ,SAAS,KAAM,QAAQ,GAAG,UAAqB,GAAG;KAC5D,MAAM,MAAM,QAAQ,GAAG;AACvB,SAAI,OAAO,KAAK,MAAM,QAAQ,QAAQ;AACpC,kBAAY,QAAQ,KAAK;AACzB,cAAQ,OAAO,KAAK,EAAE;;AAExB,kBAAa;AACb;;IAEF,MAAM,QAAkB,EAAE;AAC1B,SAAK,MAAM,KAAK,SAAS;KACvB,MAAM,IAAI,EAAE;KACZ,MAAM,KAAK,EAAE;AACb,UAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IAAK,OAAM,KAAK,IAAI,EAAE;;AAEhD,UAAM,MAAM,GAAG,MAAM,IAAI,EAAE;AAC3B,SAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;KACrC,MAAM,IAAI,MAAM;AAChB,SAAI,KAAK,KAAK,IAAI,QAAQ,QAAQ;AAChC,kBAAY,QAAQ,GAAG;AACvB,cAAQ,OAAO,GAAG,EAAE;;;AAGxB,iBAAa;AACb;;;EAKJ,MAAM,SAAS,IAAI;EACnB,MAAM,SAAS,QAAQ;AAGvB,MAAI,WAAW,KAAK,SAAS,GAAG;GAC9B,MAAM,eAA2B,IAAI,MAAM,OAAO;GAClD,MAAM,OAAO,UAAU,cAAe,wBAAwB;AAC9D,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;IAC/B,MAAM,IAAI,YAAY,IAAI,IAAI,EAAE;AAChC,iBAAa,KAAK;AAClB,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,eAAW,SAAS,EAAE;AACtB,SAAK,YAAY,EAAE,QAAQ;;AAE7B,aAAU,aAAa,MAAM,OAAO;AACpC,aAAU;AACV,gBAAa;AACb;;EAGF,MAAM,UAAoB,IAAI,MAAM,OAAO;AAC3C,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAAK,SAAQ,KAAK,MAAM,IAAI,IAAI,EAAE;AAE9D,MAAI,WAAW,GAAG;AAEhB,OAAI,UAAU,WAAW,WAAW,SAAS,GAAG;AAC9C,QAAI,cAAc;AAChB,UAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAAK,cAAa,QAAQ,GAAG;AACzD,gBAAW,SAAS,QAAQ;UAE5B,YAAW,SAAS,QAAQ;AAE9B,cAAU,cAAc;AACxB,cAAU,YAAY,OAAO;SAE7B,MAAK,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,IAAK,aAAY,QAAQ,GAAG;AAE/D,aAAU,EAAE;AACZ,SAAM,OAAO;AACb,gBAAa;AACb;;AAIF,MAAI,WAAW,QAAQ;GACrB,IAAI,QAAQ,IACV,QAAQ,IACR,YAAY;AACd,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAC1B,KAAI,QAAQ,GAAG,QAAQ,QAAQ,IAAI;AACjC,QAAI,cAAc,EAAG,SAAQ;aACpB,cAAc,EAAG,SAAQ;AAClC;AACA,QAAI,YAAY,EAAG;;AAGvB,OAAI,cAAc,KAAK,QAAQ,OAAO,QAAQ,QAAQ,UAAU,QAAQ,OAAO,QAAQ,QAAQ,QAAQ;IACrG,MAAM,KAAK,QAAQ,QACjB,KAAK,QAAQ;IACf,MAAM,OAAO,GAAG,QAAQ;AACxB,cAAU,aAAa,GAAG,SAAS,GAAG,QAAQ;AAC9C,QAAI,KAAM,WAAU,aAAa,GAAG,SAAS,KAAK;QAC7C,WAAU,YAAY,GAAG,QAAQ;AACtC,YAAQ,SAAS;AACjB,YAAQ,SAAS;AACjB,QAAI,OAAO,IAAI,OAAO,KAAK,GAAG,KAAM,YAAW,IAAI,IAAI,QAAQ,MAAM;AACrE,QAAI,OAAO,IAAI,OAAO,KAAK,GAAG,KAAM,YAAW,IAAI,IAAI,QAAQ,MAAM;AACrE,iBAAa;AACb;;;AAKJ,MAAI,SAAS,KAAK,SAAS,KAAK,UAAU,WAAW,WAAW,SAAS,GAAG;GAC1E,IAAI,WAAW;AACf,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAC1B,KAAI,MAAM,IAAI,QAAQ,GAAG,EAAE;AACzB,eAAW;AACX;;AAGJ,OAAI,UAAU;AACZ,QAAI,cAAc;AAChB,UAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAAK,cAAa,QAAQ,GAAG;AACzD,gBAAW,SAAS,QAAQ;UAE5B,YAAW,SAAS,QAAQ;AAE9B,UAAM,OAAO;IACb,MAAM,aAAyB,IAAI,MAAM,OAAO;IAChD,MAAM,SAAiB,IAAI,MAAM,SAAS,EAAE;AAC5C,SAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;KAC/B,MAAM,IAAI,YAAY,IAAI,IAAI,EAAE;AAChC,gBAAW,KAAK;AAChB,YAAO,KAAK,EAAE;AACd,WAAM,IAAI,EAAE,KAAK,EAAE;AACnB,gBAAW,SAAS,EAAE;;AAExB,WAAO,UAAU;AACf,cAAkB,gBAAgB,GAAG,OAAO;AAC9C,cAAU;AACV,iBAAa;AACb;;;AAKJ,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAAM,SAAQ,GAAW,KAAK;EAC1D,MAAM,WAAW,IAAI,MAAM,OAAO;EAClC,MAAM,UAAU,IAAI,MAAM,OAAO,CAAC,KAAK,MAAM;AAC7C,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;GAC/B,MAAM,WAAW,MAAM,IAAI,QAAQ,GAAG;AACtC,OAAI,UAAU;IACZ,MAAM,SAAU,SAAiB;AACjC,aAAS,KAAK;AACd,YAAQ,UAAU;SAElB,UAAS,KAAK;;AAIlB,OAAK,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,IAC/B,KAAI,CAAC,QAAQ,GAAI,aAAY,QAAQ,GAAG;EAG1C,MAAM,SAAS,IAAI,IAAI,IAAI,SAAS,CAAC;EAErC,MAAM,OAAmB,IAAI,MAAM,OAAO;EAC1C,IAAI,UAAgB;AACpB,OAAK,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;GACpC,MAAM,SAAS,SAAS;GACxB,IAAI;AACJ,OAAI,WAAW,IAAI;AACjB,QAAI,YAAY,IAAI,IAAI,EAAE;AAC1B,UAAM,IAAI,EAAE,KAAK,EAAE;AACnB,eAAW,SAAS,EAAE;AACtB,cAAU,aAAa,EAAE,SAAS,QAAQ;UACrC;AACL,QAAI,QAAQ;AACZ,QAAI,EAAE,SAAS,OAAO,IAAI,GAAG,CAAE,YAAW,GAAG,IAAI,IAAI,EAAE;AACvD,QAAI,EAAE,QAAQ,eAAe,UAAW,WAAU,aAAa,EAAE,SAAS,QAAQ;aACzE,CAAC,OAAO,IAAI,EAAE,CAAE,WAAU,aAAa,EAAE,SAAS,QAAQ;;AAErE,QAAK,KAAK;AACV,aAAU,EAAE;;AAGd,YAAU;AACV,eAAa;;AAIf,KAAI,OAAO,SAAS,WAClB,cAAa,UAAU,YAAY;EACjC,MAAM,MAAO,MAAoB;EACjC,MAAM,OAAY,MAAM,QAAQ,IAAI,GAAG,MAAM,EAAE;AAC/C,qBAAmB,KAAK;AACxB,uBAAqB,UAAU,KAAK,CAAC;GACrC;MACG;EACL,MAAM,MAAM,UAAU,MAAM,OAA4B,IAAS,YAAuB;AACtF,aAAU,YAAY,EAAE,QAAQ;IAChC;AACF,WAAS,IAAI,IAAI"}
|
package/dist/menu.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import { n as reactiveTextValue } from "./reactive-text.mjs";
|
|
|
4
4
|
import { t as reactiveAttr } from "./reactive-attr.mjs";
|
|
5
5
|
import { t as reactiveClass } from "./reactive-class.mjs";
|
|
6
6
|
import { n as _rescue, t as keyedList } from "./keyed-list.mjs";
|
|
7
|
-
import { n as
|
|
7
|
+
import { n as readItem, t as createItemObservable } from "./item-obs.mjs";
|
|
8
8
|
import { normalizeProps } from "@zag-js/vanilla";
|
|
9
9
|
import * as menu from "@zag-js/menu";
|
|
10
10
|
//#region src/components/menu.tsx
|
|
@@ -71,8 +71,8 @@ var Menu = class extends ZagComponent {
|
|
|
71
71
|
const anchor2 = root.childNodes[1].firstChild.firstChild;
|
|
72
72
|
reactiveClass(el0, d, this, () => this.props.class || "");
|
|
73
73
|
reactiveTextValue(marker1, d, this, () => this.props.triggerLabel || "Menu");
|
|
74
|
-
const __ki_L0 = (
|
|
75
|
-
if (
|
|
74
|
+
const __ki_L0 = (__geaItemObservable, i, d) => {
|
|
75
|
+
if (readItem(__geaItemObservable).type === "separator") {
|
|
76
76
|
const root = (_tpl1_root || (_tpl1_root = _tpl1_create())).cloneNode(true);
|
|
77
77
|
reactiveAttr(root, d, this, "key", () => `sep-${i}`);
|
|
78
78
|
return root;
|
|
@@ -81,9 +81,9 @@ var Menu = class extends ZagComponent {
|
|
|
81
81
|
const el0 = root;
|
|
82
82
|
const el1 = el0;
|
|
83
83
|
const marker2 = root.firstChild;
|
|
84
|
-
reactiveAttr(el0, d, this, "key", () =>
|
|
85
|
-
reactiveAttr(el1, d, this, "data-value", () =>
|
|
86
|
-
reactiveTextValue(marker2, d, this, () =>
|
|
84
|
+
reactiveAttr(el0, d, this, "key", () => readItem(__geaItemObservable).value);
|
|
85
|
+
reactiveAttr(el1, d, this, "data-value", () => readItem(__geaItemObservable).value);
|
|
86
|
+
reactiveTextValue(marker2, d, this, () => readItem(__geaItemObservable).label);
|
|
87
87
|
return root;
|
|
88
88
|
}
|
|
89
89
|
};
|
|
@@ -110,7 +110,7 @@ var Menu = class extends ZagComponent {
|
|
|
110
110
|
}
|
|
111
111
|
const __rd = d.child();
|
|
112
112
|
const __obs = createItemObservable(item);
|
|
113
|
-
const __el = __ki_L0(
|
|
113
|
+
const __el = __ki_L0(__obs, idx, __rd);
|
|
114
114
|
return {
|
|
115
115
|
key: __k,
|
|
116
116
|
item: item && item[GEA_PROXY_RAW] || item,
|