@lab206/dom 0.1.4 → 0.1.5
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 +1 -1
- package/dist/component.d.ts +8 -2
- package/dist/component.d.ts.map +1 -1
- package/dist/component.js +10 -3
- package/dist/component.js.map +1 -1
- package/dist/dynamic.d.ts +5 -0
- package/dist/dynamic.d.ts.map +1 -1
- package/dist/dynamic.js +32 -3
- package/dist/dynamic.js.map +1 -1
- package/dist/h.d.ts.map +1 -1
- package/dist/h.js +3 -1
- package/dist/h.js.map +1 -1
- package/dist/jsx-runtime.d.ts +0 -10
- package/dist/jsx-runtime.d.ts.map +1 -1
- package/dist/jsx-runtime.js +7 -1
- package/dist/jsx-runtime.js.map +1 -1
- package/package.json +2 -2
- package/src/component.ts +10 -3
- package/src/dynamic.ts +41 -3
- package/src/h.ts +3 -1
- package/src/jsx-runtime.ts +9 -1
package/README.md
CHANGED
package/dist/component.d.ts
CHANGED
|
@@ -11,8 +11,14 @@ export type Component<P extends object = Record<string, never>> = (props?: P & {
|
|
|
11
11
|
/**
|
|
12
12
|
* Declare a function component with **reactive props**.
|
|
13
13
|
*
|
|
14
|
-
* Setup runs
|
|
15
|
-
*
|
|
14
|
+
* Setup runs once per **mount invocation**. Reads during setup use
|
|
15
|
+
* **`isolateTracking`** so they do not subscribe the parent consumer (a Dialog
|
|
16
|
+
* `{() => …}` slot does not remount when setup seeds state from a store).
|
|
17
|
+
* Nested effects and `{() => …}` still track normally. Live updates use those
|
|
18
|
+
* nested bindings / `bind` / effects — not parent remounts.
|
|
19
|
+
*
|
|
20
|
+
* Reading `props.x` inside effects / JSX reactive scopes still tracks the
|
|
21
|
+
* parent's signal or accessor.
|
|
16
22
|
*
|
|
17
23
|
* @example
|
|
18
24
|
* ```tsx
|
package/dist/component.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAGpC,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,IAAI,aAAa,CAC1D,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,IAAI,CAC7C,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,KACrB,IAAI,GAAG,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;AAEhD,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAChE,KAAK,CAAC,EAAE,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,KAC/B,IAAI,GAAG,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EACxC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GACvB,SAAS,CAAC,CAAC,CAAC,CAgBd;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE;IAC1B,IAAI,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;IACtC,QAAQ,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;CACxC,GAAG,WAAW,CA0Cd;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE;IAC5B,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;IACvD,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;CAC7B,GAAG,WAAW,CAWd"}
|
package/dist/component.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isolateTracking } from "@lab206/core";
|
|
1
2
|
import { h } from "./h.js";
|
|
2
3
|
import { show } from "./show.js";
|
|
3
4
|
import { list } from "./list.js";
|
|
@@ -5,8 +6,14 @@ import { createProps } from "./props.js";
|
|
|
5
6
|
/**
|
|
6
7
|
* Declare a function component with **reactive props**.
|
|
7
8
|
*
|
|
8
|
-
* Setup runs
|
|
9
|
-
*
|
|
9
|
+
* Setup runs once per **mount invocation**. Reads during setup use
|
|
10
|
+
* **`isolateTracking`** so they do not subscribe the parent consumer (a Dialog
|
|
11
|
+
* `{() => …}` slot does not remount when setup seeds state from a store).
|
|
12
|
+
* Nested effects and `{() => …}` still track normally. Live updates use those
|
|
13
|
+
* nested bindings / `bind` / effects — not parent remounts.
|
|
14
|
+
*
|
|
15
|
+
* Reading `props.x` inside effects / JSX reactive scopes still tracks the
|
|
16
|
+
* parent's signal or accessor.
|
|
10
17
|
*
|
|
11
18
|
* @example
|
|
12
19
|
* ```tsx
|
|
@@ -26,7 +33,7 @@ export function component(setup) {
|
|
|
26
33
|
// missing own keys reliability: always normalize through createProps
|
|
27
34
|
// on a shallow bag of current keys so double-proxy still reads source.
|
|
28
35
|
const props = createProps((raw ?? {}));
|
|
29
|
-
return setup(props);
|
|
36
|
+
return isolateTracking(() => setup(props));
|
|
30
37
|
};
|
|
31
38
|
Object.defineProperty(Comp, "name", {
|
|
32
39
|
value: setup.name || "Component",
|
package/dist/component.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAoB,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,WAAW,EAAsB,MAAM,YAAY,CAAC;AAc7D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,SAAS,CACvB,KAAwB;IAExB,MAAM,IAAI,GAAiB,CAAC,GAAG,EAAE,EAAE;QACjC,oEAAoE;QACpE,mEAAmE;QACnE,qEAAqE;QACrE,uEAAuE;QACvE,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,GAAG,IAAI,EAAE,CAA+B,CACrB,CAAC;QACvB,OAAO,eAAe,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC;IACF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE;QAClC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,WAAW;QAChC,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,KAIpB;IACC,0DAA0D;IAC1D,MAAM,CAAC,GAAG,KAAK,CAAC;IAChB,MAAM,MAAM,GAAG,GAAY,EAAE;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACjB,IAAI,OAAO,CAAC,KAAK,UAAU;YAAE,OAAO,CAAC,CAAE,CAAmB,EAAE,CAAC;QAC7D,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC;IAEhC,MAAM,OAAO,GAAG,CACd,KAA8C,EACxC,EAAE;QACR,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,OAAO,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,MAAM,GAAI,KAAuB,EAAE,CAAC;YAC1C,IAAI,MAAM,YAAY,IAAI;gBAAE,OAAO,MAAM,CAAC;YAC1C,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAA8B,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC3D,OAAO,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,KAAa,CAAC;IACvB,CAAC,CAAC;IAEF,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,QAA+B,CAAC,CAAC,CAAC;IAErE,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACnD,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC;QACxC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5C,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAI,KAItB;IACC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC;IAChC,MAAM,QAAQ,GAAG,GAAiB,EAAE;QAClC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;QACrB,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC,CAAE,CAAwB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;QACnC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/dynamic.d.ts
CHANGED
|
@@ -12,6 +12,11 @@ export type DynamicChild = Node | DocumentFragment | string | number | boolean |
|
|
|
12
12
|
* (common for Tabs / Accordion / List content).
|
|
13
13
|
*
|
|
14
14
|
* Uses a `display: contents` host so layout is unaffected.
|
|
15
|
+
*
|
|
16
|
+
* **Tracking isolation (FOUNDATION):** `get()` still tracks the parent effect
|
|
17
|
+
* for remount keys (e.g. `selected()` in a Dialog body). Component setup uses
|
|
18
|
+
* `isolateTracking` via jsx/`h`/`component()`. Node trees are owned by a nested
|
|
19
|
+
* owner and disposed on remount so Input effects do not leak.
|
|
15
20
|
*/
|
|
16
21
|
export declare function bindDynamic(parent: ParentNode, get: () => DynamicChild): Dispose;
|
|
17
22
|
//# sourceMappingURL=dynamic.d.ts.map
|
package/dist/dynamic.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic.d.ts","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"dynamic.d.ts","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,OAAO,EACb,MAAM,cAAc,CAAC;AAEtB;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB,IAAI,GACJ,gBAAgB,GAChB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,YAAY,EAAE,CAAC;AAEnB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,YAAY,GACtB,OAAO,CAiET"}
|
package/dist/dynamic.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { effect } from "@lab206/core";
|
|
1
|
+
import { createOwner, disposeOwner, effect, getActiveOwner, runWithOwner, } from "@lab206/core";
|
|
2
2
|
/**
|
|
3
3
|
* Mount a reactive child that may return **text or DOM nodes**.
|
|
4
4
|
*
|
|
@@ -7,6 +7,11 @@ import { effect } from "@lab206/core";
|
|
|
7
7
|
* (common for Tabs / Accordion / List content).
|
|
8
8
|
*
|
|
9
9
|
* Uses a `display: contents` host so layout is unaffected.
|
|
10
|
+
*
|
|
11
|
+
* **Tracking isolation (FOUNDATION):** `get()` still tracks the parent effect
|
|
12
|
+
* for remount keys (e.g. `selected()` in a Dialog body). Component setup uses
|
|
13
|
+
* `isolateTracking` via jsx/`h`/`component()`. Node trees are owned by a nested
|
|
14
|
+
* owner and disposed on remount so Input effects do not leak.
|
|
10
15
|
*/
|
|
11
16
|
export function bindDynamic(parent, get) {
|
|
12
17
|
const host = document.createElement("span");
|
|
@@ -16,15 +21,32 @@ export function bindDynamic(parent, get) {
|
|
|
16
21
|
parent.appendChild(host);
|
|
17
22
|
let textNode = null;
|
|
18
23
|
let mode = "empty";
|
|
19
|
-
|
|
20
|
-
|
|
24
|
+
let childDispose;
|
|
25
|
+
const stop = effect(() => {
|
|
26
|
+
// Nested owner: effects created while building nodes are disposed on remount.
|
|
27
|
+
// Do NOT use createRoot here — that clears activeNode and would stop the
|
|
28
|
+
// parent function from tracking remount keys like selected().
|
|
29
|
+
const owner = createOwner(getActiveOwner());
|
|
30
|
+
let value;
|
|
31
|
+
runWithOwner(owner, () => {
|
|
32
|
+
value = get();
|
|
33
|
+
});
|
|
34
|
+
const disposeOwned = () => {
|
|
35
|
+
disposeOwner(owner);
|
|
36
|
+
};
|
|
21
37
|
if (value == null || value === false || value === true) {
|
|
38
|
+
childDispose?.();
|
|
39
|
+
childDispose = undefined;
|
|
40
|
+
disposeOwned();
|
|
22
41
|
host.replaceChildren();
|
|
23
42
|
textNode = null;
|
|
24
43
|
mode = "empty";
|
|
25
44
|
return;
|
|
26
45
|
}
|
|
27
46
|
if (typeof value === "string" || typeof value === "number") {
|
|
47
|
+
childDispose?.();
|
|
48
|
+
childDispose = undefined;
|
|
49
|
+
disposeOwned(); // text path owns nothing reactive from get()
|
|
28
50
|
const s = String(value);
|
|
29
51
|
if (mode === "text" && textNode) {
|
|
30
52
|
textNode.data = s;
|
|
@@ -38,11 +60,18 @@ export function bindDynamic(parent, get) {
|
|
|
38
60
|
return;
|
|
39
61
|
}
|
|
40
62
|
// Nodes / arrays — never String(object)
|
|
63
|
+
childDispose?.();
|
|
64
|
+
childDispose = disposeOwned;
|
|
41
65
|
textNode = null;
|
|
42
66
|
mode = "nodes";
|
|
43
67
|
host.replaceChildren();
|
|
44
68
|
appendValue(host, value);
|
|
45
69
|
});
|
|
70
|
+
return () => {
|
|
71
|
+
stop();
|
|
72
|
+
childDispose?.();
|
|
73
|
+
childDispose = undefined;
|
|
74
|
+
};
|
|
46
75
|
}
|
|
47
76
|
function appendValue(parent, value) {
|
|
48
77
|
if (value == null || value === false || value === true)
|
package/dist/dynamic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":"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"}
|
package/dist/h.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h.d.ts","sourceRoot":"","sources":["../src/h.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"h.d.ts","sourceRoot":"","sources":["../src/h.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAI9D,MAAM,MAAM,KAAK,GACb,IAAI,GACJ,gBAAgB,GAChB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,CAAC,MAAM,YAAY,CAAC,CAAC;AAEzB,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAC3D,KAAK,EAAE,CAAC,KACL,IAAI,GAAG,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;AAEhD,MAAM,MAAM,KAAK,GAAG;IAClB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAChG,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACpG,KAAK,CAAC,EACF,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAClD,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAClF,4CAA4C;IAC5C,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAWF;;;;;GAKG;AACH,wBAAgB,CAAC,CAAC,CAAC,SAAS,MAAM,qBAAqB,EACrD,GAAG,EAAE,CAAC,EACN,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,GAAG,QAAQ,EAAE,KAAK,EAAE,GACnB,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAE5B,wBAAgB,CAAC,CACf,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,GAAG,QAAQ,EAAE,KAAK,EAAE,GACnB,WAAW,CAAC;AAEf,wBAAgB,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjD,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACzB,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,EAC1B,GAAG,QAAQ,EAAE,KAAK,EAAE,GACnB,IAAI,GAAG,gBAAgB,CAAC;AAoD3B,6CAA6C;AAC7C,wBAAgB,IAAI,CAClB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,GAC5E,IAAI,CAQN"}
|
package/dist/h.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isolateTracking } from "@lab206/core";
|
|
1
2
|
import { bindAttr, bindClass, bindProp, bindStyle, bindText } from "./bind.js";
|
|
2
3
|
import { bindDynamic } from "./dynamic.js";
|
|
3
4
|
import { on } from "./on.js";
|
|
@@ -20,7 +21,8 @@ export function h(tag, props, ...children) {
|
|
|
20
21
|
else if (children.length > 1) {
|
|
21
22
|
raw.children = children;
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
+
// isolateTracking: setup reads must not subscribe parent bindDynamic (forms in Dialog)
|
|
25
|
+
const result = isolateTracking(() => tag(createProps(raw)));
|
|
24
26
|
if (result == null) {
|
|
25
27
|
return document.createComment("powers");
|
|
26
28
|
}
|
package/dist/h.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h.js","sourceRoot":"","sources":["../src/h.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAqB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA8BzC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,MAAM;IACN,OAAO;IACP,WAAW;IACX,OAAO;IACP,KAAK;IACL,UAAU;CACX,CAAC,CAAC;AA0BH,MAAM,UAAU,CAAC,CACf,GAA+B,EAC/B,KAAoB,EACpB,GAAG,QAAiB;IAEpB,+DAA+D;IAC/D,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,GAAG,GAA4B,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC1B,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"h.js","sourceRoot":"","sources":["../src/h.ts"],"names":[],"mappings":"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"}
|
package/dist/jsx-runtime.d.ts
CHANGED
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Automatic JSX runtime for Powers.
|
|
3
|
-
*
|
|
4
|
-
* Vite / TypeScript:
|
|
5
|
-
* jsx: "react-jsx"
|
|
6
|
-
* jsxImportSource: "@lab206/dom"
|
|
7
|
-
*
|
|
8
|
-
* Function components receive **reactive props** via `createProps`
|
|
9
|
-
* (unless they already wrapped themselves with `component()`).
|
|
10
|
-
*/
|
|
11
1
|
import { type Props } from "./h.js";
|
|
12
2
|
import { Fragment } from "./fragment.js";
|
|
13
3
|
export { Fragment };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAWA,OAAO,EAAK,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAG5D,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAC3D,KAAK,EAAE,CAAC,KACL,IAAI,GAAG,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;AAEhD,+DAA+D;AAC/D,eAAO,MAAM,cAAc,eAAqC,CAAC;AAEjE,wBAAgB,GAAG,CACjB,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzD,KAAK,EAAE,CAAC,KAAK,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,IAAI,EAC9C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GACrB,IAAI,GAAG,gBAAgB,CAEzB;AAED,wBAAgB,IAAI,CAClB,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzD,KAAK,EAAE,CAAC,KAAK,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,IAAI,EAC9C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GACrB,IAAI,GAAG,gBAAgB,CAEzB;AAED,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzD,KAAK,EAAE,CAAC,KAAK,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,IAAI,EAC9C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GACrB,IAAI,GAAG,gBAAgB,CAEzB;AAgCD,yBAAiB,GAAG,CAAC;IACnB,KAAY,OAAO,GAAG,IAAI,GAAG,gBAAgB,CAAC;IAC9C,KAAY,WAAW,GAAG,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAE1D,UAAiB,yBAAyB;QACxC,KAAK,EAAE,OAAO,CAAC;KAChB;IACD,UAAiB,wBAAwB;QACvC,QAAQ,EAAE,OAAO,CAAC;KACnB;IAED,KAAY,wBAAwB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAE/C,UAAiB,mBAAmB;QAClC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB;IAED,KAAY,iBAAiB,GAAG;SAC7B,CAAC,IAAI,MAAM,qBAAqB,GAAG,KAAK,GAAG;YAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;SACpB,GAAG;YACF,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;SACzB;KACF,GAAG;QACF,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG;YAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;SACzB,CAAC;KACH,CAAC;CACH"}
|
package/dist/jsx-runtime.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* Function components receive **reactive props** via `createProps`
|
|
9
9
|
* (unless they already wrapped themselves with `component()`).
|
|
10
10
|
*/
|
|
11
|
+
import { isolateTracking } from "@lab206/core";
|
|
11
12
|
import { h } from "./h.js";
|
|
12
13
|
import { Fragment, normalizeChildren } from "./fragment.js";
|
|
13
14
|
import { createProps } from "./props.js";
|
|
@@ -30,8 +31,13 @@ function create(type, props) {
|
|
|
30
31
|
// Always pass through createProps so bare function components get
|
|
31
32
|
// reactive field access. component() also wraps — double-wrap is OK
|
|
32
33
|
// (outer raw object, inner Proxy of raw; component's createProps runs first).
|
|
34
|
+
//
|
|
35
|
+
// Setup under isolateTracking: construction reads (e.g. seeding a draft
|
|
36
|
+
// from a store) do not subscribe a parent bindDynamic / Dialog slot —
|
|
37
|
+
// that remount wiped focused inputs on every keystroke. Nested effects
|
|
38
|
+
// and `{() => …}` still track (unlike untrack).
|
|
33
39
|
const reactive = createProps(p);
|
|
34
|
-
const result = type(reactive);
|
|
40
|
+
const result = isolateTracking(() => type(reactive));
|
|
35
41
|
if (result == null) {
|
|
36
42
|
return document.createComment("powers");
|
|
37
43
|
}
|
package/dist/jsx-runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAc,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,CAAC;AAMpB,+DAA+D;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAEjE,MAAM,UAAU,GAAG,CACjB,IAAyD,EACzD,KAA8C,EAC9C,IAAsB;IAEtB,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAyD,EACzD,KAA8C,EAC9C,IAAsB;IAEtB,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,IAAyD,EACzD,KAA8C,EAC9C,IAAsB;IAEtB,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,MAAM,CACb,IAAyD,EACzD,KAA8C;IAE9C,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;IACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;IAEhC,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,kEAAkE;QAClE,oEAAoE;QACpE,8EAA8E;QAC9E,MAAM,QAAQ,GAAG,WAAW,CAAC,CAA4B,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAmC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAc,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,CAAC;AAMpB,+DAA+D;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAEjE,MAAM,UAAU,GAAG,CACjB,IAAyD,EACzD,KAA8C,EAC9C,IAAsB;IAEtB,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAyD,EACzD,KAA8C,EAC9C,IAAsB;IAEtB,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,IAAyD,EACzD,KAA8C,EAC9C,IAAsB;IAEtB,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,MAAM,CACb,IAAyD,EACzD,KAA8C;IAE9C,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;IACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;IAEhC,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,kEAAkE;QAClE,oEAAoE;QACpE,8EAA8E;QAC9E,EAAE;QACF,wEAAwE;QACxE,sEAAsE;QACtE,uEAAuE;QACvE,gDAAgD;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAA4B,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,EAAE,CAClC,IAAI,CAAC,QAAmC,CAAC,CAC1C,CAAC;QACF,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,CAAC,CAAC,IAAI,EAAE,IAAa,EAAE,GAAG,SAAS,CAAC,CAAC;AAC9C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lab206/dom",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Thin DOM bindings + JSX + reactive props for Powers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "BUSL-1.1",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"!src/**/*.test.tsx"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@lab206/core": "0.1.
|
|
37
|
+
"@lab206/core": "0.1.5"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"esbuild": "^0.25.1",
|
package/src/component.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isolateTracking } from "@lab206/core";
|
|
1
2
|
import type { Child } from "./h.js";
|
|
2
3
|
import { h } from "./h.js";
|
|
3
4
|
import { show } from "./show.js";
|
|
@@ -19,8 +20,14 @@ export type Component<P extends object = Record<string, never>> = (
|
|
|
19
20
|
/**
|
|
20
21
|
* Declare a function component with **reactive props**.
|
|
21
22
|
*
|
|
22
|
-
* Setup runs
|
|
23
|
-
*
|
|
23
|
+
* Setup runs once per **mount invocation**. Reads during setup use
|
|
24
|
+
* **`isolateTracking`** so they do not subscribe the parent consumer (a Dialog
|
|
25
|
+
* `{() => …}` slot does not remount when setup seeds state from a store).
|
|
26
|
+
* Nested effects and `{() => …}` still track normally. Live updates use those
|
|
27
|
+
* nested bindings / `bind` / effects — not parent remounts.
|
|
28
|
+
*
|
|
29
|
+
* Reading `props.x` inside effects / JSX reactive scopes still tracks the
|
|
30
|
+
* parent's signal or accessor.
|
|
24
31
|
*
|
|
25
32
|
* @example
|
|
26
33
|
* ```tsx
|
|
@@ -44,7 +51,7 @@ export function component<P extends object>(
|
|
|
44
51
|
const props = createProps(
|
|
45
52
|
(raw ?? {}) as P & { children?: unknown },
|
|
46
53
|
) as ComponentProps<P>;
|
|
47
|
-
return setup(props);
|
|
54
|
+
return isolateTracking(() => setup(props));
|
|
48
55
|
};
|
|
49
56
|
Object.defineProperty(Comp, "name", {
|
|
50
57
|
value: setup.name || "Component",
|
package/src/dynamic.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
createOwner,
|
|
3
|
+
disposeOwner,
|
|
4
|
+
effect,
|
|
5
|
+
getActiveOwner,
|
|
6
|
+
runWithOwner,
|
|
7
|
+
type Dispose,
|
|
8
|
+
} from "@lab206/core";
|
|
2
9
|
|
|
3
10
|
/**
|
|
4
11
|
* Values a reactive JSX child function may return.
|
|
@@ -22,6 +29,11 @@ export type DynamicChild =
|
|
|
22
29
|
* (common for Tabs / Accordion / List content).
|
|
23
30
|
*
|
|
24
31
|
* Uses a `display: contents` host so layout is unaffected.
|
|
32
|
+
*
|
|
33
|
+
* **Tracking isolation (FOUNDATION):** `get()` still tracks the parent effect
|
|
34
|
+
* for remount keys (e.g. `selected()` in a Dialog body). Component setup uses
|
|
35
|
+
* `isolateTracking` via jsx/`h`/`component()`. Node trees are owned by a nested
|
|
36
|
+
* owner and disposed on remount so Input effects do not leak.
|
|
25
37
|
*/
|
|
26
38
|
export function bindDynamic(
|
|
27
39
|
parent: ParentNode,
|
|
@@ -35,11 +47,26 @@ export function bindDynamic(
|
|
|
35
47
|
|
|
36
48
|
let textNode: Text | null = null;
|
|
37
49
|
let mode: "empty" | "text" | "nodes" = "empty";
|
|
50
|
+
let childDispose: Dispose | undefined;
|
|
51
|
+
|
|
52
|
+
const stop = effect(() => {
|
|
53
|
+
// Nested owner: effects created while building nodes are disposed on remount.
|
|
54
|
+
// Do NOT use createRoot here — that clears activeNode and would stop the
|
|
55
|
+
// parent function from tracking remount keys like selected().
|
|
56
|
+
const owner = createOwner(getActiveOwner());
|
|
57
|
+
let value!: DynamicChild;
|
|
58
|
+
runWithOwner(owner, () => {
|
|
59
|
+
value = get();
|
|
60
|
+
});
|
|
38
61
|
|
|
39
|
-
|
|
40
|
-
|
|
62
|
+
const disposeOwned = () => {
|
|
63
|
+
disposeOwner(owner);
|
|
64
|
+
};
|
|
41
65
|
|
|
42
66
|
if (value == null || value === false || value === true) {
|
|
67
|
+
childDispose?.();
|
|
68
|
+
childDispose = undefined;
|
|
69
|
+
disposeOwned();
|
|
43
70
|
host.replaceChildren();
|
|
44
71
|
textNode = null;
|
|
45
72
|
mode = "empty";
|
|
@@ -47,6 +74,9 @@ export function bindDynamic(
|
|
|
47
74
|
}
|
|
48
75
|
|
|
49
76
|
if (typeof value === "string" || typeof value === "number") {
|
|
77
|
+
childDispose?.();
|
|
78
|
+
childDispose = undefined;
|
|
79
|
+
disposeOwned(); // text path owns nothing reactive from get()
|
|
50
80
|
const s = String(value);
|
|
51
81
|
if (mode === "text" && textNode) {
|
|
52
82
|
textNode.data = s;
|
|
@@ -60,11 +90,19 @@ export function bindDynamic(
|
|
|
60
90
|
}
|
|
61
91
|
|
|
62
92
|
// Nodes / arrays — never String(object)
|
|
93
|
+
childDispose?.();
|
|
94
|
+
childDispose = disposeOwned;
|
|
63
95
|
textNode = null;
|
|
64
96
|
mode = "nodes";
|
|
65
97
|
host.replaceChildren();
|
|
66
98
|
appendValue(host, value);
|
|
67
99
|
});
|
|
100
|
+
|
|
101
|
+
return () => {
|
|
102
|
+
stop();
|
|
103
|
+
childDispose?.();
|
|
104
|
+
childDispose = undefined;
|
|
105
|
+
};
|
|
68
106
|
}
|
|
69
107
|
|
|
70
108
|
function appendValue(parent: ParentNode, value: DynamicChild): void {
|
package/src/h.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isolateTracking } from "@lab206/core";
|
|
1
2
|
import { bindAttr, bindClass, bindProp, bindStyle, bindText } from "./bind.js";
|
|
2
3
|
import { bindDynamic, type DynamicChild } from "./dynamic.js";
|
|
3
4
|
import { on } from "./on.js";
|
|
@@ -77,7 +78,8 @@ export function h(
|
|
|
77
78
|
} else if (children.length > 1) {
|
|
78
79
|
raw.children = children;
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
+
// isolateTracking: setup reads must not subscribe parent bindDynamic (forms in Dialog)
|
|
82
|
+
const result = isolateTracking(() => tag(createProps(raw) as never));
|
|
81
83
|
if (result == null) {
|
|
82
84
|
return document.createComment("powers");
|
|
83
85
|
}
|
package/src/jsx-runtime.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* Function components receive **reactive props** via `createProps`
|
|
9
9
|
* (unless they already wrapped themselves with `component()`).
|
|
10
10
|
*/
|
|
11
|
+
import { isolateTracking } from "@lab206/core";
|
|
11
12
|
import { h, type Props } from "./h.js";
|
|
12
13
|
import { Fragment, normalizeChildren } from "./fragment.js";
|
|
13
14
|
import { createProps } from "./props.js";
|
|
@@ -56,8 +57,15 @@ function create(
|
|
|
56
57
|
// Always pass through createProps so bare function components get
|
|
57
58
|
// reactive field access. component() also wraps — double-wrap is OK
|
|
58
59
|
// (outer raw object, inner Proxy of raw; component's createProps runs first).
|
|
60
|
+
//
|
|
61
|
+
// Setup under isolateTracking: construction reads (e.g. seeding a draft
|
|
62
|
+
// from a store) do not subscribe a parent bindDynamic / Dialog slot —
|
|
63
|
+
// that remount wiped focused inputs on every keystroke. Nested effects
|
|
64
|
+
// and `{() => …}` still track (unlike untrack).
|
|
59
65
|
const reactive = createProps(p as Record<string, unknown>);
|
|
60
|
-
const result =
|
|
66
|
+
const result = isolateTracking(() =>
|
|
67
|
+
type(reactive as Record<string, unknown>),
|
|
68
|
+
);
|
|
61
69
|
if (result == null) {
|
|
62
70
|
return document.createComment("powers");
|
|
63
71
|
}
|