nodality 1.2.2 → 1.2.3

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 (193) 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.LICENSE.txt +1 -1
  14. package/dist/button.cjs.js.LICENSE.txt +1 -1
  15. package/dist/button.esm.js.LICENSE.txt +1 -1
  16. package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
  17. package/dist/card-getter.esm.js.LICENSE.txt +1 -1
  18. package/dist/center.cjs.js.LICENSE.txt +1 -1
  19. package/dist/center.esm.js.LICENSE.txt +1 -1
  20. package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
  21. package/dist/checkbox.esm.js.LICENSE.txt +1 -1
  22. package/dist/code.cjs.js.LICENSE.txt +1 -1
  23. package/dist/code.esm.js.LICENSE.txt +1 -1
  24. package/dist/container.cjs.js.LICENSE.txt +1 -1
  25. package/dist/container.esm.js.LICENSE.txt +1 -1
  26. package/dist/data-list.cjs.js.LICENSE.txt +1 -1
  27. package/dist/data-list.esm.js.LICENSE.txt +1 -1
  28. package/dist/designer.cjs.js.LICENSE.txt +1 -1
  29. package/dist/designer.esm.js.LICENSE.txt +1 -1
  30. package/dist/element-mapper.cjs.js +1 -1
  31. package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
  32. package/dist/element-mapper.esm.js +1 -1
  33. package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
  34. package/dist/finalresult.esm.js.LICENSE.txt +1 -1
  35. package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
  36. package/dist/flex-card.esm.js.LICENSE.txt +1 -1
  37. package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
  38. package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
  39. package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
  40. package/dist/flex-row.esm.js.LICENSE.txt +1 -1
  41. package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
  42. package/dist/floating-input.esm.js.LICENSE.txt +1 -1
  43. package/dist/free.cjs.js.LICENSE.txt +1 -1
  44. package/dist/free.esm.js.LICENSE.txt +1 -1
  45. package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
  46. package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
  47. package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
  48. package/dist/image-picker.esm.js.LICENSE.txt +1 -1
  49. package/dist/image.cjs.js.LICENSE.txt +1 -1
  50. package/dist/image.esm.js.LICENSE.txt +1 -1
  51. package/dist/index.cjs.js.LICENSE.txt +1 -1
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.esm.js.LICENSE.txt +1 -1
  54. package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
  55. package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
  56. package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
  57. package/dist/link-getter.esm.js.LICENSE.txt +1 -1
  58. package/dist/link.cjs.js.LICENSE.txt +1 -1
  59. package/dist/link.esm.js.LICENSE.txt +1 -1
  60. package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
  61. package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
  62. package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
  63. package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
  64. package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
  65. package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
  66. package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
  67. package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
  68. package/dist/picker.cjs.js.LICENSE.txt +1 -1
  69. package/dist/picker.esm.js.LICENSE.txt +1 -1
  70. package/dist/progress.cjs.js.LICENSE.txt +1 -1
  71. package/dist/progress.esm.js.LICENSE.txt +1 -1
  72. package/dist/radio.cjs.js.LICENSE.txt +1 -1
  73. package/dist/radio.esm.js.LICENSE.txt +1 -1
  74. package/dist/range.cjs.js.LICENSE.txt +1 -1
  75. package/dist/range.esm.js.LICENSE.txt +1 -1
  76. package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
  77. package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
  78. package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
  79. package/dist/side-bar.esm.js.LICENSE.txt +1 -1
  80. package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
  81. package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
  82. package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
  83. package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
  84. package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
  85. package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
  86. package/dist/spacer.cjs.js.LICENSE.txt +1 -1
  87. package/dist/spacer.esm.js.LICENSE.txt +1 -1
  88. package/dist/stack.cjs.js.LICENSE.txt +1 -1
  89. package/dist/stack.esm.js.LICENSE.txt +1 -1
  90. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  91. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  92. package/dist/table.cjs.js.LICENSE.txt +1 -1
  93. package/dist/table.esm.js.LICENSE.txt +1 -1
  94. package/dist/text-field.cjs.js.LICENSE.txt +1 -1
  95. package/dist/text-field.esm.js.LICENSE.txt +1 -1
  96. package/dist/text.cjs.js.LICENSE.txt +1 -1
  97. package/dist/text.esm.js.LICENSE.txt +1 -1
  98. package/dist/theme.cjs.js.LICENSE.txt +1 -1
  99. package/dist/theme.esm.js.LICENSE.txt +1 -1
  100. package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
  101. package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
  102. package/dist/ulist.cjs.js.LICENSE.txt +1 -1
  103. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  104. package/dist/video.cjs.js.LICENSE.txt +1 -1
  105. package/dist/video.esm.js.LICENSE.txt +1 -1
  106. package/dist/wrap.cjs.js.LICENSE.txt +1 -1
  107. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  108. package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
  109. package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
  110. package/layout/animator.js +1 -1
  111. package/layout/audio.js +1 -1
  112. package/layout/audionew.js +1 -1
  113. package/layout/base.js +1 -1
  114. package/layout/beta-desktop-bar.js +1 -1
  115. package/layout/beta-mobile-bar.js +1 -1
  116. package/layout/button.js +1 -1
  117. package/layout/center.js +1 -1
  118. package/layout/checkbox.js +1 -1
  119. package/layout/circle.js +1 -1
  120. package/layout/code.js +1 -1
  121. package/layout/container.js +1 -1
  122. package/layout/dropdown-2025.js +1 -1
  123. package/layout/flex-card.js +1 -1
  124. package/layout/flex-grid.js +1 -1
  125. package/layout/flex-row.js +1 -1
  126. package/layout/form-components/custom.js +1 -1
  127. package/layout/form-components/data-list.js +1 -1
  128. package/layout/form-components/floating-input.js +1 -1
  129. package/layout/form-components/form-all.js +1 -1
  130. package/layout/form-components/form.js +1 -1
  131. package/layout/form-components/image-picker.js +1 -1
  132. package/layout/form-components/picker.js +1 -1
  133. package/layout/form-components/radio.js +1 -1
  134. package/layout/form-components/radiogroup.js +1 -1
  135. package/layout/form-components/range.js +1 -1
  136. package/layout/free.js +1 -1
  137. package/layout/grid-switcher.js +1 -1
  138. package/layout/grid.js +1 -1
  139. package/layout/horizontal-scroller.js +1 -1
  140. package/layout/image.js +1 -1
  141. package/layout/index.js +1 -1
  142. package/layout/link.js +1 -1
  143. package/layout/list.js +1 -1
  144. package/layout/meta-adder.js +1 -1
  145. package/layout/modal-2025.js +1 -1
  146. package/layout/morph.js +1 -1
  147. package/layout/multiswitcher.js +1 -1
  148. package/layout/nav-bar.js +1 -1
  149. package/layout/nav-factor/custom-div.js +1 -1
  150. package/layout/new-nav-bar.js +1 -1
  151. package/layout/polygon.js +1 -1
  152. package/layout/prerender-site.js +1 -1
  153. package/layout/prerender.js +1 -1
  154. package/layout/progress.js +1 -1
  155. package/layout/row.js +1 -1
  156. package/layout/scroll-video.js +1 -1
  157. package/layout/side-bar.js +1 -1
  158. package/layout/side-nav-bar.js +1 -1
  159. package/layout/simple-bar.js +1 -1
  160. package/layout/slider-2025.js +1 -1
  161. package/layout/spacer.js +1 -1
  162. package/layout/stack.js +1 -1
  163. package/layout/svg.js +1 -1
  164. package/layout/switcher.js +1 -1
  165. package/layout/table.js +1 -1
  166. package/layout/text-field.js +1 -1
  167. package/layout/text.js +1 -1
  168. package/layout/ulist.js +1 -1
  169. package/layout/video.js +1 -1
  170. package/layout/wrap.js +1 -1
  171. package/layout/zoom-card.js +1 -1
  172. package/lib/agent-surface.js +1 -1
  173. package/lib/card-getter.js +1 -1
  174. package/lib/codegen.js +1 -1
  175. package/lib/data.js +1 -1
  176. package/lib/designer.js +1 -1
  177. package/lib/element-mapper.js +7 -2
  178. package/lib/keyframe-animation.js +1 -1
  179. package/lib/link-getter.js +1 -1
  180. package/lib/morph-node.js +1 -1
  181. package/lib/raster-inspect.js +1 -1
  182. package/lib/raster-ops.js +1 -1
  183. package/lib/raster-presets.js +1 -1
  184. package/lib/scroll-video.js +1 -1
  185. package/lib/seo.js +1 -1
  186. package/lib/stacker.js +1 -1
  187. package/lib/suggest.js +1 -1
  188. package/lib/theme.js +1 -1
  189. package/lib/transform-anim.js +1 -1
  190. package/lib/transition.js +1 -1
  191. package/lib/validate-nodes.js +75 -4
  192. package/lib/webmcp-adapter.js +1 -1
  193. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.2
2
+ * nodality v1.2.3
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.3
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.3
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.3
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.3",
4
4
  "description": "A lightweight library for declarative UI elements.",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",