nodality 1.0.29 → 1.0.31

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 (201) hide show
  1. package/dist/animator.cjs.js.LICENSE.txt +1 -1
  2. package/dist/animator.esm.js.LICENSE.txt +1 -1
  3. package/dist/appleanim.cjs.js.LICENSE.txt +1 -1
  4. package/dist/appleanim.esm.js.LICENSE.txt +1 -1
  5. package/dist/audionew.cjs.js.LICENSE.txt +1 -1
  6. package/dist/audionew.esm.js.LICENSE.txt +1 -1
  7. package/dist/base.cjs.js.LICENSE.txt +1 -1
  8. package/dist/base.esm.js.LICENSE.txt +1 -1
  9. package/dist/betaDesktopBar.esm.js.LICENSE.txt +1 -1
  10. package/dist/betaMobileBar.esm.js.LICENSE.txt +1 -1
  11. package/dist/bundle.umd.js +1 -1
  12. package/dist/bundle.umd.js.LICENSE.txt +1 -1
  13. package/dist/button.cjs.js.LICENSE.txt +1 -1
  14. package/dist/button.esm.js.LICENSE.txt +1 -1
  15. package/dist/cardGetter.cjs.js.LICENSE.txt +1 -1
  16. package/dist/cardGetter.esm.js.LICENSE.txt +1 -1
  17. package/dist/center.cjs.js.LICENSE.txt +1 -1
  18. package/dist/center.esm.js.LICENSE.txt +1 -1
  19. package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
  20. package/dist/checkbox.esm.js.LICENSE.txt +1 -1
  21. package/dist/code.cjs.js.LICENSE.txt +1 -1
  22. package/dist/code.esm.js.LICENSE.txt +1 -1
  23. package/dist/container.cjs.js.LICENSE.txt +1 -1
  24. package/dist/container.esm.js.LICENSE.txt +1 -1
  25. package/dist/datalist.cjs.js.LICENSE.txt +1 -1
  26. package/dist/datalist.esm.js.LICENSE.txt +1 -1
  27. package/dist/designer.cjs.js +1 -1
  28. package/dist/designer.cjs.js.LICENSE.txt +1 -1
  29. package/dist/designer.esm.js +1 -1
  30. package/dist/designer.esm.js.LICENSE.txt +1 -1
  31. package/dist/dropdown.cjs.js.LICENSE.txt +1 -1
  32. package/dist/dropdown.esm.js.LICENSE.txt +1 -1
  33. package/dist/elementMapper.cjs.js.LICENSE.txt +1 -1
  34. package/dist/elementMapper.esm.js.LICENSE.txt +1 -1
  35. package/dist/finalresult.esm.js +1 -1
  36. package/dist/finalresult.esm.js.LICENSE.txt +1 -1
  37. package/dist/flexCard.cjs.js.LICENSE.txt +1 -1
  38. package/dist/flexCard.esm.js.LICENSE.txt +1 -1
  39. package/dist/flexGrid.cjs.js.LICENSE.txt +1 -1
  40. package/dist/flexGrid.esm.js.LICENSE.txt +1 -1
  41. package/dist/flexRow.cjs.js.LICENSE.txt +1 -1
  42. package/dist/flexRow.esm.js.LICENSE.txt +1 -1
  43. package/dist/floatingInput.cjs.js.LICENSE.txt +1 -1
  44. package/dist/floatingInput.esm.js.LICENSE.txt +1 -1
  45. package/dist/free.cjs.js.LICENSE.txt +1 -1
  46. package/dist/free.esm.js.LICENSE.txt +1 -1
  47. package/dist/horizontalScroller.esm.js.LICENSE.txt +1 -1
  48. package/dist/image.cjs.js.LICENSE.txt +1 -1
  49. package/dist/image.esm.js.LICENSE.txt +1 -1
  50. package/dist/imagePicker.cjs.js.LICENSE.txt +1 -1
  51. package/dist/imagePicker.esm.js.LICENSE.txt +1 -1
  52. package/dist/index.cjs.js +1 -1
  53. package/dist/index.cjs.js.LICENSE.txt +1 -1
  54. package/dist/index.esm.js +1 -1
  55. package/dist/index.esm.js.LICENSE.txt +1 -1
  56. package/dist/link.cjs.js.LICENSE.txt +1 -1
  57. package/dist/link.esm.js.LICENSE.txt +1 -1
  58. package/dist/linkGetter.cjs.js.LICENSE.txt +1 -1
  59. package/dist/linkGetter.esm.js.LICENSE.txt +1 -1
  60. package/dist/metaAdder.cjs.js.LICENSE.txt +1 -1
  61. package/dist/metaAdder.esm.js.LICENSE.txt +1 -1
  62. package/dist/modal2025.cjs.js.LICENSE.txt +1 -1
  63. package/dist/modal2025.esm.js.LICENSE.txt +1 -1
  64. package/dist/multiswitchers.esm.js.LICENSE.txt +1 -1
  65. package/dist/newNavBar.cjs.js.LICENSE.txt +1 -1
  66. package/dist/newNavBar.esm.js.LICENSE.txt +1 -1
  67. package/dist/picker.cjs.js.LICENSE.txt +1 -1
  68. package/dist/picker.esm.js.LICENSE.txt +1 -1
  69. package/dist/progress.cjs.js.LICENSE.txt +1 -1
  70. package/dist/progress.esm.js.LICENSE.txt +1 -1
  71. package/dist/radio.cjs.js.LICENSE.txt +1 -1
  72. package/dist/radio.esm.js.LICENSE.txt +1 -1
  73. package/dist/range.cjs.js.LICENSE.txt +1 -1
  74. package/dist/range.esm.js.LICENSE.txt +1 -1
  75. package/dist/scrollvideo.cjs.js.LICENSE.txt +1 -1
  76. package/dist/scrollvideo.esm.js.LICENSE.txt +1 -1
  77. package/dist/sideBar.cjs.js.LICENSE.txt +1 -1
  78. package/dist/sideBar.esm.js.LICENSE.txt +1 -1
  79. package/dist/sideNavBar.cjs.js.LICENSE.txt +1 -1
  80. package/dist/sideNavBar.esm.js.LICENSE.txt +1 -1
  81. package/dist/simpleBar.cjs.js.LICENSE.txt +1 -1
  82. package/dist/simpleBar.esm.js.LICENSE.txt +1 -1
  83. package/dist/slider2025.cjs.js +1 -1
  84. package/dist/slider2025.cjs.js.LICENSE.txt +1 -1
  85. package/dist/slider2025.esm.js +1 -1
  86. package/dist/slider2025.esm.js.LICENSE.txt +1 -1
  87. package/dist/spacer.cjs.js.LICENSE.txt +1 -1
  88. package/dist/stack.cjs.js.LICENSE.txt +1 -1
  89. package/dist/stack.esm.js.LICENSE.txt +1 -1
  90. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  91. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  92. package/dist/table.cjs.js.LICENSE.txt +1 -1
  93. package/dist/table.esm.js.LICENSE.txt +1 -1
  94. package/dist/text.cjs.js.LICENSE.txt +1 -1
  95. package/dist/text.esm.js.LICENSE.txt +1 -1
  96. package/dist/textField.cjs.js.LICENSE.txt +1 -1
  97. package/dist/textField.esm.js.LICENSE.txt +1 -1
  98. package/dist/transformanim.cjs.js.LICENSE.txt +1 -1
  99. package/dist/transformanim.esm.js.LICENSE.txt +1 -1
  100. package/dist/ulist.cjs.js.LICENSE.txt +1 -1
  101. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  102. package/dist/video.esm.js.LICENSE.txt +1 -1
  103. package/dist/wrap.cjs.js.LICENSE.txt +1 -1
  104. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  105. package/dist/zoomCard.cjs.js.LICENSE.txt +1 -1
  106. package/dist/zoomCard.esm.js.LICENSE.txt +1 -1
  107. package/layout/DEPRECATED-PARAGRAPH.js +1 -1
  108. package/layout/animator.js +1 -1
  109. package/layout/audio.js +1 -1
  110. package/layout/audionew.js +1 -1
  111. package/layout/base-2.js +1 -1
  112. package/layout/base.js +1 -1
  113. package/layout/betaDesktopBar.js +1 -1
  114. package/layout/betaMobileBar.js +1 -1
  115. package/layout/box.js +1 -1
  116. package/layout/button.js +1 -1
  117. package/layout/cards.js +1 -1
  118. package/layout/center.js +1 -1
  119. package/layout/checkbox.js +1 -1
  120. package/layout/circle.js +1 -1
  121. package/layout/cleanRow.js +1 -1
  122. package/layout/code.js +1 -1
  123. package/layout/container.js +1 -1
  124. package/layout/custom.js +1 -1
  125. package/layout/divImage.js +1 -1
  126. package/layout/dropdown.js +1 -1
  127. package/layout/dropdown2025.js +1 -1
  128. package/layout/emptyElement.js +1 -1
  129. package/layout/externalStylesheet.js +1 -1
  130. package/layout/flexCard.js +1 -1
  131. package/layout/flexGrid.js +1 -1
  132. package/layout/flexrow.js +1 -1
  133. package/layout/footer.js +1 -1
  134. package/layout/formComponents/custom.js +1 -1
  135. package/layout/formComponents/dataList.js +1 -1
  136. package/layout/formComponents/floatingInput.js +1 -1
  137. package/layout/formComponents/form-all.js +1 -1
  138. package/layout/formComponents/form.js +1 -1
  139. package/layout/formComponents/imagePicker.js +1 -1
  140. package/layout/formComponents/picker.js +1 -1
  141. package/layout/formComponents/radio.js +1 -1
  142. package/layout/formComponents/radiogroup.js +1 -1
  143. package/layout/formComponents/range.js +1 -1
  144. package/layout/free.js +1 -1
  145. package/layout/grid-new.js +1 -1
  146. package/layout/grid.js +1 -1
  147. package/layout/gridSwitcher.js +1 -1
  148. package/layout/group.js +1 -1
  149. package/layout/header.js +1 -1
  150. package/layout/horizontalScroller.js +1 -1
  151. package/layout/image-old.js +1 -1
  152. package/layout/image.js +1 -1
  153. package/layout/index.js +1 -1
  154. package/layout/label.js +1 -1
  155. package/layout/link.js +1 -1
  156. package/layout/list-OLD.js +1 -1
  157. package/layout/list.js +1 -1
  158. package/layout/metaAdder.js +1 -1
  159. package/layout/modal2025.js +1 -1
  160. package/layout/modernwrap.js +1 -1
  161. package/layout/multiswitcher.js +1 -1
  162. package/layout/multiswitcherBeta.js +1 -1
  163. package/layout/navBar-OLD.js +1 -1
  164. package/layout/navBar.js +1 -1
  165. package/layout/navFactor/customDiv.js +1 -1
  166. package/layout/newFlatAdder.js +1 -1
  167. package/layout/newNavBar copy 2.js +1 -1
  168. package/layout/newNavBar copy.js +1 -1
  169. package/layout/newNavBar.js +1 -1
  170. package/layout/offsetContainer.js +1 -1
  171. package/layout/polygon.js +1 -1
  172. package/layout/progress.js +1 -1
  173. package/layout/row.js +1 -1
  174. package/layout/savedNewNavBar.js +1 -1
  175. package/layout/scrollvideo.js +1 -1
  176. package/layout/sideBar.js +1 -1
  177. package/layout/sideNavBar.js +1 -1
  178. package/layout/simpleBar.js +1 -1
  179. package/layout/slider2025.js +243 -190
  180. package/layout/spacer.js +1 -1
  181. package/layout/stack.js +1 -1
  182. package/layout/styler.js +1 -1
  183. package/layout/switcher.js +1 -1
  184. package/layout/table.js +1 -1
  185. package/layout/text.js +1 -1
  186. package/layout/textField.js +1 -1
  187. package/layout/ulist.js +1 -1
  188. package/layout/video.js +1 -1
  189. package/layout/withoutNew.js +1 -1
  190. package/layout/wrap.js +1 -1
  191. package/layout/zoomCard.js +1 -1
  192. package/lib/AppleAnim.js +1 -1
  193. package/lib/KeyframeAnimation.js +1 -1
  194. package/lib/Stacker.js +1 -1
  195. package/lib/TransformAnim.js +1 -1
  196. package/lib/cardGetter.js +1 -1
  197. package/lib/designer.js +7 -10
  198. package/lib/elementMapper.js +1 -1
  199. package/lib/linkGetter.js +1 -1
  200. package/lib/scrollvideo.js +1 -1
  201. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/polygon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/row.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/sideBar.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -8,203 +8,256 @@ import {Animator} from "./animator.js";
8
8
  import {Button} from "./button.js";
9
9
 
10
10
  class Slider {
11
- constructor(elements, buttons) {
12
- this.container = document.createElement("div");//document.querySelector(containerSelector);
13
- this.elements = elements;
14
- this.currentSlideIndex = 0;
15
-
11
+ constructor(elements, buttons) {
12
+ this.container = document.createElement("div"); // root element
13
+ this.container.style.width = "100%";
14
+ this.container.style.margin = "20px auto";
15
+ this.container.style.textAlign = "center";
16
+
17
+ this.elements = elements;
18
+ this.currentSlideIndex = 0;
19
+
20
+ this.buttons = buttons;
21
+
22
+ if (!this.buttons) {
23
+ let buttons = {
24
+ leftButton: new Button("L").set({
25
+ frame: { width: 50, height: 50 },
26
+ url: "../assets/arrow-left.png",
27
+ color: "#1abc9c",
28
+ image: new Image().set({ url: "../assets/arrow-left.png", width: "50px", height: "50px" }),
29
+ radius: "100%",
30
+ arrayMargin: { sides: ["all"], value: "1rem" },
31
+ }),
32
+
33
+ rightButton: new Button("R").set({
34
+ frame: { width: 50, height: 50 },
35
+ url: "../assets/arrow-right.png",
36
+ color: "#1abc9c",
37
+ radius: "100%",
38
+ arrayMargin: { sides: ["all"], value: "1rem" },
39
+ }),
40
+ };
16
41
  this.buttons = buttons;
17
-
18
- if (!this.buttons){
19
-
20
-
21
-
22
- let buttons = {
23
- leftButton: new Button("L").set({
24
- frame: {width: 50, height: 50},
25
- url: "../assets/arrow-left.png",
26
- color: "#1abc9c",
27
- image: new Image().set({ url: "../assets/arrow-left.png", width: "50px", height: "50px"}),
28
- radius: "100%",
29
- arrayMargin: {sides: ["all"], value: "1rem"}
30
- // 10/01/2025 18:12:55 margin does not add to page width, padding does
31
-
32
- // Attr <a href="https://www.flaticon.com/free-icons/back" title="back icons">Back icons created by Lyolya - Flaticon</a>
33
- }),
34
-
35
- rightButton: new Button("R").set({
36
- frame: {width: 50, height: 50},
37
- url: "../assets/arrow-right.png",
38
- color: "#1abc9c",
39
-
40
- radius: "100%",
41
- arrayMargin: {sides: ["all"], value: "1rem"}
42
- })
43
- };
44
-
45
- this.buttons = buttons;
46
- }
47
-
48
- this.createSlider();
49
- this.init();
50
- }
51
-
52
- toCode(){
53
- let code = `new Slider([${this.elements.map(el => el.toCode())}], null)`;
54
- code = code.replace(/,\s*\./g, '.');
55
- return [code];
56
42
  }
57
43
 
58
- createSlider() {
59
- // Slider container
60
- this.slider = document.createElement('div');
61
- this.slider.style.width = '100%';
62
- this.slider.style.height = '400px';
63
- this.slider.style.margin = '20px auto';
64
- this.slider.style.textAlign = 'center';
65
- this.slider.style.borderRadius = '20px';
66
- this.slider.style.overflow = 'hidden';
67
- this.slider.style.position = 'relative';
68
-
69
- // Slides wrapper
70
- const slidesWrapper = document.createElement('div');
71
- this.slidesWrapper = slidesWrapper;
72
- slidesWrapper.style.display = 'flex';
73
- slidesWrapper.style.overflowX = 'scroll';
74
- slidesWrapper.style.scrollBehavior = 'smooth';
75
- slidesWrapper.style.scrollSnapType = 'x mandatory';
76
-
77
- this.elements.forEach((text, index) => {
78
- const slide = document.createElement('div');
79
- slide.setAttribute("class", "slide");
80
- slide.style.display = 'flex';
81
- slide.style.justifyContent = 'center';
82
- slide.style.alignItems = 'center';
83
- slide.style.flexShrink = '0';
84
- slide.style.width = '100%';
85
- slide.style.height = '400px';
86
- slide.style.background = index % 2 === 0 ? 'rgb(250, 246, 212)' : 'white';
87
- slide.style.transformOrigin = 'center center';
88
- slide.style.transform = 'scale(1)';
89
- slide.style.scrollSnapAlign = 'center';
90
-
91
- slide.appendChild(text.render());
92
- slidesWrapper.appendChild(slide);
93
- });
94
-
95
- // Navigation arrows
96
- this.arrowPrev = this.buttons.leftButton.render();
97
- this.arrowPrev.style.position = 'absolute';
98
- this.arrowPrev.style.left = '10px';
99
- this.arrowPrev.style.top = '50%';
100
- this.arrowPrev.style.transform = 'translateY(-50%)';
101
- this.arrowPrev.style.zIndex = '1';
102
-
103
- this.arrowNext = this.buttons.rightButton.render();
104
- this.arrowNext.style.position = 'absolute';
105
- this.arrowNext.style.right = '10px';
106
- this.arrowNext.style.top = '50%';
107
- this.arrowNext.style.transform = 'translateY(-50%)';
108
- this.arrowNext.style.zIndex = '1';
109
-
110
- // Navigation dots
111
- const nav = document.createElement('div');
112
- nav.style.position = 'absolute';
113
- nav.style.bottom = '10%';
114
- nav.style.left = '50%';
115
- nav.style.width = '200px';
116
- nav.style.transform = 'translateX(-50%)';
117
- nav.style.textAlign = 'center';
118
-
119
- this.elements.forEach((_, index) => {
120
- const navLink = document.createElement('a');
121
- navLink.style.display = 'inline-block';
122
- navLink.style.height = '15px';
123
- navLink.style.width = '15px';
124
- navLink.style.borderRadius = '50%';
125
- navLink.style.backgroundColor = 'black';
126
- navLink.style.margin = '0 10px';
127
- navLink.style.cursor = 'pointer';
128
- navLink.dataset.index = index;
129
- nav.appendChild(navLink);
130
- });
131
-
132
- // Append elements to the slider
133
- this.slider.appendChild(this.arrowPrev);
134
- this.slider.appendChild(this.arrowNext);
135
- this.slider.appendChild(slidesWrapper);
136
- this.slider.appendChild(nav);
137
-
138
- // Append slider to the container
139
- this.container.appendChild(this.slider);
140
-
141
- // Store references
142
- this.slidesWrapper = slidesWrapper;
143
- this.navLinks = nav.querySelectorAll('a');
144
- }
145
-
146
- init() {
147
- this.updateActiveSlide();
148
- this.attachEventListeners();
149
- }
150
-
151
- attachEventListeners() {
152
- this.arrowPrev.addEventListener('click', () => {
153
- this.moveToSlide(
154
- this.currentSlideIndex - 1 < 0 ? this.elements.length - 1 : this.currentSlideIndex - 1
155
- );
156
- });
157
-
158
- this.arrowNext.addEventListener('click', () => {
159
- this.moveToSlide((this.currentSlideIndex + 1) % this.elements.length);
44
+ this.createSlider();
45
+ this.init();
46
+ }
47
+
48
+ toCode() {
49
+ let code = `new Slider([${this.elements.map((el) => el.toCode())}], null)`;
50
+ code = code.replace(/,\s*\./g, ".");
51
+ return [code];
52
+ }
53
+
54
+ createSlider() {
55
+ // Slider frame
56
+ this.slider = document.createElement("div");
57
+ this.slider.style.width = "100%";
58
+ this.slider.style.height = "400px";
59
+ this.slider.style.borderRadius = "20px";
60
+ this.slider.style.overflow = "hidden";
61
+ this.slider.style.position = "relative";
62
+ this.slider.style.marginBottom = "15px";
63
+
64
+ // Slides wrapper
65
+ const slidesWrapper = document.createElement("div");
66
+ this.slidesWrapper = slidesWrapper;
67
+ slidesWrapper.style.display = "flex";
68
+ slidesWrapper.style.overflowX = "scroll";
69
+ slidesWrapper.style.scrollBehavior = "smooth";
70
+ slidesWrapper.style.scrollSnapType = "x mandatory";
71
+
72
+ // build slides
73
+ this.elements.forEach((text, index) => {
74
+ const slide = document.createElement("div");
75
+ slide.setAttribute("class", "slide");
76
+ slide.style.display = "flex";
77
+ slide.style.justifyContent = "center";
78
+ slide.style.alignItems = "center";
79
+ slide.style.flexShrink = "0";
80
+ slide.style.width = "100%";
81
+ slide.style.height = "400px";
82
+ slide.style.background = index % 2 === 0 ? "rgb(250, 246, 212)" : "white";
83
+ slide.style.transformOrigin = "center center";
84
+ slide.style.transform = "scale(1)";
85
+ slide.style.scrollSnapAlign = "center";
86
+
87
+ // render element once and clone from that instance for the thumbnail
88
+ const rendered = text.render();
89
+ slide.appendChild(rendered);
90
+ slidesWrapper.appendChild(slide);
91
+ });
92
+
93
+ // Navigation arrows
94
+ this.arrowPrev = this.buttons.leftButton.render();
95
+ this.arrowPrev.style.position = "absolute";
96
+ this.arrowPrev.style.left = "10px";
97
+ this.arrowPrev.style.top = "50%";
98
+ this.arrowPrev.style.transform = "translateY(-50%)";
99
+ this.arrowPrev.style.zIndex = "1";
100
+
101
+ this.arrowNext = this.buttons.rightButton.render();
102
+ this.arrowNext.style.position = "absolute";
103
+ this.arrowNext.style.right = "10px";
104
+ this.arrowNext.style.top = "50%";
105
+ this.arrowNext.style.transform = "translateY(-50%)";
106
+ this.arrowNext.style.zIndex = "1";
107
+
108
+ // Navigation dots
109
+ const nav = document.createElement("div");
110
+ nav.style.position = "absolute";
111
+ nav.style.bottom = "10%";
112
+ nav.style.left = "50%";
113
+ nav.style.width = "200px";
114
+ nav.style.transform = "translateX(-50%)";
115
+ nav.style.textAlign = "center";
116
+
117
+ this.elements.forEach((_, index) => {
118
+ const navLink = document.createElement("a");
119
+ navLink.style.display = "inline-block";
120
+ navLink.style.height = "15px";
121
+ navLink.style.width = "15px";
122
+ navLink.style.borderRadius = "50%";
123
+ navLink.style.backgroundColor = "black";
124
+ navLink.style.margin = "0 10px";
125
+ navLink.style.cursor = "pointer";
126
+ navLink.dataset.index = index;
127
+ nav.appendChild(navLink);
128
+ });
129
+
130
+ // ✅ Thumbnails section (fixed and robust)
131
+ const thumbsContainer = document.createElement("div");
132
+ thumbsContainer.style.display = "flex";
133
+ thumbsContainer.style.justifyContent = "center";
134
+ thumbsContainer.style.marginTop = "10px";
135
+ thumbsContainer.style.gap = "10px";
136
+ thumbsContainer.style.flexWrap = "nowrap";
137
+ thumbsContainer.style.overflowX = "auto"; // optional: allow scrolling if many thumbs
138
+
139
+ // create thumbnails from existing slide DOM (clone once)
140
+ const slides = slidesWrapper.querySelectorAll(".slide");
141
+ slides.forEach((slide, index) => {
142
+ const thumb = document.createElement("div");
143
+ thumb.className = "slider-thumb"; // specific class so we only select top-level thumbs
144
+ thumb.dataset.index = index.toString();
145
+ thumb.style.width = "60px";
146
+ thumb.style.height = "40px";
147
+ thumb.style.border = "2px solid gray";
148
+ thumb.style.borderRadius = "5px";
149
+ thumb.style.overflow = "hidden";
150
+ thumb.style.cursor = "pointer";
151
+ thumb.style.flexShrink = "0";
152
+ thumb.style.position = "relative";
153
+
154
+ // use the slide's rendered content and clone it (no extra text.render() calls)
155
+ const sourceContent = slide.firstElementChild || slide.cloneNode(true);
156
+ const preview = sourceContent.cloneNode(true);
157
+
158
+ // scale down the preview and make sure it sits in the thumb
159
+ preview.style.transform = "scale(0.2)";
160
+ preview.style.transformOrigin = "top left";
161
+ // make width/height big enough so scale produces visible result
162
+ preview.style.width = "300px";
163
+ preview.style.height = "auto";
164
+ preview.style.pointerEvents = "none"; // prevent interactive elements inside preview catching clicks
165
+
166
+ thumb.appendChild(preview);
167
+
168
+ thumbsContainer.appendChild(thumb);
169
+ });
170
+
171
+ // Append elements to the slider
172
+ this.slider.appendChild(this.arrowPrev);
173
+ this.slider.appendChild(this.arrowNext);
174
+ this.slider.appendChild(slidesWrapper);
175
+ this.slider.appendChild(nav);
176
+
177
+ // Append everything to root container (single root element)
178
+ this.container.appendChild(this.slider);
179
+ this.container.appendChild(thumbsContainer);
180
+
181
+ // Store references (select only top-level thumbs)
182
+ this.slidesWrapper = slidesWrapper;
183
+ this.navLinks = Array.from(nav.querySelectorAll("a"));
184
+ this.thumbs = Array.from(thumbsContainer.querySelectorAll(".slider-thumb"));
185
+ }
186
+
187
+ init() {
188
+ this.updateActiveSlide();
189
+ this.attachEventListeners();
190
+ }
191
+
192
+ attachEventListeners() {
193
+ this.arrowPrev.addEventListener("click", () => {
194
+ this.moveToSlide(this.currentSlideIndex - 1 < 0 ? this.elements.length - 1 : this.currentSlideIndex - 1);
195
+ });
196
+
197
+ this.arrowNext.addEventListener("click", () => {
198
+ this.moveToSlide((this.currentSlideIndex + 1) % this.elements.length);
199
+ });
200
+
201
+ this.navLinks.forEach((navLink) => {
202
+ navLink.addEventListener("click", (e) => {
203
+ e.preventDefault();
204
+ const index = parseInt(navLink.dataset.index, 10);
205
+ this.moveToSlide(index);
160
206
  });
161
-
162
- this.navLinks.forEach((navLink) => {
163
- navLink.addEventListener('click', (e) => {
164
- e.preventDefault();
165
- const index = parseInt(navLink.dataset.index, 10);
166
- this.moveToSlide(index);
167
- });
207
+ });
208
+
209
+ // thumbnails click (use data-index to be robust)
210
+ this.thumbs.forEach((thumb) => {
211
+ thumb.addEventListener("click", () => {
212
+ const idx = parseInt(thumb.dataset.index, 10);
213
+ this.moveToSlide(idx);
168
214
  });
169
-
170
- // Keydown event for left and right arrow keys
171
- document.addEventListener('keydown', (e) => {
172
- if (e.key === 'ArrowLeft') {
173
- // Move to the previous slide
174
- this.moveToSlide(
175
- this.currentSlideIndex - 1 < 0 ? this.elements.length - 1 : this.currentSlideIndex - 1
176
- );
177
- } else if (e.key === 'ArrowRight') {
178
- // Move to the next slide
215
+ });
216
+
217
+ // Keydown event for left and right arrow keys
218
+ document.addEventListener("keydown", (e) => {
219
+ if (e.key === "ArrowLeft") {
220
+ this.moveToSlide(this.currentSlideIndex - 1 < 0 ? this.elements.length - 1 : this.currentSlideIndex - 1);
221
+ } else if (e.key === "ArrowRight") {
179
222
  this.moveToSlide((this.currentSlideIndex + 1) % this.elements.length);
180
223
  }
181
224
  });
182
- }
183
-
184
- moveToSlide(index) {
185
- this.currentSlideIndex = index;
186
- this.updateActiveSlide();
187
- }
188
-
189
- updateActiveSlide() {
190
- this.navLinks.forEach((navLink, index) => {
191
- navLink.style.backgroundColor = index === this.currentSlideIndex ? 'green' : 'gray';
192
- });
193
-
194
- const slideWidth = this.slidesWrapper.querySelector('.slide').offsetWidth;
195
- this.slidesWrapper.scrollTo({
196
- left: this.currentSlideIndex * slideWidth,
197
- behavior: 'smooth',
198
- });
199
- }
200
-
201
- render(div) {
202
- if (div) {
203
- document.querySelector(div).appendChild(this.slider);
204
- } else {
205
- return this.slider;
206
- }
225
+ }
226
+
227
+ moveToSlide(index) {
228
+ this.currentSlideIndex = index;
229
+ this.updateActiveSlide();
230
+ }
231
+
232
+ updateActiveSlide() {
233
+ // highlight nav dots using dataset (robust even if nodes reorder)
234
+ this.navLinks.forEach((navLink) => {
235
+ const idx = parseInt(navLink.dataset.index, 10);
236
+ navLink.style.backgroundColor = idx === this.currentSlideIndex ? "green" : "gray";
237
+ });
238
+
239
+ // highlight thumbs using dataset (robust)
240
+ this.thumbs.forEach((thumb) => {
241
+ const idx = parseInt(thumb.dataset.index, 10);
242
+ thumb.style.borderColor = idx === this.currentSlideIndex ? "green" : "gray";
243
+ });
244
+
245
+ // scroll main slides wrapper
246
+ const slideElem = this.slidesWrapper.querySelector(".slide");
247
+ const slideWidth = slideElem ? slideElem.offsetWidth : this.slidesWrapper.clientWidth;
248
+ this.slidesWrapper.scrollTo({
249
+ left: this.currentSlideIndex * slideWidth,
250
+ behavior: "smooth",
251
+ });
252
+ }
253
+
254
+ render(div) {
255
+ if (div) {
256
+ document.querySelector(div).appendChild(this.container);
257
+ } else {
258
+ return this.container; // return single root element
207
259
  }
208
260
  }
209
-
261
+ }
262
+
210
263
  export { Slider };
package/layout/spacer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/stack.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/styler.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/table.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/text.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/ulist.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/video.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/wrap.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.0.29
2
+ * nodality v1.0.31
3
3
  * (c) 2025 Filip Vabrousek
4
4
  * License: MIT
5
5
  */