nodality 1.3.19 → 1.3.21

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 (293) hide show
  1. package/bin/mcp-server.mjs +8 -3
  2. package/bin/nodality.mjs +41 -0
  3. package/dist/animator.cjs.js +1 -1
  4. package/dist/animator.cjs.js.LICENSE.txt +1 -1
  5. package/dist/animator.esm.js +1 -1
  6. package/dist/animator.esm.js.LICENSE.txt +1 -1
  7. package/dist/audionew.cjs.js +1 -1
  8. package/dist/audionew.cjs.js.LICENSE.txt +1 -1
  9. package/dist/audionew.esm.js +1 -1
  10. package/dist/audionew.esm.js.LICENSE.txt +1 -1
  11. package/dist/base.cjs.js +1 -1
  12. package/dist/base.cjs.js.LICENSE.txt +1 -1
  13. package/dist/base.esm.js +1 -1
  14. package/dist/base.esm.js.LICENSE.txt +1 -1
  15. package/dist/beta-desktop-bar.cjs.js +1 -1
  16. package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
  17. package/dist/beta-desktop-bar.esm.js +1 -1
  18. package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
  19. package/dist/beta-mobile-bar.cjs.js +1 -1
  20. package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
  21. package/dist/beta-mobile-bar.esm.js +1 -1
  22. package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
  23. package/dist/bundle.umd.js +1 -1
  24. package/dist/bundle.umd.js.LICENSE.txt +1 -1
  25. package/dist/button.cjs.js +1 -1
  26. package/dist/button.cjs.js.LICENSE.txt +1 -1
  27. package/dist/button.esm.js +1 -1
  28. package/dist/button.esm.js.LICENSE.txt +1 -1
  29. package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
  30. package/dist/card-getter.esm.js.LICENSE.txt +1 -1
  31. package/dist/center.cjs.js +1 -1
  32. package/dist/center.cjs.js.LICENSE.txt +1 -1
  33. package/dist/center.esm.js +1 -1
  34. package/dist/center.esm.js.LICENSE.txt +1 -1
  35. package/dist/checkbox.cjs.js +1 -1
  36. package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
  37. package/dist/checkbox.esm.js +1 -1
  38. package/dist/checkbox.esm.js.LICENSE.txt +1 -1
  39. package/dist/code.cjs.js +1 -1
  40. package/dist/code.cjs.js.LICENSE.txt +1 -1
  41. package/dist/code.esm.js +1 -1
  42. package/dist/code.esm.js.LICENSE.txt +1 -1
  43. package/dist/container.cjs.js +1 -1
  44. package/dist/container.cjs.js.LICENSE.txt +1 -1
  45. package/dist/container.esm.js +1 -1
  46. package/dist/container.esm.js.LICENSE.txt +1 -1
  47. package/dist/data-list.cjs.js +1 -1
  48. package/dist/data-list.cjs.js.LICENSE.txt +1 -1
  49. package/dist/data-list.esm.js +1 -1
  50. package/dist/data-list.esm.js.LICENSE.txt +1 -1
  51. package/dist/designer.cjs.js +1 -1
  52. package/dist/designer.cjs.js.LICENSE.txt +1 -1
  53. package/dist/designer.esm.js +1 -1
  54. package/dist/designer.esm.js.LICENSE.txt +1 -1
  55. package/dist/element-mapper.cjs.js +1 -1
  56. package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
  57. package/dist/element-mapper.esm.js +1 -1
  58. package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
  59. package/dist/finalresult.esm.js +1 -1
  60. package/dist/finalresult.esm.js.LICENSE.txt +1 -1
  61. package/dist/flex-card.cjs.js +1 -1
  62. package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
  63. package/dist/flex-card.esm.js +1 -1
  64. package/dist/flex-card.esm.js.LICENSE.txt +1 -1
  65. package/dist/flex-grid.cjs.js +1 -1
  66. package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
  67. package/dist/flex-grid.esm.js +1 -1
  68. package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
  69. package/dist/flex-row.cjs.js +1 -1
  70. package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
  71. package/dist/flex-row.esm.js +1 -1
  72. package/dist/flex-row.esm.js.LICENSE.txt +1 -1
  73. package/dist/floating-input.cjs.js +1 -1
  74. package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
  75. package/dist/floating-input.esm.js +1 -1
  76. package/dist/floating-input.esm.js.LICENSE.txt +1 -1
  77. package/dist/free.cjs.js +1 -1
  78. package/dist/free.cjs.js.LICENSE.txt +1 -1
  79. package/dist/free.esm.js +1 -1
  80. package/dist/free.esm.js.LICENSE.txt +1 -1
  81. package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
  82. package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
  83. package/dist/image-picker.cjs.js +1 -1
  84. package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
  85. package/dist/image-picker.esm.js +1 -1
  86. package/dist/image-picker.esm.js.LICENSE.txt +1 -1
  87. package/dist/image.cjs.js +1 -1
  88. package/dist/image.cjs.js.LICENSE.txt +1 -1
  89. package/dist/image.esm.js +1 -1
  90. package/dist/image.esm.js.LICENSE.txt +1 -1
  91. package/dist/index.cjs.js +1 -1
  92. package/dist/index.cjs.js.LICENSE.txt +1 -1
  93. package/dist/index.d.ts +3 -2
  94. package/dist/index.esm.js +1 -1
  95. package/dist/index.esm.js.LICENSE.txt +1 -1
  96. package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
  97. package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
  98. package/dist/link-getter.cjs.js +1 -1
  99. package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
  100. package/dist/link-getter.esm.js +1 -1
  101. package/dist/link-getter.esm.js.LICENSE.txt +1 -1
  102. package/dist/link.cjs.js +1 -1
  103. package/dist/link.cjs.js.LICENSE.txt +1 -1
  104. package/dist/link.esm.js +1 -1
  105. package/dist/link.esm.js.LICENSE.txt +1 -1
  106. package/dist/meta-adder.cjs.js +1 -1
  107. package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
  108. package/dist/meta-adder.esm.js +1 -1
  109. package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
  110. package/dist/modal-2025.cjs.js +1 -1
  111. package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
  112. package/dist/modal-2025.esm.js +1 -1
  113. package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
  114. package/dist/multiswitcher.cjs.js +1 -1
  115. package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
  116. package/dist/multiswitcher.esm.js +1 -1
  117. package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
  118. package/dist/new-nav-bar.cjs.js +1 -1
  119. package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
  120. package/dist/new-nav-bar.esm.js +1 -1
  121. package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
  122. package/dist/picker.cjs.js +1 -1
  123. package/dist/picker.cjs.js.LICENSE.txt +1 -1
  124. package/dist/picker.esm.js +1 -1
  125. package/dist/picker.esm.js.LICENSE.txt +1 -1
  126. package/dist/progress.cjs.js +1 -1
  127. package/dist/progress.cjs.js.LICENSE.txt +1 -1
  128. package/dist/progress.esm.js +1 -1
  129. package/dist/progress.esm.js.LICENSE.txt +1 -1
  130. package/dist/radio.cjs.js +1 -1
  131. package/dist/radio.cjs.js.LICENSE.txt +1 -1
  132. package/dist/radio.esm.js +1 -1
  133. package/dist/radio.esm.js.LICENSE.txt +1 -1
  134. package/dist/range.cjs.js +1 -1
  135. package/dist/range.cjs.js.LICENSE.txt +1 -1
  136. package/dist/range.esm.js +1 -1
  137. package/dist/range.esm.js.LICENSE.txt +1 -1
  138. package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
  139. package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
  140. package/dist/side-bar.cjs.js +1 -1
  141. package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
  142. package/dist/side-bar.esm.js +1 -1
  143. package/dist/side-bar.esm.js.LICENSE.txt +1 -1
  144. package/dist/side-nav-bar.cjs.js +1 -1
  145. package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
  146. package/dist/side-nav-bar.esm.js +1 -1
  147. package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
  148. package/dist/simple-bar.cjs.js +1 -1
  149. package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
  150. package/dist/simple-bar.esm.js +1 -1
  151. package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
  152. package/dist/slider-2025.cjs.js +1 -1
  153. package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
  154. package/dist/slider-2025.esm.js +1 -1
  155. package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
  156. package/dist/spacer.cjs.js +1 -1
  157. package/dist/spacer.cjs.js.LICENSE.txt +1 -1
  158. package/dist/spacer.esm.js +1 -1
  159. package/dist/spacer.esm.js.LICENSE.txt +1 -1
  160. package/dist/stack.cjs.js +1 -1
  161. package/dist/stack.cjs.js.LICENSE.txt +1 -1
  162. package/dist/stack.esm.js +1 -1
  163. package/dist/stack.esm.js.LICENSE.txt +1 -1
  164. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  165. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  166. package/dist/table.cjs.js +1 -1
  167. package/dist/table.cjs.js.LICENSE.txt +1 -1
  168. package/dist/table.esm.js +1 -1
  169. package/dist/table.esm.js.LICENSE.txt +1 -1
  170. package/dist/text-field.cjs.js +1 -1
  171. package/dist/text-field.cjs.js.LICENSE.txt +1 -1
  172. package/dist/text-field.esm.js +1 -1
  173. package/dist/text-field.esm.js.LICENSE.txt +1 -1
  174. package/dist/text.cjs.js +1 -1
  175. package/dist/text.cjs.js.LICENSE.txt +1 -1
  176. package/dist/text.esm.js +1 -1
  177. package/dist/text.esm.js.LICENSE.txt +1 -1
  178. package/dist/theme.cjs.js.LICENSE.txt +1 -1
  179. package/dist/theme.esm.js.LICENSE.txt +1 -1
  180. package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
  181. package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
  182. package/dist/ulist.cjs.js +1 -1
  183. package/dist/ulist.cjs.js.LICENSE.txt +1 -1
  184. package/dist/ulist.esm.js +1 -1
  185. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  186. package/dist/video.cjs.js +1 -1
  187. package/dist/video.cjs.js.LICENSE.txt +1 -1
  188. package/dist/video.esm.js +1 -1
  189. package/dist/video.esm.js.LICENSE.txt +1 -1
  190. package/dist/wrap.cjs.js +1 -1
  191. package/dist/wrap.cjs.js.LICENSE.txt +1 -1
  192. package/dist/wrap.esm.js +1 -1
  193. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  194. package/dist/zoom-card.cjs.js +1 -1
  195. package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
  196. package/dist/zoom-card.esm.js +1 -1
  197. package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
  198. package/layout/animator.js +191 -135
  199. package/layout/audio.js +1 -1
  200. package/layout/audionew.js +1 -1
  201. package/layout/base.js +1 -1
  202. package/layout/beta-desktop-bar.js +7 -1
  203. package/layout/beta-mobile-bar.js +13 -3
  204. package/layout/button.js +1 -1
  205. package/layout/center.js +1 -1
  206. package/layout/checkbox.js +1 -1
  207. package/layout/circle.js +1 -1
  208. package/layout/code.js +1 -1
  209. package/layout/container.js +1 -1
  210. package/layout/dropdown-2025.js +1 -1
  211. package/layout/flex-card.js +1 -1
  212. package/layout/flex-grid.js +1 -1
  213. package/layout/flex-row.js +1 -1
  214. package/layout/form-components/custom.js +1 -1
  215. package/layout/form-components/data-list.js +1 -1
  216. package/layout/form-components/floating-input.js +1 -1
  217. package/layout/form-components/form-all.js +1 -1
  218. package/layout/form-components/form.js +1 -1
  219. package/layout/form-components/image-picker.js +1 -1
  220. package/layout/form-components/picker.js +1 -1
  221. package/layout/form-components/radio.js +1 -1
  222. package/layout/form-components/radiogroup.js +1 -1
  223. package/layout/form-components/range.js +1 -1
  224. package/layout/free.js +1 -1
  225. package/layout/grid-overlay.js +1 -1
  226. package/layout/grid-switcher.js +1 -1
  227. package/layout/grid.js +1 -1
  228. package/layout/horizontal-scroller.js +1 -1
  229. package/layout/image.js +1 -1
  230. package/layout/index.js +1 -1
  231. package/layout/link.js +1 -1
  232. package/layout/list.js +1 -1
  233. package/layout/meta-adder.js +1 -1
  234. package/layout/modal-2025.js +1 -1
  235. package/layout/morph.js +1 -1
  236. package/layout/multiswitcher.js +1 -1
  237. package/layout/nav-bar.js +1 -1
  238. package/layout/nav-factor/custom-div.js +1 -1
  239. package/layout/new-nav-bar.js +1 -1
  240. package/layout/polygon.js +1 -1
  241. package/layout/prerender-site.js +1 -1
  242. package/layout/prerender.js +1 -1
  243. package/layout/progress.js +1 -1
  244. package/layout/row.js +1 -1
  245. package/layout/scroll-video.js +1 -1
  246. package/layout/shop.js +9 -1
  247. package/layout/side-bar.js +1 -1
  248. package/layout/side-nav-bar.js +1 -1
  249. package/layout/simple-bar.js +1 -1
  250. package/layout/slider-2025.js +1 -1
  251. package/layout/spacer.js +1 -1
  252. package/layout/stack.js +1 -1
  253. package/layout/svg.js +1 -1
  254. package/layout/switcher.js +1 -1
  255. package/layout/table.js +1 -1
  256. package/layout/text-field.js +1 -1
  257. package/layout/text.js +7 -1
  258. package/layout/ulist.js +1 -1
  259. package/layout/video.js +1 -1
  260. package/layout/wrap.js +1 -1
  261. package/layout/zoom-card.js +1 -1
  262. package/lib/agent-surface.js +1 -1
  263. package/lib/card-getter.js +1 -1
  264. package/lib/check-page.js +14 -2
  265. package/lib/codegen.js +1 -1
  266. package/lib/data.js +1 -1
  267. package/lib/designer.js +1 -1
  268. package/lib/element-mapper.js +23 -8
  269. package/lib/element-params.generated.js +4 -4
  270. package/lib/grid-geometry.js +1 -1
  271. package/lib/keyframe-animation.js +1 -1
  272. package/lib/known-inert.js +8 -9
  273. package/lib/link-getter.js +1 -1
  274. package/lib/morph-node.js +1 -1
  275. package/lib/normalize-spec.js +1 -1
  276. package/lib/parse-html.js +1 -1
  277. package/lib/raster-inspect.js +1 -1
  278. package/lib/raster-ops.js +1 -1
  279. package/lib/raster-presets.js +1 -1
  280. package/lib/resolve-refs.js +1 -1
  281. package/lib/scroll-video.js +1 -1
  282. package/lib/seo.js +1 -1
  283. package/lib/stacker.js +1 -1
  284. package/lib/suggest.js +1 -1
  285. package/lib/theme.js +1 -1
  286. package/lib/transform-anim.js +1 -1
  287. package/lib/transition.js +1 -1
  288. package/lib/validate-nodes.js +9 -2
  289. package/lib/webmcp-adapter.js +1 -1
  290. package/package.json +2 -1
  291. package/schema.json +10100 -2535
  292. package/scripts/generate-schema.mjs +83 -2
  293. package/skills/nodality/SKILL.md +16 -3
@@ -148,7 +148,11 @@ const TOOLS = [
148
148
  "width and reports horizontal overflow, elements past the viewport, " +
149
149
  "clipped content, images with no description, tap targets under 24px, " +
150
150
  "controls with no accessible name, skipped heading levels and text " +
151
- "below the WCAG contrast minimum. Same report shape as validate_nodes; " +
151
+ "below the WCAG contrast minimum, and a shop product whose loading " +
152
+ "copy sits somewhere other than the loaded element (the shop script is " +
153
+ "blocked, so this needs no store). For a prerendered site page, pass " +
154
+ "`base` (the dev server's origin) so its fonts and assets load. Same " +
155
+ "report shape as validate_nodes; " +
152
156
  "`path` in an error is a CSS selector into the rendered page. It " +
153
157
  "reports facts, never taste \u2014 it will not tell you whether a " +
154
158
  "design is good.",
@@ -157,6 +161,7 @@ const TOOLS = [
157
161
  properties: {
158
162
  html: { type: "string", description: "Rendered HTML: a document or a fragment." },
159
163
  path: { type: "string", description: "Path to an HTML file, e.g. what `preview` returned." },
164
+ base: { type: "string", description: "Origin the page is served from, e.g. http://localhost:4000/ — resolves its /assets/ fonts and styles." },
160
165
  },
161
166
  },
162
167
  },
@@ -259,7 +264,7 @@ const IMPL = {
259
264
  // generator is a build-time script and this server answers in-process. The
260
265
  // drift test keeps the committed copy honest, so reading it is not a second
261
266
  // source of truth, it is the same one at rest.
262
- check_page: async ({ html, path: file } = {}) => {
267
+ check_page: async ({ html, path: file, base } = {}) => {
263
268
  const { checkPage } = await import("../lib/check-page.js");
264
269
  let source = html;
265
270
  if (!source && file) {
@@ -276,7 +281,7 @@ const IMPL = {
276
281
  }],
277
282
  });
278
283
  }
279
- return ok(await checkPage(source));
284
+ return ok(await checkPage(source, base ? { base, waitUntil: "networkidle" } : {}));
280
285
  },
281
286
 
282
287
  get_schema: async ({ type } = {}) => {
package/bin/nodality.mjs CHANGED
@@ -126,6 +126,13 @@ function showUsage() {
126
126
  # --dir=<path> copy SKILL.md anywhere
127
127
  # --no-mcp skip MCP registration
128
128
  # Re-run after upgrading to refresh in place.
129
+ nodality check <page.html>... [--base=<url>] # Check rendered pages in a real browser
130
+ # (Playwright): overflow, clipping,
131
+ # contrast, labels, tap targets, a shop
132
+ # product's loading shift. --base is the
133
+ # origin they are served from, so fonts
134
+ # and /assets/ load. Exit 1 on findings.
135
+ # The same check as the MCP check_page.
129
136
  nodality schema [type] [--check] # Print the machine-readable element
130
137
  # schema, derived from the source
131
138
  # at run time. With a type, print
@@ -916,6 +923,35 @@ async function runFanoutStandalone(rawArgs) {
916
923
  }
917
924
  }
918
925
 
926
+ // ─── check subcommand ──────────────────────────────────────────
927
+
928
+ async function runCheck(rest) {
929
+ const fs = await import("node:fs");
930
+ const files = rest.filter((a) => !a.startsWith("--"));
931
+ const baseArg = rest.find((a) => a.startsWith("--base="));
932
+ if (!files.length) {
933
+ console.error("[nodality] check: name one or more HTML files, e.g. npx nodality check upload/index.html --base=http://localhost:4000/");
934
+ process.exit(1);
935
+ }
936
+ const { checkPage } = await import("../lib/check-page.js");
937
+ let findings = 0;
938
+ for (const file of files) {
939
+ const html = fs.readFileSync(file, "utf8");
940
+ const opts = baseArg ? { base: baseArg.slice("--base=".length), waitUntil: "networkidle" } : {};
941
+ const r = await checkPage(html, opts);
942
+ if (r.errors[0]?.code === "MISSING_PEER_DEPENDENCY") {
943
+ console.error(`[nodality] check: ${r.errors[0].detail}\n ${r.errors[0].suggestions.join("\n ")}`);
944
+ process.exit(1);
945
+ }
946
+ findings += r.errors.length;
947
+ console.log(r.errors.length ? `✗ ${file} — ${r.errors.length} finding(s)` : `✓ ${file}`);
948
+ for (const e of r.errors) {
949
+ console.log(` ${e.code} ${e.path} ${e.got ?? ""} [${e.viewport}]${e.detail ? `\n ${e.detail}` : ""}${e.suggestions.length ? `\n → ${e.suggestions[0]}` : ""}`);
950
+ }
951
+ }
952
+ if (findings) process.exit(1);
953
+ }
954
+
919
955
  // ─── Dispatch ──────────────────────────────────────────────────
920
956
 
921
957
  async function main() {
@@ -960,6 +996,11 @@ async function main() {
960
996
  // should cost nothing, and a broken generator must not take the CLI down.
961
997
  const { runSchema } = await import("./schema-cli.mjs");
962
998
  await runSchema(rest);
999
+ } else if (command === "check") {
1000
+ // check_page without the MCP. A session where the server is not loaded
1001
+ // (it needs approving per project) had no way to run it: the module was
1002
+ // not exported and no command reached it.
1003
+ await runCheck(rest);
963
1004
  } else if (command === "skill") {
964
1005
  const { runSkillInstall } = await import("./install-skill.mjs");
965
1006
  await runSkillInstall(rest);