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.
- package/dist/animator.cjs.js +1 -1
- package/dist/animator.cjs.js.LICENSE.txt +3 -1
- package/dist/animator.esm.js.LICENSE.txt +1 -1
- package/dist/audionew.cjs.js +1 -1
- package/dist/audionew.cjs.js.LICENSE.txt +3 -1
- package/dist/audionew.esm.js.LICENSE.txt +1 -1
- package/dist/base.cjs.js +1 -1
- package/dist/base.cjs.js.LICENSE.txt +3 -1
- package/dist/base.esm.js.LICENSE.txt +1 -1
- package/dist/beta-desktop-bar.cjs.js +1 -1
- package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +3 -1
- package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
- package/dist/beta-mobile-bar.cjs.js +1 -1
- package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +3 -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 +1 -1
- package/dist/button.cjs.js.LICENSE.txt +3 -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 +1 -1
- package/dist/center.cjs.js.LICENSE.txt +3 -1
- package/dist/center.esm.js.LICENSE.txt +1 -1
- package/dist/checkbox.cjs.js +1 -1
- package/dist/checkbox.cjs.js.LICENSE.txt +3 -1
- package/dist/checkbox.esm.js.LICENSE.txt +1 -1
- package/dist/code.cjs.js +1 -1
- package/dist/code.cjs.js.LICENSE.txt +3 -1
- package/dist/code.esm.js.LICENSE.txt +1 -1
- package/dist/container.cjs.js +1 -1
- package/dist/container.cjs.js.LICENSE.txt +3 -1
- package/dist/container.esm.js.LICENSE.txt +1 -1
- package/dist/data-list.cjs.js +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 +3 -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 +1 -1
- package/dist/flex-card.cjs.js.LICENSE.txt +3 -1
- package/dist/flex-card.esm.js.LICENSE.txt +1 -1
- package/dist/flex-grid.cjs.js +1 -1
- package/dist/flex-grid.cjs.js.LICENSE.txt +3 -1
- package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
- package/dist/flex-row.cjs.js +1 -1
- package/dist/flex-row.cjs.js.LICENSE.txt +3 -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 +3 -1
- package/dist/floating-input.esm.js.LICENSE.txt +1 -1
- package/dist/free.cjs.js +1 -1
- package/dist/free.cjs.js.LICENSE.txt +3 -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 +1 -1
- package/dist/image-picker.cjs.js.LICENSE.txt +3 -1
- package/dist/image-picker.esm.js.LICENSE.txt +1 -1
- package/dist/image.cjs.js +1 -1
- package/dist/image.cjs.js.LICENSE.txt +3 -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 +1 -1
- package/dist/link-getter.cjs.js.LICENSE.txt +3 -1
- package/dist/link-getter.esm.js.LICENSE.txt +1 -1
- package/dist/link.cjs.js +1 -1
- package/dist/link.cjs.js.LICENSE.txt +3 -1
- package/dist/link.esm.js.LICENSE.txt +1 -1
- package/dist/meta-adder.cjs.js +1 -1
- package/dist/meta-adder.cjs.js.LICENSE.txt +3 -1
- package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
- package/dist/modal-2025.cjs.js +1 -1
- package/dist/modal-2025.cjs.js.LICENSE.txt +3 -1
- package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
- package/dist/multiswitcher.cjs.js +1 -1
- package/dist/multiswitcher.cjs.js.LICENSE.txt +3 -1
- package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
- package/dist/new-nav-bar.cjs.js +1 -1
- package/dist/new-nav-bar.cjs.js.LICENSE.txt +3 -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 +3 -1
- package/dist/picker.esm.js.LICENSE.txt +1 -1
- package/dist/progress.cjs.js +1 -1
- package/dist/progress.cjs.js.LICENSE.txt +3 -1
- package/dist/progress.esm.js.LICENSE.txt +1 -1
- package/dist/radio.cjs.js +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 +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 +1 -1
- package/dist/side-bar.cjs.js.LICENSE.txt +3 -1
- package/dist/side-bar.esm.js.LICENSE.txt +1 -1
- package/dist/side-nav-bar.cjs.js +1 -1
- package/dist/side-nav-bar.cjs.js.LICENSE.txt +3 -1
- package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
- package/dist/simple-bar.cjs.js +1 -1
- package/dist/simple-bar.cjs.js.LICENSE.txt +3 -1
- package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
- package/dist/slider-2025.cjs.js +1 -1
- package/dist/slider-2025.cjs.js.LICENSE.txt +3 -1
- package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
- package/dist/spacer.cjs.js +1 -1
- package/dist/spacer.cjs.js.LICENSE.txt +3 -1
- package/dist/spacer.esm.js.LICENSE.txt +1 -1
- package/dist/stack.cjs.js +1 -1
- package/dist/stack.cjs.js.LICENSE.txt +3 -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 +1 -1
- package/dist/table.cjs.js.LICENSE.txt +3 -1
- package/dist/table.esm.js.LICENSE.txt +1 -1
- package/dist/text-field.cjs.js +1 -1
- package/dist/text-field.cjs.js.LICENSE.txt +3 -1
- package/dist/text-field.esm.js.LICENSE.txt +1 -1
- package/dist/text.cjs.js +1 -1
- package/dist/text.cjs.js.LICENSE.txt +3 -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 +1 -1
- package/dist/ulist.cjs.js.LICENSE.txt +3 -1
- package/dist/ulist.esm.js +1 -1
- package/dist/ulist.esm.js.LICENSE.txt +1 -1
- package/dist/video.cjs.js +1 -1
- package/dist/video.cjs.js.LICENSE.txt +3 -1
- package/dist/video.esm.js.LICENSE.txt +1 -1
- package/dist/wrap.cjs.js +1 -1
- package/dist/wrap.cjs.js.LICENSE.txt +3 -1
- package/dist/wrap.esm.js.LICENSE.txt +1 -1
- package/dist/zoom-card.cjs.js +1 -1
- package/dist/zoom-card.cjs.js.LICENSE.txt +3 -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 +16 -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 +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 +98 -5
- package/lib/element-params.generated.js +1 -1
- 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 +215 -5
- 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 +83 -2
- package/lib/webmcp-adapter.js +1 -1
- package/package.json +2 -2
- package/schema.json +609 -3264
- package/scripts/generate-schema.mjs +102 -12
- package/skills/nodality/SKILL.md +20 -2
- /package/bin/{nodality.js → nodality.mjs} +0 -0
package/lib/validate-nodes.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.3.
|
|
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
|
-
|
|
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");
|
package/lib/webmcp-adapter.js
CHANGED
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nodality",
|
|
3
|
-
"version": "1.3.
|
|
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.
|
|
8
|
+
"nodality": "bin/nodality.mjs"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"lib/",
|