@takazudo/zfb 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -7
- package/dist/config.d.ts +43 -9
- package/dist/config.js +23 -12
- package/dist/config.js.map +1 -1
- package/dist/content.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js.map +1 -1
- package/dist/island-boundary.d.ts +2 -2
- package/dist/island-boundary.js +4 -2
- package/dist/island-boundary.js.map +1 -1
- package/dist/island.d.ts +8 -4
- package/dist/island.js +1 -1
- package/dist/island.js.map +1 -1
- package/dist/jsx-types.d.ts +1 -1
- package/dist/jsx-types.js.map +1 -1
- package/dist/runtime.d.ts +7 -4
- package/dist/runtime.js +166 -28
- package/dist/runtime.js.map +1 -1
- package/dist/slugify.js.map +1 -1
- package/dist/zudo-react/description.d.ts +18 -0
- package/dist/zudo-react/description.js +41 -0
- package/dist/zudo-react/description.js.map +1 -1
- package/dist/zudo-react/dom-bindings.d.ts +2 -1
- package/dist/zudo-react/dom-bindings.js +16 -22
- package/dist/zudo-react/dom-bindings.js.map +1 -1
- package/dist/zudo-react/forms.js.map +1 -1
- package/dist/zudo-react/hydrate.js +27 -34
- package/dist/zudo-react/hydrate.js.map +1 -1
- package/dist/zudo-react/index.d.ts +2 -1
- package/dist/zudo-react/index.js.map +1 -1
- package/dist/zudo-react/jsx-dev-runtime.d.ts +2 -6
- package/dist/zudo-react/jsx-dev-runtime.js +3 -3
- package/dist/zudo-react/jsx-dev-runtime.js.map +1 -1
- package/dist/zudo-react/jsx-runtime.js +2 -2
- package/dist/zudo-react/jsx-runtime.js.map +1 -1
- package/dist/zudo-react/jsx-types.d.ts +80 -31
- package/dist/zudo-react/jsx-types.js.map +1 -1
- package/dist/zudo-react/props-transport.d.ts +2 -0
- package/dist/zudo-react/props-transport.js +42 -14
- package/dist/zudo-react/props-transport.js.map +1 -1
- package/dist/zudo-react/raw-html.d.ts +1 -0
- package/dist/zudo-react/raw-html.js +120 -0
- package/dist/zudo-react/raw-html.js.map +1 -0
- package/dist/zudo-react/reactive.js.map +1 -1
- package/dist/zudo-react/render-html.d.ts +11 -1
- package/dist/zudo-react/render-html.js +96 -71
- package/dist/zudo-react/render-html.js.map +1 -1
- package/dist/zudo-react/root.js +24 -1
- package/dist/zudo-react/root.js.map +1 -1
- package/dist/zudo-react/server.d.ts +2 -0
- package/dist/zudo-react/server.js.map +1 -1
- package/dist/zudo-react/structure.d.ts +2 -0
- package/dist/zudo-react/structure.js +14 -0
- package/dist/zudo-react/structure.js.map +1 -1
- package/dist/zudo-react/style.d.ts +10 -0
- package/dist/zudo-react/style.js +525 -0
- package/dist/zudo-react/style.js.map +1 -0
- package/dist/zudo-react/testing.d.ts +27 -0
- package/dist/zudo-react/testing.js +117 -0
- package/dist/zudo-react/testing.js.map +1 -0
- package/dist/zudo-react/vocabulary.d.ts +19 -0
- package/dist/zudo-react/vocabulary.js +155 -0
- package/dist/zudo-react/vocabulary.js.map +1 -0
- package/package.json +16 -10
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { serializeStyle } from "./style.js";
|
|
1
2
|
import { type Subscription } from "./reactive.js";
|
|
2
3
|
import type { ReadonlySignal } from "./reactive-types.js";
|
|
3
4
|
import type { RuntimeScope } from "./scope.js";
|
|
4
5
|
import type { RootOptions } from "./root.js";
|
|
5
6
|
export declare function isReactive(value: unknown): value is ReadonlySignal<unknown>;
|
|
6
7
|
export declare function read(value: unknown): unknown;
|
|
7
|
-
export declare
|
|
8
|
+
export declare const styleText: typeof serializeStyle;
|
|
8
9
|
export declare function setAttribute(element: Element, name: string, value: unknown): void;
|
|
9
10
|
export declare function bind<T>(source: ReadonlySignal<T>, scope: RuntimeScope, options: RootOptions, container: Element, path: string, apply: (value: T) => void, initial: T): Subscription;
|
|
10
11
|
export declare function listener(name: string): {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { serializeStyle } from "./style.js";
|
|
1
2
|
import { subscribe, readSnapshot } from "./reactive.js";
|
|
2
3
|
import { diagnostic, report, rootPath } from "./root.js";
|
|
4
|
+
import { attributeNamespace, attributeText } from "./vocabulary.js";
|
|
3
5
|
export function isReactive(value) {
|
|
4
6
|
return (typeof value === "object" &&
|
|
5
7
|
value !== null &&
|
|
@@ -9,31 +11,23 @@ export function isReactive(value) {
|
|
|
9
11
|
export function read(value) {
|
|
10
12
|
return isReactive(value) ? readSnapshot(value) : value;
|
|
11
13
|
}
|
|
12
|
-
export
|
|
13
|
-
if (typeof value === "string")
|
|
14
|
-
return value;
|
|
15
|
-
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
16
|
-
throw new TypeError("ZR_STYLE");
|
|
17
|
-
let result = "";
|
|
18
|
-
for (const [name, entry] of Object.entries(value)) {
|
|
19
|
-
if (!/^(--[a-zA-Z0-9_-]+|[a-z][a-z0-9-]*)$/.test(name) || /[A-Z]/.test(name))
|
|
20
|
-
throw new TypeError(`ZR_STYLE: ${name}`);
|
|
21
|
-
if (entry == null)
|
|
22
|
-
continue;
|
|
23
|
-
if (typeof entry !== "string" && !(typeof entry === "number" && Number.isFinite(entry)))
|
|
24
|
-
throw new TypeError(`ZR_STYLE: ${name}`);
|
|
25
|
-
result += `${name}:${entry};`;
|
|
26
|
-
}
|
|
27
|
-
return result;
|
|
28
|
-
}
|
|
29
|
-
const booleanAttrs = new Set("hidden inert readonly autofocus required disabled checked selected multiple open controls muted loop autoplay novalidate formnovalidate allowfullscreen".split(" "));
|
|
14
|
+
export const styleText = serializeStyle;
|
|
30
15
|
export function setAttribute(element, name, value) {
|
|
31
|
-
|
|
32
|
-
|
|
16
|
+
const namespace = attributeNamespace(name);
|
|
17
|
+
const localName = namespace && name.includes(":") ? name.split(":")[1] : name;
|
|
18
|
+
const text = name === "style" && value != null ? styleText(value) : attributeText(name, value);
|
|
19
|
+
if (text === null) {
|
|
20
|
+
if (namespace)
|
|
21
|
+
element.removeAttributeNS(namespace, localName);
|
|
22
|
+
else
|
|
23
|
+
element.removeAttribute(name);
|
|
33
24
|
return;
|
|
34
25
|
}
|
|
35
|
-
|
|
36
|
-
|
|
26
|
+
if (namespace) {
|
|
27
|
+
if (element.getAttributeNS(namespace, localName) !== text)
|
|
28
|
+
element.setAttributeNS(namespace, name, text);
|
|
29
|
+
}
|
|
30
|
+
else if (element.getAttribute(name) !== text)
|
|
37
31
|
element.setAttribute(name, text);
|
|
38
32
|
}
|
|
39
33
|
export function bind(source, scope, options, container, path, apply, initial) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-bindings.js","sourceRoot":"","sources":["../../src/zudo-react/dom-bindings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAqB,MAAM,eAAe,CAAC;AAI3E,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dom-bindings.js","sourceRoot":"","sources":["../../src/zudo-react/dom-bindings.ts"],"names":[],"mappings":"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","sourcesContent":["import { serializeStyle } from \"./style.js\";\nimport { subscribe, readSnapshot, type Subscription } from \"./reactive.js\";\nimport type { ReadonlySignal } from \"./reactive-types.js\";\nimport type { RuntimeScope } from \"./scope.js\";\nimport type { RootOptions } from \"./root.js\";\nimport { diagnostic, report, rootPath } from \"./root.js\";\nimport { attributeNamespace, attributeText } from \"./vocabulary.js\";\n\nexport function isReactive(value: unknown): value is ReadonlySignal<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"$$zudoReactive\" in value &&\n value.$$zudoReactive === \"zudo-react.reactive.v1\"\n );\n}\nexport function read(value: unknown): unknown {\n return isReactive(value) ? readSnapshot(value) : value;\n}\nexport const styleText = serializeStyle;\nexport function setAttribute(element: Element, name: string, value: unknown): void {\n const namespace = attributeNamespace(name);\n const localName = namespace && name.includes(\":\") ? name.split(\":\")[1]! : name;\n const text = name === \"style\" && value != null ? styleText(value) : attributeText(name, value);\n if (text === null) {\n if (namespace) element.removeAttributeNS(namespace, localName);\n else element.removeAttribute(name);\n return;\n }\n if (namespace) {\n if (element.getAttributeNS(namespace, localName) !== text)\n element.setAttributeNS(namespace, name, text);\n } else if (element.getAttribute(name) !== text) element.setAttribute(name, text);\n}\nexport function bind<T>(\n source: ReadonlySignal<T>,\n scope: RuntimeScope,\n options: RootOptions,\n container: Element,\n path: string,\n apply: (value: T) => void,\n initial: T,\n): Subscription {\n let previous = initial;\n const subscription = subscribe(\n () => {\n const next = source.value;\n if (Object.is(previous, next)) return;\n previous = next;\n apply(next);\n },\n {\n active: () => scope.active,\n report: (code, actual) =>\n report(\n options,\n diagnostic(\n options,\n code,\n \"update\",\n `${rootPath(container)}${path}`,\n \"binding update\",\n actual,\n ),\n ),\n },\n );\n subscription.run();\n return subscription;\n}\nexport function listener(name: string): { name: string; capture: boolean } | null {\n const match = /^on:([A-Za-z][A-Za-z0-9_-]*)(:capture)?$/.exec(name);\n return match ? { name: match[1]!, capture: Boolean(match[2]) } : null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/zudo-react/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAoB,MAAM,WAAW,CAAC;AAE3E,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;AAC7E,MAAM,WAAW,GAAG,IAAI,OAAO,EAG5B,CAAC;AAiBJ,MAAM,OAAO,SAAU,SAAQ,SAAS;IAE3B;IACA;IACA;IAHX,YACW,IAAY,EACZ,IAAY,EACZ,MAAc;QAEvB,KAAK,CAAC,GAAG,IAAI,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC,CAAC;QAJ9B,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAQ;IAGzB,CAAC;CACF;AACD,SAAS,KAAK,CAAC,IAAY,EAAE,IAAY,EAAE,MAAc;IACvD,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AACD,SAAS,QAAQ,CAAC,KAAc,EAAE,IAAY;IAC5C,IACE,CAAC,KAAK;QACN,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,CAAC,gBAAgB,IAAI,KAAK,CAAC;QAC5B,KAAK,CAAC,cAAc,KAAK,wBAAwB;QACjD,CAAC,CAAC,gBAAgB,IAAI,KAAK,CAAC;QAC5B,KAAK,CAAC,cAAc,KAAK,wBAAwB;QAEjD,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,kCAAkC,CAAC,CAAC;IACvE,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,OAAO,UAAU,CAAC,GAAG,KAAK,UAAU;gBACtC,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,kCAAkC,CAAC,CAAC;YACvE,OAAO,KAAc,CAAC;QACxB,CAAC;QACD,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,kCAAkC,CAAC,CAAC;AAC9E,CAAC;AACD,SAAS,IAAI,CAAC,IAAa,EAAE,KAAwC;IACnE,IAAI,IAAI,CAAC,SAAS,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IACrD,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IAC1C,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC3C,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACrC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9F,CAAC;AACD,yDAAyD;AACzD,SAAS,WAAW,CAClB,IAAsB,EACtB,IAAY;IAEZ,OAAO;QACL,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;QACtB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,sBAAsB,CAAC,CAAC;YACrF,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAC/C,CAAC;KACF,CAAC;AACJ,CAAC;AACD,uDAAuD;AACvD,SAAS,eAAe,CACtB,IAAyB,EACzB,IAAY;IAEZ,OAAO;QACL,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;QACtB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC;YACzF,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAC/C,CAAC;KACF,CAAC;AACJ,CAAC;AACD,2DAA2D;AAC3D,SAAS,eAAe,CACtB,IAAsB,EACtB,IAAY;IAEZ,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO;QACxB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,OAAO,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;YAC3F,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;gBAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC;AACD,iFAAiF;AACjF,SAAS,aAAa,CACpB,IAAuB,EACvB,IAAY;IAEZ,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;QACtB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;YACvF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC;gBAC/E,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,wBAAwB,KAAK,EAAE,CAAC,CAAC;YACjE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAC/C,CAAC;KACF,CAAC;AACJ,CAAC;AACD,8EAA8E;AAC9E,SAAS,YAAY,CAAC,IAAsB;IAC1C,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YACf,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;gBAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC;AACD,SAAS,UAAU,CACjB,IAAqB,EACrB,IAAa,EACb,IAAY;IAEZ,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,IAAwB,EAAE,IAAI,CAAC,CAAC;QACrD,KAAK,UAAU;YACb,OAAO,eAAe,CAAC,IAA2B,EAAE,IAAI,CAAC,CAAC;QAC5D,KAAK,UAAU;YACb,OAAO,eAAe,CAAC,IAAwB,EAAE,IAAI,CAAC,CAAC;QACzD,KAAK,QAAQ;YACX,OAAO,aAAa,CAAC,IAAyB,EAAE,IAAI,CAAC,CAAC;QACxD,KAAK,OAAO;YACV,OAAO,YAAY,CAAC,IAAwB,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AACD,SAAS,MAAM,CAAC,IAAuB;IACrC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AACD,SAAS,eAAe,CAAC,KAAgB;IACvC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAE,OAAO,CAAC,IAAyB,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AACD,MAAM,UAAU,YAAY,CAC1B,KAAiB,EACjB,GAAoB,EACpB,IAAyB,EACzB,SAAkB;IAElB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAY,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACpC,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACxC,MAAM,QAAQ,GAAG,UAAU,KAAK,SAAS,CAAC;QAC1C,MAAM,UAAU,GAAG,YAAY,KAAK,SAAS,CAAC;QAC9C,IAAI,QAAQ,IAAI,UAAU;YAAE,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,8BAA8B,CAAC,CAAC;QAC7F,IACE,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC;YAC/D,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC;YAEnE,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,sCAAsC,CAAC,CAAC;QAC3E,IACE,CAAC,QAAQ;YACP,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS;gBAC/B,CAAC,WAAW,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;YAC5D,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;YAEnF,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,oCAAoC,CAAC,CAAC;QACzE,IACE,KAAK,CAAC,YAAY,KAAK,SAAS;YAChC,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;YAE3D,KAAK,CAAC,sBAAsB,EAAE,IAAI,EAAE,qCAAqC,CAAC,CAAC;QAC7E,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;YAC1F,KAAK,CAAC,sBAAsB,EAAE,IAAI,EAAE,uCAAuC,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAK,IAA0B,CAAC,QAAQ;YACrE,KAAK,CAAC,sBAAsB,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;QAC1D,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC;gBACrD,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAAE,KAAK,CAAC,sBAAsB,EAAE,IAAI,EAAE,YAAY,IAAI,QAAQ,CAAC,CAAC;YAC7F,IACE,CAAC,WAAW;gBACZ,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;gBACpC,CAAC,UAAU,IAAI,WAAW,KAAK,UAAU,CAAC;gBAC1C,CAAC,QAAQ,IAAI,WAAW,KAAK,UAAU,CAAC;gBAExC,KAAK,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YACnE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;YAC5B,IACE,WAAW,KAAK,UAAU;gBACxB,CAAC,CAAC,OAAO,OAAO,KAAK,SAAS;gBAC9B,CAAC,CAAC,WAAW,KAAK,OAAO;oBACvB,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;oBACjD,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ;gBAEjC,KAAK,CAAC,gBAAgB,EAAE,IAAI,EAAE,4BAA4B,CAAC,CAAC;YAC9D,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,CAAC,GAAI,IAA0B,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvF,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM;oBAC1C,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,+BAA+B,CAAC,CAAC;YACtE,CAAC;YACD,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,IAAwB,CAAC;gBACvC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;oBAChD,KAAK,CAAC,sBAAsB,EAAE,IAAI,EAAE,sCAAsC,CAAC,CAAC;gBAC9E,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACnD,IACE,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACtB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CACrF;oBAED,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,uCAAuC,CAAC,CAAC;gBAC5E,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnC,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK;oBAC1B,KAAK,CAAC,mBAAmB,EAAE,IAAI,EAAE,uCAAuC,CAAC,CAAC;gBAC5E,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9B,CAAC;YACD,MAAM,OAAO,GAAY;gBACvB,IAAI,EAAE,IAAe;gBACrB,KAAK;gBACL,IAAI,EAAE,WAAY;gBAClB,IAAI;gBACJ,GAAG,UAAU,CAAC,WAAY,EAAE,IAAe,EAAE,IAAI,CAAC;aACnD,CAAC;YACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM;YAC9D,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC;QAChF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAwB,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAC5E,CAAC;YACF,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,IACE,KAAK,CAAC,IAAI,KAAK,CAAC;gBAChB,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;gBAClD,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,MAAM;gBAElD,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,2CAA2C,CAAC,CAAC;YAC1F,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAe,CAAC;gBAC3F,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;YACvE,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;gBACvE,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;QAC1E,CAAC;aAAM,IACL,IAAI,KAAK,SAAS;YAClB,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAErE,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC;QAC/E,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;gBAC5B,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;gBACpC,OAAO,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE;oBACxB,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAe,CAAC;wBACrE,KAAK,CAAC,gBAAgB,EAAE,OAAO,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;oBACrE,aAAa,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,QAAmB,EAAE,IAAyB;IAC3E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ;QAC5B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7E,IAAI,IAAI,KAAK,SAAS;QACpB,KAAK,CAAC,GAAG,EAAE;YACT,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;gBACpC,KAAK,CAAC,KAAK;oBACT,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,OAAO;wBACxB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;wBACpE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;;QACA,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM;YAAE,KAAK,MAAM,OAAO,IAAI,KAAK;gBAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACpG,CAAC;AACD,MAAM,UAAU,aAAa,CAC3B,QAAmB,EACnB,KAAmB,EACnB,QAA2B,EAC3B,OAAoB,EACpB,SAAkB;IAElB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IACrD,MAAM,KAAK,GACT,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC;QACxC,IAAI,GAAG,EAAiE,CAAC;IAC3E,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,aAAa,GAAyE,EAAE,CAAC;IAC/F,KAAK,MAAM,OAAO,IAAI,QAAQ;QAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAwB,CAAC;YAC9C,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3E,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC;IACH,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;QACjB,KAAK,MAAM,YAAY,IAAI,aAAa;YAAE,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC;QACvE,IAAI,SAAS,GACX,OAAO,IAAK,IAA2C,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC;QACvF,IAAI,OAAO,GACT,OAAO;YACP,IAAI,CAAC,aAAa,CAAC,aAAa,KAAK,IAAI;YACxC,IAA2C,CAAC,cAAc,CAAC,KAAK,SAAS,CAAC;QAC7E,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;YAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,CAAE,IAAyB,CAAC,OAAO;gBAAE,OAAO;YAC5E,IAAI,OAAO,IAAK,KAAoB,CAAC,WAAW;gBAAE,SAAS,GAAG,IAAI,CAAC;YACnE,MAAM,EAAE,CAAC;QACX,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,SAAS,GAAG,IAAI,CAAC;YACjB,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC;QACF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,SAAS,GAAG,KAAK,CAAC;YAClB,OAAO,GAAG,KAAK,CAAC;YAChB,MAAM,EAAE,CAAC;QACX,CAAC,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YAClD,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;YACjB,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACjD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;gBACtD,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;gBACrD,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,SAAS,CAC5B,GAAG,EAAE;YACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;gBAAC,OAAO,OAAO,EAAE,CAAC;oBACjB,IAAI,CAAC,CAAC,OAAO,YAAY,SAAS,CAAC;wBAAE,MAAM,OAAO,CAAC;oBACnD,MAAM,CACJ,OAAO,EACP,UAAU,CACR,OAAO,EACP,OAAO,CAAC,IAAI,EACZ,QAAQ,EACR,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,EACvC,oBAAoB,EACpB,OAAO,CAAC,MAAM,CACf,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,EACD;YACE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM;YAC1B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CACvB,MAAM,CACJ,OAAO,EACP,UAAU,CACR,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,EACvC,oBAAoB,EACpB,MAAM,CACP,CACF;SACJ,CACF,CAAC;QACF,YAAY,CAAC,GAAG,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACrC,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE,CAC/B,cAAc,CAAC,GAAG,EAAE;YAClB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,gBAAgB;gBAAE,OAAO;YAC9C,KAAK,CAAC,GAAG,EAAE;gBACT,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;gBAC3C,KAAK,MAAM,OAAO,IAAI,OAAO;oBAC3B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7E,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM;oBACjC,KAAK,CAAC,KAAK;wBACT,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,OAAO;4BACxB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;4BACpE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACL,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;YACjB,MAAM,GAAG,KAAK,CAAC;YACf,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC","sourcesContent":["import { batch } from \"./scheduler.js\";\nimport { isReactive } from \"./dom-bindings.js\";\nimport { subscribe } from \"./reactive.js\";\nimport type { Signal } from \"./reactive-types.js\";\nimport type { RuntimeScope } from \"./scope.js\";\nimport { diagnostic, report, rootPath, type RootOptions } from \"./root.js\";\n\nconst compositionKey = Symbol.for(\"@takazudo/zfb/zudo-react/composition-v1\");\nconst radioOwners = new WeakMap<\n Document,\n Set<{ root: Element; name: string; form: HTMLFormElement | null }>\n>();\ntype Control = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\ntype Model = Signal<string | boolean | null>;\nexport interface FormPlan {\n element: Element;\n props: Readonly<Record<string, unknown>>;\n path: string;\n}\ninterface Binding {\n node: Control;\n model: Model;\n kind: \"text\" | \"textarea\" | \"checkbox\" | \"select\" | \"radio\";\n read(): string | boolean | null;\n write(value: string | boolean | null): void;\n event: \"input\" | \"change\";\n path: string;\n}\nexport class FormError extends TypeError {\n constructor(\n readonly code: string,\n readonly path: string,\n readonly detail: string,\n ) {\n super(`${code}: ${detail} at ${path}`);\n }\n}\nfunction error(code: string, path: string, detail: string): never {\n throw new FormError(code, path, detail);\n}\nfunction writable(value: unknown, path: string): Model {\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"$$zudoReactive\" in value) ||\n value.$$zudoReactive !== \"zudo-react.reactive.v1\" ||\n !(\"$$zudoWritable\" in value) ||\n value.$$zudoWritable !== \"zudo-react.writable.v1\"\n )\n error(\"ZR_MODEL_READONLY\", path, \"model requires a writable signal\");\n let proto = value;\n while (proto) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, \"value\");\n if (descriptor) {\n if (typeof descriptor.set !== \"function\")\n error(\"ZR_MODEL_READONLY\", path, \"model requires a writable signal\");\n return value as Model;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return error(\"ZR_MODEL_READONLY\", path, \"model requires a writable signal\");\n}\nfunction kind(node: Element, props: Readonly<Record<string, unknown>>): Binding[\"kind\"] | null {\n if (node.localName === \"textarea\") return \"textarea\";\n if (node.localName === \"select\") return \"select\";\n if (node.localName !== \"input\") return null;\n const type = String(props.type ?? \"text\");\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"radio\") return \"radio\";\n return [\"text\", \"search\", \"email\", \"url\", \"tel\", \"password\"].includes(type) ? \"text\" : null;\n}\n// Text input: read/write string .value; listen to input.\nfunction textAdapter(\n node: HTMLInputElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"input\",\n read: () => node.value,\n write: (value) => {\n if (typeof value !== \"string\") error(\"ZR_MODEL_VALUE\", path, \"text requires string\");\n if (node.value !== value) node.value = value;\n },\n };\n}\n// Textarea: read/write string .value; listen to input.\nfunction textareaAdapter(\n node: HTMLTextAreaElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"input\",\n read: () => node.value,\n write: (value) => {\n if (typeof value !== \"string\") error(\"ZR_MODEL_VALUE\", path, \"textarea requires string\");\n if (node.value !== value) node.value = value;\n },\n };\n}\n// Checkbox: read/write boolean .checked; listen to change.\nfunction checkboxAdapter(\n node: HTMLInputElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"change\",\n read: () => node.checked,\n write: (value) => {\n if (typeof value !== \"boolean\") error(\"ZR_MODEL_VALUE\", path, \"checkbox requires boolean\");\n if (node.checked !== value) node.checked = value;\n },\n };\n}\n// Single select: read/write string .value after options exist; listen to change.\nfunction selectAdapter(\n node: HTMLSelectElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"change\",\n read: () => node.value,\n write: (value) => {\n if (typeof value !== \"string\") error(\"ZR_MODEL_VALUE\", path, \"select requires string\");\n if (!values(node).includes(value) && !(value === \"\" && node.selectedIndex === -1))\n error(\"ZR_MODEL_VALUE\", path, `select has no option ${value}`);\n if (node.value !== value) node.value = value;\n },\n };\n}\n// Radio group: read selected option or null; write checked; listen to change.\nfunction radioAdapter(node: HTMLInputElement): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"change\",\n read: () => (node.checked ? node.value : null),\n write: (value) => {\n const checked = value === node.value;\n if (node.checked !== checked) node.checked = checked;\n },\n };\n}\nfunction adapterFor(\n kind: Binding[\"kind\"],\n node: Control,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n switch (kind) {\n case \"text\":\n return textAdapter(node as HTMLInputElement, path);\n case \"textarea\":\n return textareaAdapter(node as HTMLTextAreaElement, path);\n case \"checkbox\":\n return checkboxAdapter(node as HTMLInputElement, path);\n case \"select\":\n return selectAdapter(node as HTMLSelectElement, path);\n case \"radio\":\n return radioAdapter(node as HTMLInputElement);\n }\n}\nfunction values(node: HTMLSelectElement): string[] {\n return [...node.options].map((option) => option.value);\n}\nfunction optionValuesFor(group: Binding[]): string[] {\n return group.map((binding) => (binding.node as HTMLInputElement).value);\n}\nexport function prepareForms(\n plans: FormPlan[],\n map: Map<Node, Node>,\n mode: \"hydrate\" | \"mount\",\n container: Element,\n): Binding[] {\n const bindings: Binding[] = [];\n const groupByModel = new Map<Model, Binding[]>();\n const namedRadios = new Map<string, Model>();\n for (const plan of plans) {\n const { props, path } = plan;\n const node = map.get(plan.element) as Element;\n const controlKind = kind(node, props);\n const modelValue = props.modelValue;\n const modelChecked = props.modelChecked;\n const hasValue = modelValue !== undefined;\n const hasChecked = modelChecked !== undefined;\n if (hasValue && hasChecked) error(\"ZR_MODEL_CONFLICT\", path, \"modelValue with modelChecked\");\n if (\n (props.defaultValue !== undefined && props.value !== undefined) ||\n (props.defaultChecked !== undefined && props.checked !== undefined)\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"default with static value or checked\");\n if (\n (hasValue &&\n (props.defaultValue !== undefined ||\n (controlKind !== \"radio\" && props.value !== undefined))) ||\n (hasChecked && (props.defaultChecked !== undefined || props.checked !== undefined))\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"model with default or static value\");\n if (\n props.defaultValue !== undefined &&\n ![\"text\", \"textarea\", \"select\"].includes(controlKind ?? \"\")\n )\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"defaultValue on unsupported control\");\n if (props.defaultChecked !== undefined && ![\"checkbox\", \"radio\"].includes(controlKind ?? \"\"))\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"defaultChecked on unsupported control\");\n if (node.localName === \"select\" && (node as HTMLSelectElement).multiple)\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"select[multiple]\");\n if (hasValue || hasChecked) {\n for (const name of [\"type\", \"multiple\", \"name\", \"form\"])\n if (isReactive(props[name])) error(\"ZR_MODEL_UNSUPPORTED\", path, `reactive ${name} shape`);\n if (\n !controlKind ||\n node.hasAttribute(\"contenteditable\") ||\n (hasChecked && controlKind !== \"checkbox\") ||\n (hasValue && controlKind === \"checkbox\")\n )\n error(\"ZR_MODEL_UNSUPPORTED\", path, node.localName);\n const model = writable(hasValue ? modelValue : modelChecked, path);\n const initial = model.value;\n if (\n controlKind === \"checkbox\"\n ? typeof initial !== \"boolean\"\n : controlKind === \"radio\"\n ? initial !== null && typeof initial !== \"string\"\n : typeof initial !== \"string\"\n )\n error(\"ZR_MODEL_VALUE\", path, \"model has wrong value type\");\n if (controlKind === \"select\") {\n const options = [...(node as HTMLSelectElement).options].map((option) => option.value);\n if (new Set(options).size !== options.length)\n error(\"ZR_MODEL_CONFLICT\", path, \"duplicate select option value\");\n }\n if (controlKind === \"radio\") {\n const radio = node as HTMLInputElement;\n if (!radio.name || typeof props.value !== \"string\")\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"radio requires static name and value\");\n const owners = radioOwners.get(node.ownerDocument);\n if (\n [...(owners ?? [])].some(\n (entry) =>\n entry.root !== container && entry.name === radio.name && entry.form === radio.form,\n )\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"same-name radio owned by another root\");\n const key = `${radio.name}\\u0000${radio.getAttribute(\"form\") ?? \"\"}`;\n const prior = namedRadios.get(key);\n if (prior && prior !== model)\n error(\"ZR_MODEL_CONFLICT\", path, \"same-name radios use different models\");\n namedRadios.set(key, model);\n }\n const binding: Binding = {\n node: node as Control,\n model,\n kind: controlKind!,\n path,\n ...adapterFor(controlKind!, node as Control, path),\n };\n bindings.push(binding);\n const group = groupByModel.get(model) ?? [];\n group.push(binding);\n groupByModel.set(model, group);\n }\n }\n for (const [model, group] of groupByModel) {\n const radios = group.every((binding) => binding.kind === \"radio\");\n if (group.some((binding) => binding.kind === \"radio\") && !radios)\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"radio and non-radio share model\");\n if (radios) {\n const nodes = group.map((binding) => binding.node as HTMLInputElement);\n const names = new Set(\n nodes.map((node) => `${node.name}\\u0000${node.getAttribute(\"form\") ?? \"\"}`),\n );\n const optionValues = nodes.map((node) => node.value);\n if (\n names.size !== 1 ||\n new Set(nodes.map((node) => node.form)).size !== 1 ||\n new Set(optionValues).size !== optionValues.length\n )\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"radio group membership or duplicate value\");\n if (mode === \"mount\" && model.value !== null && !optionValues.includes(model.value as string))\n error(\"ZR_MODEL_VALUE\", group[0]!.path, \"radio model has no option\");\n if (mode === \"hydrate\" && nodes.filter((node) => node.checked).length > 1)\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"multiple checked radios\");\n } else if (\n mode === \"hydrate\" &&\n group.some((binding) => !Object.is(binding.read(), group[0]!.read()))\n )\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"shared model controls disagree\");\n if (radios) {\n for (const binding of group) {\n const originalWrite = binding.write;\n binding.write = (value) => {\n if (value !== null && !optionValuesFor(group).includes(value as string))\n error(\"ZR_MODEL_VALUE\", binding.path, \"radio model has no option\");\n originalWrite(value);\n };\n }\n }\n }\n return bindings;\n}\nexport function reconcileForms(bindings: Binding[], mode: \"hydrate\" | \"mount\"): void {\n const groups = new Map<Model, Binding[]>();\n for (const binding of bindings)\n groups.set(binding.model, [...(groups.get(binding.model) ?? []), binding]);\n if (mode === \"hydrate\")\n batch(() => {\n for (const [model, group] of groups) {\n model.value =\n group[0]!.kind === \"radio\"\n ? (group.find((binding) => binding.read() !== null)?.read() ?? null)\n : group[0]!.read();\n }\n });\n else for (const [model, group] of groups) for (const binding of group) binding.write(model.value);\n}\nexport function activateForms(\n bindings: Binding[],\n scope: RuntimeScope,\n cleanups: Array<() => void>,\n options: RootOptions,\n container: Element,\n): void {\n const byForm = new Map<HTMLFormElement, Binding[]>();\n const owned =\n radioOwners.get(container.ownerDocument) ??\n new Set<{ root: Element; name: string; form: HTMLFormElement | null }>();\n radioOwners.set(container.ownerDocument, owned);\n const registrations: Array<{ root: Element; name: string; form: HTMLFormElement | null }> = [];\n for (const binding of bindings)\n if (binding.kind === \"radio\") {\n const node = binding.node as HTMLInputElement;\n const registration = { root: container, name: node.name, form: node.form };\n registrations.push(registration);\n owned.add(registration);\n }\n cleanups.push(() => {\n for (const registration of registrations) owned.delete(registration);\n });\n for (const binding of bindings) {\n const { node, model } = binding;\n const textual = binding.kind === \"text\" || binding.kind === \"textarea\";\n let composing =\n textual && (node as unknown as Record<symbol, unknown>)[compositionKey] === \"active\";\n let unknown =\n textual &&\n node.ownerDocument.activeElement === node &&\n (node as unknown as Record<symbol, unknown>)[compositionKey] === undefined;\n const update = () => {\n model.value = binding.read();\n };\n const onInput = (event: Event) => {\n if (binding.kind === \"radio\" && !(node as HTMLInputElement).checked) return;\n if (textual && (event as InputEvent).isComposing) composing = true;\n update();\n };\n const onStart = () => {\n composing = true;\n unknown = false;\n };\n const onFinish = () => {\n composing = false;\n unknown = false;\n update();\n };\n node.addEventListener(binding.event, onInput);\n if (textual) {\n node.addEventListener(\"compositionstart\", onStart);\n node.addEventListener(\"compositionend\", onFinish);\n node.addEventListener(\"blur\", onFinish);\n }\n cleanups.push(() => {\n node.removeEventListener(binding.event, onInput);\n if (textual) {\n node.removeEventListener(\"compositionstart\", onStart);\n node.removeEventListener(\"compositionend\", onFinish);\n node.removeEventListener(\"blur\", onFinish);\n }\n });\n const subscription = subscribe(\n () => {\n const value = model.value;\n if (!composing && !unknown) {\n try {\n binding.write(value);\n } catch (failure) {\n if (!(failure instanceof FormError)) throw failure;\n report(\n options,\n diagnostic(\n options,\n failure.code,\n \"update\",\n `${rootPath(container)}${binding.path}`,\n \"valid model update\",\n failure.detail,\n ),\n );\n }\n }\n },\n {\n active: () => scope.active,\n report: (code, actual) =>\n report(\n options,\n diagnostic(\n options,\n code,\n \"update\",\n `${rootPath(container)}${binding.path}`,\n \"valid model update\",\n actual,\n ),\n ),\n },\n );\n subscription.run();\n cleanups.push(() => subscription.dispose());\n const form = node.form;\n if (form) byForm.set(form, [...(byForm.get(form) ?? []), binding]);\n }\n for (const [form, members] of byForm) {\n let active = true;\n const onReset = (event: Event) =>\n queueMicrotask(() => {\n if (!active || event.defaultPrevented) return;\n batch(() => {\n const groups = new Map<Model, Binding[]>();\n for (const binding of members)\n groups.set(binding.model, [...(groups.get(binding.model) ?? []), binding]);\n for (const [model, group] of groups)\n model.value =\n group[0]!.kind === \"radio\"\n ? (group.find((binding) => binding.read() !== null)?.read() ?? null)\n : group[0]!.read();\n });\n });\n form.addEventListener(\"reset\", onReset);\n cleanups.push(() => {\n active = false;\n form.removeEventListener(\"reset\", onReset);\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/zudo-react/forms.ts"],"names":[],"mappings":"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","sourcesContent":["import { batch } from \"./scheduler.js\";\nimport { isReactive } from \"./dom-bindings.js\";\nimport { subscribe } from \"./reactive.js\";\nimport type { Signal } from \"./reactive-types.js\";\nimport type { RuntimeScope } from \"./scope.js\";\nimport { diagnostic, report, rootPath, type RootOptions } from \"./root.js\";\n\nconst compositionKey = Symbol.for(\"@takazudo/zfb/zudo-react/composition-v1\");\nconst radioOwners = new WeakMap<\n Document,\n Set<{ root: Element; name: string; form: HTMLFormElement | null }>\n>();\ntype Control = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\ntype Model = Signal<string | boolean | null>;\nexport interface FormPlan {\n element: Element;\n props: Readonly<Record<string, unknown>>;\n path: string;\n}\ninterface Binding {\n node: Control;\n model: Model;\n kind: \"text\" | \"textarea\" | \"checkbox\" | \"select\" | \"radio\";\n read(): string | boolean | null;\n write(value: string | boolean | null): void;\n event: \"input\" | \"change\";\n path: string;\n}\nexport class FormError extends TypeError {\n constructor(\n readonly code: string,\n readonly path: string,\n readonly detail: string,\n ) {\n super(`${code}: ${detail} at ${path}`);\n }\n}\nfunction error(code: string, path: string, detail: string): never {\n throw new FormError(code, path, detail);\n}\nfunction writable(value: unknown, path: string): Model {\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"$$zudoReactive\" in value) ||\n value.$$zudoReactive !== \"zudo-react.reactive.v1\" ||\n !(\"$$zudoWritable\" in value) ||\n value.$$zudoWritable !== \"zudo-react.writable.v1\"\n )\n error(\"ZR_MODEL_READONLY\", path, \"model requires a writable signal\");\n let proto = value;\n while (proto) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, \"value\");\n if (descriptor) {\n if (typeof descriptor.set !== \"function\")\n error(\"ZR_MODEL_READONLY\", path, \"model requires a writable signal\");\n return value as Model;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return error(\"ZR_MODEL_READONLY\", path, \"model requires a writable signal\");\n}\nfunction kind(node: Element, props: Readonly<Record<string, unknown>>): Binding[\"kind\"] | null {\n if (node.localName === \"textarea\") return \"textarea\";\n if (node.localName === \"select\") return \"select\";\n if (node.localName !== \"input\") return null;\n const type = String(props.type ?? \"text\");\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"radio\") return \"radio\";\n return [\"text\", \"search\", \"email\", \"url\", \"tel\", \"password\"].includes(type) ? \"text\" : null;\n}\n// Text input: read/write string .value; listen to input.\nfunction textAdapter(\n node: HTMLInputElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"input\",\n read: () => node.value,\n write: (value) => {\n if (typeof value !== \"string\") error(\"ZR_MODEL_VALUE\", path, \"text requires string\");\n if (node.value !== value) node.value = value;\n },\n };\n}\n// Textarea: read/write string .value; listen to input.\nfunction textareaAdapter(\n node: HTMLTextAreaElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"input\",\n read: () => node.value,\n write: (value) => {\n if (typeof value !== \"string\") error(\"ZR_MODEL_VALUE\", path, \"textarea requires string\");\n if (node.value !== value) node.value = value;\n },\n };\n}\n// Checkbox: read/write boolean .checked; listen to change.\nfunction checkboxAdapter(\n node: HTMLInputElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"change\",\n read: () => node.checked,\n write: (value) => {\n if (typeof value !== \"boolean\") error(\"ZR_MODEL_VALUE\", path, \"checkbox requires boolean\");\n if (node.checked !== value) node.checked = value;\n },\n };\n}\n// Single select: read/write string .value after options exist; listen to change.\nfunction selectAdapter(\n node: HTMLSelectElement,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"change\",\n read: () => node.value,\n write: (value) => {\n if (typeof value !== \"string\") error(\"ZR_MODEL_VALUE\", path, \"select requires string\");\n if (!values(node).includes(value) && !(value === \"\" && node.selectedIndex === -1))\n error(\"ZR_MODEL_VALUE\", path, `select has no option ${value}`);\n if (node.value !== value) node.value = value;\n },\n };\n}\n// Radio group: read selected option or null; write checked; listen to change.\nfunction radioAdapter(node: HTMLInputElement): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n return {\n event: \"change\",\n read: () => (node.checked ? node.value : null),\n write: (value) => {\n const checked = value === node.value;\n if (node.checked !== checked) node.checked = checked;\n },\n };\n}\nfunction adapterFor(\n kind: Binding[\"kind\"],\n node: Control,\n path: string,\n): Pick<Binding, \"read\" | \"write\" | \"event\"> {\n switch (kind) {\n case \"text\":\n return textAdapter(node as HTMLInputElement, path);\n case \"textarea\":\n return textareaAdapter(node as HTMLTextAreaElement, path);\n case \"checkbox\":\n return checkboxAdapter(node as HTMLInputElement, path);\n case \"select\":\n return selectAdapter(node as HTMLSelectElement, path);\n case \"radio\":\n return radioAdapter(node as HTMLInputElement);\n }\n}\nfunction values(node: HTMLSelectElement): string[] {\n return [...node.options].map((option) => option.value);\n}\nfunction optionValuesFor(group: Binding[]): string[] {\n return group.map((binding) => (binding.node as HTMLInputElement).value);\n}\nexport function prepareForms(\n plans: FormPlan[],\n map: Map<Node, Node>,\n mode: \"hydrate\" | \"mount\",\n container: Element,\n): Binding[] {\n const bindings: Binding[] = [];\n const groupByModel = new Map<Model, Binding[]>();\n const namedRadios = new Map<string, Model>();\n for (const plan of plans) {\n const { props, path } = plan;\n const node = map.get(plan.element) as Element;\n const controlKind = kind(node, props);\n const modelValue = props.modelValue;\n const modelChecked = props.modelChecked;\n const hasValue = modelValue !== undefined;\n const hasChecked = modelChecked !== undefined;\n if (hasValue && hasChecked) error(\"ZR_MODEL_CONFLICT\", path, \"modelValue with modelChecked\");\n if (\n (props.defaultValue !== undefined && props.value !== undefined) ||\n (props.defaultChecked !== undefined && props.checked !== undefined)\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"default with static value or checked\");\n if (\n (hasValue &&\n (props.defaultValue !== undefined ||\n (controlKind !== \"radio\" && props.value !== undefined))) ||\n (hasChecked && (props.defaultChecked !== undefined || props.checked !== undefined))\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"model with default or static value\");\n if (\n props.defaultValue !== undefined &&\n ![\"text\", \"textarea\", \"select\"].includes(controlKind ?? \"\")\n )\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"defaultValue on unsupported control\");\n if (props.defaultChecked !== undefined && ![\"checkbox\", \"radio\"].includes(controlKind ?? \"\"))\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"defaultChecked on unsupported control\");\n if (node.localName === \"select\" && (node as HTMLSelectElement).multiple)\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"select[multiple]\");\n if (hasValue || hasChecked) {\n for (const name of [\"type\", \"multiple\", \"name\", \"form\"])\n if (isReactive(props[name])) error(\"ZR_MODEL_UNSUPPORTED\", path, `reactive ${name} shape`);\n if (\n !controlKind ||\n node.hasAttribute(\"contenteditable\") ||\n (hasChecked && controlKind !== \"checkbox\") ||\n (hasValue && controlKind === \"checkbox\")\n )\n error(\"ZR_MODEL_UNSUPPORTED\", path, node.localName);\n const model = writable(hasValue ? modelValue : modelChecked, path);\n const initial = model.value;\n if (\n controlKind === \"checkbox\"\n ? typeof initial !== \"boolean\"\n : controlKind === \"radio\"\n ? initial !== null && typeof initial !== \"string\"\n : typeof initial !== \"string\"\n )\n error(\"ZR_MODEL_VALUE\", path, \"model has wrong value type\");\n if (controlKind === \"select\") {\n const options = [...(node as HTMLSelectElement).options].map((option) => option.value);\n if (new Set(options).size !== options.length)\n error(\"ZR_MODEL_CONFLICT\", path, \"duplicate select option value\");\n }\n if (controlKind === \"radio\") {\n const radio = node as HTMLInputElement;\n if (!radio.name || typeof props.value !== \"string\")\n error(\"ZR_MODEL_UNSUPPORTED\", path, \"radio requires static name and value\");\n const owners = radioOwners.get(node.ownerDocument);\n if (\n [...(owners ?? [])].some(\n (entry) =>\n entry.root !== container && entry.name === radio.name && entry.form === radio.form,\n )\n )\n error(\"ZR_MODEL_CONFLICT\", path, \"same-name radio owned by another root\");\n const key = `${radio.name}\\u0000${radio.getAttribute(\"form\") ?? \"\"}`;\n const prior = namedRadios.get(key);\n if (prior && prior !== model)\n error(\"ZR_MODEL_CONFLICT\", path, \"same-name radios use different models\");\n namedRadios.set(key, model);\n }\n const binding: Binding = {\n node: node as Control,\n model,\n kind: controlKind!,\n path,\n ...adapterFor(controlKind!, node as Control, path),\n };\n bindings.push(binding);\n const group = groupByModel.get(model) ?? [];\n group.push(binding);\n groupByModel.set(model, group);\n }\n }\n for (const [model, group] of groupByModel) {\n const radios = group.every((binding) => binding.kind === \"radio\");\n if (group.some((binding) => binding.kind === \"radio\") && !radios)\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"radio and non-radio share model\");\n if (radios) {\n const nodes = group.map((binding) => binding.node as HTMLInputElement);\n const names = new Set(\n nodes.map((node) => `${node.name}\\u0000${node.getAttribute(\"form\") ?? \"\"}`),\n );\n const optionValues = nodes.map((node) => node.value);\n if (\n names.size !== 1 ||\n new Set(nodes.map((node) => node.form)).size !== 1 ||\n new Set(optionValues).size !== optionValues.length\n )\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"radio group membership or duplicate value\");\n if (mode === \"mount\" && model.value !== null && !optionValues.includes(model.value as string))\n error(\"ZR_MODEL_VALUE\", group[0]!.path, \"radio model has no option\");\n if (mode === \"hydrate\" && nodes.filter((node) => node.checked).length > 1)\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"multiple checked radios\");\n } else if (\n mode === \"hydrate\" &&\n group.some((binding) => !Object.is(binding.read(), group[0]!.read()))\n )\n error(\"ZR_MODEL_CONFLICT\", group[0]!.path, \"shared model controls disagree\");\n if (radios) {\n for (const binding of group) {\n const originalWrite = binding.write;\n binding.write = (value) => {\n if (value !== null && !optionValuesFor(group).includes(value as string))\n error(\"ZR_MODEL_VALUE\", binding.path, \"radio model has no option\");\n originalWrite(value);\n };\n }\n }\n }\n return bindings;\n}\nexport function reconcileForms(bindings: Binding[], mode: \"hydrate\" | \"mount\"): void {\n const groups = new Map<Model, Binding[]>();\n for (const binding of bindings)\n groups.set(binding.model, [...(groups.get(binding.model) ?? []), binding]);\n if (mode === \"hydrate\")\n batch(() => {\n for (const [model, group] of groups) {\n model.value =\n group[0]!.kind === \"radio\"\n ? (group.find((binding) => binding.read() !== null)?.read() ?? null)\n : group[0]!.read();\n }\n });\n else for (const [model, group] of groups) for (const binding of group) binding.write(model.value);\n}\nexport function activateForms(\n bindings: Binding[],\n scope: RuntimeScope,\n cleanups: Array<() => void>,\n options: RootOptions,\n container: Element,\n): void {\n const byForm = new Map<HTMLFormElement, Binding[]>();\n const owned =\n radioOwners.get(container.ownerDocument) ??\n new Set<{ root: Element; name: string; form: HTMLFormElement | null }>();\n radioOwners.set(container.ownerDocument, owned);\n const registrations: Array<{ root: Element; name: string; form: HTMLFormElement | null }> = [];\n for (const binding of bindings)\n if (binding.kind === \"radio\") {\n const node = binding.node as HTMLInputElement;\n const registration = { root: container, name: node.name, form: node.form };\n registrations.push(registration);\n owned.add(registration);\n }\n cleanups.push(() => {\n for (const registration of registrations) owned.delete(registration);\n });\n for (const binding of bindings) {\n const { node, model } = binding;\n const textual = binding.kind === \"text\" || binding.kind === \"textarea\";\n let composing =\n textual && (node as unknown as Record<symbol, unknown>)[compositionKey] === \"active\";\n let unknown =\n textual &&\n node.ownerDocument.activeElement === node &&\n (node as unknown as Record<symbol, unknown>)[compositionKey] === undefined;\n const update = () => {\n model.value = binding.read();\n };\n const onInput = (event: Event) => {\n if (binding.kind === \"radio\" && !(node as HTMLInputElement).checked) return;\n if (textual && (event as InputEvent).isComposing) composing = true;\n update();\n };\n const onStart = () => {\n composing = true;\n unknown = false;\n };\n const onFinish = () => {\n composing = false;\n unknown = false;\n update();\n };\n node.addEventListener(binding.event, onInput);\n if (textual) {\n node.addEventListener(\"compositionstart\", onStart);\n node.addEventListener(\"compositionend\", onFinish);\n node.addEventListener(\"blur\", onFinish);\n }\n cleanups.push(() => {\n node.removeEventListener(binding.event, onInput);\n if (textual) {\n node.removeEventListener(\"compositionstart\", onStart);\n node.removeEventListener(\"compositionend\", onFinish);\n node.removeEventListener(\"blur\", onFinish);\n }\n });\n const subscription = subscribe(\n () => {\n const value = model.value;\n if (!composing && !unknown) {\n try {\n binding.write(value);\n } catch (failure) {\n if (!(failure instanceof FormError)) throw failure;\n report(\n options,\n diagnostic(\n options,\n failure.code,\n \"update\",\n `${rootPath(container)}${binding.path}`,\n \"valid model update\",\n failure.detail,\n ),\n );\n }\n }\n },\n {\n active: () => scope.active,\n report: (code, actual) =>\n report(\n options,\n diagnostic(\n options,\n code,\n \"update\",\n `${rootPath(container)}${binding.path}`,\n \"valid model update\",\n actual,\n ),\n ),\n },\n );\n subscription.run();\n cleanups.push(() => subscription.dispose());\n const form = node.form;\n if (form) byForm.set(form, [...(byForm.get(form) ?? []), binding]);\n }\n for (const [form, members] of byForm) {\n let active = true;\n const onReset = (event: Event) =>\n queueMicrotask(() => {\n if (!active || event.defaultPrevented) return;\n batch(() => {\n const groups = new Map<Model, Binding[]>();\n for (const binding of members)\n groups.set(binding.model, [...(groups.get(binding.model) ?? []), binding]);\n for (const [model, group] of groups)\n model.value =\n group[0]!.kind === \"radio\"\n ? (group.find((binding) => binding.read() !== null)?.read() ?? null)\n : group[0]!.read();\n });\n });\n form.addEventListener(\"reset\", onReset);\n cleanups.push(() => {\n active = false;\n form.removeEventListener(\"reset\", onReset);\n });\n }\n}\n"]}
|
|
@@ -5,11 +5,12 @@ import { isReactive, read, styleText, setAttribute, bind, listener } from "./dom
|
|
|
5
5
|
import { createRoot, diagnostic, report, rootPath, storedRoot, } from "./root.js";
|
|
6
6
|
import { subscribe } from "./reactive.js";
|
|
7
7
|
import { batch } from "./scheduler.js";
|
|
8
|
+
import { rawHtmlReserved } from "./raw-html.js";
|
|
8
9
|
import { Show, For, showProps, forProps, keyed, keyPayload, view } from "./structure.js";
|
|
10
|
+
import { attributeError, commonAttrs, dialectSuggestion, emptyIframeChildren, formProps, htmlAttrs, htmlTags, isDialectProp, reactiveModelSuggestion, svgAttrs, svgTags, voidTags, } from "./vocabulary.js";
|
|
9
11
|
const HTML = "http://www.w3.org/1999/xhtml";
|
|
10
12
|
const SVG = "http://www.w3.org/2000/svg";
|
|
11
|
-
const
|
|
12
|
-
const sensitive = new Set("template noscript xmp iframe noembed noframes plaintext".split(" "));
|
|
13
|
+
const sensitive = new Set("template noscript xmp noembed noframes plaintext".split(" "));
|
|
13
14
|
const tableChildren = {
|
|
14
15
|
table: new Set("caption colgroup thead tbody tfoot".split(" ")),
|
|
15
16
|
thead: new Set(["tr"]),
|
|
@@ -19,9 +20,6 @@ const tableChildren = {
|
|
|
19
20
|
colgroup: new Set(["col"]),
|
|
20
21
|
};
|
|
21
22
|
const restricted = new Set("title select optgroup option table thead tbody tfoot tr colgroup".split(" "));
|
|
22
|
-
const booleanAttrs = new Set("hidden inert readonly autofocus required disabled checked selected multiple open controls muted loop autoplay novalidate formnovalidate allowfullscreen".split(" "));
|
|
23
|
-
const dialect = new Set("className htmlFor charSet dateTime tabIndex readOnly strokeWidth dangerouslySetInnerHTML".split(" "));
|
|
24
|
-
const formProps = new Set("modelValue modelChecked defaultValue defaultChecked".split(" "));
|
|
25
23
|
const shapeAttrs = {
|
|
26
24
|
input: ["type", "form"],
|
|
27
25
|
select: ["multiple", "form"],
|
|
@@ -29,12 +27,6 @@ const shapeAttrs = {
|
|
|
29
27
|
textarea: ["form"],
|
|
30
28
|
};
|
|
31
29
|
const protocol = "zudo-react/1";
|
|
32
|
-
const words = (value) => new Set(value.split(" "));
|
|
33
|
-
const htmlTags = words("html head body title base link meta style script div span p a br hr main header footer nav section article aside h1 h2 h3 h4 h5 h6 ul ol li dl dt dd blockquote pre code strong em b i small mark time figure figcaption img picture source video audio track canvas form label input button textarea select option optgroup fieldset legend output progress meter datalist table caption thead tbody tfoot tr th td col colgroup details summary dialog template slot iframe noscript address abbr bdi bdo cite data del dfn ins kbd map area object param q rp rt ruby s samp sub sup u var wbr embed xmp noembed noframes plaintext");
|
|
34
|
-
const svgTags = words("svg g path circle ellipse rect line polyline polygon text tspan defs symbol use clipPath mask linearGradient radialGradient stop title desc foreignObject");
|
|
35
|
-
const commonAttrs = words("id class title lang dir slot role style hidden inert contenteditable draggable spellcheck tabindex accesskey translate onclick onload onerror");
|
|
36
|
-
const htmlAttrs = words("href target rel download src alt width height type name value placeholder for charset datetime readonly autofocus required disabled checked selected multiple open controls muted loop autoplay novalidate formnovalidate maxlength minlength min max step pattern autocomplete accept accept-charset http-equiv content media method action enctype rows cols colspan rowspan scope cite poster loading decoding sizes srcset crossorigin referrerpolicy sandbox allow allowfullscreen");
|
|
37
|
-
const svgAttrs = words("width height viewBox preserveAspectRatio gradientUnits gradientTransform markerWidth markerHeight refX refY xlink:href xml:lang stroke-width fill-rule clip-rule stroke-linecap stroke-linejoin stop-color stop-opacity fill stroke d x y x1 x2 y1 y2 cx cy r rx ry points transform opacity offset");
|
|
38
30
|
function owned(context, name, namespace, parentTag, path, factory, initial, kind, parentScope) {
|
|
39
31
|
const scope = (parentScope ?? context.scope).child(name);
|
|
40
32
|
const fragment = context.document.createDocumentFragment();
|
|
@@ -183,7 +175,7 @@ function scalar(value, path) {
|
|
|
183
175
|
}
|
|
184
176
|
function validateRawHtml(value, tag, path) {
|
|
185
177
|
if (typeof value !== "string" ||
|
|
186
|
-
|
|
178
|
+
rawHtmlReserved(value, tag) ||
|
|
187
179
|
(tag === "script" && /<\/script/i.test(value)) ||
|
|
188
180
|
(tag === "style" && /<\/style/i.test(value)))
|
|
189
181
|
fail("ZR_RAW_HTML", "setup", "valid rawHtml", typeof value, path);
|
|
@@ -216,6 +208,12 @@ function element(desc, parent, context, namespace, parentTag, path) {
|
|
|
216
208
|
const childNamespace = tag === "foreignObject" ? HTML : ownNamespace;
|
|
217
209
|
const element = context.document.createElementNS(ownNamespace, tag);
|
|
218
210
|
const props = desc.props;
|
|
211
|
+
if (tag === "iframe") {
|
|
212
|
+
if (Object.hasOwn(props, "rawHtml"))
|
|
213
|
+
fail("ZR_RAW_HTML", "preflight", "iframe without rawHtml", "rawHtml", path);
|
|
214
|
+
if (!emptyIframeChildren(props.children))
|
|
215
|
+
fail("ZR_UNSUPPORTED_POSITION", "preflight", "empty iframe children", "children", path);
|
|
216
|
+
}
|
|
219
217
|
if (tag === "select" && read(props.multiple) === true)
|
|
220
218
|
fail("ZR_MODEL_UNSUPPORTED", "preflight", "single select", "multiple", path);
|
|
221
219
|
if (voidTags.has(tag) && ("children" in props || "rawHtml" in props))
|
|
@@ -241,8 +239,9 @@ function element(desc, parent, context, namespace, parentTag, path) {
|
|
|
241
239
|
setAttribute(element, "checked", read(original));
|
|
242
240
|
continue;
|
|
243
241
|
}
|
|
244
|
-
if (
|
|
245
|
-
fail("ZR_PROP_DIALECT", "setup", "
|
|
242
|
+
if (isDialectProp(name, ownNamespace === SVG ? "svg" : "html", custom))
|
|
243
|
+
fail("ZR_PROP_DIALECT", "setup", dialectSuggestion(name, ownNamespace === SVG ? "svg" : "html", custom) ??
|
|
244
|
+
"HTML-spelled prop", name, path);
|
|
246
245
|
if (name === "ref") {
|
|
247
246
|
if (!original || typeof original !== "object" || !("current" in original))
|
|
248
247
|
fail("ZR_REF", "setup", "object ref", typeof original, path);
|
|
@@ -279,8 +278,10 @@ function element(desc, parent, context, namespace, parentTag, path) {
|
|
|
279
278
|
continue;
|
|
280
279
|
}
|
|
281
280
|
if (name === "value" || name === "checked") {
|
|
282
|
-
if (isReactive(original))
|
|
283
|
-
|
|
281
|
+
if (isReactive(original)) {
|
|
282
|
+
const suggestion = reactiveModelSuggestion(tag, name, String(read(props.type) ?? "text"), custom);
|
|
283
|
+
fail("ZR_MODEL_UNSUPPORTED", "preflight", suggestion ?? "static value", name, path);
|
|
284
|
+
}
|
|
284
285
|
}
|
|
285
286
|
if (!/^[A-Za-z_:][A-Za-z0-9_:.-]*$/.test(name) ||
|
|
286
287
|
(!custom &&
|
|
@@ -295,20 +296,12 @@ function element(desc, parent, context, namespace, parentTag, path) {
|
|
|
295
296
|
fail("ZR_ATTRIBUTE", "setup", "custom element string attribute", name, path);
|
|
296
297
|
if (/^on[a-z]/.test(name) && typeof initial === "function")
|
|
297
298
|
fail("ZR_PROP_DIALECT", "setup", "on:event", name, path);
|
|
299
|
+
const initialError = attributeError(name, initial, custom);
|
|
300
|
+
if (initialError)
|
|
301
|
+
fail("ZR_ATTRIBUTE", "setup", initialError, name, path);
|
|
298
302
|
if (initial != null) {
|
|
299
|
-
if (ownNamespace === SVG &&
|
|
300
|
-
(name === "width" || name === "height") &&
|
|
301
|
-
typeof initial !== "string" &&
|
|
302
|
-
!(typeof initial === "number" && Number.isFinite(initial)))
|
|
303
|
-
fail("ZR_ATTRIBUTE", "setup", "SVG dimension string or number", typeof initial, path);
|
|
304
303
|
if (name === "style")
|
|
305
304
|
styleText(initial);
|
|
306
|
-
else if (booleanAttrs.has(name) && typeof initial !== "boolean")
|
|
307
|
-
fail("ZR_ATTRIBUTE", "setup", "boolean", typeof initial, path);
|
|
308
|
-
else if (typeof initial !== "string" &&
|
|
309
|
-
typeof initial !== "number" &&
|
|
310
|
-
typeof initial !== "boolean")
|
|
311
|
-
fail("ZR_ATTRIBUTE", "setup", "scalar", typeof initial, path);
|
|
312
305
|
setAttribute(element, name, initial);
|
|
313
306
|
}
|
|
314
307
|
if (isReactive(original)) {
|
|
@@ -316,12 +309,9 @@ function element(desc, parent, context, namespace, parentTag, path) {
|
|
|
316
309
|
context.operations.push((map, cleanups) => {
|
|
317
310
|
const node = map.get(element);
|
|
318
311
|
const subscription = bind(original, bindingScope, context.options, context.container, path, (value) => {
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
typeof value !== "string" &&
|
|
323
|
-
!(typeof value === "number" && Number.isFinite(value)))
|
|
324
|
-
throw new TypeError(`ZR_ATTRIBUTE: SVG dimension ${name} requires a string or number`);
|
|
312
|
+
const error = attributeError(name, value, custom);
|
|
313
|
+
if (error)
|
|
314
|
+
throw new TypeError(`ZR_ATTRIBUTE: ${name} ${error}`);
|
|
325
315
|
setAttribute(node, name, value);
|
|
326
316
|
}, initial);
|
|
327
317
|
cleanups.push(() => subscription.dispose());
|
|
@@ -368,6 +358,9 @@ function element(desc, parent, context, namespace, parentTag, path) {
|
|
|
368
358
|
});
|
|
369
359
|
}
|
|
370
360
|
}
|
|
361
|
+
else if (tag === "iframe") {
|
|
362
|
+
// The iframe document and fallback content are outside owned reconciliation.
|
|
363
|
+
}
|
|
371
364
|
else if (tag === "textarea" &&
|
|
372
365
|
(props.modelValue !== undefined || props.defaultValue !== undefined)) {
|
|
373
366
|
const value = String(read(props.modelValue ?? props.defaultValue));
|
|
@@ -812,7 +805,7 @@ function execute(node, container, options, mode) {
|
|
|
812
805
|
fail("ZR_IDENTITY", "preflight", options.identity.component, "different child component", rootPath(container));
|
|
813
806
|
scope = createScope({
|
|
814
807
|
component: options.identity.component,
|
|
815
|
-
|
|
808
|
+
reporter: (value) => report(options, value),
|
|
816
809
|
protocol,
|
|
817
810
|
build: options.identity.build,
|
|
818
811
|
path: rootPath(container),
|