nodality 1.3.0 → 1.3.2
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.
- package/dist/animator.cjs.js.LICENSE.txt +1 -1
- package/dist/animator.esm.js.LICENSE.txt +1 -1
- package/dist/audionew.cjs.js.LICENSE.txt +1 -1
- package/dist/audionew.esm.js.LICENSE.txt +1 -1
- package/dist/base.cjs.js.LICENSE.txt +1 -1
- package/dist/base.esm.js.LICENSE.txt +1 -1
- package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
- package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
- package/dist/bundle.umd.js +1 -1
- package/dist/bundle.umd.js.LICENSE.txt +1 -1
- package/dist/button.cjs.js.LICENSE.txt +1 -1
- package/dist/button.esm.js.LICENSE.txt +1 -1
- package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
- package/dist/card-getter.esm.js.LICENSE.txt +1 -1
- package/dist/center.cjs.js.LICENSE.txt +1 -1
- package/dist/center.esm.js.LICENSE.txt +1 -1
- package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
- package/dist/checkbox.esm.js.LICENSE.txt +1 -1
- package/dist/code.cjs.js.LICENSE.txt +1 -1
- package/dist/code.esm.js.LICENSE.txt +1 -1
- package/dist/container.cjs.js.LICENSE.txt +1 -1
- package/dist/container.esm.js.LICENSE.txt +1 -1
- package/dist/data-list.cjs.js.LICENSE.txt +1 -1
- package/dist/data-list.esm.js.LICENSE.txt +1 -1
- package/dist/designer.cjs.js +1 -1
- package/dist/designer.cjs.js.LICENSE.txt +1 -1
- package/dist/designer.esm.js +1 -1
- package/dist/designer.esm.js.LICENSE.txt +1 -1
- package/dist/element-mapper.cjs.js +1 -1
- package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
- package/dist/element-mapper.esm.js +1 -1
- package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
- package/dist/finalresult.esm.js +1 -1
- package/dist/finalresult.esm.js.LICENSE.txt +1 -1
- package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-card.esm.js.LICENSE.txt +1 -1
- package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
- package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-row.esm.js.LICENSE.txt +1 -1
- package/dist/floating-input.cjs.js +1 -1
- package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
- package/dist/floating-input.esm.js +1 -1
- package/dist/floating-input.esm.js.LICENSE.txt +1 -1
- package/dist/free.cjs.js.LICENSE.txt +1 -1
- package/dist/free.esm.js.LICENSE.txt +1 -1
- package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
- package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
- package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
- package/dist/image-picker.esm.js.LICENSE.txt +1 -1
- package/dist/image.cjs.js.LICENSE.txt +1 -1
- package/dist/image.esm.js.LICENSE.txt +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.LICENSE.txt +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.LICENSE.txt +1 -1
- package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
- package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
- package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
- package/dist/link-getter.esm.js.LICENSE.txt +1 -1
- package/dist/link.cjs.js.LICENSE.txt +1 -1
- package/dist/link.esm.js.LICENSE.txt +1 -1
- package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
- package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
- package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
- package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
- package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
- package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
- package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
- package/dist/picker.cjs.js +1 -1
- package/dist/picker.cjs.js.LICENSE.txt +1 -1
- package/dist/picker.esm.js +1 -1
- package/dist/picker.esm.js.LICENSE.txt +1 -1
- package/dist/progress.cjs.js.LICENSE.txt +1 -1
- package/dist/progress.esm.js.LICENSE.txt +1 -1
- package/dist/radio.cjs.js.LICENSE.txt +1 -1
- package/dist/radio.esm.js.LICENSE.txt +1 -1
- package/dist/range.cjs.js.LICENSE.txt +1 -1
- package/dist/range.esm.js.LICENSE.txt +1 -1
- package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
- package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
- package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/side-bar.esm.js.LICENSE.txt +1 -1
- package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
- package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
- package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
- package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
- package/dist/spacer.cjs.js.LICENSE.txt +1 -1
- package/dist/spacer.esm.js.LICENSE.txt +1 -1
- package/dist/stack.cjs.js.LICENSE.txt +1 -1
- package/dist/stack.esm.js.LICENSE.txt +1 -1
- package/dist/stacker.cjs.js.LICENSE.txt +1 -1
- package/dist/stacker.esm.js.LICENSE.txt +1 -1
- package/dist/table.cjs.js.LICENSE.txt +1 -1
- package/dist/table.esm.js.LICENSE.txt +1 -1
- package/dist/text-field.cjs.js.LICENSE.txt +1 -1
- package/dist/text-field.esm.js.LICENSE.txt +1 -1
- package/dist/text.cjs.js.LICENSE.txt +1 -1
- package/dist/text.esm.js.LICENSE.txt +1 -1
- package/dist/theme.cjs.js.LICENSE.txt +1 -1
- package/dist/theme.esm.js.LICENSE.txt +1 -1
- package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
- package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
- package/dist/ulist.cjs.js.LICENSE.txt +1 -1
- package/dist/ulist.esm.js.LICENSE.txt +1 -1
- package/dist/video.cjs.js.LICENSE.txt +1 -1
- package/dist/video.esm.js.LICENSE.txt +1 -1
- package/dist/wrap.cjs.js.LICENSE.txt +1 -1
- package/dist/wrap.esm.js.LICENSE.txt +1 -1
- package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
- package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
- package/layout/animator.js +1 -1
- package/layout/audio.js +1 -1
- package/layout/audionew.js +1 -1
- package/layout/base.js +1 -1
- package/layout/beta-desktop-bar.js +1 -1
- package/layout/beta-mobile-bar.js +1 -1
- package/layout/button.js +1 -1
- package/layout/center.js +1 -1
- package/layout/checkbox.js +1 -1
- package/layout/circle.js +1 -1
- package/layout/code.js +1 -1
- package/layout/container.js +1 -1
- package/layout/dropdown-2025.js +1 -1
- package/layout/flex-card.js +1 -1
- package/layout/flex-grid.js +1 -1
- package/layout/flex-row.js +1 -1
- package/layout/form-components/custom.js +1 -1
- package/layout/form-components/data-list.js +1 -1
- package/layout/form-components/floating-input.js +12 -6
- package/layout/form-components/form-all.js +1 -1
- package/layout/form-components/form.js +1 -1
- package/layout/form-components/image-picker.js +1 -1
- package/layout/form-components/picker.js +37 -2
- package/layout/form-components/radio.js +1 -1
- package/layout/form-components/radiogroup.js +1 -1
- package/layout/form-components/range.js +1 -1
- package/layout/free.js +1 -1
- package/layout/grid-switcher.js +1 -1
- package/layout/grid.js +1 -1
- package/layout/horizontal-scroller.js +1 -1
- package/layout/image.js +1 -1
- package/layout/index.js +1 -1
- package/layout/link.js +1 -1
- package/layout/list.js +1 -1
- package/layout/meta-adder.js +1 -1
- package/layout/modal-2025.js +1 -1
- package/layout/morph.js +1 -1
- package/layout/multiswitcher.js +1 -1
- package/layout/nav-bar.js +1 -1
- package/layout/nav-factor/custom-div.js +1 -1
- package/layout/new-nav-bar.js +1 -1
- package/layout/polygon.js +1 -1
- package/layout/prerender-site.js +1 -1
- package/layout/prerender.js +1 -1
- package/layout/progress.js +1 -1
- package/layout/row.js +1 -1
- package/layout/scroll-video.js +1 -1
- package/layout/side-bar.js +1 -1
- package/layout/side-nav-bar.js +1 -1
- package/layout/simple-bar.js +1 -1
- package/layout/slider-2025.js +1 -1
- package/layout/spacer.js +1 -1
- package/layout/stack.js +1 -1
- package/layout/svg.js +1 -1
- package/layout/switcher.js +1 -1
- package/layout/table.js +1 -1
- package/layout/text-field.js +1 -1
- package/layout/text.js +1 -1
- package/layout/ulist.js +1 -1
- package/layout/video.js +1 -1
- package/layout/wrap.js +1 -1
- package/layout/zoom-card.js +1 -1
- package/lib/agent-surface.js +1 -1
- package/lib/card-getter.js +1 -1
- package/lib/check-page.js +173 -24
- package/lib/codegen.js +1 -1
- package/lib/data.js +1 -1
- package/lib/designer.js +1 -1
- package/lib/element-mapper.js +11 -3
- package/lib/element-params.generated.js +2 -2
- package/lib/keyframe-animation.js +1 -1
- package/lib/link-getter.js +1 -1
- package/lib/morph-node.js +1 -1
- package/lib/normalize-spec.js +1 -1
- package/lib/parse-html.js +1 -1
- package/lib/raster-inspect.js +1 -1
- package/lib/raster-ops.js +1 -1
- package/lib/raster-presets.js +1 -1
- package/lib/resolve-refs.js +1 -1
- package/lib/scroll-video.js +1 -1
- package/lib/seo.js +1 -1
- package/lib/stacker.js +1 -1
- package/lib/suggest.js +1 -1
- package/lib/theme.js +1 -1
- package/lib/transform-anim.js +1 -1
- package/lib/transition.js +1 -1
- package/lib/validate-nodes.js +52 -1
- package/lib/webmcp-adapter.js +71 -6
- package/package.json +1 -1
- package/schema.json +769 -0
- package/scripts/generate-schema.mjs +9 -1
package/lib/webmcp-adapter.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.3.
|
|
2
|
+
* nodality v1.3.2
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -279,18 +279,83 @@ export function installAgentSurface({ mount, elements, nodes, morphs }) {
|
|
|
279
279
|
return refuse("MISSING_REQUIRED", missing, Object.keys(props));
|
|
280
280
|
}
|
|
281
281
|
|
|
282
|
-
|
|
282
|
+
// Setting a control is not the same as the control TAKING the
|
|
283
|
+
// value, and the difference used to be invisible. Assigning a
|
|
284
|
+
// `<select>` a value it has no option for leaves it untouched and
|
|
285
|
+
// throws nothing; the old loop pushed the key onto `filled`
|
|
286
|
+
// regardless, so the tool answered `ok: true, filled: [... "topic"]`
|
|
287
|
+
// for a field that never reached the payload. An agent was told
|
|
288
|
+
// its submission carried something it did not.
|
|
289
|
+
//
|
|
290
|
+
// So every field is READ BACK after it is set, and what a control
|
|
291
|
+
// refused is reported rather than counted as done.
|
|
292
|
+
const filled = [], rejected = [], absent = [];
|
|
293
|
+
|
|
294
|
+
/** The values a control will actually accept, where it is a closed set. */
|
|
295
|
+
const accepts = (field) => field.tagName === "SELECT"
|
|
296
|
+
? [...field.options].map((o) => o.value) : [];
|
|
297
|
+
|
|
283
298
|
for (const key of Object.keys(props)) {
|
|
284
299
|
if (args[key] === undefined) continue;
|
|
300
|
+
const want = args[key];
|
|
285
301
|
const field = form.querySelector(
|
|
286
302
|
`[name="${key}"], #${CSS.escape(key)}`);
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
303
|
+
// Named by the schema and carried by nothing. Also silent
|
|
304
|
+
// before, and the same lie by omission.
|
|
305
|
+
if (!field) { absent.push(key); continue; }
|
|
306
|
+
|
|
307
|
+
if (field.type === "checkbox") {
|
|
308
|
+
field.checked = !!want;
|
|
309
|
+
} else if (field.type === "radio") {
|
|
310
|
+
// A group, not a field: `querySelector` returns the FIRST
|
|
311
|
+
// radio, and assigning `.value` to it rewrites that
|
|
312
|
+
// button's value instead of choosing the one asked for —
|
|
313
|
+
// which then reads back as a match and reports success
|
|
314
|
+
// while nothing is selected.
|
|
315
|
+
const group = [...form.querySelectorAll(`[name="${key}"]`)];
|
|
316
|
+
const hit = group.find((r) => r.value === String(want));
|
|
317
|
+
if (hit) hit.checked = true;
|
|
318
|
+
else {
|
|
319
|
+
rejected.push({ field: key, got: null,
|
|
320
|
+
valid: group.map((r) => r.value) });
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
} else {
|
|
324
|
+
field.value = String(want);
|
|
325
|
+
}
|
|
290
326
|
// Both, because component state may listen for either.
|
|
291
327
|
field.dispatchEvent(new Event("input", { bubbles: true }));
|
|
292
328
|
field.dispatchEvent(new Event("change", { bubbles: true }));
|
|
293
|
-
|
|
329
|
+
|
|
330
|
+
const got = field.type === "checkbox" ? field.checked
|
|
331
|
+
: field.type === "radio" ? String(want) : field.value;
|
|
332
|
+
const took = field.type === "checkbox"
|
|
333
|
+
? (!!want === got) : (String(want) === got);
|
|
334
|
+
if (took) filled.push(key);
|
|
335
|
+
else rejected.push({ field: key, got, valid: accepts(field) });
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Nothing is submitted when a field did not take. A partial
|
|
339
|
+
// payload sent under `ok: true` is the failure this whole
|
|
340
|
+
// architecture exists to remove, and it is worse on the agent
|
|
341
|
+
// path than anywhere else: the caller has no eyes on the page and
|
|
342
|
+
// no reason to doubt the report. The refusal names the field and,
|
|
343
|
+
// where the control has a closed set, what it would have accepted
|
|
344
|
+
// — repairable in one turn.
|
|
345
|
+
if (rejected.length || absent.length) {
|
|
346
|
+
return {
|
|
347
|
+
...refuse("FIELD_NOT_SET",
|
|
348
|
+
[...rejected.map((r) => r.field), ...absent],
|
|
349
|
+
[...rejected.map((r) => r.valid.length
|
|
350
|
+
? `"${r.field}" accepts ${r.valid.map((v) => JSON.stringify(v)).join(", ")}`
|
|
351
|
+
: `"${r.field}" did not take the value given`),
|
|
352
|
+
...absent.map((k) =>
|
|
353
|
+
`"${k}" is named by the schema but no control in the form carries it`)]),
|
|
354
|
+
// What DID land, because the form is now partly filled and
|
|
355
|
+
// a caller retrying needs to know that.
|
|
356
|
+
filled,
|
|
357
|
+
submitted: null,
|
|
358
|
+
};
|
|
294
359
|
}
|
|
295
360
|
|
|
296
361
|
// Submitted through the form's OWN path, so its listeners,
|