nodality 1.0.199 → 1.0.201

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 (174) 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/designer.cjs.js +1 -1
  23. package/dist/designer.esm.js +1 -1
  24. package/dist/dropdown.cjs.js +1 -1
  25. package/dist/dropdown.esm.js +1 -1
  26. package/dist/element-mapper.cjs.js +1 -1
  27. package/dist/element-mapper.esm.js +1 -1
  28. package/dist/finalresult.esm.js +1 -1
  29. package/dist/flex-card.cjs.js +1 -1
  30. package/dist/flex-card.esm.js +1 -1
  31. package/dist/flex-grid.cjs.js +1 -1
  32. package/dist/flex-grid.esm.js +1 -1
  33. package/dist/flex-row.cjs.js +1 -1
  34. package/dist/flex-row.esm.js +1 -1
  35. package/dist/floating-input.cjs.js +1 -1
  36. package/dist/floating-input.esm.js +1 -1
  37. package/dist/free.cjs.js +1 -1
  38. package/dist/free.esm.js +1 -1
  39. package/dist/horizontal-scroller.cjs.js +1 -1
  40. package/dist/horizontal-scroller.esm.js +1 -1
  41. package/dist/image-picker.cjs.js +1 -1
  42. package/dist/image-picker.esm.js +1 -1
  43. package/dist/image.cjs.js +1 -1
  44. package/dist/image.esm.js +1 -1
  45. package/dist/index.cjs.js +1 -1
  46. package/dist/index.esm.js +1 -1
  47. package/dist/link-getter.cjs.js +1 -1
  48. package/dist/link-getter.esm.js +1 -1
  49. package/dist/link.cjs.js +1 -1
  50. package/dist/link.esm.js +1 -1
  51. package/dist/multiswitcher.cjs.js +1 -1
  52. package/dist/multiswitcher.esm.js +1 -1
  53. package/dist/new-nav-bar.cjs.js +1 -1
  54. package/dist/new-nav-bar.esm.js +1 -1
  55. package/dist/picker.cjs.js +1 -1
  56. package/dist/picker.esm.js +1 -1
  57. package/dist/side-bar.cjs.js +1 -1
  58. package/dist/side-bar.esm.js +1 -1
  59. package/dist/side-nav-bar.cjs.js +1 -1
  60. package/dist/side-nav-bar.esm.js +1 -1
  61. package/dist/simple-bar.cjs.js +1 -1
  62. package/dist/simple-bar.esm.js +1 -1
  63. package/dist/slider-2025.cjs.js +1 -1
  64. package/dist/slider-2025.esm.js +1 -1
  65. package/dist/table.cjs.js +1 -1
  66. package/dist/table.esm.js +1 -1
  67. package/dist/text-field.cjs.js +1 -1
  68. package/dist/text-field.esm.js +1 -1
  69. package/dist/text.cjs.js +1 -1
  70. package/dist/text.esm.js +1 -1
  71. package/dist/ulist.cjs.js +1 -1
  72. package/dist/ulist.esm.js +1 -1
  73. package/dist/video.cjs.js +1 -1
  74. package/dist/video.esm.js +1 -1
  75. package/dist/zoom-card.cjs.js +1 -1
  76. package/dist/zoom-card.esm.js +1 -1
  77. package/layout/animator.js +107 -47
  78. package/layout/audio.js +1 -1
  79. package/layout/audionew.js +1 -1
  80. package/layout/base-2.js +1 -1
  81. package/layout/base.js +15 -11
  82. package/layout/beta-desktop-bar.js +1 -1
  83. package/layout/beta-mobile-bar.js +1 -1
  84. package/layout/box.js +1 -1
  85. package/layout/button.js +2 -3
  86. package/layout/cards.js +1 -1
  87. package/layout/center.js +3 -5
  88. package/layout/checkbox.js +1 -1
  89. package/layout/circle.js +1 -1
  90. package/layout/clean-row.js +1 -1
  91. package/layout/code.js +1 -1
  92. package/layout/container.js +2 -3
  93. package/layout/custom.js +1 -1
  94. package/layout/div-image.js +1 -1
  95. package/layout/dropdown-2025.js +1 -1
  96. package/layout/dropdown.js +1 -1
  97. package/layout/empty-element.js +1 -1
  98. package/layout/external-stylesheet.js +1 -1
  99. package/layout/flex-card.js +1 -1
  100. package/layout/flex-grid.js +1 -1
  101. package/layout/flex-row.js +1 -3
  102. package/layout/footer.js +1 -1
  103. package/layout/form-components/custom.js +1 -1
  104. package/layout/form-components/data-list.js +1 -1
  105. package/layout/form-components/floating-input.js +1 -1
  106. package/layout/form-components/form-all.js +1 -1
  107. package/layout/form-components/form.js +1 -1
  108. package/layout/form-components/image-picker.js +1 -1
  109. package/layout/form-components/picker.js +1 -1
  110. package/layout/form-components/radio.js +1 -1
  111. package/layout/form-components/radiogroup.js +1 -1
  112. package/layout/form-components/range.js +1 -1
  113. package/layout/free.js +1 -1
  114. package/layout/grid-new.js +1 -1
  115. package/layout/grid-switcher.js +1 -1
  116. package/layout/grid.js +1 -1
  117. package/layout/group.js +1 -1
  118. package/layout/header.js +1 -1
  119. package/layout/horizontal-scroller.js +1 -1
  120. package/layout/image-old.js +1 -1
  121. package/layout/image.js +1 -1
  122. package/layout/index.js +1 -1
  123. package/layout/label.js +1 -1
  124. package/layout/link.js +1 -1
  125. package/layout/list-OLD.js +1 -1
  126. package/layout/list.js +1 -1
  127. package/layout/meta-adder.js +1 -1
  128. package/layout/modal-2025.js +1 -1
  129. package/layout/modernwrap.js +1 -1
  130. package/layout/multiswitcher.js +1 -1
  131. package/layout/multiswitcherBeta.js +1 -1
  132. package/layout/nav-bar.js +1 -1
  133. package/layout/nav-factor/custom-div.js +1 -1
  134. package/layout/navBar-OLD.js +1 -1
  135. package/layout/new-flat-adder.js +1 -1
  136. package/layout/new-nav-bar.js +1 -1
  137. package/layout/offset-container.js +1 -1
  138. package/layout/polygon.js +1 -1
  139. package/layout/prerender-site.js +1 -1
  140. package/layout/prerender.js +1 -1
  141. package/layout/progress.js +1 -1
  142. package/layout/row.js +1 -1
  143. package/layout/saved-new-nav-bar.js +1 -1
  144. package/layout/scroll-video.js +1 -1
  145. package/layout/side-bar.js +1 -1
  146. package/layout/side-nav-bar.js +2 -3
  147. package/layout/simple-bar.js +1 -1
  148. package/layout/slider-2025.js +1 -1
  149. package/layout/spacer.js +1 -1
  150. package/layout/stack.js +1 -1
  151. package/layout/styler.js +1 -1
  152. package/layout/svg.js +1 -1
  153. package/layout/switcher.js +1 -1
  154. package/layout/table.js +1 -1
  155. package/layout/text-field.js +1 -1
  156. package/layout/text.js +3 -5
  157. package/layout/ulist.js +1 -1
  158. package/layout/video.js +1 -1
  159. package/layout/without-new.js +1 -1
  160. package/layout/wrap.js +1 -1
  161. package/layout/zoom-card.js +1 -1
  162. package/lib/card-getter.js +1 -1
  163. package/lib/data.js +1 -1
  164. package/lib/designer.js +65 -19
  165. package/lib/element-mapper.js +17 -73
  166. package/lib/keyframe-animation.js +1 -1
  167. package/lib/link-getter.js +1 -1
  168. package/lib/raster-ops.js +20 -2
  169. package/lib/scroll-video.js +1 -1
  170. package/lib/seo.js +1 -1
  171. package/lib/stacker.js +1 -1
  172. package/lib/theme.js +1 -1
  173. package/lib/transform-anim.js +1 -1
  174. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -39,13 +39,14 @@ class Animator {
39
39
  // to the document and has a layout box. Safe no-op headless.
40
40
  rasterize(list){
41
41
  if (!list || list.length === 0 || this._rasterHandle) return;
42
+ if (this._rasterCancelled) return; // destroy() ran before we attached
42
43
  if (typeof document === "undefined" || typeof setTimeout === "undefined") return;
43
44
  // setTimeout, not requestAnimationFrame: rAF is throttled to a
44
45
  // standstill in backgrounded tabs, which would leave the effect
45
46
  // permanently unattached there.
46
47
  let attempts = 0;
47
48
  const tryAttach = () => {
48
- if (this._rasterHandle) return;
49
+ if (this._rasterHandle || this._rasterCancelled) return;
49
50
  if (this.res && this.res.isConnected) {
50
51
  try {
51
52
  this._rasterHandle = applyRasterPipeline(this.res, list);
@@ -57,9 +58,10 @@ class Animator {
57
58
  // null: layout box not ready yet (or WebGL/motion
58
59
  // unavailable) - keep retrying within the budget.
59
60
  }
60
- if (++attempts < 80) setTimeout(tryAttach, 50);
61
+ if (++attempts < 80) this._rasterTimer = setTimeout(tryAttach, 50);
61
62
  };
62
- setTimeout(tryAttach, 0);
63
+ this._rasterTimer = setTimeout(tryAttach, 0);
64
+ this._track(() => clearTimeout(this._rasterTimer));
63
65
  }
64
66
 
65
67
  isHidden(hide){
@@ -83,13 +85,54 @@ class Animator {
83
85
  return this;
84
86
  }
85
87
 
86
- // Tear down theme subscription. Call this when removing a component from
87
- // the DOM in long-lived apps to prevent listener accumulation on document.
88
+ // Register a teardown callback. Everything this component attaches to a
89
+ // long-lived target (window, document, an observer, the GPU pipeline)
90
+ // should go through _track/_on so destroy() can actually release it.
91
+ _track(fn){
92
+ if (typeof fn !== "function") return fn;
93
+ (this._disposables || (this._disposables = [])).push(fn);
94
+ return fn;
95
+ }
96
+
97
+ // addEventListener + automatic removal on destroy(). Element-level
98
+ // listeners are collected with the element, but window/document ones
99
+ // outlive it and pin the component (and its DOM subtree) forever.
100
+ _on(target, type, handler, opts){
101
+ if (!target || typeof target.addEventListener !== "function") return handler;
102
+ target.addEventListener(type, handler, opts);
103
+ this._track(() => target.removeEventListener(type, handler, opts));
104
+ return handler;
105
+ }
106
+
107
+ // Tear down everything this component attached: theme subscription, the
108
+ // raster GPU pipeline, window/document listeners and observers. Call it
109
+ // when removing a component from the DOM in a long-lived app.
110
+ //
111
+ // Previously this released only the theme subscription, so each mounted
112
+ // component leaked its resize/scroll handlers and — for raster elements —
113
+ // an entire WebGL context, RAF loop and two observers. raster-ops has had
114
+ // a complete destroy() all along; nothing ever called it.
88
115
  destroy(){
89
116
  if (typeof this._themeUnsub === "function") {
90
117
  this._themeUnsub();
91
118
  this._themeUnsub = null;
92
119
  }
120
+
121
+ if (this._rasterHandle && typeof this._rasterHandle.destroy === "function") {
122
+ try { this._rasterHandle.destroy(); } catch (e) { /* already gone */ }
123
+ }
124
+ this._rasterHandle = null;
125
+ this._rasterCancelled = true;
126
+
127
+ if (this._disposables) {
128
+ for (const off of this._disposables) {
129
+ try { off(); } catch (e) { /* keep draining */ }
130
+ }
131
+ this._disposables.length = 0;
132
+ }
133
+ this._responsiveTasks = null;
134
+ this._responsiveHandler = null;
135
+
93
136
  if (this.res && this.res.parentNode) {
94
137
  this.res.parentNode.removeChild(this.res);
95
138
  }
@@ -381,7 +424,14 @@ class Animator {
381
424
  if (obj.animation) {
382
425
 
383
426
  this.res.style.transition = `${obj.animation}`; //`${obj.animation}s ease-in-out`; // stop resize ???
384
- this.res.style.transionProperty = `background, color, transform`;
427
+ // This used to be misspelled `transionProperty`, which CSSOM
428
+ // silently discards — so the shipped behaviour was the shorthand's
429
+ // default, `all`. Fixing the spelling narrows what animates, so the
430
+ // list has to name every property hover() actually changes
431
+ // (see the onmouseover/onmouseout handlers below) or those would
432
+ // start snapping instead of easing.
433
+ this.res.style.transitionProperty =
434
+ `background-color, color, border, box-shadow, transform`;
385
435
  // this.transition(obj.animation);
386
436
  }
387
437
 
@@ -525,7 +575,7 @@ class Animator {
525
575
  }
526
576
  };
527
577
 
528
- window.addEventListener("scroll", compute);
578
+ this._on(window, "scroll", compute);
529
579
 
530
580
  // Fire at the beginning if user sets "from" value to 0
531
581
  if (data.from === 0) {
@@ -618,7 +668,7 @@ _setupResponsiveManager() {
618
668
  // We check if the handler is already assigned to avoid duplicate listeners
619
669
  if (!this._responsiveHandler) {
620
670
  this._responsiveHandler = react;
621
- window.addEventListener("resize", react);
671
+ this._on(window, "resize", react);
622
672
  }
623
673
 
624
674
  // 4. Trigger Execution (ALWAYS)
@@ -701,12 +751,10 @@ resprop(arr, op) {
701
751
 
702
752
  // --- 2. STATE CAPTURE ---
703
753
 
704
- this.prevStyles = {};
705
- for (const prop in this.res.style) {
706
- if (this.res.style.hasOwnProperty(prop) && isNaN(parseInt(prop))) {
707
- this.prevStyles[prop] = this.res.style[prop];
708
- }
709
- }
754
+ // NOTE: the full-style snapshot that used to live here (this.prevStyles)
755
+ // was write-only — the only readers are in commented-out earlier versions
756
+ // of resprop below. It walked every CSSOM property on every resprop() call
757
+ // for nothing, so it has been dropped.
710
758
 
711
759
  const responsiveProps = new Set();
712
760
  arr.forEach(bp => {
@@ -726,7 +774,7 @@ resprop(arr, op) {
726
774
 
727
775
  // --- 3. CORE LOGIC ---
728
776
  const respropTask = () => {
729
- const width = window.innerWidth;
777
+ const width = Animator.viewportWidth();
730
778
  let applied = defaultItem;
731
779
 
732
780
  // 1. Find the first matching range.
@@ -759,11 +807,14 @@ resprop(arr, op) {
759
807
 
760
808
  // C. Overrides: Apply matching breakpoint values
761
809
  for (const key in applied) {
762
-
810
+
811
+ // `exact` is a font-size. It used to call this.set(applied) —
812
+ // re-entering the component's whole set() pipeline (re-registering
813
+ // hover handlers, re-parsing every option) on EVERY resize event.
814
+ // Apply the property directly instead.
763
815
  if (key === "exact"){
764
- //alert(key);
765
- this.set(applied);
766
- //this.set({key: })
816
+ this.res.style.fontSize = applied[key];
817
+ continue;
767
818
  }
768
819
 
769
820
 
@@ -840,7 +891,7 @@ respad(arr) {
840
891
 
841
892
  // --- 3. CORE LOGIC: The Responsive Task Function ---
842
893
  const respadTask = () => {
843
- const width = window.innerWidth;
894
+ const width = Animator.viewportWidth();
844
895
  let applied = defaultItem;
845
896
 
846
897
  // 1. RANGE LOGIC: Find the exact breakpoint whose range matches the current width.
@@ -947,7 +998,7 @@ respad(arr) { // COOL
947
998
  // --- 3. CORE LOGIC: The 'react' function (Responsive Style Application) ---
948
999
 
949
1000
  const react = () => {
950
- const width = window.innerWidth;
1001
+ const width = Animator.viewportWidth();
951
1002
  let applied = defaultItem;
952
1003
 
953
1004
  // 1. RANGE LOGIC: Find the exact breakpoint whose range matches the current width.
@@ -1068,7 +1119,7 @@ _applyResponsive(arr, applyFn) {
1068
1119
  if (this._responsiveHandler) window.removeEventListener("resize", this._responsiveHandler);
1069
1120
  this._responsiveHandler = react;
1070
1121
 
1071
- window.addEventListener("resize", react);
1122
+ this._on(window, "resize", react);
1072
1123
 
1073
1124
  // ⭐ FIX: Defer the initial call slightly to avoid race conditions on refresh.
1074
1125
  setTimeout(() => {
@@ -1170,7 +1221,7 @@ resprop(arr) { // COOL
1170
1221
  // --- 3. CORE LOGIC: The 'react' function (Responsive Style Application) ---
1171
1222
 
1172
1223
  const react = () => {
1173
- const width = window.innerWidth;
1224
+ const width = Animator.viewportWidth();
1174
1225
  let applied = defaultItem;
1175
1226
 
1176
1227
  // 1. RANGE LOGIC: Find the FIRST breakpoint whose range matches the current width.
@@ -1299,7 +1350,7 @@ resprop(arr) {
1299
1350
  // --- 3. CORE LOGIC: The 'react' function (Responsive Style Application) ---
1300
1351
 
1301
1352
  const react = () => {
1302
- const width = window.innerWidth;
1353
+ const width = Animator.viewportWidth();
1303
1354
  let applied = defaultItem;
1304
1355
 
1305
1356
  // 1. STANDARD MIN-WIDTH LOGIC: Find the LARGEST breakpoint whose MIN-WIDTH is matched.
@@ -1409,7 +1460,7 @@ resmar(arr) {
1409
1460
 
1410
1461
  // --- 3. CORE LOGIC: The Responsive Task Function ---
1411
1462
  const resmarTask = () => {
1412
- const width = window.innerWidth;
1463
+ const width = Animator.viewportWidth();
1413
1464
  let applied = defaultItem;
1414
1465
 
1415
1466
  // 1. RANGE LOGIC: Find the exact breakpoint whose range matches the current width.
@@ -1487,6 +1538,15 @@ resmar(arr) {
1487
1538
  isNumber(value) {
1488
1539
  return typeof value === 'number' && !isNaN(value);
1489
1540
  }
1541
+
1542
+ // Single source of truth for "how wide is the viewport". See the note in
1543
+ // chainReact — visualViewport is preferred (it tracks pinch-zoom) but is
1544
+ // not universally present.
1545
+ static viewportWidth() {
1546
+ if (typeof window === "undefined") return 0;
1547
+ const vv = window.visualViewport;
1548
+ return (vv && typeof vv.width === "number") ? vv.width : window.innerWidth;
1549
+ }
1490
1550
 
1491
1551
  pad(arr){
1492
1552
 
@@ -1607,17 +1667,12 @@ resmar(arr) {
1607
1667
  percent = (val - from.max) / (from.min - from.max);
1608
1668
  }
1609
1669
 
1610
- let toRange = (to.min - to.max) * percent - to.min;
1611
- toRange = Math.abs(toRange);
1612
-
1613
- if (to.min < to.max) {
1614
- let sm = to.max + Math.abs(to.min);
1615
- let timesPerc = sm * percent;
1616
- toRange = to.min + timesPerc;
1617
- }
1618
-
1619
-
1620
- return toRange;
1670
+ // Linear interpolation across the OUTPUT range. The old form added
1671
+ // |to.min| to to.max instead of subtracting it, so any range whose
1672
+ // minimum was above zero overshot: 0.2 -> 1 produced 0.2 + 1.2p = 1.4
1673
+ // at full scroll. Correct only when to.min <= 0, which is why the
1674
+ // 0 -> 1 demos never showed it.
1675
+ return to.min + (to.max - to.min) * percent;
1621
1676
  }
1622
1677
 
1623
1678
 
@@ -2411,7 +2466,11 @@ setTags(obj){
2411
2466
  // Function to check and log queries based on screen size
2412
2467
  const checkQueries = (qban) => {
2413
2468
  //alert("/P")
2414
- const screenSize = window.visualViewport.width; // window.innerWidth window.screen.width window.visualViewport.width
2469
+ // One width source for the whole library. visualViewport is absent in
2470
+ // jsdom and older WebViews (TypeError), and disagrees with innerWidth
2471
+ // during pinch-zoom — which used to make chainReact breakpoints flip at
2472
+ // different widths than resprop/respad breakpoints on the same page.
2473
+ const screenSize = Animator.viewportWidth();
2415
2474
  let ops = "";
2416
2475
  let operations = [];
2417
2476
  let globalQueries = [];
@@ -2799,12 +2858,12 @@ this.hasAnimated = true;
2799
2858
  let ass = this.options.animation.op;
2800
2859
  //alert(this.openTag);
2801
2860
 
2802
- window.addEventListener(/*this.openTag*/"sidebar:open", () => {
2861
+ this._on(window, /*this.openTag*/"sidebar:open", () => {
2803
2862
 
2804
2863
  this.res.animate(ass.keyframesOpen, ass.openOptions);
2805
2864
  });
2806
2865
 
2807
- window.addEventListener(/*this.closeTag*/ "sidebar:closed", () => {
2866
+ this._on(window, /*this.closeTag*/ "sidebar:closed", () => {
2808
2867
 
2809
2868
  this.res.animate(ass.keyframesClose, ass.closeOptions);
2810
2869
  });
@@ -2823,11 +2882,11 @@ let ass = this.options.animation.op;
2823
2882
  // alert("ONA" + this.openTag);
2824
2883
  //alert(this.openTag);
2825
2884
 
2826
- window.addEventListener(this.openTag, () => {
2885
+ this._on(window, this.openTag, () => {
2827
2886
  this.res.animate(ass.keyframesOpen, ass.openOptions);
2828
2887
  });
2829
2888
  // "sidebar:opened" "sidebar:closed"
2830
- window.addEventListener(this.closeTag, () => {
2889
+ this._on(window, this.closeTag, () => {
2831
2890
  this.res.animate(ass.keyframesClose, ass.closeOptions);
2832
2891
  });
2833
2892
  }
@@ -2853,7 +2912,7 @@ window.addEventListener(this.openTag, () => {
2853
2912
  }
2854
2913
  };
2855
2914
 
2856
- window.addEventListener("scroll", scrollHandler);
2915
+ this._on(window, "scroll", scrollHandler);
2857
2916
 
2858
2917
  }
2859
2918
 
@@ -2874,6 +2933,7 @@ window.addEventListener(this.openTag, () => {
2874
2933
  });
2875
2934
 
2876
2935
  observer.observe(this.res);
2936
+ this._track(() => observer.disconnect());
2877
2937
  }
2878
2938
  /*
2879
2939
  if (!this.openedElements.get(this.res)) {
@@ -2936,7 +2996,7 @@ this.res.querySelectorAll('span').forEach(span => {
2936
2996
 
2937
2997
  if (!this.options.animation /*&& this.getType() !== "LayoutWrapperElement"*/){
2938
2998
 
2939
- window.addEventListener('resize', () => checkQueries());
2999
+ this._on(window, 'resize', () => checkQueries());
2940
3000
  }
2941
3001
 
2942
3002
  checkQueries();
@@ -3098,7 +3158,7 @@ this.res.querySelectorAll('span').forEach(span => {
3098
3158
  (this.blastTarget || this.res).style.transform = transformValue;
3099
3159
  this.res.style.opacity = opacity;
3100
3160
  } else {
3101
- alert("OPE")
3161
+ console.warn("[nodality] transform produced no geometric value - check `values`")
3102
3162
  }
3103
3163
  }
3104
3164
 
@@ -3117,7 +3177,7 @@ this.res.querySelectorAll('span').forEach(span => {
3117
3177
 
3118
3178
  } else {
3119
3179
 
3120
- window.addEventListener("load", () => {
3180
+ this._on(window, "load", () => {
3121
3181
  if (transform.delay) {
3122
3182
 
3123
3183
  setTimeout(() => {
@@ -3192,7 +3252,7 @@ if (transform.on){
3192
3252
  }
3193
3253
 
3194
3254
  } else {
3195
- alert("THIS FIRE WITH GRADIENT (invalid block");
3255
+ console.warn("[nodality] reactOnTransform: unrecognised transform descriptor - ignored");
3196
3256
  }
3197
3257
 
3198
3258
  }
package/layout/audio.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/base-2.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/base.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -28,19 +28,25 @@ class Base {
28
28
  Proxima(a) {
29
29
  var me = this;
30
30
  return new Proxy(a, {
31
- set(target, prop, key, value) {
32
- alert(`Setting ${key} to ${value}`);
33
- target[key] = value;
34
-
35
-
36
- this.initialState.data.push(key);
37
-
31
+ // Proxy set traps are (target, prop, value, receiver). The old
32
+ // signature named the third parameter `key`, so `target[key] = value`
33
+ // stored the incoming VALUE under the receiver as a property name and
34
+ // the real property was never written — every reactive-state write
35
+ // silently corrupted the object.
36
+ set(target, prop, value) {
37
+ target[prop] = value;
38
+
39
+ if (me.initialState && me.initialState.data &&
40
+ typeof me.initialState.data.push === "function") {
41
+ me.initialState.data.push(prop);
42
+ }
43
+
38
44
  if (prop !== 'length') {
39
45
  me.refreshUI("Added");
40
46
  }
41
47
  return true;//a[P];
42
48
  },
43
- has(target, prop, key, value) {
49
+ has(target, prop) {
44
50
 
45
51
  if (prop !== 'length') {
46
52
  me.refreshUI("Deleted");
@@ -62,7 +68,6 @@ class Base {
62
68
  loadState(data, id){
63
69
  this.loadEl = id;
64
70
  this.initialState = data;
65
- alert(this.initialState.data);
66
71
 
67
72
  return this.observe(this.state.data);
68
73
 
@@ -144,7 +149,6 @@ class Base {
144
149
 
145
150
 
146
151
  let node = document.querySelector("#res");
147
- alert(this.render());
148
152
 
149
153
 
150
154
  let nodes = this.toNode(this.toHTML());
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/box.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/button.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -457,8 +457,7 @@ this.options = obj;
457
457
  const adj = () => {
458
458
  let query = window.matchMedia("(max-device-width: 415px)");
459
459
  if (query.matches) {
460
- alert("WOW")
461
- this.res.style.fontSize = '6rem';
460
+ this.res.style.fontSize = '6rem';
462
461
  } else {
463
462
  this.res.style.fontSize = '3rem';
464
463
  }
package/layout/cards.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/center.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -94,8 +94,7 @@ return this;
94
94
  }
95
95
 
96
96
  if (!T && !R && !B){
97
- alert("j")
98
- this.res.style.margin = L;
97
+ this.res.style.margin = L;
99
98
  }
100
99
 
101
100
  return this;
@@ -141,8 +140,7 @@ return this;
141
140
  }
142
141
 
143
142
  if (!T && !R && !B){
144
- alert("j")
145
- this.res.style.margin = L;
143
+ this.res.style.margin = L;
146
144
  }
147
145
 
148
146
  return this;
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/circle.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/code.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -953,8 +953,7 @@ apply(arr) {
953
953
  let query = window.matchMedia(`(max-width: ${el.width}px)`);
954
954
  if (el.device){
955
955
  query = window.matchMedia(`(max-device-width: ${el.width}px)`);
956
- alert(el.device);
957
- }
956
+ }
958
957
 
959
958
 
960
959
 
package/layout/custom.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -186,7 +186,6 @@ let stringified = JSON.stringify(options.borderObj);
186
186
  // // console.warn(options);
187
187
 
188
188
  // options.columnAlways && (this.columnAlways = true);
189
- options.columnAlways && alert("JIJ" + options.columnAlways);
190
189
 
191
190
  options.toColumn && this.toColumn(options.toColumn); // OK
192
191
 
@@ -495,7 +494,6 @@ let stringified = JSON.stringify(options.borderObj);
495
494
 
496
495
 
497
496
  toColumn(at){
498
- alert("ON")
499
497
 
500
498
  const toCol = () => {
501
499
  let media = window.matchMedia(`(max-width: ${at})`);
package/layout/footer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.199
2
+ * nodality v1.0.201
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */