@takazudo/zfb 3.1.0 → 4.0.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.
Files changed (61) hide show
  1. package/dist/config.d.ts +57 -3
  2. package/dist/config.js +23 -12
  3. package/dist/config.js.map +1 -1
  4. package/dist/content.js.map +1 -1
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/island-boundary.d.ts +2 -2
  8. package/dist/island-boundary.js +4 -2
  9. package/dist/island-boundary.js.map +1 -1
  10. package/dist/island.d.ts +8 -4
  11. package/dist/island.js +1 -1
  12. package/dist/island.js.map +1 -1
  13. package/dist/jsx-types.d.ts +1 -1
  14. package/dist/jsx-types.js.map +1 -1
  15. package/dist/plugins.d.ts +18 -4
  16. package/dist/plugins.js.map +1 -1
  17. package/dist/runtime.js.map +1 -1
  18. package/dist/slugify.js.map +1 -1
  19. package/dist/zudo-react/description.d.ts +18 -0
  20. package/dist/zudo-react/description.js +41 -0
  21. package/dist/zudo-react/description.js.map +1 -1
  22. package/dist/zudo-react/dom-bindings.d.ts +2 -1
  23. package/dist/zudo-react/dom-bindings.js +16 -22
  24. package/dist/zudo-react/dom-bindings.js.map +1 -1
  25. package/dist/zudo-react/forms.js.map +1 -1
  26. package/dist/zudo-react/hydrate.js +52 -31
  27. package/dist/zudo-react/hydrate.js.map +1 -1
  28. package/dist/zudo-react/index.d.ts +2 -1
  29. package/dist/zudo-react/index.js.map +1 -1
  30. package/dist/zudo-react/jsx-dev-runtime.d.ts +2 -6
  31. package/dist/zudo-react/jsx-dev-runtime.js +3 -3
  32. package/dist/zudo-react/jsx-dev-runtime.js.map +1 -1
  33. package/dist/zudo-react/jsx-runtime.js +2 -2
  34. package/dist/zudo-react/jsx-runtime.js.map +1 -1
  35. package/dist/zudo-react/jsx-types.d.ts +73 -26
  36. package/dist/zudo-react/jsx-types.js.map +1 -1
  37. package/dist/zudo-react/props-transport.d.ts +2 -0
  38. package/dist/zudo-react/props-transport.js +42 -14
  39. package/dist/zudo-react/props-transport.js.map +1 -1
  40. package/dist/zudo-react/raw-html.d.ts +1 -0
  41. package/dist/zudo-react/raw-html.js +260 -0
  42. package/dist/zudo-react/raw-html.js.map +1 -0
  43. package/dist/zudo-react/reactive.js.map +1 -1
  44. package/dist/zudo-react/render-html.d.ts +11 -1
  45. package/dist/zudo-react/render-html.js +83 -56
  46. package/dist/zudo-react/render-html.js.map +1 -1
  47. package/dist/zudo-react/root.d.ts +9 -1
  48. package/dist/zudo-react/root.js +45 -3
  49. package/dist/zudo-react/root.js.map +1 -1
  50. package/dist/zudo-react/server.d.ts +2 -0
  51. package/dist/zudo-react/server.js.map +1 -1
  52. package/dist/zudo-react/style.d.ts +10 -0
  53. package/dist/zudo-react/style.js +525 -0
  54. package/dist/zudo-react/style.js.map +1 -0
  55. package/dist/zudo-react/testing.d.ts +27 -0
  56. package/dist/zudo-react/testing.js +117 -0
  57. package/dist/zudo-react/testing.js.map +1 -0
  58. package/dist/zudo-react/vocabulary.d.ts +7 -0
  59. package/dist/zudo-react/vocabulary.js +64 -5
  60. package/dist/zudo-react/vocabulary.js.map +1 -1
  61. package/package.json +16 -10
@@ -1 +1 @@
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"]}
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";
9
- import { booleanAttrs, commonAttrs, dialectSuggestion, formProps, htmlAttrs, htmlTags, isDialectProp, reactiveModelSuggestion, svgAttrs, svgTags, voidTags, } from "./vocabulary.js";
10
+ import { attributeError, commonAttrs, dialectSuggestion, emptyIframeChildren, formProps, htmlAttrs, htmlTags, isDialectProp, reactiveModelSuggestion, svgAttrs, svgTags, voidTags, } from "./vocabulary.js";
10
11
  const HTML = "http://www.w3.org/1999/xhtml";
11
12
  const SVG = "http://www.w3.org/2000/svg";
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"]),
@@ -121,8 +122,35 @@ function marker(context, parent, kind, content) {
121
122
  context.opaque.add(open);
122
123
  if (kind === "t")
123
124
  context.textSlots.add(open);
125
+ if (context.collectRootRanges && (kind === "t" || kind === "l" || kind.startsWith("s:")))
126
+ context.dynamicRanges.push([open, close]);
124
127
  return [open, close];
125
128
  }
129
+ function rootOwned(container, context, map) {
130
+ const starts = new Map();
131
+ for (const [open, close] of context.dynamicRanges) {
132
+ const start = map.get(open);
133
+ const end = map.get(close);
134
+ if (start?.parentNode === container && end?.parentNode === container)
135
+ starts.set(start, end);
136
+ }
137
+ const nodes = [...container.childNodes];
138
+ const owned = [];
139
+ for (let index = 0; index < nodes.length; index++) {
140
+ const start = nodes[index];
141
+ const end = starts.get(start);
142
+ if (end) {
143
+ const endIndex = nodes.indexOf(end, index + 1);
144
+ if (endIndex >= 0) {
145
+ owned.push({ kind: "range", start, end });
146
+ index = endIndex;
147
+ continue;
148
+ }
149
+ }
150
+ owned.push({ kind: "node", node: start });
151
+ }
152
+ return owned;
153
+ }
126
154
  function range(start, end) {
127
155
  const nodes = [];
128
156
  for (let node = start; node; node = node.nextSibling) {
@@ -174,7 +202,7 @@ function scalar(value, path) {
174
202
  }
175
203
  function validateRawHtml(value, tag, path) {
176
204
  if (typeof value !== "string" ||
177
- /<!--\/?zr:1:|data-zfb-island(?:-skip-ssr)?\s*=/.test(value) ||
205
+ rawHtmlReserved(value, tag) ||
178
206
  (tag === "script" && /<\/script/i.test(value)) ||
179
207
  (tag === "style" && /<\/style/i.test(value)))
180
208
  fail("ZR_RAW_HTML", "setup", "valid rawHtml", typeof value, path);
@@ -207,6 +235,12 @@ function element(desc, parent, context, namespace, parentTag, path) {
207
235
  const childNamespace = tag === "foreignObject" ? HTML : ownNamespace;
208
236
  const element = context.document.createElementNS(ownNamespace, tag);
209
237
  const props = desc.props;
238
+ if (tag === "iframe") {
239
+ if (Object.hasOwn(props, "rawHtml"))
240
+ fail("ZR_RAW_HTML", "preflight", "iframe without rawHtml", "rawHtml", path);
241
+ if (!emptyIframeChildren(props.children))
242
+ fail("ZR_UNSUPPORTED_POSITION", "preflight", "empty iframe children", "children", path);
243
+ }
210
244
  if (tag === "select" && read(props.multiple) === true)
211
245
  fail("ZR_MODEL_UNSUPPORTED", "preflight", "single select", "multiple", path);
212
246
  if (voidTags.has(tag) && ("children" in props || "rawHtml" in props))
@@ -289,24 +323,12 @@ function element(desc, parent, context, namespace, parentTag, path) {
289
323
  fail("ZR_ATTRIBUTE", "setup", "custom element string attribute", name, path);
290
324
  if (/^on[a-z]/.test(name) && typeof initial === "function")
291
325
  fail("ZR_PROP_DIALECT", "setup", "on:event", name, path);
326
+ const initialError = attributeError(name, initial, custom);
327
+ if (initialError)
328
+ fail("ZR_ATTRIBUTE", "setup", initialError, name, path);
292
329
  if (initial != null) {
293
- if (name === "start" &&
294
- typeof initial !== "string" &&
295
- !(typeof initial === "number" && Number.isFinite(initial)))
296
- fail("ZR_ATTRIBUTE", "setup", "string or finite number", typeof initial, path);
297
- else if (ownNamespace === SVG &&
298
- (name === "width" || name === "height") &&
299
- typeof initial !== "string" &&
300
- !(typeof initial === "number" && Number.isFinite(initial)))
301
- fail("ZR_ATTRIBUTE", "setup", "SVG dimension string or number", typeof initial, path);
302
330
  if (name === "style")
303
331
  styleText(initial);
304
- else if (booleanAttrs.has(name) && typeof initial !== "boolean")
305
- fail("ZR_ATTRIBUTE", "setup", "boolean", typeof initial, path);
306
- else if (typeof initial !== "string" &&
307
- typeof initial !== "number" &&
308
- typeof initial !== "boolean")
309
- fail("ZR_ATTRIBUTE", "setup", "scalar", typeof initial, path);
310
332
  setAttribute(element, name, initial);
311
333
  }
312
334
  if (isReactive(original)) {
@@ -314,17 +336,9 @@ function element(desc, parent, context, namespace, parentTag, path) {
314
336
  context.operations.push((map, cleanups) => {
315
337
  const node = map.get(element);
316
338
  const subscription = bind(original, bindingScope, context.options, context.container, path, (value) => {
317
- if (name === "start" &&
318
- value != null &&
319
- typeof value !== "string" &&
320
- !(typeof value === "number" && Number.isFinite(value)))
321
- throw new TypeError("ZR_ATTRIBUTE: start requires a string or finite number");
322
- if (ownNamespace === SVG &&
323
- (name === "width" || name === "height") &&
324
- value != null &&
325
- typeof value !== "string" &&
326
- !(typeof value === "number" && Number.isFinite(value)))
327
- throw new TypeError(`ZR_ATTRIBUTE: SVG dimension ${name} requires a string or number`);
339
+ const error = attributeError(name, value, custom);
340
+ if (error)
341
+ throw new TypeError(`ZR_ATTRIBUTE: ${name} ${error}`);
328
342
  setAttribute(node, name, value);
329
343
  }, initial);
330
344
  cleanups.push(() => subscription.dispose());
@@ -371,6 +385,9 @@ function element(desc, parent, context, namespace, parentTag, path) {
371
385
  });
372
386
  }
373
387
  }
388
+ else if (tag === "iframe") {
389
+ // The iframe document and fallback content are outside owned reconciliation.
390
+ }
374
391
  else if (tag === "textarea" &&
375
392
  (props.modelValue !== undefined || props.defaultValue !== undefined)) {
376
393
  const value = String(read(props.modelValue ?? props.defaultValue));
@@ -815,7 +832,7 @@ function execute(node, container, options, mode) {
815
832
  fail("ZR_IDENTITY", "preflight", options.identity.component, "different child component", rootPath(container));
816
833
  scope = createScope({
817
834
  component: options.identity.component,
818
- ...(options.report ? { reporter: options.report } : {}),
835
+ reporter: (value) => report(options, value),
819
836
  protocol,
820
837
  build: options.identity.build,
821
838
  path: rootPath(container),
@@ -832,9 +849,12 @@ function execute(node, container, options, mode) {
832
849
  formOwners: new Map(),
833
850
  opaque: new Set(),
834
851
  textSlots: new Set(),
852
+ dynamicRanges: [],
853
+ collectRootRanges: true,
835
854
  };
836
855
  const fragment = container.ownerDocument.createDocumentFragment();
837
856
  render(node, fragment, context, HTML, "", rootPath(container));
857
+ context.collectRootRanges = false;
838
858
  const built = [...fragment.childNodes];
839
859
  const map = new Map();
840
860
  if (mode === "hydrate")
@@ -871,7 +891,8 @@ function execute(node, container, options, mode) {
871
891
  }
872
892
  for (const [owner, bindings] of ownedForms)
873
893
  activateForms(bindings, owner.scope, owner.cleanups, options, container);
874
- const owned = mode === "hydrate" ? [...container.childNodes] : built;
894
+ const owned = rootOwned(container, context, map);
895
+ context.dynamicRanges.length = 0;
875
896
  const handle = createRoot(container, options, scope, cleanups, owned);
876
897
  try {
877
898
  scope.activate();