nodality 1.3.1 → 1.3.2

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 (205) hide show
  1. package/dist/animator.cjs.js.LICENSE.txt +1 -1
  2. package/dist/animator.esm.js.LICENSE.txt +1 -1
  3. package/dist/audionew.cjs.js.LICENSE.txt +1 -1
  4. package/dist/audionew.esm.js.LICENSE.txt +1 -1
  5. package/dist/base.cjs.js.LICENSE.txt +1 -1
  6. package/dist/base.esm.js.LICENSE.txt +1 -1
  7. package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
  8. package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
  9. package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
  10. package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
  11. package/dist/bundle.umd.js +1 -1
  12. package/dist/bundle.umd.js.LICENSE.txt +1 -1
  13. package/dist/button.cjs.js.LICENSE.txt +1 -1
  14. package/dist/button.esm.js.LICENSE.txt +1 -1
  15. package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
  16. package/dist/card-getter.esm.js.LICENSE.txt +1 -1
  17. package/dist/center.cjs.js.LICENSE.txt +1 -1
  18. package/dist/center.esm.js.LICENSE.txt +1 -1
  19. package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
  20. package/dist/checkbox.esm.js.LICENSE.txt +1 -1
  21. package/dist/code.cjs.js.LICENSE.txt +1 -1
  22. package/dist/code.esm.js.LICENSE.txt +1 -1
  23. package/dist/container.cjs.js.LICENSE.txt +1 -1
  24. package/dist/container.esm.js.LICENSE.txt +1 -1
  25. package/dist/data-list.cjs.js.LICENSE.txt +1 -1
  26. package/dist/data-list.esm.js.LICENSE.txt +1 -1
  27. package/dist/designer.cjs.js +1 -1
  28. package/dist/designer.cjs.js.LICENSE.txt +1 -1
  29. package/dist/designer.esm.js +1 -1
  30. package/dist/designer.esm.js.LICENSE.txt +1 -1
  31. package/dist/element-mapper.cjs.js +1 -1
  32. package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
  33. package/dist/element-mapper.esm.js +1 -1
  34. package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
  35. package/dist/finalresult.esm.js +1 -1
  36. package/dist/finalresult.esm.js.LICENSE.txt +1 -1
  37. package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
  38. package/dist/flex-card.esm.js.LICENSE.txt +1 -1
  39. package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
  40. package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
  41. package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
  42. package/dist/flex-row.esm.js.LICENSE.txt +1 -1
  43. package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
  44. package/dist/floating-input.esm.js.LICENSE.txt +1 -1
  45. package/dist/free.cjs.js.LICENSE.txt +1 -1
  46. package/dist/free.esm.js.LICENSE.txt +1 -1
  47. package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
  48. package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
  49. package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
  50. package/dist/image-picker.esm.js.LICENSE.txt +1 -1
  51. package/dist/image.cjs.js.LICENSE.txt +1 -1
  52. package/dist/image.esm.js.LICENSE.txt +1 -1
  53. package/dist/index.cjs.js +1 -1
  54. package/dist/index.cjs.js.LICENSE.txt +1 -1
  55. package/dist/index.d.ts +1 -1
  56. package/dist/index.esm.js +1 -1
  57. package/dist/index.esm.js.LICENSE.txt +1 -1
  58. package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
  59. package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
  60. package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
  61. package/dist/link-getter.esm.js.LICENSE.txt +1 -1
  62. package/dist/link.cjs.js.LICENSE.txt +1 -1
  63. package/dist/link.esm.js.LICENSE.txt +1 -1
  64. package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
  65. package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
  66. package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
  67. package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
  68. package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
  69. package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
  70. package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
  71. package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
  72. package/dist/picker.cjs.js +1 -1
  73. package/dist/picker.cjs.js.LICENSE.txt +1 -1
  74. package/dist/picker.esm.js +1 -1
  75. package/dist/picker.esm.js.LICENSE.txt +1 -1
  76. package/dist/progress.cjs.js.LICENSE.txt +1 -1
  77. package/dist/progress.esm.js.LICENSE.txt +1 -1
  78. package/dist/radio.cjs.js.LICENSE.txt +1 -1
  79. package/dist/radio.esm.js.LICENSE.txt +1 -1
  80. package/dist/range.cjs.js.LICENSE.txt +1 -1
  81. package/dist/range.esm.js.LICENSE.txt +1 -1
  82. package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
  83. package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
  84. package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
  85. package/dist/side-bar.esm.js.LICENSE.txt +1 -1
  86. package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
  87. package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
  88. package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
  89. package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
  90. package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
  91. package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
  92. package/dist/spacer.cjs.js.LICENSE.txt +1 -1
  93. package/dist/spacer.esm.js.LICENSE.txt +1 -1
  94. package/dist/stack.cjs.js.LICENSE.txt +1 -1
  95. package/dist/stack.esm.js.LICENSE.txt +1 -1
  96. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  97. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  98. package/dist/table.cjs.js.LICENSE.txt +1 -1
  99. package/dist/table.esm.js.LICENSE.txt +1 -1
  100. package/dist/text-field.cjs.js.LICENSE.txt +1 -1
  101. package/dist/text-field.esm.js.LICENSE.txt +1 -1
  102. package/dist/text.cjs.js.LICENSE.txt +1 -1
  103. package/dist/text.esm.js.LICENSE.txt +1 -1
  104. package/dist/theme.cjs.js.LICENSE.txt +1 -1
  105. package/dist/theme.esm.js.LICENSE.txt +1 -1
  106. package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
  107. package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
  108. package/dist/ulist.cjs.js.LICENSE.txt +1 -1
  109. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  110. package/dist/video.cjs.js.LICENSE.txt +1 -1
  111. package/dist/video.esm.js.LICENSE.txt +1 -1
  112. package/dist/wrap.cjs.js.LICENSE.txt +1 -1
  113. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  114. package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
  115. package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
  116. package/layout/animator.js +1 -1
  117. package/layout/audio.js +1 -1
  118. package/layout/audionew.js +1 -1
  119. package/layout/base.js +1 -1
  120. package/layout/beta-desktop-bar.js +1 -1
  121. package/layout/beta-mobile-bar.js +1 -1
  122. package/layout/button.js +1 -1
  123. package/layout/center.js +1 -1
  124. package/layout/checkbox.js +1 -1
  125. package/layout/circle.js +1 -1
  126. package/layout/code.js +1 -1
  127. package/layout/container.js +1 -1
  128. package/layout/dropdown-2025.js +1 -1
  129. package/layout/flex-card.js +1 -1
  130. package/layout/flex-grid.js +1 -1
  131. package/layout/flex-row.js +1 -1
  132. package/layout/form-components/custom.js +1 -1
  133. package/layout/form-components/data-list.js +1 -1
  134. package/layout/form-components/floating-input.js +1 -1
  135. package/layout/form-components/form-all.js +1 -1
  136. package/layout/form-components/form.js +1 -1
  137. package/layout/form-components/image-picker.js +1 -1
  138. package/layout/form-components/picker.js +37 -2
  139. package/layout/form-components/radio.js +1 -1
  140. package/layout/form-components/radiogroup.js +1 -1
  141. package/layout/form-components/range.js +1 -1
  142. package/layout/free.js +1 -1
  143. package/layout/grid-switcher.js +1 -1
  144. package/layout/grid.js +1 -1
  145. package/layout/horizontal-scroller.js +1 -1
  146. package/layout/image.js +1 -1
  147. package/layout/index.js +1 -1
  148. package/layout/link.js +1 -1
  149. package/layout/list.js +1 -1
  150. package/layout/meta-adder.js +1 -1
  151. package/layout/modal-2025.js +1 -1
  152. package/layout/morph.js +1 -1
  153. package/layout/multiswitcher.js +1 -1
  154. package/layout/nav-bar.js +1 -1
  155. package/layout/nav-factor/custom-div.js +1 -1
  156. package/layout/new-nav-bar.js +1 -1
  157. package/layout/polygon.js +1 -1
  158. package/layout/prerender-site.js +1 -1
  159. package/layout/prerender.js +1 -1
  160. package/layout/progress.js +1 -1
  161. package/layout/row.js +1 -1
  162. package/layout/scroll-video.js +1 -1
  163. package/layout/side-bar.js +1 -1
  164. package/layout/side-nav-bar.js +1 -1
  165. package/layout/simple-bar.js +1 -1
  166. package/layout/slider-2025.js +1 -1
  167. package/layout/spacer.js +1 -1
  168. package/layout/stack.js +1 -1
  169. package/layout/svg.js +1 -1
  170. package/layout/switcher.js +1 -1
  171. package/layout/table.js +1 -1
  172. package/layout/text-field.js +1 -1
  173. package/layout/text.js +1 -1
  174. package/layout/ulist.js +1 -1
  175. package/layout/video.js +1 -1
  176. package/layout/wrap.js +1 -1
  177. package/layout/zoom-card.js +1 -1
  178. package/lib/agent-surface.js +1 -1
  179. package/lib/card-getter.js +1 -1
  180. package/lib/check-page.js +45 -5
  181. package/lib/codegen.js +1 -1
  182. package/lib/data.js +1 -1
  183. package/lib/designer.js +1 -1
  184. package/lib/element-mapper.js +1 -1
  185. package/lib/element-params.generated.js +1 -1
  186. package/lib/keyframe-animation.js +1 -1
  187. package/lib/link-getter.js +1 -1
  188. package/lib/morph-node.js +1 -1
  189. package/lib/normalize-spec.js +1 -1
  190. package/lib/parse-html.js +1 -1
  191. package/lib/raster-inspect.js +1 -1
  192. package/lib/raster-ops.js +1 -1
  193. package/lib/raster-presets.js +1 -1
  194. package/lib/resolve-refs.js +1 -1
  195. package/lib/scroll-video.js +1 -1
  196. package/lib/seo.js +1 -1
  197. package/lib/stacker.js +1 -1
  198. package/lib/suggest.js +1 -1
  199. package/lib/theme.js +1 -1
  200. package/lib/transform-anim.js +1 -1
  201. package/lib/transition.js +1 -1
  202. package/lib/validate-nodes.js +1 -1
  203. package/lib/webmcp-adapter.js +71 -6
  204. package/package.json +1 -1
  205. package/schema.json +7 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/parse-html.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/raster-ops.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/seo.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/stacker.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/suggest.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/theme.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/transition.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -279,18 +279,83 @@ export function installAgentSurface({ mount, elements, nodes, morphs }) {
279
279
  return refuse("MISSING_REQUIRED", missing, Object.keys(props));
280
280
  }
281
281
 
282
- const filled = [];
282
+ // Setting a control is not the same as the control TAKING the
283
+ // value, and the difference used to be invisible. Assigning a
284
+ // `<select>` a value it has no option for leaves it untouched and
285
+ // throws nothing; the old loop pushed the key onto `filled`
286
+ // regardless, so the tool answered `ok: true, filled: [... "topic"]`
287
+ // for a field that never reached the payload. An agent was told
288
+ // its submission carried something it did not.
289
+ //
290
+ // So every field is READ BACK after it is set, and what a control
291
+ // refused is reported rather than counted as done.
292
+ const filled = [], rejected = [], absent = [];
293
+
294
+ /** The values a control will actually accept, where it is a closed set. */
295
+ const accepts = (field) => field.tagName === "SELECT"
296
+ ? [...field.options].map((o) => o.value) : [];
297
+
283
298
  for (const key of Object.keys(props)) {
284
299
  if (args[key] === undefined) continue;
300
+ const want = args[key];
285
301
  const field = form.querySelector(
286
302
  `[name="${key}"], #${CSS.escape(key)}`);
287
- if (!field) continue;
288
- if (field.type === "checkbox") field.checked = !!args[key];
289
- else field.value = String(args[key]);
303
+ // Named by the schema and carried by nothing. Also silent
304
+ // before, and the same lie by omission.
305
+ if (!field) { absent.push(key); continue; }
306
+
307
+ if (field.type === "checkbox") {
308
+ field.checked = !!want;
309
+ } else if (field.type === "radio") {
310
+ // A group, not a field: `querySelector` returns the FIRST
311
+ // radio, and assigning `.value` to it rewrites that
312
+ // button's value instead of choosing the one asked for —
313
+ // which then reads back as a match and reports success
314
+ // while nothing is selected.
315
+ const group = [...form.querySelectorAll(`[name="${key}"]`)];
316
+ const hit = group.find((r) => r.value === String(want));
317
+ if (hit) hit.checked = true;
318
+ else {
319
+ rejected.push({ field: key, got: null,
320
+ valid: group.map((r) => r.value) });
321
+ continue;
322
+ }
323
+ } else {
324
+ field.value = String(want);
325
+ }
290
326
  // Both, because component state may listen for either.
291
327
  field.dispatchEvent(new Event("input", { bubbles: true }));
292
328
  field.dispatchEvent(new Event("change", { bubbles: true }));
293
- filled.push(key);
329
+
330
+ const got = field.type === "checkbox" ? field.checked
331
+ : field.type === "radio" ? String(want) : field.value;
332
+ const took = field.type === "checkbox"
333
+ ? (!!want === got) : (String(want) === got);
334
+ if (took) filled.push(key);
335
+ else rejected.push({ field: key, got, valid: accepts(field) });
336
+ }
337
+
338
+ // Nothing is submitted when a field did not take. A partial
339
+ // payload sent under `ok: true` is the failure this whole
340
+ // architecture exists to remove, and it is worse on the agent
341
+ // path than anywhere else: the caller has no eyes on the page and
342
+ // no reason to doubt the report. The refusal names the field and,
343
+ // where the control has a closed set, what it would have accepted
344
+ // — repairable in one turn.
345
+ if (rejected.length || absent.length) {
346
+ return {
347
+ ...refuse("FIELD_NOT_SET",
348
+ [...rejected.map((r) => r.field), ...absent],
349
+ [...rejected.map((r) => r.valid.length
350
+ ? `"${r.field}" accepts ${r.valid.map((v) => JSON.stringify(v)).join(", ")}`
351
+ : `"${r.field}" did not take the value given`),
352
+ ...absent.map((k) =>
353
+ `"${k}" is named by the schema but no control in the form carries it`)]),
354
+ // What DID land, because the form is now partly filled and
355
+ // a caller retrying needs to know that.
356
+ filled,
357
+ submitted: null,
358
+ };
294
359
  }
295
360
 
296
361
  // Submitted through the form's OWN path, so its listeners,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodality",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "description": "A lightweight library for declarative UI elements.",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
package/schema.json CHANGED
@@ -4814,6 +4814,10 @@
4814
4814
  {
4815
4815
  "name": "items"
4816
4816
  },
4817
+ {
4818
+ "name": "label",
4819
+ "description": "Accessible name for the field."
4820
+ },
4817
4821
  {
4818
4822
  "name": "length"
4819
4823
  },
@@ -4833,6 +4837,9 @@
4833
4837
  "name": "radius",
4834
4838
  "description": "Corner radius in pixels. A bare number, not a CSS length."
4835
4839
  },
4840
+ {
4841
+ "name": "title"
4842
+ },
4836
4843
  {
4837
4844
  "name": "type",
4838
4845
  "description": "Input type attribute. Defaults to \"text\"; \"search\" adds the native clear button."