nodality 1.0.190 → 1.0.192
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/base.cjs.js +1 -1
- package/dist/base.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/data-list.cjs.js +1 -1
- package/dist/data-list.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/horizontal-scroller.cjs.js +1 -1
- package/dist/horizontal-scroller.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/meta-adder.cjs.js +1 -1
- package/dist/meta-adder.esm.js +1 -1
- package/dist/modal-2025.cjs.js +1 -1
- package/dist/modal-2025.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/progress.cjs.js +1 -1
- package/dist/progress.esm.js +1 -1
- package/dist/radio.cjs.js +1 -1
- package/dist/radio.esm.js +1 -1
- package/dist/range.cjs.js +1 -1
- package/dist/range.esm.js +1 -1
- package/dist/side-bar.cjs.js +1 -1
- package/dist/side-bar.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/spacer.cjs.js +1 -1
- package/dist/spacer.esm.js +1 -1
- package/dist/stack.cjs.js +1 -1
- package/dist/stack.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/wrap.cjs.js +1 -1
- package/dist/wrap.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 +111 -1
- 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.192
|
|
3
3
|
* (c) 2026 Filip Vabrousek
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -1407,7 +1407,41 @@ function freezeViewportUnits(original, clone) {
|
|
|
1407
1407
|
return clone;
|
|
1408
1408
|
}
|
|
1409
1409
|
|
|
1410
|
+
/**
|
|
1411
|
+
* The single <img> a host renders, if that is all it is.
|
|
1412
|
+
*
|
|
1413
|
+
* A foreignObject rendered from a data: URI never fetches subresources, so
|
|
1414
|
+
* any <img> inside the serialized subtree comes back blank — a photo host
|
|
1415
|
+
* would capture as fully transparent. When the host is just an image we can
|
|
1416
|
+
* skip serialization entirely and upload that image as the texture, which
|
|
1417
|
+
* is both correct and considerably cheaper.
|
|
1418
|
+
*
|
|
1419
|
+
* Only same-origin, already-decoded images qualify: a cross-origin one
|
|
1420
|
+
* would taint the canvas and break the readback the pipeline depends on.
|
|
1421
|
+
*/
|
|
1422
|
+
function soleImageOf(el) {
|
|
1423
|
+
if (!el) return null;
|
|
1424
|
+
const img = el.tagName === "IMG"
|
|
1425
|
+
? el
|
|
1426
|
+
: (el.children && el.children.length === 1 && el.children[0].tagName === "IMG"
|
|
1427
|
+
? el.children[0]
|
|
1428
|
+
: null);
|
|
1429
|
+
if (!img || !img.complete || !img.naturalWidth) return null;
|
|
1430
|
+
try {
|
|
1431
|
+
// Relative and same-origin absolute srcs both resolve clean here.
|
|
1432
|
+
if (new URL(img.currentSrc || img.src, location.href).origin !== location.origin) {
|
|
1433
|
+
return null;
|
|
1434
|
+
}
|
|
1435
|
+
} catch (e) {
|
|
1436
|
+
return null;
|
|
1437
|
+
}
|
|
1438
|
+
return img;
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1410
1441
|
function snapshotToImage(el, w, h, dpr) {
|
|
1442
|
+
const direct = soleImageOf(el);
|
|
1443
|
+
if (direct) return Promise.resolve(direct);
|
|
1444
|
+
|
|
1411
1445
|
return new Promise((resolve, reject) => {
|
|
1412
1446
|
const serialized = new XMLSerializer()
|
|
1413
1447
|
.serializeToString(freezeViewportUnits(el, el.cloneNode(true)));
|
|
@@ -1476,6 +1510,67 @@ function resolveSwitches(nodes, depth) {
|
|
|
1476
1510
|
return out;
|
|
1477
1511
|
}
|
|
1478
1512
|
|
|
1513
|
+
// ── Replaced / void hosts ────────────────────────────────────────────
|
|
1514
|
+
//
|
|
1515
|
+
// Elements that cannot contain rendered children. Appending the pipeline
|
|
1516
|
+
// canvas to one of these puts it in the DOM but never paints it, so the
|
|
1517
|
+
// effect appears to attach and then does nothing at all.
|
|
1518
|
+
const VOID_RASTER_HOSTS = new Set([
|
|
1519
|
+
"IMG", "VIDEO", "CANVAS", "IFRAME", "INPUT", "EMBED", "OBJECT",
|
|
1520
|
+
"TEXTAREA", "SELECT", "BR", "HR", "AREA", "SOURCE", "TRACK", "WBR",
|
|
1521
|
+
]);
|
|
1522
|
+
|
|
1523
|
+
// Styles that describe the element's CONTENT rather than its box, and so
|
|
1524
|
+
// must stay on the element when its box moves to the wrapper.
|
|
1525
|
+
const CONTENT_STYLES = [
|
|
1526
|
+
"objectFit", "objectPosition", "borderRadius", "imageRendering", "filter",
|
|
1527
|
+
];
|
|
1528
|
+
|
|
1529
|
+
/**
|
|
1530
|
+
* Put `el` inside a container that can host the pipeline canvas.
|
|
1531
|
+
*
|
|
1532
|
+
* The wrapper takes over the element's authored inline box — position,
|
|
1533
|
+
* insets, size, margins — so layout is unchanged, and the element is reset
|
|
1534
|
+
* to fill it. Inline styles are moved rather than computed values copied:
|
|
1535
|
+
* copying computed width/height would freeze a fluid element at whatever
|
|
1536
|
+
* pixel size it happened to have at attach time.
|
|
1537
|
+
*
|
|
1538
|
+
* @returns {HTMLElement|null} the wrapper, or null if `el` has no parent.
|
|
1539
|
+
*/
|
|
1540
|
+
function wrapReplacedHost(el) {
|
|
1541
|
+
if (!el.parentNode) return null;
|
|
1542
|
+
|
|
1543
|
+
const keep = {};
|
|
1544
|
+
for (const k of CONTENT_STYLES) {
|
|
1545
|
+
if (el.style[k]) keep[k] = el.style[k];
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
const wrap = document.createElement("div");
|
|
1549
|
+
wrap.setAttribute("data-nodality-raster-host", el.tagName.toLowerCase());
|
|
1550
|
+
wrap.style.cssText = el.style.cssText;
|
|
1551
|
+
|
|
1552
|
+
el.parentNode.insertBefore(wrap, el);
|
|
1553
|
+
wrap.appendChild(el);
|
|
1554
|
+
|
|
1555
|
+
// The wrapper is now the box; the element fills it.
|
|
1556
|
+
el.removeAttribute("style");
|
|
1557
|
+
Object.assign(el.style, keep);
|
|
1558
|
+
el.style.display = "block";
|
|
1559
|
+
el.style.width = "100%";
|
|
1560
|
+
el.style.height = "100%";
|
|
1561
|
+
|
|
1562
|
+
// The canvas is positioned against the wrapper, so it needs to be a
|
|
1563
|
+
// containing block.
|
|
1564
|
+
const pos = typeof getComputedStyle === "function"
|
|
1565
|
+
? getComputedStyle(wrap).position
|
|
1566
|
+
: "static";
|
|
1567
|
+
if (pos === "static") wrap.style.position = "relative";
|
|
1568
|
+
if (!wrap.style.width) wrap.style.width = "100%";
|
|
1569
|
+
if (!wrap.style.height) wrap.style.height = "100%";
|
|
1570
|
+
|
|
1571
|
+
return wrap;
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1479
1574
|
// ── Pipeline runner ──────────────────────────────────────────────────
|
|
1480
1575
|
|
|
1481
1576
|
function applyRasterPipeline(el, rasterNodes) {
|
|
@@ -1501,6 +1596,21 @@ function applyRasterPipeline(el, rasterNodes) {
|
|
|
1501
1596
|
if (typeof window.matchMedia === "function" &&
|
|
1502
1597
|
window.matchMedia("(prefers-reduced-motion: reduce)").matches) return null;
|
|
1503
1598
|
|
|
1599
|
+
// The pipeline hosts its canvas as a child of the target. Replaced and
|
|
1600
|
+
// void elements cannot take children — appending to an <img> puts the
|
|
1601
|
+
// canvas in the tree but never renders it, so the effect silently does
|
|
1602
|
+
// nothing. Wrap such a target in a container and host there instead.
|
|
1603
|
+
if (VOID_RASTER_HOSTS.has(el.tagName)) {
|
|
1604
|
+
const existing =
|
|
1605
|
+
el.parentElement &&
|
|
1606
|
+
el.parentElement.hasAttribute &&
|
|
1607
|
+
el.parentElement.hasAttribute("data-nodality-raster-host")
|
|
1608
|
+
? el.parentElement
|
|
1609
|
+
: null;
|
|
1610
|
+
el = existing || wrapReplacedHost(el);
|
|
1611
|
+
if (!el) return null;
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1504
1614
|
// One pipeline per host element (set() chains can fire more than
|
|
1505
1615
|
// once across codegen instances; only the mounted one matters).
|
|
1506
1616
|
if (el.querySelector && el.querySelector(":scope > canvas[data-nodality-raster]")) return null;
|
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