nodality 1.2.0 → 1.2.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/README.md +111 -130
- 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.LICENSE.txt +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.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 +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.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 +1 -1
- package/lib/keyframe-animation.js +1 -1
- package/lib/link-getter.js +1 -1
- package/lib/morph-node.js +9 -4
- 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 +1 -1
- package/lib/webmcp-adapter.js +40 -8
- package/package.json +1 -1
package/layout/free.js
CHANGED
package/layout/grid-switcher.js
CHANGED
package/layout/grid.js
CHANGED
package/layout/image.js
CHANGED
package/layout/index.js
CHANGED
package/layout/link.js
CHANGED
package/layout/list.js
CHANGED
package/layout/meta-adder.js
CHANGED
package/layout/modal-2025.js
CHANGED
package/layout/morph.js
CHANGED
package/layout/multiswitcher.js
CHANGED
package/layout/nav-bar.js
CHANGED
package/layout/new-nav-bar.js
CHANGED
package/layout/polygon.js
CHANGED
package/layout/prerender-site.js
CHANGED
package/layout/prerender.js
CHANGED
package/layout/progress.js
CHANGED
package/layout/row.js
CHANGED
package/layout/scroll-video.js
CHANGED
package/layout/side-bar.js
CHANGED
package/layout/side-nav-bar.js
CHANGED
package/layout/simple-bar.js
CHANGED
package/layout/slider-2025.js
CHANGED
package/layout/spacer.js
CHANGED
package/layout/stack.js
CHANGED
package/layout/svg.js
CHANGED
package/layout/switcher.js
CHANGED
package/layout/table.js
CHANGED
package/layout/text-field.js
CHANGED
package/layout/text.js
CHANGED
package/layout/ulist.js
CHANGED
package/layout/video.js
CHANGED
package/layout/wrap.js
CHANGED
package/layout/zoom-card.js
CHANGED
package/lib/agent-surface.js
CHANGED
package/lib/card-getter.js
CHANGED
package/lib/codegen.js
CHANGED
package/lib/data.js
CHANGED
package/lib/designer.js
CHANGED
package/lib/element-mapper.js
CHANGED
package/lib/link-getter.js
CHANGED
package/lib/morph-node.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.2.
|
|
2
|
+
* nodality v1.2.2
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -471,9 +471,15 @@ function setUpMorph(mount, m, resolve) {
|
|
|
471
471
|
// it takes the source's own position, so views replace each other
|
|
472
472
|
// in one region rather than marching down the page.
|
|
473
473
|
const fromRect = rectIn(rhost, srcEl);
|
|
474
|
+
// POSITION only. This used to also force `boxSizing: border-box`,
|
|
475
|
+
// which silently relaid the author's element: a card written as
|
|
476
|
+
// `width: min(560px, 92vw)` with padding renders 612px wide in
|
|
477
|
+
// normal flow (content-box) and 560px once border-box is imposed.
|
|
478
|
+
// The source keeps its own box model, so the two ends of the
|
|
479
|
+
// transition were different sizes and the handover to real DOM
|
|
480
|
+
// snapped by the padding — the jump visible at the end of a hop.
|
|
474
481
|
Object.assign(dest.style, { position: "absolute", left: "0",
|
|
475
|
-
top: Math.round(inPlace ? fromRect.y : fromRect.h + 20) + "px"
|
|
476
|
-
boxSizing: "border-box" });
|
|
482
|
+
top: Math.round(inPlace ? fromRect.y : fromRect.h + 20) + "px" });
|
|
477
483
|
|
|
478
484
|
await buildTransition(srcEl, dest, edge);
|
|
479
485
|
if (!tl) return;
|
|
@@ -590,7 +596,6 @@ function setUpMorph(mount, m, resolve) {
|
|
|
590
596
|
Object.assign(targetEl.style, {
|
|
591
597
|
position: "absolute", left: "0",
|
|
592
598
|
top: Math.round(inPlace ? cur.y : 0) + "px",
|
|
593
|
-
boxSizing: "border-box",
|
|
594
599
|
});
|
|
595
600
|
}
|
|
596
601
|
|
package/lib/raster-inspect.js
CHANGED
package/lib/raster-ops.js
CHANGED
package/lib/raster-presets.js
CHANGED
package/lib/scroll-video.js
CHANGED
package/lib/seo.js
CHANGED
package/lib/stacker.js
CHANGED
package/lib/suggest.js
CHANGED
package/lib/theme.js
CHANGED
package/lib/transform-anim.js
CHANGED
package/lib/transition.js
CHANGED
package/lib/validate-nodes.js
CHANGED
package/lib/webmcp-adapter.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.2.
|
|
2
|
+
* nodality v1.2.2
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -71,14 +71,26 @@ const esc = (s) => {
|
|
|
71
71
|
return str.replace(/([^a-zA-Z0-9_-])/g, "\\$1");
|
|
72
72
|
};
|
|
73
73
|
|
|
74
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Text an agent can read, from the subtree being presented.
|
|
76
|
+
*
|
|
77
|
+
* `visibility: hidden` is NOT treated as absent, and that is the whole
|
|
78
|
+
* subtlety. Under the live backend the presented state is hosted inside
|
|
79
|
+
* the canvas: it has real layout and real text, and the DOM copy is
|
|
80
|
+
* hidden precisely BECAUSE the canvas is painting it. Filtering on
|
|
81
|
+
* visibility — the correct test for "can this be clicked" — made
|
|
82
|
+
* `read_view` return nothing at all on exactly the pages that use the
|
|
83
|
+
* feature, while navigation worked perfectly. So the caller passes the
|
|
84
|
+
* subtree it knows is current, and this reads it; `display: none` still
|
|
85
|
+
* counts as absent, because that element is not laid out at all.
|
|
86
|
+
*/
|
|
75
87
|
function readSubtree(root) {
|
|
76
88
|
if (!root) return { text: "", actions: [] };
|
|
77
89
|
const visible = (el) => {
|
|
78
|
-
const r = el.getBoundingClientRect();
|
|
79
|
-
if (!(r.width > 0 && r.height > 0)) return false;
|
|
80
90
|
const cs = getComputedStyle(el);
|
|
81
|
-
|
|
91
|
+
if (cs.display === "none" || cs.opacity === "0") return false;
|
|
92
|
+
const r = el.getBoundingClientRect();
|
|
93
|
+
return r.width > 0 && r.height > 0;
|
|
82
94
|
};
|
|
83
95
|
const lines = [];
|
|
84
96
|
for (const el of root.querySelectorAll("h1,h2,h3,h4,h5,h6,p,li")) {
|
|
@@ -119,6 +131,21 @@ export function installAgentSurface({ mount, elements, nodes, morphs }) {
|
|
|
119
131
|
const handles = Array.isArray(morphs) ? morphs.filter(Boolean) : [];
|
|
120
132
|
const graphFor = (id) => handles.find((h) => h.states && h.states.has(id)) || null;
|
|
121
133
|
|
|
134
|
+
/**
|
|
135
|
+
* The subtree to read: the state the graph is actually in.
|
|
136
|
+
*
|
|
137
|
+
* Known, not inferred. Asking "what is painted" cannot answer this
|
|
138
|
+
* on a live morph, where the painting is done by a canvas and the
|
|
139
|
+
* DOM behind it is deliberately hidden.
|
|
140
|
+
*/
|
|
141
|
+
const currentSubtree = () => {
|
|
142
|
+
for (const h of handles) {
|
|
143
|
+
const el = h.states && h.current != null ? h.states.get(h.current) : null;
|
|
144
|
+
if (el) return el;
|
|
145
|
+
}
|
|
146
|
+
return mount;
|
|
147
|
+
};
|
|
148
|
+
|
|
122
149
|
/**
|
|
123
150
|
* The rendered form a descriptor id names, wherever it currently is.
|
|
124
151
|
*
|
|
@@ -203,6 +230,11 @@ export function installAgentSurface({ mount, elements, nodes, morphs }) {
|
|
|
203
230
|
return run;
|
|
204
231
|
};
|
|
205
232
|
|
|
233
|
+
const currentView = () => {
|
|
234
|
+
for (const h of handles) if (h.current != null) return h.current;
|
|
235
|
+
return null;
|
|
236
|
+
};
|
|
237
|
+
|
|
206
238
|
const execute = {
|
|
207
239
|
navigate: ({ destination } = {}) => serial(async () => {
|
|
208
240
|
const h = graphFor(destination);
|
|
@@ -221,17 +253,17 @@ export function installAgentSurface({ mount, elements, nodes, morphs }) {
|
|
|
221
253
|
return refuse("UNREACHABLE_FROM_HERE", destination,
|
|
222
254
|
edge.filter((id) => id !== from));
|
|
223
255
|
}
|
|
224
|
-
return { ok: true, view: h.current, ...readSubtree(h.
|
|
256
|
+
return { ok: true, view: h.current, ...readSubtree(h.states.get(h.current) || mount) };
|
|
225
257
|
}),
|
|
226
258
|
|
|
227
259
|
back: () => serial(async () => {
|
|
228
260
|
const h = handles.find((x) => x.history && x.history.length);
|
|
229
261
|
if (!h) return refuse("NO_HISTORY", null, []);
|
|
230
262
|
await h.goBack();
|
|
231
|
-
return { ok: true, view: h.current, ...readSubtree(h.
|
|
263
|
+
return { ok: true, view: h.current, ...readSubtree(h.states.get(h.current) || mount) };
|
|
232
264
|
}),
|
|
233
265
|
|
|
234
|
-
read: async () => ({ ok: true, ...readSubtree(
|
|
266
|
+
read: async () => ({ ok: true, view: currentView(), ...readSubtree(currentSubtree()) }),
|
|
235
267
|
|
|
236
268
|
submit: async (args = {}, tool) => {
|
|
237
269
|
const form = findForm(tool.formId);
|