nodality 1.2.2 → 1.2.4

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 (209) hide show
  1. package/README.md +15 -15
  2. package/bin/mcp-server.mjs +17 -4
  3. package/dist/animator.cjs.js.LICENSE.txt +1 -1
  4. package/dist/animator.esm.js.LICENSE.txt +1 -1
  5. package/dist/audionew.cjs.js.LICENSE.txt +1 -1
  6. package/dist/audionew.esm.js.LICENSE.txt +1 -1
  7. package/dist/base.cjs.js.LICENSE.txt +1 -1
  8. package/dist/base.esm.js.LICENSE.txt +1 -1
  9. package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
  10. package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
  11. package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
  12. package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
  13. package/dist/bundle.umd.js +1 -1
  14. package/dist/bundle.umd.js.LICENSE.txt +1 -1
  15. package/dist/button.cjs.js.LICENSE.txt +1 -1
  16. package/dist/button.esm.js.LICENSE.txt +1 -1
  17. package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
  18. package/dist/card-getter.esm.js.LICENSE.txt +1 -1
  19. package/dist/center.cjs.js +1 -1
  20. package/dist/center.cjs.js.LICENSE.txt +1 -1
  21. package/dist/center.esm.js +1 -1
  22. package/dist/center.esm.js.LICENSE.txt +1 -1
  23. package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
  24. package/dist/checkbox.esm.js.LICENSE.txt +1 -1
  25. package/dist/code.cjs.js.LICENSE.txt +1 -1
  26. package/dist/code.esm.js.LICENSE.txt +1 -1
  27. package/dist/container.cjs.js.LICENSE.txt +1 -1
  28. package/dist/container.esm.js.LICENSE.txt +1 -1
  29. package/dist/data-list.cjs.js.LICENSE.txt +1 -1
  30. package/dist/data-list.esm.js.LICENSE.txt +1 -1
  31. package/dist/designer.cjs.js +1 -1
  32. package/dist/designer.cjs.js.LICENSE.txt +1 -1
  33. package/dist/designer.esm.js +1 -1
  34. package/dist/designer.esm.js.LICENSE.txt +1 -1
  35. package/dist/element-mapper.cjs.js +1 -1
  36. package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
  37. package/dist/element-mapper.esm.js +1 -1
  38. package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
  39. package/dist/finalresult.esm.js +1 -1
  40. package/dist/finalresult.esm.js.LICENSE.txt +1 -1
  41. package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
  42. package/dist/flex-card.esm.js.LICENSE.txt +1 -1
  43. package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
  44. package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
  45. package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
  46. package/dist/flex-row.esm.js.LICENSE.txt +1 -1
  47. package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
  48. package/dist/floating-input.esm.js.LICENSE.txt +1 -1
  49. package/dist/free.cjs.js.LICENSE.txt +1 -1
  50. package/dist/free.esm.js.LICENSE.txt +1 -1
  51. package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
  52. package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
  53. package/dist/image-picker.cjs.js +1 -1
  54. package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
  55. package/dist/image-picker.esm.js +1 -1
  56. package/dist/image-picker.esm.js.LICENSE.txt +1 -1
  57. package/dist/image.cjs.js +1 -1
  58. package/dist/image.cjs.js.LICENSE.txt +1 -1
  59. package/dist/image.esm.js +1 -1
  60. package/dist/image.esm.js.LICENSE.txt +1 -1
  61. package/dist/index.cjs.js +1 -1
  62. package/dist/index.cjs.js.LICENSE.txt +1 -1
  63. package/dist/index.d.ts +1 -1
  64. package/dist/index.esm.js +1 -1
  65. package/dist/index.esm.js.LICENSE.txt +1 -1
  66. package/dist/keyframe-animation.cjs.js +1 -1
  67. package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
  68. package/dist/keyframe-animation.esm.js +1 -1
  69. package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
  70. package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
  71. package/dist/link-getter.esm.js.LICENSE.txt +1 -1
  72. package/dist/link.cjs.js.LICENSE.txt +1 -1
  73. package/dist/link.esm.js.LICENSE.txt +1 -1
  74. package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
  75. package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
  76. package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
  77. package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
  78. package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
  79. package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
  80. package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
  81. package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
  82. package/dist/picker.cjs.js.LICENSE.txt +1 -1
  83. package/dist/picker.esm.js.LICENSE.txt +1 -1
  84. package/dist/progress.cjs.js.LICENSE.txt +1 -1
  85. package/dist/progress.esm.js.LICENSE.txt +1 -1
  86. package/dist/radio.cjs.js.LICENSE.txt +1 -1
  87. package/dist/radio.esm.js.LICENSE.txt +1 -1
  88. package/dist/range.cjs.js.LICENSE.txt +1 -1
  89. package/dist/range.esm.js.LICENSE.txt +1 -1
  90. package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
  91. package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
  92. package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
  93. package/dist/side-bar.esm.js.LICENSE.txt +1 -1
  94. package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
  95. package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
  96. package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
  97. package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
  98. package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
  99. package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
  100. package/dist/spacer.cjs.js.LICENSE.txt +1 -1
  101. package/dist/spacer.esm.js.LICENSE.txt +1 -1
  102. package/dist/stack.cjs.js.LICENSE.txt +1 -1
  103. package/dist/stack.esm.js.LICENSE.txt +1 -1
  104. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  105. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  106. package/dist/table.cjs.js.LICENSE.txt +1 -1
  107. package/dist/table.esm.js.LICENSE.txt +1 -1
  108. package/dist/text-field.cjs.js.LICENSE.txt +1 -1
  109. package/dist/text-field.esm.js.LICENSE.txt +1 -1
  110. package/dist/text.cjs.js +1 -1
  111. package/dist/text.cjs.js.LICENSE.txt +1 -1
  112. package/dist/text.esm.js +1 -1
  113. package/dist/text.esm.js.LICENSE.txt +1 -1
  114. package/dist/theme.cjs.js.LICENSE.txt +1 -1
  115. package/dist/theme.esm.js.LICENSE.txt +1 -1
  116. package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
  117. package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
  118. package/dist/ulist.cjs.js.LICENSE.txt +1 -1
  119. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  120. package/dist/video.cjs.js.LICENSE.txt +1 -1
  121. package/dist/video.esm.js.LICENSE.txt +1 -1
  122. package/dist/wrap.cjs.js.LICENSE.txt +1 -1
  123. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  124. package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
  125. package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
  126. package/layout/animator.js +1 -1
  127. package/layout/audio.js +1 -1
  128. package/layout/audionew.js +1 -1
  129. package/layout/base.js +1 -1
  130. package/layout/beta-desktop-bar.js +1 -1
  131. package/layout/beta-mobile-bar.js +1 -1
  132. package/layout/button.js +1 -1
  133. package/layout/center.js +3 -3
  134. package/layout/checkbox.js +1 -1
  135. package/layout/circle.js +1 -1
  136. package/layout/code.js +1 -1
  137. package/layout/container.js +1 -1
  138. package/layout/dropdown-2025.js +1 -1
  139. package/layout/flex-card.js +1 -1
  140. package/layout/flex-grid.js +1 -1
  141. package/layout/flex-row.js +1 -1
  142. package/layout/form-components/custom.js +1 -1
  143. package/layout/form-components/data-list.js +1 -1
  144. package/layout/form-components/floating-input.js +1 -1
  145. package/layout/form-components/form-all.js +1 -1
  146. package/layout/form-components/form.js +1 -1
  147. package/layout/form-components/image-picker.js +2 -2
  148. package/layout/form-components/picker.js +1 -1
  149. package/layout/form-components/radio.js +1 -1
  150. package/layout/form-components/radiogroup.js +1 -1
  151. package/layout/form-components/range.js +1 -1
  152. package/layout/free.js +1 -1
  153. package/layout/grid-switcher.js +1 -1
  154. package/layout/grid.js +1 -1
  155. package/layout/horizontal-scroller.js +1 -1
  156. package/layout/image.js +2 -2
  157. package/layout/index.js +1 -1
  158. package/layout/link.js +1 -1
  159. package/layout/list.js +1 -1
  160. package/layout/meta-adder.js +1 -1
  161. package/layout/modal-2025.js +1 -1
  162. package/layout/morph.js +1 -1
  163. package/layout/multiswitcher.js +1 -1
  164. package/layout/nav-bar.js +1 -1
  165. package/layout/nav-factor/custom-div.js +1 -1
  166. package/layout/new-nav-bar.js +1 -1
  167. package/layout/polygon.js +1 -1
  168. package/layout/prerender-site.js +1 -1
  169. package/layout/prerender.js +1 -1
  170. package/layout/progress.js +1 -1
  171. package/layout/row.js +1 -1
  172. package/layout/scroll-video.js +1 -1
  173. package/layout/side-bar.js +1 -1
  174. package/layout/side-nav-bar.js +1 -1
  175. package/layout/simple-bar.js +1 -1
  176. package/layout/slider-2025.js +1 -1
  177. package/layout/spacer.js +1 -1
  178. package/layout/stack.js +1 -1
  179. package/layout/svg.js +1 -1
  180. package/layout/switcher.js +1 -1
  181. package/layout/table.js +1 -1
  182. package/layout/text-field.js +1 -1
  183. package/layout/text.js +2 -2
  184. package/layout/ulist.js +1 -1
  185. package/layout/video.js +1 -1
  186. package/layout/wrap.js +1 -1
  187. package/layout/zoom-card.js +1 -1
  188. package/lib/agent-surface.js +1 -1
  189. package/lib/card-getter.js +1 -1
  190. package/lib/codegen.js +1 -1
  191. package/lib/data.js +1 -1
  192. package/lib/designer.js +1 -1
  193. package/lib/element-mapper.js +7 -2
  194. package/lib/keyframe-animation.js +2 -2
  195. package/lib/link-getter.js +1 -1
  196. package/lib/morph-node.js +1 -1
  197. package/lib/raster-inspect.js +1 -1
  198. package/lib/raster-ops.js +1 -1
  199. package/lib/raster-presets.js +1 -1
  200. package/lib/scroll-video.js +1 -1
  201. package/lib/seo.js +1 -1
  202. package/lib/stacker.js +1 -1
  203. package/lib/suggest.js +1 -1
  204. package/lib/theme.js +1 -1
  205. package/lib/transform-anim.js +1 -1
  206. package/lib/transition.js +1 -1
  207. package/lib/validate-nodes.js +75 -4
  208. package/lib/webmcp-adapter.js +1 -1
  209. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/grid.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/image.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -372,7 +372,7 @@ let obj = options;
372
372
 
373
373
 
374
374
  setID(id){
375
- this.res.setAttribute("id", id);
375
+ if (id !== undefined && id !== null) this.res.setAttribute("id", id);
376
376
  return this;
377
377
  }
378
378
 
package/layout/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/link.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/list.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/morph.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/nav-bar.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/polygon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/row.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/spacer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/stack.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/svg.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/table.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/text.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -693,7 +693,7 @@ addIcon(obj){
693
693
  if (obj){
694
694
  // alert(obj.type);
695
695
  el = document.createElement(obj.type);
696
- el.setAttribute("id", obj.id);
696
+ if (obj.id !== undefined && obj.id !== null) el.setAttribute("id", obj.id);
697
697
 
698
698
 
699
699
  if (obj.type === "span"){
package/layout/ulist.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/video.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/wrap.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/codegen.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/data.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/designer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1961,4 +1961,9 @@ static form(obj){
1961
1961
  }
1962
1962
 
1963
1963
 
1964
- export {ElementMapper};
1964
+ // ELEMENT_TYPES is exported so the validator can check the E array against
1965
+ // the same vocabulary the mapper dispatches on. Without it the two would
1966
+ // drift, and a validator that accepted a type the mapper rejects would be
1967
+ // worse than none: it would promise an agent that a page is well-formed
1968
+ // and then throw when it rendered.
1969
+ export {ElementMapper, ELEMENT_TYPES};
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -25,7 +25,7 @@ class KeyframeAnim {
25
25
  this.targetHeight = this.data.targetHeight;
26
26
  this.html = document.body;
27
27
  this.res = document.createElement("div"); // stack
28
- this.res.setAttribute("id", this.data.id);
28
+ if (this.data.id !== undefined && this.data.id !== null) this.res.setAttribute("id", this.data.id);
29
29
  this.res.style.border = "1px solid green";
30
30
  this.res.style.width = "100%";
31
31
  this.res.style.display = "grid";
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/morph-node.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
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.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
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.2.2
2
+ * nodality v1.2.4
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.2.2
2
+ * nodality v1.2.4
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.2.2
2
+ * nodality v1.2.4
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.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
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.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -29,6 +29,8 @@ import {
29
29
  REGISTRY, RASTER_OP_NAMES, DRIVER_NAMES, RASTER_UNITS,
30
30
  FRAMEWORK_DOC, EASING_NAMES,
31
31
  } from "./raster-ops.js";
32
+ import { presetNames, presetInfo } from "./raster-presets.js";
33
+ import { ELEMENT_TYPES } from "./element-mapper.js";
32
34
  import { didYouMean, suggest } from "./suggest.js";
33
35
 
34
36
  /**
@@ -131,6 +133,34 @@ export function validateNodes(nodes, elements) {
131
133
  });
132
134
  };
133
135
 
136
+ // ── the E array ─────────────────────────────────────────────────
137
+ //
138
+ // Checked here because half the pair was previously unvalidated: an
139
+ // element whose `type` names nothing is not a silent no-op but a THROW
140
+ // from the mapper at render time, which reaches a generator as a stack
141
+ // trace rather than as a report it can repair from.
142
+ if (idsKnown) {
143
+ const walkEls = (list, at) => {
144
+ if (!Array.isArray(list)) return;
145
+ list.forEach((el, i) => {
146
+ const p = `${at}[${i}]`;
147
+ if (!el || typeof el !== "object" || Array.isArray(el)) {
148
+ push("BAD_ELEMENT", p, el, [], ["{ type: \"<element type>\", ... }"]);
149
+ return;
150
+ }
151
+ if (typeof el.type !== "string") {
152
+ push("MISSING_FIELD", `${p}.type`, el.type, [],
153
+ ["an element type, e.g. \"h1\", \"wrap\", \"nav\""]);
154
+ } else if (!ELEMENT_TYPES.includes(el.type)) {
155
+ push("UNKNOWN_ELEMENT_TYPE", `${p}.type`, el.type,
156
+ suggest(el.type, ELEMENT_TYPES), ELEMENT_TYPES);
157
+ }
158
+ walkEls(el.children, `${p}.children`);
159
+ });
160
+ };
161
+ walkEls(elements, "elements");
162
+ }
163
+
134
164
  nodes.forEach((node, i) => {
135
165
  const path = `nodes[${i}]`;
136
166
  const family = familyOf(node);
@@ -256,6 +286,15 @@ export function validateNodes(nodes, elements) {
256
286
  typeof o.effect !== "string" && !Array.isArray(o.effect)) {
257
287
  push("BAD_FIELD", `${at}.effect`, o.effect, [],
258
288
  ["a preset name, or an inline array of raster nodes"]);
289
+ } else if (typeof o.effect === "string" &&
290
+ !presetNames().includes(o.effect)) {
291
+ // A preset that does not exist resolves to an EMPTY chain
292
+ // and the transition runs with no effect at all: it
293
+ // validates, renders, and does nothing. That is the silent
294
+ // omission this validator exists to remove, and it sat
295
+ // inside the validator's own blind spot until 1.2.3.
296
+ push("UNKNOWN_EFFECT", `${at}.effect`, o.effect,
297
+ suggest(o.effect, presetNames()), presetNames());
259
298
  }
260
299
  for (const flag of ["back", "live"]) {
261
300
  if (o[flag] !== undefined && typeof o[flag] !== "boolean") {
@@ -333,9 +372,31 @@ export function validateNodes(nodes, elements) {
333
372
  // ── raster nodes ────────────────────────────────────────────
334
373
  const def = REGISTRY[node.op];
335
374
  if (!def) {
336
- push("UNKNOWN_OP", `${path}.op`, node.op,
337
- suggest(node.op, RASTER_OP_NAMES), RASTER_OP_NAMES);
338
- return; // parameters cannot be judged without a definition
375
+ const guesses = suggest(node.op, RASTER_OP_NAMES);
376
+ push("UNKNOWN_OP", `${path}.op`, node.op, guesses, RASTER_OP_NAMES);
377
+
378
+ // Parameters cannot be judged without a definition — but where the
379
+ // op is a near miss, they can be judged against the op that was
380
+ // MEANT, and reported as provisional. Without this a node with a
381
+ // misspelled op AND a misspelled parameter takes two round-trips:
382
+ // the op error hides the parameter error until it is fixed. The
383
+ // `assuming` field says which definition the check used, so a
384
+ // consumer can tell a certain finding from a conditional one.
385
+ const meant = guesses.length ? REGISTRY[guesses[0]] : null;
386
+ if (meant) {
387
+ const known = Object.keys((meant.doc && meant.doc.params) || {});
388
+ const shared = Object.keys(FRAMEWORK_DOC);
389
+ for (const key in node) {
390
+ if (key === "op" || shared.includes(key) || known.includes(key)) continue;
391
+ errors.push({
392
+ code: "UNKNOWN_PARAM", path: `${path}.${key}`, got: key,
393
+ suggestions: suggest(key, known.concat(shared)),
394
+ valid: known.concat(shared),
395
+ assuming: guesses[0],
396
+ });
397
+ }
398
+ }
399
+ return;
339
400
  }
340
401
 
341
402
  const params = (def.doc && def.doc.params) || {};
@@ -396,6 +457,16 @@ export function describeOps() {
396
457
  });
397
458
  return {
398
459
  ops,
460
+ // The transition presets a morph's `effect` may name. Absent from
461
+ // this reply until 1.2.3, which left an agent to guess them from an
462
+ // example in the tool description.
463
+ presets: presetNames().map((name) => {
464
+ const info = presetInfo(name) || {};
465
+ return { name, summary: info.summary || "", live: info.live };
466
+ }),
467
+ // The vocabulary of E, so both halves of the pair are discoverable
468
+ // from one call rather than only the half that is transformed.
469
+ elementTypes: ELEMENT_TYPES,
399
470
  shared: Object.keys(FRAMEWORK_DOC).map((k) => ({
400
471
  name: k,
401
472
  default: FRAMEWORK_DOC[k].default,
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.4
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodality",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "A lightweight library for declarative UI elements.",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",