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.
- package/dist/animator.cjs.js.LICENSE.txt +1 -1
- package/dist/animator.esm.js.LICENSE.txt +1 -1
- package/dist/appleanim.cjs.js.LICENSE.txt +1 -1
- package/dist/appleanim.esm.js.LICENSE.txt +1 -1
- package/dist/audionew.cjs.js.LICENSE.txt +1 -1
- package/dist/audionew.esm.js.LICENSE.txt +1 -1
- package/dist/base.cjs.js.LICENSE.txt +1 -1
- package/dist/base.esm.js.LICENSE.txt +1 -1
- package/dist/betaDesktopBar.esm.js.LICENSE.txt +1 -1
- package/dist/betaMobileBar.esm.js.LICENSE.txt +1 -1
- package/dist/bundle.umd.js +1 -1
- package/dist/bundle.umd.js.LICENSE.txt +1 -1
- package/dist/button.cjs.js.LICENSE.txt +1 -1
- package/dist/button.esm.js.LICENSE.txt +1 -1
- package/dist/cardGetter.cjs.js.LICENSE.txt +1 -1
- package/dist/cardGetter.esm.js.LICENSE.txt +1 -1
- package/dist/center.cjs.js.LICENSE.txt +1 -1
- package/dist/center.esm.js.LICENSE.txt +1 -1
- package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
- package/dist/checkbox.esm.js.LICENSE.txt +1 -1
- package/dist/code.cjs.js.LICENSE.txt +1 -1
- package/dist/code.esm.js.LICENSE.txt +1 -1
- package/dist/container.cjs.js.LICENSE.txt +1 -1
- package/dist/container.esm.js.LICENSE.txt +1 -1
- package/dist/datalist.cjs.js.LICENSE.txt +1 -1
- package/dist/datalist.esm.js.LICENSE.txt +1 -1
- package/dist/designer.cjs.js +1 -1
- package/dist/designer.cjs.js.LICENSE.txt +1 -1
- package/dist/designer.esm.js +1 -1
- package/dist/designer.esm.js.LICENSE.txt +1 -1
- package/dist/dropdown.cjs.js.LICENSE.txt +1 -1
- package/dist/dropdown.esm.js.LICENSE.txt +1 -1
- package/dist/elementMapper.cjs.js.LICENSE.txt +1 -1
- package/dist/elementMapper.esm.js.LICENSE.txt +1 -1
- package/dist/finalresult.esm.js +1 -1
- package/dist/finalresult.esm.js.LICENSE.txt +1 -1
- package/dist/flexCard.cjs.js.LICENSE.txt +1 -1
- package/dist/flexCard.esm.js.LICENSE.txt +1 -1
- package/dist/flexGrid.cjs.js.LICENSE.txt +1 -1
- package/dist/flexGrid.esm.js.LICENSE.txt +1 -1
- package/dist/flexRow.cjs.js.LICENSE.txt +1 -1
- package/dist/flexRow.esm.js.LICENSE.txt +1 -1
- package/dist/floatingInput.cjs.js.LICENSE.txt +1 -1
- package/dist/floatingInput.esm.js.LICENSE.txt +1 -1
- package/dist/free.cjs.js.LICENSE.txt +1 -1
- package/dist/free.esm.js.LICENSE.txt +1 -1
- package/dist/horizontalScroller.esm.js.LICENSE.txt +1 -1
- package/dist/image.cjs.js.LICENSE.txt +1 -1
- package/dist/image.esm.js.LICENSE.txt +1 -1
- package/dist/imagePicker.cjs.js.LICENSE.txt +1 -1
- package/dist/imagePicker.esm.js.LICENSE.txt +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.LICENSE.txt +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.LICENSE.txt +1 -1
- package/dist/link.cjs.js.LICENSE.txt +1 -1
- package/dist/link.esm.js.LICENSE.txt +1 -1
- package/dist/linkGetter.cjs.js.LICENSE.txt +1 -1
- package/dist/linkGetter.esm.js.LICENSE.txt +1 -1
- package/dist/metaAdder.cjs.js.LICENSE.txt +1 -1
- package/dist/metaAdder.esm.js.LICENSE.txt +1 -1
- package/dist/modal2025.cjs.js.LICENSE.txt +1 -1
- package/dist/modal2025.esm.js.LICENSE.txt +1 -1
- package/dist/multiswitchers.esm.js.LICENSE.txt +1 -1
- package/dist/newNavBar.cjs.js.LICENSE.txt +1 -1
- package/dist/newNavBar.esm.js.LICENSE.txt +1 -1
- package/dist/picker.cjs.js.LICENSE.txt +1 -1
- package/dist/picker.esm.js.LICENSE.txt +1 -1
- package/dist/progress.cjs.js.LICENSE.txt +1 -1
- package/dist/progress.esm.js.LICENSE.txt +1 -1
- package/dist/radio.cjs.js.LICENSE.txt +1 -1
- package/dist/radio.esm.js.LICENSE.txt +1 -1
- package/dist/range.cjs.js.LICENSE.txt +1 -1
- package/dist/range.esm.js.LICENSE.txt +1 -1
- package/dist/scrollvideo.cjs.js.LICENSE.txt +1 -1
- package/dist/scrollvideo.esm.js.LICENSE.txt +1 -1
- package/dist/sideBar.cjs.js.LICENSE.txt +1 -1
- package/dist/sideBar.esm.js.LICENSE.txt +1 -1
- package/dist/sideNavBar.cjs.js.LICENSE.txt +1 -1
- package/dist/sideNavBar.esm.js.LICENSE.txt +1 -1
- package/dist/simpleBar.cjs.js.LICENSE.txt +1 -1
- package/dist/simpleBar.esm.js.LICENSE.txt +1 -1
- package/dist/slider2025.cjs.js +1 -1
- package/dist/slider2025.cjs.js.LICENSE.txt +1 -1
- package/dist/slider2025.esm.js +1 -1
- package/dist/slider2025.esm.js.LICENSE.txt +1 -1
- package/dist/spacer.cjs.js.LICENSE.txt +1 -1
- package/dist/stack.cjs.js.LICENSE.txt +1 -1
- package/dist/stack.esm.js.LICENSE.txt +1 -1
- package/dist/stacker.cjs.js.LICENSE.txt +1 -1
- package/dist/stacker.esm.js.LICENSE.txt +1 -1
- package/dist/table.cjs.js.LICENSE.txt +1 -1
- package/dist/table.esm.js.LICENSE.txt +1 -1
- package/dist/text.cjs.js.LICENSE.txt +1 -1
- package/dist/text.esm.js.LICENSE.txt +1 -1
- package/dist/textField.cjs.js.LICENSE.txt +1 -1
- package/dist/textField.esm.js.LICENSE.txt +1 -1
- package/dist/transformanim.cjs.js.LICENSE.txt +1 -1
- package/dist/transformanim.esm.js.LICENSE.txt +1 -1
- package/dist/ulist.cjs.js.LICENSE.txt +1 -1
- package/dist/ulist.esm.js.LICENSE.txt +1 -1
- package/dist/video.esm.js.LICENSE.txt +1 -1
- package/dist/wrap.cjs.js.LICENSE.txt +1 -1
- package/dist/wrap.esm.js.LICENSE.txt +1 -1
- package/dist/zoomCard.cjs.js.LICENSE.txt +1 -1
- package/dist/zoomCard.esm.js.LICENSE.txt +1 -1
- package/layout/DEPRECATED-PARAGRAPH.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/betaDesktopBar.js +1 -1
- package/layout/betaMobileBar.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/cleanRow.js +1 -1
- package/layout/code.js +1 -1
- package/layout/container.js +1 -1
- package/layout/custom.js +1 -1
- package/layout/divImage.js +1 -1
- package/layout/dropdown.js +1 -1
- package/layout/dropdown2025.js +1 -1
- package/layout/emptyElement.js +1 -1
- package/layout/externalStylesheet.js +1 -1
- package/layout/flexCard.js +1 -1
- package/layout/flexGrid.js +1 -1
- package/layout/flexrow.js +1 -1
- package/layout/footer.js +1 -1
- package/layout/formComponents/custom.js +1 -1
- package/layout/formComponents/dataList.js +1 -1
- package/layout/formComponents/floatingInput.js +1 -1
- package/layout/formComponents/form-all.js +1 -1
- package/layout/formComponents/form.js +1 -1
- package/layout/formComponents/imagePicker.js +1 -1
- package/layout/formComponents/picker.js +1 -1
- package/layout/formComponents/radio.js +1 -1
- package/layout/formComponents/radiogroup.js +1 -1
- package/layout/formComponents/range.js +1 -1
- package/layout/free.js +1 -1
- package/layout/grid-new.js +1 -1
- package/layout/grid.js +1 -1
- package/layout/gridSwitcher.js +1 -1
- package/layout/group.js +1 -1
- package/layout/header.js +1 -1
- package/layout/horizontalScroller.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/metaAdder.js +1 -1
- package/layout/modal2025.js +1 -1
- package/layout/modernwrap.js +1 -1
- package/layout/multiswitcher.js +1 -1
- package/layout/multiswitcherBeta.js +1 -1
- package/layout/navBar-OLD.js +1 -1
- package/layout/navBar.js +1 -1
- package/layout/navFactor/customDiv.js +1 -1
- package/layout/newFlatAdder.js +1 -1
- package/layout/newNavBar copy 2.js +1 -1
- package/layout/newNavBar copy.js +1 -1
- package/layout/newNavBar.js +1 -1
- package/layout/offsetContainer.js +1 -1
- package/layout/polygon.js +1 -1
- package/layout/progress.js +1 -1
- package/layout/row.js +1 -1
- package/layout/savedNewNavBar.js +1 -1
- package/layout/scrollvideo.js +1 -1
- package/layout/sideBar.js +1 -1
- package/layout/sideNavBar.js +1 -1
- package/layout/simpleBar.js +1 -1
- package/layout/slider2025.js +243 -190
- package/layout/spacer.js +1 -1
- package/layout/stack.js +1 -1
- package/layout/styler.js +1 -1
- package/layout/switcher.js +1 -1
- package/layout/table.js +1 -1
- package/layout/text.js +1 -1
- package/layout/textField.js +1 -1
- package/layout/ulist.js +1 -1
- package/layout/video.js +1 -1
- package/layout/withoutNew.js +1 -1
- package/layout/wrap.js +1 -1
- package/layout/zoomCard.js +1 -1
- package/lib/AppleAnim.js +1 -1
- package/lib/KeyframeAnimation.js +1 -1
- package/lib/Stacker.js +1 -1
- package/lib/TransformAnim.js +1 -1
- package/lib/cardGetter.js +1 -1
- package/lib/designer.js +7 -10
- package/lib/elementMapper.js +1 -1
- package/lib/linkGetter.js +1 -1
- package/lib/scrollvideo.js +1 -1
- package/package.json +1 -1
package/layout/newFlatAdder.js
CHANGED
package/layout/newNavBar copy.js
CHANGED
package/layout/newNavBar.js
CHANGED
package/layout/polygon.js
CHANGED
package/layout/progress.js
CHANGED
package/layout/row.js
CHANGED
package/layout/savedNewNavBar.js
CHANGED
package/layout/scrollvideo.js
CHANGED
package/layout/sideBar.js
CHANGED
package/layout/sideNavBar.js
CHANGED
package/layout/simpleBar.js
CHANGED
package/layout/slider2025.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* nodality v1.0.
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
this.moveToSlide(
|
|
175
|
-
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
package/layout/stack.js
CHANGED
package/layout/styler.js
CHANGED
package/layout/switcher.js
CHANGED
package/layout/table.js
CHANGED
package/layout/text.js
CHANGED
package/layout/textField.js
CHANGED
package/layout/ulist.js
CHANGED
package/layout/video.js
CHANGED
package/layout/withoutNew.js
CHANGED
package/layout/wrap.js
CHANGED