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.
- package/README.md +15 -15
- package/bin/mcp-server.mjs +17 -4
- 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.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.LICENSE.txt +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.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.LICENSE.txt +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.LICENSE.txt +1 -1
- package/dist/index.d.ts +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.LICENSE.txt +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 +1 -1
- 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 +1 -1
- 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/codegen.js +1 -1
- package/lib/data.js +1 -1
- package/lib/designer.js +1 -1
- package/lib/element-mapper.js +7 -2
- package/lib/keyframe-animation.js +1 -1
- package/lib/link-getter.js +1 -1
- package/lib/morph-node.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/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 +75 -4
- package/lib/webmcp-adapter.js +1 -1
- package/package.json +1 -1
package/lib/transform-anim.js
CHANGED
package/lib/transition.js
CHANGED
package/lib/validate-nodes.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.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
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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,
|
package/lib/webmcp-adapter.js
CHANGED