nodality 1.3.5 → 1.3.7

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 (248) hide show
  1. package/dist/animator.cjs.js +1 -1
  2. package/dist/animator.cjs.js.LICENSE.txt +3 -1
  3. package/dist/animator.esm.js.LICENSE.txt +1 -1
  4. package/dist/audionew.cjs.js +1 -1
  5. package/dist/audionew.cjs.js.LICENSE.txt +3 -1
  6. package/dist/audionew.esm.js.LICENSE.txt +1 -1
  7. package/dist/base.cjs.js +1 -1
  8. package/dist/base.cjs.js.LICENSE.txt +3 -1
  9. package/dist/base.esm.js.LICENSE.txt +1 -1
  10. package/dist/beta-desktop-bar.cjs.js +1 -1
  11. package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +3 -1
  12. package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
  13. package/dist/beta-mobile-bar.cjs.js +1 -1
  14. package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +3 -1
  15. package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
  16. package/dist/bundle.umd.js +1 -1
  17. package/dist/bundle.umd.js.LICENSE.txt +1 -1
  18. package/dist/button.cjs.js +1 -1
  19. package/dist/button.cjs.js.LICENSE.txt +3 -1
  20. package/dist/button.esm.js.LICENSE.txt +1 -1
  21. package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
  22. package/dist/card-getter.esm.js.LICENSE.txt +1 -1
  23. package/dist/center.cjs.js +1 -1
  24. package/dist/center.cjs.js.LICENSE.txt +3 -1
  25. package/dist/center.esm.js.LICENSE.txt +1 -1
  26. package/dist/checkbox.cjs.js +1 -1
  27. package/dist/checkbox.cjs.js.LICENSE.txt +3 -1
  28. package/dist/checkbox.esm.js.LICENSE.txt +1 -1
  29. package/dist/code.cjs.js +1 -1
  30. package/dist/code.cjs.js.LICENSE.txt +3 -1
  31. package/dist/code.esm.js.LICENSE.txt +1 -1
  32. package/dist/container.cjs.js +1 -1
  33. package/dist/container.cjs.js.LICENSE.txt +3 -1
  34. package/dist/container.esm.js.LICENSE.txt +1 -1
  35. package/dist/data-list.cjs.js +1 -1
  36. package/dist/data-list.cjs.js.LICENSE.txt +1 -1
  37. package/dist/data-list.esm.js.LICENSE.txt +1 -1
  38. package/dist/designer.cjs.js +1 -1
  39. package/dist/designer.cjs.js.LICENSE.txt +1 -1
  40. package/dist/designer.esm.js +1 -1
  41. package/dist/designer.esm.js.LICENSE.txt +1 -1
  42. package/dist/element-mapper.cjs.js +1 -1
  43. package/dist/element-mapper.cjs.js.LICENSE.txt +3 -1
  44. package/dist/element-mapper.esm.js +1 -1
  45. package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
  46. package/dist/finalresult.esm.js +1 -1
  47. package/dist/finalresult.esm.js.LICENSE.txt +1 -1
  48. package/dist/flex-card.cjs.js +1 -1
  49. package/dist/flex-card.cjs.js.LICENSE.txt +3 -1
  50. package/dist/flex-card.esm.js.LICENSE.txt +1 -1
  51. package/dist/flex-grid.cjs.js +1 -1
  52. package/dist/flex-grid.cjs.js.LICENSE.txt +3 -1
  53. package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
  54. package/dist/flex-row.cjs.js +1 -1
  55. package/dist/flex-row.cjs.js.LICENSE.txt +3 -1
  56. package/dist/flex-row.esm.js.LICENSE.txt +1 -1
  57. package/dist/floating-input.cjs.js +1 -1
  58. package/dist/floating-input.cjs.js.LICENSE.txt +3 -1
  59. package/dist/floating-input.esm.js.LICENSE.txt +1 -1
  60. package/dist/free.cjs.js +1 -1
  61. package/dist/free.cjs.js.LICENSE.txt +3 -1
  62. package/dist/free.esm.js.LICENSE.txt +1 -1
  63. package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
  64. package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
  65. package/dist/image-picker.cjs.js +1 -1
  66. package/dist/image-picker.cjs.js.LICENSE.txt +3 -1
  67. package/dist/image-picker.esm.js.LICENSE.txt +1 -1
  68. package/dist/image.cjs.js +1 -1
  69. package/dist/image.cjs.js.LICENSE.txt +3 -1
  70. package/dist/image.esm.js.LICENSE.txt +1 -1
  71. package/dist/index.cjs.js +1 -1
  72. package/dist/index.cjs.js.LICENSE.txt +1 -1
  73. package/dist/index.d.ts +1 -1
  74. package/dist/index.esm.js +1 -1
  75. package/dist/index.esm.js.LICENSE.txt +1 -1
  76. package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
  77. package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
  78. package/dist/link-getter.cjs.js +1 -1
  79. package/dist/link-getter.cjs.js.LICENSE.txt +3 -1
  80. package/dist/link-getter.esm.js.LICENSE.txt +1 -1
  81. package/dist/link.cjs.js +1 -1
  82. package/dist/link.cjs.js.LICENSE.txt +3 -1
  83. package/dist/link.esm.js.LICENSE.txt +1 -1
  84. package/dist/meta-adder.cjs.js +1 -1
  85. package/dist/meta-adder.cjs.js.LICENSE.txt +3 -1
  86. package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
  87. package/dist/modal-2025.cjs.js +1 -1
  88. package/dist/modal-2025.cjs.js.LICENSE.txt +3 -1
  89. package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
  90. package/dist/multiswitcher.cjs.js +1 -1
  91. package/dist/multiswitcher.cjs.js.LICENSE.txt +3 -1
  92. package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
  93. package/dist/new-nav-bar.cjs.js +1 -1
  94. package/dist/new-nav-bar.cjs.js.LICENSE.txt +3 -1
  95. package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
  96. package/dist/picker.cjs.js +1 -1
  97. package/dist/picker.cjs.js.LICENSE.txt +3 -1
  98. package/dist/picker.esm.js.LICENSE.txt +1 -1
  99. package/dist/progress.cjs.js +1 -1
  100. package/dist/progress.cjs.js.LICENSE.txt +3 -1
  101. package/dist/progress.esm.js.LICENSE.txt +1 -1
  102. package/dist/radio.cjs.js +1 -1
  103. package/dist/radio.cjs.js.LICENSE.txt +1 -1
  104. package/dist/radio.esm.js.LICENSE.txt +1 -1
  105. package/dist/range.cjs.js +1 -1
  106. package/dist/range.cjs.js.LICENSE.txt +1 -1
  107. package/dist/range.esm.js.LICENSE.txt +1 -1
  108. package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
  109. package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
  110. package/dist/side-bar.cjs.js +1 -1
  111. package/dist/side-bar.cjs.js.LICENSE.txt +3 -1
  112. package/dist/side-bar.esm.js.LICENSE.txt +1 -1
  113. package/dist/side-nav-bar.cjs.js +1 -1
  114. package/dist/side-nav-bar.cjs.js.LICENSE.txt +3 -1
  115. package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
  116. package/dist/simple-bar.cjs.js +1 -1
  117. package/dist/simple-bar.cjs.js.LICENSE.txt +3 -1
  118. package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
  119. package/dist/slider-2025.cjs.js +1 -1
  120. package/dist/slider-2025.cjs.js.LICENSE.txt +3 -1
  121. package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
  122. package/dist/spacer.cjs.js +1 -1
  123. package/dist/spacer.cjs.js.LICENSE.txt +3 -1
  124. package/dist/spacer.esm.js.LICENSE.txt +1 -1
  125. package/dist/stack.cjs.js +1 -1
  126. package/dist/stack.cjs.js.LICENSE.txt +3 -1
  127. package/dist/stack.esm.js.LICENSE.txt +1 -1
  128. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  129. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  130. package/dist/table.cjs.js +1 -1
  131. package/dist/table.cjs.js.LICENSE.txt +3 -1
  132. package/dist/table.esm.js.LICENSE.txt +1 -1
  133. package/dist/text-field.cjs.js +1 -1
  134. package/dist/text-field.cjs.js.LICENSE.txt +3 -1
  135. package/dist/text-field.esm.js.LICENSE.txt +1 -1
  136. package/dist/text.cjs.js +1 -1
  137. package/dist/text.cjs.js.LICENSE.txt +3 -1
  138. package/dist/text.esm.js.LICENSE.txt +1 -1
  139. package/dist/theme.cjs.js.LICENSE.txt +1 -1
  140. package/dist/theme.esm.js.LICENSE.txt +1 -1
  141. package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
  142. package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
  143. package/dist/ulist.cjs.js +1 -1
  144. package/dist/ulist.cjs.js.LICENSE.txt +3 -1
  145. package/dist/ulist.esm.js +1 -1
  146. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  147. package/dist/video.cjs.js +1 -1
  148. package/dist/video.cjs.js.LICENSE.txt +3 -1
  149. package/dist/video.esm.js.LICENSE.txt +1 -1
  150. package/dist/wrap.cjs.js +1 -1
  151. package/dist/wrap.cjs.js.LICENSE.txt +3 -1
  152. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  153. package/dist/zoom-card.cjs.js +1 -1
  154. package/dist/zoom-card.cjs.js.LICENSE.txt +3 -1
  155. package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
  156. package/layout/animator.js +1 -1
  157. package/layout/audio.js +1 -1
  158. package/layout/audionew.js +1 -1
  159. package/layout/base.js +1 -1
  160. package/layout/beta-desktop-bar.js +1 -1
  161. package/layout/beta-mobile-bar.js +1 -1
  162. package/layout/button.js +1 -1
  163. package/layout/center.js +1 -1
  164. package/layout/checkbox.js +1 -1
  165. package/layout/circle.js +1 -1
  166. package/layout/code.js +1 -1
  167. package/layout/container.js +1 -1
  168. package/layout/dropdown-2025.js +1 -1
  169. package/layout/flex-card.js +1 -1
  170. package/layout/flex-grid.js +1 -1
  171. package/layout/flex-row.js +1 -1
  172. package/layout/form-components/custom.js +1 -1
  173. package/layout/form-components/data-list.js +1 -1
  174. package/layout/form-components/floating-input.js +1 -1
  175. package/layout/form-components/form-all.js +1 -1
  176. package/layout/form-components/form.js +1 -1
  177. package/layout/form-components/image-picker.js +1 -1
  178. package/layout/form-components/picker.js +1 -1
  179. package/layout/form-components/radio.js +1 -1
  180. package/layout/form-components/radiogroup.js +1 -1
  181. package/layout/form-components/range.js +1 -1
  182. package/layout/free.js +1 -1
  183. package/layout/grid-switcher.js +1 -1
  184. package/layout/grid.js +1 -1
  185. package/layout/horizontal-scroller.js +1 -1
  186. package/layout/image.js +1 -1
  187. package/layout/index.js +1 -1
  188. package/layout/link.js +1 -1
  189. package/layout/list.js +1 -1
  190. package/layout/meta-adder.js +1 -1
  191. package/layout/modal-2025.js +1 -1
  192. package/layout/morph.js +1 -1
  193. package/layout/multiswitcher.js +1 -1
  194. package/layout/nav-bar.js +1 -1
  195. package/layout/nav-factor/custom-div.js +1 -1
  196. package/layout/new-nav-bar.js +1 -1
  197. package/layout/polygon.js +1 -1
  198. package/layout/prerender-site.js +1 -1
  199. package/layout/prerender.js +1 -1
  200. package/layout/progress.js +1 -1
  201. package/layout/row.js +1 -1
  202. package/layout/scroll-video.js +1 -1
  203. package/layout/side-bar.js +1 -1
  204. package/layout/side-nav-bar.js +1 -1
  205. package/layout/simple-bar.js +1 -1
  206. package/layout/slider-2025.js +1 -1
  207. package/layout/spacer.js +1 -1
  208. package/layout/stack.js +1 -1
  209. package/layout/svg.js +1 -1
  210. package/layout/switcher.js +1 -1
  211. package/layout/table.js +1 -1
  212. package/layout/text-field.js +1 -1
  213. package/layout/text.js +1 -1
  214. package/layout/ulist.js +16 -1
  215. package/layout/video.js +1 -1
  216. package/layout/wrap.js +1 -1
  217. package/layout/zoom-card.js +1 -1
  218. package/lib/agent-surface.js +1 -1
  219. package/lib/card-getter.js +1 -1
  220. package/lib/check-page.js +1 -1
  221. package/lib/codegen.js +1 -1
  222. package/lib/data.js +1 -1
  223. package/lib/designer.js +1 -1
  224. package/lib/element-mapper.js +98 -5
  225. package/lib/element-params.generated.js +1 -1
  226. package/lib/keyframe-animation.js +1 -1
  227. package/lib/link-getter.js +1 -1
  228. package/lib/morph-node.js +1 -1
  229. package/lib/normalize-spec.js +1 -1
  230. package/lib/parse-html.js +1 -1
  231. package/lib/raster-inspect.js +1 -1
  232. package/lib/raster-ops.js +215 -5
  233. package/lib/raster-presets.js +1 -1
  234. package/lib/resolve-refs.js +1 -1
  235. package/lib/scroll-video.js +1 -1
  236. package/lib/seo.js +1 -1
  237. package/lib/stacker.js +1 -1
  238. package/lib/suggest.js +1 -1
  239. package/lib/theme.js +1 -1
  240. package/lib/transform-anim.js +1 -1
  241. package/lib/transition.js +1 -1
  242. package/lib/validate-nodes.js +83 -2
  243. package/lib/webmcp-adapter.js +1 -1
  244. package/package.json +2 -2
  245. package/schema.json +609 -3264
  246. package/scripts/generate-schema.mjs +102 -12
  247. package/skills/nodality/SKILL.md +20 -2
  248. /package/bin/{nodality.js → nodality.mjs} +0 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.5
2
+ * nodality v1.3.7
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -158,9 +158,18 @@ const familyOf = (node) => {
158
158
  // be demonstrated is absent, and absent means silent: reporting a slot that
159
159
  // might work would stop `preview` rendering a page that renders, which 1.2.7
160
160
  // established is the costlier direction to be wrong in.
161
+ //
162
+ // Four types had that evidence and were missing anyway. `stack` was declared in
163
+ // the mapper's copy of this table and not in this one, so the two had already
164
+ // drifted -- which is what the comment on SPEC_ITEMS below warns about, one
165
+ // table over. `dropdown`, `picker` and `radio` read `items` as choices and were
166
+ // in neither. The omission was invisible to the drift test because the test
167
+ // iterated THIS map, so a type absent from it was a type it never checked; the
168
+ // test now iterates the element registry instead.
161
169
  export const CONTENT_SLOT = {
162
170
  cards: "items", nav: "items", sideNav: "items", table: "items", ulist: "items",
163
- row: "children", form: "children", wrap: "children",
171
+ dropdown: "items", picker: "items", radio: "items",
172
+ row: "children", form: "children", stack: "children", wrap: "children",
164
173
  };
165
174
 
166
175
  // Of the types that read `items`, which read the entries as ELEMENT SPECS
@@ -172,6 +181,41 @@ export const CONTENT_SLOT = {
172
181
  // drifted before 1.2.8.
173
182
  export const SPEC_ITEMS = new Set(["ulist"]);
174
183
 
184
+ // Of the types that read `items` but NOT as flat element specs, what an entry
185
+ // may be. Measured by rendering every shape against every type rather than read
186
+ // off the mappers, because the mappers disagree: `table` takes an element spec,
187
+ // `cards` takes one only inside a nested array, and `nav` takes neither.
188
+ //
189
+ // This guards the expensive kind of failure rather than the cheap one. An entry
190
+ // carrying `type` IS a well-formed element spec, so nothing here is a typo and
191
+ // near-miss detection cannot reach it: `cards` renders an empty card, `nav`
192
+ // drops the entry, both pages render, and the content is simply gone. That is
193
+ // the "validates and is wrong" case, and it is the one shape a generator
194
+ // reaches for first, because every other slot in the format takes element
195
+ // specs.
196
+ //
197
+ // `keys` are the fields that prove an entry was MEANT as data. A report fires
198
+ // only when none of them is present -- i.e. only when the entry cannot render
199
+ // anything at all -- because a false report does not annotate the page, it
200
+ // prevents it.
201
+ export const ITEM_SHAPE = {
202
+ cards: {
203
+ nest: true, keys: ["title", "link", "img"],
204
+ valid: 'a data object -- { title, link, img } -- or an ARRAY of element specs, which renders as one card containing them',
205
+ },
206
+ nav: {
207
+ nest: false, keys: ["title", "link"],
208
+ valid: '{ title, link }, or a plain string',
209
+ },
210
+ sideNav: {
211
+ nest: false, keys: ["title", "link"],
212
+ valid: '{ title, link }, or a plain string',
213
+ },
214
+ dropdown: { nest: false, keys: [], valid: 'a plain string, or a [value, text] pair' },
215
+ picker: { nest: false, keys: [], valid: 'a plain string, or a [value, text] pair' },
216
+ radio: { nest: false, keys: [], valid: 'a plain string' },
217
+ };
218
+
175
219
  export function validateNodes(nodes, elements, defs) {
176
220
  const errors = [];
177
221
  const push = (code, path, got, suggestions, valid) => {
@@ -433,6 +477,43 @@ export function validateNodes(nodes, elements, defs) {
433
477
  }
434
478
  });
435
479
  }
480
+
481
+ // Phase S8: an entry in the wrong SHAPE for a type that reads
482
+ // `items` as something other than element specs. The sibling
483
+ // check above walks entries that ARE specs; this one reports
484
+ // entries that are specs where a spec renders nothing.
485
+ //
486
+ // Fires only when the entry carries none of the fields the type
487
+ // reads, so an entry meant as data is never reported, and a
488
+ // `$ref` -- resolved later -- is left alone. The suggestion
489
+ // hands back the replacement rather than describing it, which
490
+ // 8.7.4 measured as the difference between a report a model can
491
+ // act on and one it cannot.
492
+ const shape = ITEM_SHAPE[el.type];
493
+ if (shape && Array.isArray(el.items)) {
494
+ el.items.forEach((entry, k) => {
495
+ const at = `${p}.items[${k}]`;
496
+ if (entry === null || typeof entry !== "object") return;
497
+ if (Array.isArray(entry)) return; // nested spec, or a [value, text] pair
498
+ if (isRef(entry)) return;
499
+ if (shape.keys.some((key) => entry[key] !== undefined)) return;
500
+
501
+ const text = ["text", "title", "label"]
502
+ .map((key) => entry[key]).find((v) => typeof v === "string");
503
+ const suggestions = [];
504
+ if (shape.nest && typeof entry.type === "string") {
505
+ suggestions.push(JSON.stringify([entry]));
506
+ } else if (shape.keys.length) {
507
+ suggestions.push(JSON.stringify({
508
+ title: text === undefined ? "..." : text,
509
+ link: entry.url || entry.link || "#",
510
+ }));
511
+ } else if (text !== undefined) {
512
+ suggestions.push(JSON.stringify(text));
513
+ }
514
+ push("WRONG_ITEM_SHAPE", at, entry, suggestions, [shape.valid]);
515
+ });
516
+ }
436
517
  });
437
518
  };
438
519
  walkEls(toWalk, "elements");
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.5
2
+ * nodality v1.3.7
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "nodality",
3
- "version": "1.3.5",
3
+ "version": "1.3.7",
4
4
  "description": "A lightweight library for declarative UI elements.",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
7
7
  "bin": {
8
- "nodality": "bin/nodality.js"
8
+ "nodality": "bin/nodality.mjs"
9
9
  },
10
10
  "files": [
11
11
  "lib/",