nodality 1.3.15 → 1.3.17

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 (288) hide show
  1. package/bin/install-skill.mjs +3 -3
  2. package/bin/mcp-server.mjs +46 -1
  3. package/bin/nodality.mjs +103 -0
  4. package/dist/animator.cjs.js +1 -1
  5. package/dist/animator.cjs.js.LICENSE.txt +1 -1
  6. package/dist/animator.esm.js +1 -1
  7. package/dist/animator.esm.js.LICENSE.txt +1 -1
  8. package/dist/audionew.cjs.js +1 -1
  9. package/dist/audionew.cjs.js.LICENSE.txt +1 -1
  10. package/dist/audionew.esm.js +1 -1
  11. package/dist/audionew.esm.js.LICENSE.txt +1 -1
  12. package/dist/base.cjs.js +1 -1
  13. package/dist/base.cjs.js.LICENSE.txt +1 -1
  14. package/dist/base.esm.js +1 -1
  15. package/dist/base.esm.js.LICENSE.txt +1 -1
  16. package/dist/beta-desktop-bar.cjs.js +1 -1
  17. package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
  18. package/dist/beta-desktop-bar.esm.js +1 -1
  19. package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
  20. package/dist/beta-mobile-bar.cjs.js +1 -1
  21. package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
  22. package/dist/beta-mobile-bar.esm.js +1 -1
  23. package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
  24. package/dist/bundle.umd.js +1 -1
  25. package/dist/bundle.umd.js.LICENSE.txt +1 -1
  26. package/dist/button.cjs.js +1 -1
  27. package/dist/button.cjs.js.LICENSE.txt +1 -1
  28. package/dist/button.esm.js +1 -1
  29. package/dist/button.esm.js.LICENSE.txt +1 -1
  30. package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
  31. package/dist/card-getter.esm.js.LICENSE.txt +1 -1
  32. package/dist/center.cjs.js +1 -1
  33. package/dist/center.cjs.js.LICENSE.txt +1 -1
  34. package/dist/center.esm.js +1 -1
  35. package/dist/center.esm.js.LICENSE.txt +1 -1
  36. package/dist/checkbox.cjs.js +1 -1
  37. package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
  38. package/dist/checkbox.esm.js +1 -1
  39. package/dist/checkbox.esm.js.LICENSE.txt +1 -1
  40. package/dist/code.cjs.js +1 -1
  41. package/dist/code.cjs.js.LICENSE.txt +1 -1
  42. package/dist/code.esm.js +1 -1
  43. package/dist/code.esm.js.LICENSE.txt +1 -1
  44. package/dist/container.cjs.js +1 -1
  45. package/dist/container.cjs.js.LICENSE.txt +1 -1
  46. package/dist/container.esm.js +1 -1
  47. package/dist/container.esm.js.LICENSE.txt +1 -1
  48. package/dist/data-list.cjs.js.LICENSE.txt +1 -1
  49. package/dist/data-list.esm.js.LICENSE.txt +1 -1
  50. package/dist/designer.cjs.js +1 -1
  51. package/dist/designer.cjs.js.LICENSE.txt +1 -1
  52. package/dist/designer.esm.js +1 -1
  53. package/dist/designer.esm.js.LICENSE.txt +1 -1
  54. package/dist/element-mapper.cjs.js +1 -1
  55. package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
  56. package/dist/element-mapper.esm.js +1 -1
  57. package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
  58. package/dist/finalresult.esm.js +1 -1
  59. package/dist/finalresult.esm.js.LICENSE.txt +1 -1
  60. package/dist/flex-card.cjs.js +1 -1
  61. package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
  62. package/dist/flex-card.esm.js +1 -1
  63. package/dist/flex-card.esm.js.LICENSE.txt +1 -1
  64. package/dist/flex-grid.cjs.js +1 -1
  65. package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
  66. package/dist/flex-grid.esm.js +1 -1
  67. package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
  68. package/dist/flex-row.cjs.js +1 -1
  69. package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
  70. package/dist/flex-row.esm.js +1 -1
  71. package/dist/flex-row.esm.js.LICENSE.txt +1 -1
  72. package/dist/floating-input.cjs.js +1 -1
  73. package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
  74. package/dist/floating-input.esm.js +1 -1
  75. package/dist/floating-input.esm.js.LICENSE.txt +1 -1
  76. package/dist/free.cjs.js +1 -1
  77. package/dist/free.cjs.js.LICENSE.txt +1 -1
  78. package/dist/free.esm.js +1 -1
  79. package/dist/free.esm.js.LICENSE.txt +1 -1
  80. package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
  81. package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
  82. package/dist/image-picker.cjs.js +1 -1
  83. package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
  84. package/dist/image-picker.esm.js +1 -1
  85. package/dist/image-picker.esm.js.LICENSE.txt +1 -1
  86. package/dist/image.cjs.js +1 -1
  87. package/dist/image.cjs.js.LICENSE.txt +1 -1
  88. package/dist/image.esm.js +1 -1
  89. package/dist/image.esm.js.LICENSE.txt +1 -1
  90. package/dist/index.cjs.js +1 -1
  91. package/dist/index.cjs.js.LICENSE.txt +1 -1
  92. package/dist/index.d.ts +3 -2
  93. package/dist/index.esm.js +1 -1
  94. package/dist/index.esm.js.LICENSE.txt +1 -1
  95. package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
  96. package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
  97. package/dist/link-getter.cjs.js +1 -1
  98. package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
  99. package/dist/link-getter.esm.js +1 -1
  100. package/dist/link-getter.esm.js.LICENSE.txt +1 -1
  101. package/dist/link.cjs.js +1 -1
  102. package/dist/link.cjs.js.LICENSE.txt +1 -1
  103. package/dist/link.esm.js +1 -1
  104. package/dist/link.esm.js.LICENSE.txt +1 -1
  105. package/dist/meta-adder.cjs.js +1 -1
  106. package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
  107. package/dist/meta-adder.esm.js +1 -1
  108. package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
  109. package/dist/modal-2025.cjs.js +1 -1
  110. package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
  111. package/dist/modal-2025.esm.js +1 -1
  112. package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
  113. package/dist/multiswitcher.cjs.js +1 -1
  114. package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
  115. package/dist/multiswitcher.esm.js +1 -1
  116. package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
  117. package/dist/new-nav-bar.cjs.js +1 -1
  118. package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
  119. package/dist/new-nav-bar.esm.js +1 -1
  120. package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
  121. package/dist/picker.cjs.js +1 -1
  122. package/dist/picker.cjs.js.LICENSE.txt +1 -1
  123. package/dist/picker.esm.js +1 -1
  124. package/dist/picker.esm.js.LICENSE.txt +1 -1
  125. package/dist/progress.cjs.js +1 -1
  126. package/dist/progress.cjs.js.LICENSE.txt +1 -1
  127. package/dist/progress.esm.js +1 -1
  128. package/dist/progress.esm.js.LICENSE.txt +1 -1
  129. package/dist/radio.cjs.js.LICENSE.txt +1 -1
  130. package/dist/radio.esm.js.LICENSE.txt +1 -1
  131. package/dist/range.cjs.js.LICENSE.txt +1 -1
  132. package/dist/range.esm.js.LICENSE.txt +1 -1
  133. package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
  134. package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
  135. package/dist/side-bar.cjs.js +1 -1
  136. package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
  137. package/dist/side-bar.esm.js +1 -1
  138. package/dist/side-bar.esm.js.LICENSE.txt +1 -1
  139. package/dist/side-nav-bar.cjs.js +1 -1
  140. package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
  141. package/dist/side-nav-bar.esm.js +1 -1
  142. package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
  143. package/dist/simple-bar.cjs.js +1 -1
  144. package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
  145. package/dist/simple-bar.esm.js +1 -1
  146. package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
  147. package/dist/slider-2025.cjs.js +1 -1
  148. package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
  149. package/dist/slider-2025.esm.js +1 -1
  150. package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
  151. package/dist/spacer.cjs.js +1 -1
  152. package/dist/spacer.cjs.js.LICENSE.txt +1 -1
  153. package/dist/spacer.esm.js +1 -1
  154. package/dist/spacer.esm.js.LICENSE.txt +1 -1
  155. package/dist/stack.cjs.js +1 -1
  156. package/dist/stack.cjs.js.LICENSE.txt +1 -1
  157. package/dist/stack.esm.js +1 -1
  158. package/dist/stack.esm.js.LICENSE.txt +1 -1
  159. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  160. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  161. package/dist/table.cjs.js +1 -1
  162. package/dist/table.cjs.js.LICENSE.txt +1 -1
  163. package/dist/table.esm.js +1 -1
  164. package/dist/table.esm.js.LICENSE.txt +1 -1
  165. package/dist/text-field.cjs.js +1 -1
  166. package/dist/text-field.cjs.js.LICENSE.txt +1 -1
  167. package/dist/text-field.esm.js +1 -1
  168. package/dist/text-field.esm.js.LICENSE.txt +1 -1
  169. package/dist/text.cjs.js +1 -1
  170. package/dist/text.cjs.js.LICENSE.txt +1 -1
  171. package/dist/text.esm.js +1 -1
  172. package/dist/text.esm.js.LICENSE.txt +1 -1
  173. package/dist/theme.cjs.js.LICENSE.txt +1 -1
  174. package/dist/theme.esm.js.LICENSE.txt +1 -1
  175. package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
  176. package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
  177. package/dist/ulist.cjs.js +1 -1
  178. package/dist/ulist.cjs.js.LICENSE.txt +1 -1
  179. package/dist/ulist.esm.js +1 -1
  180. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  181. package/dist/video.cjs.js +1 -1
  182. package/dist/video.cjs.js.LICENSE.txt +1 -1
  183. package/dist/video.esm.js +1 -1
  184. package/dist/video.esm.js.LICENSE.txt +1 -1
  185. package/dist/wrap.cjs.js +1 -1
  186. package/dist/wrap.cjs.js.LICENSE.txt +1 -1
  187. package/dist/wrap.esm.js +1 -1
  188. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  189. package/dist/zoom-card.cjs.js +1 -1
  190. package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
  191. package/dist/zoom-card.esm.js +1 -1
  192. package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
  193. package/layout/animator.js +38 -1
  194. package/layout/audio.js +1 -1
  195. package/layout/audionew.js +1 -1
  196. package/layout/base.js +1 -1
  197. package/layout/beta-desktop-bar.js +1 -1
  198. package/layout/beta-mobile-bar.js +1 -1
  199. package/layout/button.js +1 -1
  200. package/layout/center.js +1 -1
  201. package/layout/checkbox.js +1 -1
  202. package/layout/circle.js +1 -1
  203. package/layout/code.js +1 -1
  204. package/layout/container.js +1 -1
  205. package/layout/dropdown-2025.js +1 -1
  206. package/layout/flex-card.js +1 -1
  207. package/layout/flex-grid.js +1 -1
  208. package/layout/flex-row.js +1 -1
  209. package/layout/form-components/custom.js +1 -1
  210. package/layout/form-components/data-list.js +1 -1
  211. package/layout/form-components/floating-input.js +1 -1
  212. package/layout/form-components/form-all.js +1 -1
  213. package/layout/form-components/form.js +9 -2
  214. package/layout/form-components/image-picker.js +1 -1
  215. package/layout/form-components/picker.js +1 -1
  216. package/layout/form-components/radio.js +1 -1
  217. package/layout/form-components/radiogroup.js +1 -1
  218. package/layout/form-components/range.js +1 -1
  219. package/layout/free.js +1 -1
  220. package/layout/grid-overlay.js +1 -1
  221. package/layout/grid-switcher.js +1 -1
  222. package/layout/grid.js +1 -1
  223. package/layout/horizontal-scroller.js +1 -1
  224. package/layout/image.js +1 -1
  225. package/layout/index.js +1 -1
  226. package/layout/link.js +6 -3
  227. package/layout/list.js +1 -1
  228. package/layout/meta-adder.js +1 -1
  229. package/layout/modal-2025.js +1 -1
  230. package/layout/morph.js +1 -1
  231. package/layout/multiswitcher.js +1 -1
  232. package/layout/nav-bar.js +1 -1
  233. package/layout/nav-factor/custom-div.js +1 -1
  234. package/layout/new-nav-bar.js +1 -1
  235. package/layout/polygon.js +1 -1
  236. package/layout/prerender-site.js +1 -1
  237. package/layout/prerender.js +1 -1
  238. package/layout/progress.js +1 -1
  239. package/layout/row.js +1 -1
  240. package/layout/scroll-video.js +1 -1
  241. package/layout/shop.js +1 -1
  242. package/layout/side-bar.js +1 -1
  243. package/layout/side-nav-bar.js +1 -1
  244. package/layout/simple-bar.js +1 -1
  245. package/layout/slider-2025.js +1 -1
  246. package/layout/spacer.js +1 -1
  247. package/layout/stack.js +1 -1
  248. package/layout/svg.js +1 -1
  249. package/layout/switcher.js +1 -1
  250. package/layout/table.js +1 -1
  251. package/layout/text-field.js +4 -2
  252. package/layout/text.js +1 -1
  253. package/layout/ulist.js +1 -1
  254. package/layout/video.js +1 -1
  255. package/layout/wrap.js +1 -1
  256. package/layout/zoom-card.js +1 -1
  257. package/lib/agent-surface.js +1 -1
  258. package/lib/card-getter.js +1 -1
  259. package/lib/check-page.js +37 -5
  260. package/lib/codegen.js +1 -1
  261. package/lib/data.js +1 -1
  262. package/lib/designer.js +1 -1
  263. package/lib/element-mapper.js +3 -1
  264. package/lib/element-params.generated.js +3 -3
  265. package/lib/grid-geometry.js +1 -1
  266. package/lib/keyframe-animation.js +1 -1
  267. package/lib/known-inert.js +85 -0
  268. package/lib/link-getter.js +1 -1
  269. package/lib/morph-node.js +1 -1
  270. package/lib/normalize-spec.js +1 -1
  271. package/lib/parse-html.js +1 -1
  272. package/lib/raster-inspect.js +1 -1
  273. package/lib/raster-ops.js +1 -1
  274. package/lib/raster-presets.js +1 -1
  275. package/lib/resolve-refs.js +1 -1
  276. package/lib/scroll-video.js +1 -1
  277. package/lib/seo.js +1 -1
  278. package/lib/stacker.js +1 -1
  279. package/lib/suggest.js +1 -1
  280. package/lib/theme.js +1 -1
  281. package/lib/transform-anim.js +1 -1
  282. package/lib/transition.js +1 -1
  283. package/lib/validate-nodes.js +14 -1
  284. package/lib/webmcp-adapter.js +1 -1
  285. package/package.json +1 -1
  286. package/schema.json +2764 -957
  287. package/scripts/generate-schema.mjs +16 -0
  288. package/skills/nodality/SKILL.md +16 -1
@@ -361,6 +361,15 @@ for (const type of TYPES) {
361
361
  // Read off the element by every mapper regardless of component.
362
362
  for (const p of ["type", "id"]) contributed(p, MAPPER);
363
363
 
364
+ // Options the BASE CLASS applies to every component built on it, after the
365
+ // component's own set() — currently `loop`. Component scans never see them,
366
+ // because they are read in animator.js. Credited only where the type has no
367
+ // parameter of that name already: `video` has its own boolean `loop`.
368
+ const ANIMATOR = join(ROOT, "layout", "animator.js");
369
+ const onAnimator = files.some((f) => { try { return /extends\s+Animator\b/.test(readFileSync(f, "utf8")); } catch { return false; } });
370
+ // And only where the element's options reach the component at all.
371
+ if (onAnimator && forwardsElement) for (const p of ["loop"]) if (!params.has(p)) contributed(p, ANIMATOR);
372
+
364
373
  // NOTE. A `settable` flag was attempted here and removed. The question it
365
374
  // was meant to answer -- which of these parameters an AUTHOR can set on the
366
375
  // element, as opposed to which the components READ -- is real and still
@@ -385,8 +394,15 @@ for (const type of TYPES) {
385
394
  const unit = (UNIT_BY_TYPE[type] && UNIT_BY_TYPE[type][name])
386
395
  || where.map((f) => (UNIT_BY_FILE.get(f) || {})[name]).find(Boolean)
387
396
  || UNIT_GLOBAL[name];
397
+ // Where the name is read. "mapper": the type reads it off the element
398
+ // by name — its own vocabulary. "component": only reachable because the
399
+ // mapper forwards the element to a component that reads it — real, but
400
+ // inherited, and the bulk of a composite's list. Reported so a reader
401
+ // (or get_schema) can put the type's own parameters first.
402
+ const via = where.includes(MAPPER) ? "mapper" : "component";
388
403
  return {
389
404
  name,
405
+ via,
390
406
  ...(unit ? { unit } : {}),
391
407
  ...(description ? { description } : {}),
392
408
  ...(deprecated ? { deprecated } : {}),
@@ -42,6 +42,10 @@ drift. If the MCP is not configured, add it:
42
42
  { "mcpServers": { "nodality": { "command": "npx", "args": ["nodality", "mcp"] } } }
43
43
  ```
44
44
 
45
+ Or let the CLI write it: `npx nodality mcp --register` in the project, or
46
+ `--root=<folder>` when sessions start in a folder above it — the tools only
47
+ appear in sessions started where `.mcp.json` lives.
48
+
45
49
  1. **`list_ops` first.** Never guess an op name, a parameter, an easing
46
50
  name, a transition preset, or an element type. One call returns all
47
51
  of them as data.
@@ -58,7 +62,8 @@ drift. If the MCP is not configured, add it:
58
62
  against real ids and E itself is validated. The report never throws;
59
63
  repair from its `did-you-mean` suggestions and re-validate until
60
64
  clean.
61
- 4. **`preview` to render.** It writes a self-contained HTML file through
65
+ 4. **`preview` to render.** Pass `viewport: "desktop"` to see the wide side of anything chosen by width (the default is a phone); the report lists ids that rendered `empty` instead of leaving a blank page to look finished.
66
+ It writes a self-contained HTML file through
62
67
  the jsdom prerenderer. Know the boundary: the file is prerendered DOM
63
68
  and morph scaffolding only and carries no runtime, so raster effects
64
69
  and transitions will not run from it. To see them, put the pair in a
@@ -76,6 +81,8 @@ does not do what you wrote:
76
81
  |---|---|
77
82
  | `BAD_PARAM_VALUE` | the value is not the shape the parameter takes — `width: 7` is not a CSS length, `mar: 7` is not `[{a: 7}]`. As an *error* where the value is provably inert; as a warning otherwise. |
78
83
  | `PARAM_NOT_ON_TYPE` | a real parameter name that THIS type does not read, so it is accepted and dropped — `keySet` on a `table`. |
84
+ | `PARAM_INERT` | a parameter the type DOES list, and is known to ignore (the library's conformance baseline) — `size` on a `p`, `color` on a `checkbox`. The hint says what to use instead. |
85
+ | `STORE_AFTER_PRODUCT` / `NO_STORE` | a commerce `product` placed before the page's `store`, or with none: it renders empty. |
79
86
 
80
87
  `get_schema <type>` carries a `unit` on every parameter whose shape the
81
88
  source declares, which is where those checks come from, and a
@@ -198,6 +205,11 @@ A complete navigation graph is one node:
198
205
  element/op (extend the library), or the `keySet` option on an element
199
206
  (`keySet: { key, value }`) for one custom CSS property. Note the
200
207
  spelling: `keySet`, capital S.
208
+ - **No CSS in the page either.** No `<style>` rules, no `@keyframes`, no
209
+ stylesheet files. Anything that moves on its own takes `loop` on the element —
210
+ `loop: { keyframes: [{…}, {…}], duration }` runs forever through the Web
211
+ Animations API and holds still for reduced motion. If something cannot be
212
+ expressed, extend the library.
201
213
  - **Elements take `text`, never `value`.**
202
214
  - **Every element that a node targets needs an `id`.** Short and stable
203
215
  (`"hero"`, `"topnav"`); ids are the joint between the two arrays and
@@ -314,6 +326,9 @@ document is untrusted input.
314
326
 
315
327
  ## Verifying your work
316
328
 
329
+ - **Read `FAINT_TEXT` from `check_page`.** It reports small text that passes
330
+ WCAG and still reads faint (APCA), the usual case on mid-tone backgrounds.
331
+ Fix with weight, a lighter or darker ground, or size; not by ignoring it.
317
332
  - **Verify a morph by progress, not by DOM presence.** The destination
318
333
  view is inserted before capture begins, so "the element exists" passes
319
334
  even when the transition hangs. Assert that the animation *progressed*