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.
Files changed (192) hide show
  1. package/dist/animator.cjs.js +1 -1
  2. package/dist/animator.esm.js +1 -1
  3. package/dist/audionew.cjs.js +1 -1
  4. package/dist/audionew.esm.js +1 -1
  5. package/dist/base.cjs.js +1 -1
  6. package/dist/base.esm.js +1 -1
  7. package/dist/beta-desktop-bar.cjs.js +1 -1
  8. package/dist/beta-desktop-bar.esm.js +1 -1
  9. package/dist/beta-mobile-bar.cjs.js +1 -1
  10. package/dist/beta-mobile-bar.esm.js +1 -1
  11. package/dist/bundle.umd.js +1 -1
  12. package/dist/button.cjs.js +1 -1
  13. package/dist/button.esm.js +1 -1
  14. package/dist/center.cjs.js +1 -1
  15. package/dist/center.esm.js +1 -1
  16. package/dist/checkbox.cjs.js +1 -1
  17. package/dist/checkbox.esm.js +1 -1
  18. package/dist/code.cjs.js +1 -1
  19. package/dist/code.esm.js +1 -1
  20. package/dist/container.cjs.js +1 -1
  21. package/dist/container.esm.js +1 -1
  22. package/dist/data-list.cjs.js +1 -1
  23. package/dist/data-list.esm.js +1 -1
  24. package/dist/designer.cjs.js +1 -1
  25. package/dist/designer.esm.js +1 -1
  26. package/dist/dropdown.cjs.js +1 -1
  27. package/dist/dropdown.esm.js +1 -1
  28. package/dist/element-mapper.cjs.js +1 -1
  29. package/dist/element-mapper.esm.js +1 -1
  30. package/dist/finalresult.esm.js +1 -1
  31. package/dist/flex-card.cjs.js +1 -1
  32. package/dist/flex-card.esm.js +1 -1
  33. package/dist/flex-grid.cjs.js +1 -1
  34. package/dist/flex-grid.esm.js +1 -1
  35. package/dist/flex-row.cjs.js +1 -1
  36. package/dist/flex-row.esm.js +1 -1
  37. package/dist/floating-input.cjs.js +1 -1
  38. package/dist/floating-input.esm.js +1 -1
  39. package/dist/free.cjs.js +1 -1
  40. package/dist/free.esm.js +1 -1
  41. package/dist/horizontal-scroller.cjs.js +1 -1
  42. package/dist/horizontal-scroller.esm.js +1 -1
  43. package/dist/image-picker.cjs.js +1 -1
  44. package/dist/image-picker.esm.js +1 -1
  45. package/dist/image.cjs.js +1 -1
  46. package/dist/image.esm.js +1 -1
  47. package/dist/index.cjs.js +1 -1
  48. package/dist/index.esm.js +1 -1
  49. package/dist/link-getter.cjs.js +1 -1
  50. package/dist/link-getter.esm.js +1 -1
  51. package/dist/link.cjs.js +1 -1
  52. package/dist/link.esm.js +1 -1
  53. package/dist/meta-adder.cjs.js +1 -1
  54. package/dist/meta-adder.esm.js +1 -1
  55. package/dist/modal-2025.cjs.js +1 -1
  56. package/dist/modal-2025.esm.js +1 -1
  57. package/dist/multiswitcher.cjs.js +1 -1
  58. package/dist/multiswitcher.esm.js +1 -1
  59. package/dist/new-nav-bar.cjs.js +1 -1
  60. package/dist/new-nav-bar.esm.js +1 -1
  61. package/dist/picker.cjs.js +1 -1
  62. package/dist/picker.esm.js +1 -1
  63. package/dist/progress.cjs.js +1 -1
  64. package/dist/progress.esm.js +1 -1
  65. package/dist/radio.cjs.js +1 -1
  66. package/dist/radio.esm.js +1 -1
  67. package/dist/range.cjs.js +1 -1
  68. package/dist/range.esm.js +1 -1
  69. package/dist/side-bar.cjs.js +1 -1
  70. package/dist/side-bar.esm.js +1 -1
  71. package/dist/side-nav-bar.cjs.js +1 -1
  72. package/dist/side-nav-bar.esm.js +1 -1
  73. package/dist/simple-bar.cjs.js +1 -1
  74. package/dist/simple-bar.esm.js +1 -1
  75. package/dist/slider-2025.cjs.js +1 -1
  76. package/dist/slider-2025.esm.js +1 -1
  77. package/dist/spacer.cjs.js +1 -1
  78. package/dist/spacer.esm.js +1 -1
  79. package/dist/stack.cjs.js +1 -1
  80. package/dist/stack.esm.js +1 -1
  81. package/dist/table.cjs.js +1 -1
  82. package/dist/table.esm.js +1 -1
  83. package/dist/text-field.cjs.js +1 -1
  84. package/dist/text-field.esm.js +1 -1
  85. package/dist/text.cjs.js +1 -1
  86. package/dist/text.esm.js +1 -1
  87. package/dist/ulist.cjs.js +1 -1
  88. package/dist/ulist.esm.js +1 -1
  89. package/dist/video.cjs.js +1 -1
  90. package/dist/video.esm.js +1 -1
  91. package/dist/wrap.cjs.js +1 -1
  92. package/dist/wrap.esm.js +1 -1
  93. package/dist/zoom-card.cjs.js +1 -1
  94. package/dist/zoom-card.esm.js +1 -1
  95. package/layout/animator.js +1 -1
  96. package/layout/audio.js +1 -1
  97. package/layout/audionew.js +1 -1
  98. package/layout/base-2.js +1 -1
  99. package/layout/base.js +1 -1
  100. package/layout/beta-desktop-bar.js +1 -1
  101. package/layout/beta-mobile-bar.js +1 -1
  102. package/layout/box.js +1 -1
  103. package/layout/button.js +1 -1
  104. package/layout/cards.js +1 -1
  105. package/layout/center.js +1 -1
  106. package/layout/checkbox.js +1 -1
  107. package/layout/circle.js +1 -1
  108. package/layout/clean-row.js +1 -1
  109. package/layout/code.js +1 -1
  110. package/layout/container.js +1 -1
  111. package/layout/custom.js +1 -1
  112. package/layout/div-image.js +1 -1
  113. package/layout/dropdown-2025.js +1 -1
  114. package/layout/dropdown.js +1 -1
  115. package/layout/empty-element.js +1 -1
  116. package/layout/external-stylesheet.js +1 -1
  117. package/layout/flex-card.js +1 -1
  118. package/layout/flex-grid.js +1 -1
  119. package/layout/flex-row.js +1 -1
  120. package/layout/footer.js +1 -1
  121. package/layout/form-components/custom.js +1 -1
  122. package/layout/form-components/data-list.js +1 -1
  123. package/layout/form-components/floating-input.js +1 -1
  124. package/layout/form-components/form-all.js +1 -1
  125. package/layout/form-components/form.js +1 -1
  126. package/layout/form-components/image-picker.js +1 -1
  127. package/layout/form-components/picker.js +1 -1
  128. package/layout/form-components/radio.js +1 -1
  129. package/layout/form-components/radiogroup.js +1 -1
  130. package/layout/form-components/range.js +1 -1
  131. package/layout/free.js +1 -1
  132. package/layout/grid-new.js +1 -1
  133. package/layout/grid-switcher.js +1 -1
  134. package/layout/grid.js +1 -1
  135. package/layout/group.js +1 -1
  136. package/layout/header.js +1 -1
  137. package/layout/horizontal-scroller.js +1 -1
  138. package/layout/image-old.js +1 -1
  139. package/layout/image.js +1 -1
  140. package/layout/index.js +1 -1
  141. package/layout/label.js +1 -1
  142. package/layout/link.js +1 -1
  143. package/layout/list-OLD.js +1 -1
  144. package/layout/list.js +1 -1
  145. package/layout/meta-adder.js +1 -1
  146. package/layout/modal-2025.js +1 -1
  147. package/layout/modernwrap.js +1 -1
  148. package/layout/multiswitcher.js +1 -1
  149. package/layout/multiswitcherBeta.js +1 -1
  150. package/layout/nav-bar.js +1 -1
  151. package/layout/nav-factor/custom-div.js +1 -1
  152. package/layout/navBar-OLD.js +1 -1
  153. package/layout/new-flat-adder.js +1 -1
  154. package/layout/new-nav-bar.js +1 -1
  155. package/layout/offset-container.js +1 -1
  156. package/layout/polygon.js +1 -1
  157. package/layout/prerender-site.js +1 -1
  158. package/layout/prerender.js +1 -1
  159. package/layout/progress.js +1 -1
  160. package/layout/row.js +1 -1
  161. package/layout/saved-new-nav-bar.js +1 -1
  162. package/layout/scroll-video.js +1 -1
  163. package/layout/side-bar.js +1 -1
  164. package/layout/side-nav-bar.js +1 -1
  165. package/layout/simple-bar.js +1 -1
  166. package/layout/slider-2025.js +1 -1
  167. package/layout/spacer.js +1 -1
  168. package/layout/stack.js +1 -1
  169. package/layout/styler.js +1 -1
  170. package/layout/svg.js +1 -1
  171. package/layout/switcher.js +1 -1
  172. package/layout/table.js +1 -1
  173. package/layout/text-field.js +1 -1
  174. package/layout/text.js +1 -1
  175. package/layout/ulist.js +1 -1
  176. package/layout/video.js +1 -1
  177. package/layout/without-new.js +1 -1
  178. package/layout/wrap.js +1 -1
  179. package/layout/zoom-card.js +1 -1
  180. package/lib/card-getter.js +1 -1
  181. package/lib/data.js +1 -1
  182. package/lib/designer.js +1 -1
  183. package/lib/element-mapper.js +1 -1
  184. package/lib/keyframe-animation.js +1 -1
  185. package/lib/link-getter.js +1 -1
  186. package/lib/raster-ops.js +111 -1
  187. package/lib/scroll-video.js +1 -1
  188. package/lib/seo.js +1 -1
  189. package/lib/stacker.js +1 -1
  190. package/lib/theme.js +1 -1
  191. package/lib/transform-anim.js +1 -1
  192. package/package.json +1 -1
package/lib/raster-ops.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.190
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;
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.190
2
+ * nodality v1.0.192
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/seo.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.190
2
+ * nodality v1.0.192
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/stacker.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.190
2
+ * nodality v1.0.192
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/theme.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.190
2
+ * nodality v1.0.192
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.190
2
+ * nodality v1.0.192
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodality",
3
- "version": "1.0.190",
3
+ "version": "1.0.192",
4
4
  "description": "A lightweight library for declarative UI elements.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",