nodality 1.0.193 → 1.0.194
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 +47 -10
- 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.194
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -1954,12 +1954,20 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
1954
1954
|
const px = mouse[0] / canvas.width;
|
|
1955
1955
|
const py = 1 - mouse[1] / canvas.height;
|
|
1956
1956
|
let dx = 0, dy = 0;
|
|
1957
|
-
|
|
1957
|
+
// Only a real pointer event counts as motion. `mouse` is stored in
|
|
1958
|
+
// canvas pixels, so this normalised position also shifts whenever the
|
|
1959
|
+
// canvas itself resizes or moves — an element being animated (a
|
|
1960
|
+
// scroll-driven hero expanding) would otherwise inject phantom
|
|
1961
|
+
// velocity every frame and stir itself with the pointer sitting
|
|
1962
|
+
// still, or with the pointer nowhere near it.
|
|
1963
|
+
if (s.primed && pointerMoved) {
|
|
1958
1964
|
dx = (px - s.prevX) / Math.max(dt, 1e-3);
|
|
1959
1965
|
dy = (py - s.prevY) / Math.max(dt, 1e-3);
|
|
1960
1966
|
}
|
|
1967
|
+
// Re-baseline regardless, so the frame after a resize does not
|
|
1968
|
+
// measure its delta against a position from a different geometry.
|
|
1961
1969
|
s.prevX = px; s.prevY = py; s.primed = true;
|
|
1962
|
-
const moving = Math.abs(dx) + Math.abs(dy) > 1e-3;
|
|
1970
|
+
const moving = pointerMoved && Math.abs(dx) + Math.abs(dy) > 1e-3;
|
|
1963
1971
|
|
|
1964
1972
|
s.def.solver.step(S, s.node, {
|
|
1965
1973
|
dt, px, py, dx, dy, moving,
|
|
@@ -2191,10 +2199,17 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
2191
2199
|
// Pointer -> u_mouse (listen on the host so the overlay stays
|
|
2192
2200
|
// pointer-events: none).
|
|
2193
2201
|
let mouse = [canvas.width * 0.5, canvas.height * 0.5];
|
|
2202
|
+
// Set by a real pointer event, cleared once the solvers have consumed
|
|
2203
|
+
// it. Stateful ops splat only while this is true, so nothing is stirred
|
|
2204
|
+
// by the element resizing or scrolling under a stationary pointer.
|
|
2205
|
+
let pointerMoved = false;
|
|
2194
2206
|
const onMove = (e) => {
|
|
2195
2207
|
const r = canvas.getBoundingClientRect();
|
|
2196
2208
|
const pt = e.touches ? e.touches[0] : e;
|
|
2197
|
-
|
|
2209
|
+
const next = [(pt.clientX - r.left) * dpr, (pt.clientY - r.top) * dpr];
|
|
2210
|
+
// Guard against move events that report the same position.
|
|
2211
|
+
if (next[0] !== mouse[0] || next[1] !== mouse[1]) pointerMoved = true;
|
|
2212
|
+
mouse = next;
|
|
2198
2213
|
};
|
|
2199
2214
|
el.addEventListener("mousemove", onMove, { passive: true });
|
|
2200
2215
|
el.addEventListener("touchmove", onMove, { passive: true });
|
|
@@ -2240,6 +2255,10 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
2240
2255
|
// 1. Advance stateful fluid solvers into their own off-screen
|
|
2241
2256
|
// targets (this rebinds framebuffer/program/textures).
|
|
2242
2257
|
for (const s of solverOps) stepSolver(s, dt);
|
|
2258
|
+
// Consumed for this frame: a splat needs a fresh pointer event,
|
|
2259
|
+
// not merely a pointer position that happens to differ because
|
|
2260
|
+
// the canvas moved or resized beneath it.
|
|
2261
|
+
pointerMoved = false;
|
|
2243
2262
|
|
|
2244
2263
|
// 2. Composite pass, back on the visible framebuffer.
|
|
2245
2264
|
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
@@ -2306,15 +2325,30 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
2306
2325
|
// ResizeObserver, the window-resize fallback and the font-loading
|
|
2307
2326
|
// recapture, so all three agree on what "resize the canvas" means.
|
|
2308
2327
|
const remeasureAndCapture = () => {
|
|
2309
|
-
if (destroyed
|
|
2328
|
+
if (destroyed) return;
|
|
2310
2329
|
const m = measure();
|
|
2330
|
+
if (m.width < 2 || m.height < 2) return;
|
|
2331
|
+
const bw = Math.round(m.width * dpr);
|
|
2332
|
+
const bh = Math.round(m.height * dpr);
|
|
2311
2333
|
rect.width = m.width;
|
|
2312
2334
|
rect.height = m.height;
|
|
2313
|
-
canvas.width = Math.round(m.width * dpr);
|
|
2314
|
-
canvas.height = Math.round(m.height * dpr);
|
|
2315
2335
|
canvas.style.width = m.width + "px";
|
|
2316
2336
|
canvas.style.height = m.height + "px";
|
|
2317
|
-
|
|
2337
|
+
// Re-allocating the buffer clears it, so skip when it already matches
|
|
2338
|
+
// — syncCanvasBox may have kept the CSS box in step without needing a
|
|
2339
|
+
// new buffer at all.
|
|
2340
|
+
const bufferStale = canvas.width !== bw || canvas.height !== bh;
|
|
2341
|
+
if (bufferStale) {
|
|
2342
|
+
canvas.width = bw;
|
|
2343
|
+
canvas.height = bh;
|
|
2344
|
+
}
|
|
2345
|
+
if (mode === "snapshot") {
|
|
2346
|
+
snapshotCapture();
|
|
2347
|
+
} else if (bufferStale) {
|
|
2348
|
+
// Live mode re-uploads from the DOM every paint, so it needs no
|
|
2349
|
+
// recapture — only a fresh upload at the new buffer size.
|
|
2350
|
+
onPaint();
|
|
2351
|
+
}
|
|
2318
2352
|
};
|
|
2319
2353
|
|
|
2320
2354
|
// Match the canvas box to the host immediately, without recapturing.
|
|
@@ -2323,6 +2357,11 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
2323
2357
|
// being animated (a scroll-driven hero expanding every frame) would
|
|
2324
2358
|
// otherwise render up to a debounce-interval behind its own layout —
|
|
2325
2359
|
// the canvas visibly trailing the content it is drawn over.
|
|
2360
|
+
// CSS size only. Assigning canvas.width/height re-allocates the drawing
|
|
2361
|
+
// buffer and CLEARS it, so doing that per frame while an element is being
|
|
2362
|
+
// animated makes the whole effect flash on every scroll step. The buffer
|
|
2363
|
+
// is left to the debounced recapture below; stretching the existing one
|
|
2364
|
+
// for a few frames costs a little sharpness and nothing else.
|
|
2326
2365
|
const syncCanvasBox = () => {
|
|
2327
2366
|
if (destroyed) return;
|
|
2328
2367
|
const m = measure();
|
|
@@ -2333,8 +2372,6 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
2333
2372
|
rect.height = m.height;
|
|
2334
2373
|
canvas.style.width = m.width + "px";
|
|
2335
2374
|
canvas.style.height = m.height + "px";
|
|
2336
|
-
canvas.width = Math.round(m.width * dpr);
|
|
2337
|
-
canvas.height = Math.round(m.height * dpr);
|
|
2338
2375
|
};
|
|
2339
2376
|
|
|
2340
2377
|
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