nodality 1.0.193 → 1.0.195
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.esm.js +1 -1
- package/dist/audionew.cjs.js +1 -1
- package/dist/audionew.esm.js +1 -1
- package/dist/beta-desktop-bar.cjs.js +1 -1
- package/dist/beta-desktop-bar.esm.js +1 -1
- package/dist/beta-mobile-bar.cjs.js +1 -1
- package/dist/beta-mobile-bar.esm.js +1 -1
- package/dist/bundle.umd.js +1 -1
- package/dist/button.cjs.js +1 -1
- package/dist/button.esm.js +1 -1
- package/dist/center.cjs.js +1 -1
- package/dist/center.esm.js +1 -1
- package/dist/checkbox.cjs.js +1 -1
- package/dist/checkbox.esm.js +1 -1
- package/dist/code.cjs.js +1 -1
- package/dist/code.esm.js +1 -1
- package/dist/container.cjs.js +1 -1
- package/dist/container.esm.js +1 -1
- package/dist/designer.cjs.js +1 -1
- package/dist/designer.esm.js +1 -1
- package/dist/dropdown.cjs.js +1 -1
- package/dist/dropdown.esm.js +1 -1
- package/dist/element-mapper.cjs.js +1 -1
- package/dist/element-mapper.esm.js +1 -1
- package/dist/finalresult.esm.js +1 -1
- package/dist/flex-card.cjs.js +1 -1
- package/dist/flex-card.esm.js +1 -1
- package/dist/flex-grid.cjs.js +1 -1
- package/dist/flex-grid.esm.js +1 -1
- package/dist/flex-row.cjs.js +1 -1
- package/dist/flex-row.esm.js +1 -1
- package/dist/floating-input.cjs.js +1 -1
- package/dist/floating-input.esm.js +1 -1
- package/dist/free.cjs.js +1 -1
- package/dist/free.esm.js +1 -1
- package/dist/image-picker.cjs.js +1 -1
- package/dist/image-picker.esm.js +1 -1
- package/dist/image.cjs.js +1 -1
- package/dist/image.esm.js +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/link-getter.cjs.js +1 -1
- package/dist/link-getter.esm.js +1 -1
- package/dist/link.cjs.js +1 -1
- package/dist/link.esm.js +1 -1
- package/dist/multiswitcher.cjs.js +1 -1
- package/dist/multiswitcher.esm.js +1 -1
- package/dist/new-nav-bar.cjs.js +1 -1
- package/dist/new-nav-bar.esm.js +1 -1
- package/dist/picker.cjs.js +1 -1
- package/dist/picker.esm.js +1 -1
- package/dist/side-nav-bar.cjs.js +1 -1
- package/dist/side-nav-bar.esm.js +1 -1
- package/dist/simple-bar.cjs.js +1 -1
- package/dist/simple-bar.esm.js +1 -1
- package/dist/slider-2025.cjs.js +1 -1
- package/dist/slider-2025.esm.js +1 -1
- package/dist/table.cjs.js +1 -1
- package/dist/table.esm.js +1 -1
- package/dist/text-field.cjs.js +1 -1
- package/dist/text-field.esm.js +1 -1
- package/dist/text.cjs.js +1 -1
- package/dist/text.esm.js +1 -1
- package/dist/ulist.cjs.js +1 -1
- package/dist/ulist.esm.js +1 -1
- package/dist/video.cjs.js +1 -1
- package/dist/video.esm.js +1 -1
- package/dist/zoom-card.cjs.js +1 -1
- package/dist/zoom-card.esm.js +1 -1
- package/layout/animator.js +1 -1
- package/layout/audio.js +1 -1
- package/layout/audionew.js +1 -1
- package/layout/base-2.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/box.js +1 -1
- package/layout/button.js +1 -1
- package/layout/cards.js +1 -1
- package/layout/center.js +1 -1
- package/layout/checkbox.js +1 -1
- package/layout/circle.js +1 -1
- package/layout/clean-row.js +1 -1
- package/layout/code.js +1 -1
- package/layout/container.js +1 -1
- package/layout/custom.js +1 -1
- package/layout/div-image.js +1 -1
- package/layout/dropdown-2025.js +1 -1
- package/layout/dropdown.js +1 -1
- package/layout/empty-element.js +1 -1
- package/layout/external-stylesheet.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/footer.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-new.js +1 -1
- package/layout/grid-switcher.js +1 -1
- package/layout/grid.js +1 -1
- package/layout/group.js +1 -1
- package/layout/header.js +1 -1
- package/layout/horizontal-scroller.js +1 -1
- package/layout/image-old.js +1 -1
- package/layout/image.js +1 -1
- package/layout/index.js +1 -1
- package/layout/label.js +1 -1
- package/layout/link.js +1 -1
- package/layout/list-OLD.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/modernwrap.js +1 -1
- package/layout/multiswitcher.js +1 -1
- package/layout/multiswitcherBeta.js +1 -1
- package/layout/nav-bar.js +1 -1
- package/layout/nav-factor/custom-div.js +1 -1
- package/layout/navBar-OLD.js +1 -1
- package/layout/new-flat-adder.js +1 -1
- package/layout/new-nav-bar.js +1 -1
- package/layout/offset-container.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/saved-new-nav-bar.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/styler.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/without-new.js +1 -1
- package/layout/wrap.js +1 -1
- package/layout/zoom-card.js +1 -1
- package/lib/card-getter.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/raster-ops.js +68 -17
- package/lib/scroll-video.js +1 -1
- package/lib/seo.js +1 -1
- package/lib/stacker.js +1 -1
- package/lib/theme.js +1 -1
- package/lib/transform-anim.js +1 -1
- package/package.json +1 -1
package/lib/raster-ops.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.0.
|
|
2
|
+
* nodality v1.0.195
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -1425,11 +1425,18 @@ function freezeViewportUnits(original, clone) {
|
|
|
1425
1425
|
*/
|
|
1426
1426
|
function soleImageOf(el) {
|
|
1427
1427
|
if (!el) return null;
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1428
|
+
let img = null;
|
|
1429
|
+
if (el.tagName === "IMG") {
|
|
1430
|
+
img = el;
|
|
1431
|
+
} else if (el.children) {
|
|
1432
|
+
// Ignore the pipeline's own canvas: by the time a capture runs it has
|
|
1433
|
+
// already been appended to the host, so a strict one-child test never
|
|
1434
|
+
// matches and a wrapped photo falls back to the foreignObject path —
|
|
1435
|
+
// which cannot fetch the image and captures blank.
|
|
1436
|
+
const content = Array.prototype.filter.call(
|
|
1437
|
+
el.children, (n) => !n.hasAttribute || !n.hasAttribute("data-nodality-raster"));
|
|
1438
|
+
if (content.length === 1 && content[0].tagName === "IMG") img = content[0];
|
|
1439
|
+
}
|
|
1433
1440
|
if (!img || !img.complete || !img.naturalWidth) return null;
|
|
1434
1441
|
try {
|
|
1435
1442
|
// Relative and same-origin absolute srcs both resolve clean here.
|
|
@@ -1622,11 +1629,18 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
1622
1629
|
// Content-box measurement: some elements (fluid-sized Text) keep a
|
|
1623
1630
|
// collapsed layout box while their glyphs overflow it, so fall back
|
|
1624
1631
|
// to scroll dimensions when the rect is degenerate.
|
|
1632
|
+
//
|
|
1633
|
+
// The fallback is per-axis and only for a genuinely collapsed box. It
|
|
1634
|
+
// used to be an unconditional max(rect, scroll), which cannot shrink:
|
|
1635
|
+
// the canvas is a CHILD of the measured element, so once it has been
|
|
1636
|
+
// sized up its own width holds scrollWidth at the old value, the max
|
|
1637
|
+
// never comes down, and a host that is animating smaller (a hero
|
|
1638
|
+
// collapsing as you scroll back up) leaves the canvas stuck wide.
|
|
1625
1639
|
const measure = () => {
|
|
1626
1640
|
const r = el.getBoundingClientRect();
|
|
1627
1641
|
return {
|
|
1628
|
-
width:
|
|
1629
|
-
height:
|
|
1642
|
+
width: r.width >= 2 ? r.width : (el.scrollWidth || 0),
|
|
1643
|
+
height: r.height >= 2 ? r.height : (el.scrollHeight || 0),
|
|
1630
1644
|
};
|
|
1631
1645
|
};
|
|
1632
1646
|
const rect = measure();
|
|
@@ -1954,12 +1968,20 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
1954
1968
|
const px = mouse[0] / canvas.width;
|
|
1955
1969
|
const py = 1 - mouse[1] / canvas.height;
|
|
1956
1970
|
let dx = 0, dy = 0;
|
|
1957
|
-
|
|
1971
|
+
// Only a real pointer event counts as motion. `mouse` is stored in
|
|
1972
|
+
// canvas pixels, so this normalised position also shifts whenever the
|
|
1973
|
+
// canvas itself resizes or moves — an element being animated (a
|
|
1974
|
+
// scroll-driven hero expanding) would otherwise inject phantom
|
|
1975
|
+
// velocity every frame and stir itself with the pointer sitting
|
|
1976
|
+
// still, or with the pointer nowhere near it.
|
|
1977
|
+
if (s.primed && pointerMoved) {
|
|
1958
1978
|
dx = (px - s.prevX) / Math.max(dt, 1e-3);
|
|
1959
1979
|
dy = (py - s.prevY) / Math.max(dt, 1e-3);
|
|
1960
1980
|
}
|
|
1981
|
+
// Re-baseline regardless, so the frame after a resize does not
|
|
1982
|
+
// measure its delta against a position from a different geometry.
|
|
1961
1983
|
s.prevX = px; s.prevY = py; s.primed = true;
|
|
1962
|
-
const moving = Math.abs(dx) + Math.abs(dy) > 1e-3;
|
|
1984
|
+
const moving = pointerMoved && Math.abs(dx) + Math.abs(dy) > 1e-3;
|
|
1963
1985
|
|
|
1964
1986
|
s.def.solver.step(S, s.node, {
|
|
1965
1987
|
dt, px, py, dx, dy, moving,
|
|
@@ -2191,10 +2213,17 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
2191
2213
|
// Pointer -> u_mouse (listen on the host so the overlay stays
|
|
2192
2214
|
// pointer-events: none).
|
|
2193
2215
|
let mouse = [canvas.width * 0.5, canvas.height * 0.5];
|
|
2216
|
+
// Set by a real pointer event, cleared once the solvers have consumed
|
|
2217
|
+
// it. Stateful ops splat only while this is true, so nothing is stirred
|
|
2218
|
+
// by the element resizing or scrolling under a stationary pointer.
|
|
2219
|
+
let pointerMoved = false;
|
|
2194
2220
|
const onMove = (e) => {
|
|
2195
2221
|
const r = canvas.getBoundingClientRect();
|
|
2196
2222
|
const pt = e.touches ? e.touches[0] : e;
|
|
2197
|
-
|
|
2223
|
+
const next = [(pt.clientX - r.left) * dpr, (pt.clientY - r.top) * dpr];
|
|
2224
|
+
// Guard against move events that report the same position.
|
|
2225
|
+
if (next[0] !== mouse[0] || next[1] !== mouse[1]) pointerMoved = true;
|
|
2226
|
+
mouse = next;
|
|
2198
2227
|
};
|
|
2199
2228
|
el.addEventListener("mousemove", onMove, { passive: true });
|
|
2200
2229
|
el.addEventListener("touchmove", onMove, { passive: true });
|
|
@@ -2240,6 +2269,10 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
2240
2269
|
// 1. Advance stateful fluid solvers into their own off-screen
|
|
2241
2270
|
// targets (this rebinds framebuffer/program/textures).
|
|
2242
2271
|
for (const s of solverOps) stepSolver(s, dt);
|
|
2272
|
+
// Consumed for this frame: a splat needs a fresh pointer event,
|
|
2273
|
+
// not merely a pointer position that happens to differ because
|
|
2274
|
+
// the canvas moved or resized beneath it.
|
|
2275
|
+
pointerMoved = false;
|
|
2243
2276
|
|
|
2244
2277
|
// 2. Composite pass, back on the visible framebuffer.
|
|
2245
2278
|
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
@@ -2306,15 +2339,30 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
2306
2339
|
// ResizeObserver, the window-resize fallback and the font-loading
|
|
2307
2340
|
// recapture, so all three agree on what "resize the canvas" means.
|
|
2308
2341
|
const remeasureAndCapture = () => {
|
|
2309
|
-
if (destroyed
|
|
2342
|
+
if (destroyed) return;
|
|
2310
2343
|
const m = measure();
|
|
2344
|
+
if (m.width < 2 || m.height < 2) return;
|
|
2345
|
+
const bw = Math.round(m.width * dpr);
|
|
2346
|
+
const bh = Math.round(m.height * dpr);
|
|
2311
2347
|
rect.width = m.width;
|
|
2312
2348
|
rect.height = m.height;
|
|
2313
|
-
canvas.width = Math.round(m.width * dpr);
|
|
2314
|
-
canvas.height = Math.round(m.height * dpr);
|
|
2315
2349
|
canvas.style.width = m.width + "px";
|
|
2316
2350
|
canvas.style.height = m.height + "px";
|
|
2317
|
-
|
|
2351
|
+
// Re-allocating the buffer clears it, so skip when it already matches
|
|
2352
|
+
// — syncCanvasBox may have kept the CSS box in step without needing a
|
|
2353
|
+
// new buffer at all.
|
|
2354
|
+
const bufferStale = canvas.width !== bw || canvas.height !== bh;
|
|
2355
|
+
if (bufferStale) {
|
|
2356
|
+
canvas.width = bw;
|
|
2357
|
+
canvas.height = bh;
|
|
2358
|
+
}
|
|
2359
|
+
if (mode === "snapshot") {
|
|
2360
|
+
snapshotCapture();
|
|
2361
|
+
} else if (bufferStale) {
|
|
2362
|
+
// Live mode re-uploads from the DOM every paint, so it needs no
|
|
2363
|
+
// recapture — only a fresh upload at the new buffer size.
|
|
2364
|
+
onPaint();
|
|
2365
|
+
}
|
|
2318
2366
|
};
|
|
2319
2367
|
|
|
2320
2368
|
// Match the canvas box to the host immediately, without recapturing.
|
|
@@ -2323,6 +2371,11 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
2323
2371
|
// being animated (a scroll-driven hero expanding every frame) would
|
|
2324
2372
|
// otherwise render up to a debounce-interval behind its own layout —
|
|
2325
2373
|
// the canvas visibly trailing the content it is drawn over.
|
|
2374
|
+
// CSS size only. Assigning canvas.width/height re-allocates the drawing
|
|
2375
|
+
// buffer and CLEARS it, so doing that per frame while an element is being
|
|
2376
|
+
// animated makes the whole effect flash on every scroll step. The buffer
|
|
2377
|
+
// is left to the debounced recapture below; stretching the existing one
|
|
2378
|
+
// for a few frames costs a little sharpness and nothing else.
|
|
2326
2379
|
const syncCanvasBox = () => {
|
|
2327
2380
|
if (destroyed) return;
|
|
2328
2381
|
const m = measure();
|
|
@@ -2333,8 +2386,6 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
2333
2386
|
rect.height = m.height;
|
|
2334
2387
|
canvas.style.width = m.width + "px";
|
|
2335
2388
|
canvas.style.height = m.height + "px";
|
|
2336
|
-
canvas.width = Math.round(m.width * dpr);
|
|
2337
|
-
canvas.height = Math.round(m.height * dpr);
|
|
2338
2389
|
};
|
|
2339
2390
|
|
|
2340
2391
|
if (typeof ResizeObserver !== "undefined") {
|
package/lib/scroll-video.js
CHANGED
package/lib/seo.js
CHANGED
package/lib/stacker.js
CHANGED
package/lib/theme.js
CHANGED
package/lib/transform-anim.js
CHANGED