@schukai/monster 3.74.0 → 3.76.0

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 (61) hide show
  1. package/CHANGELOG.md +35 -6
  2. package/package.json +1 -1
  3. package/source/components/datatable/datasource/rest.mjs +0 -1
  4. package/source/components/form/api-button.mjs +0 -1
  5. package/source/components/form/context-error.mjs +0 -1
  6. package/source/components/form/context-help.mjs +0 -1
  7. package/source/components/form/message-state-button.mjs +0 -1
  8. package/source/components/form/popper-button.mjs +0 -1
  9. package/source/components/form/select.mjs +16 -5
  10. package/source/components/form/toggle-switch.mjs +0 -3
  11. package/source/components/form/tree-select.mjs +0 -1
  12. package/source/components/layout/collapse.mjs +361 -395
  13. package/source/components/layout/details.mjs +10 -40
  14. package/source/components/layout/iframe.mjs +358 -0
  15. package/source/components/layout/panel.mjs +10 -25
  16. package/source/components/layout/slider.mjs +420 -439
  17. package/source/components/layout/split-panel.mjs +7 -39
  18. package/source/components/layout/style/iframe.pcss +39 -0
  19. package/source/components/layout/style/panel.pcss +10 -3
  20. package/source/components/layout/style/split-panel.pcss +2 -0
  21. package/source/components/layout/stylesheet/iframe.mjs +38 -0
  22. package/source/components/layout/stylesheet/panel.mjs +1 -1
  23. package/source/components/layout/stylesheet/slider.mjs +13 -6
  24. package/source/components/layout/tabs.mjs +6 -35
  25. package/source/components/layout/width-toggle.mjs +10 -31
  26. package/source/components/navigation/table-of-content.mjs +0 -1
  27. package/source/components/tree-menu/dragable-tree-menu.mjs +4 -4
  28. package/source/components/tree-menu/tree-menu.mjs +16 -12
  29. package/source/data/datasource/server/restapi.mjs +1 -1
  30. package/source/dom/updater.mjs +767 -771
  31. package/source/math/random.mjs +2 -3
  32. package/source/monster.mjs +12 -3
  33. package/source/types/version.mjs +1 -1
  34. package/test/cases/components/form/button.mjs +2 -1
  35. package/test/cases/components/form/confirm-button.mjs +1 -1
  36. package/test/cases/components/form/form.mjs +1 -1
  37. package/test/cases/components/form/reload.mjs +1 -1
  38. package/test/cases/components/form/select.mjs +1 -1
  39. package/test/cases/components/form/state-button.mjs +1 -1
  40. package/test/cases/components/form/template.mjs +1 -1
  41. package/test/cases/components/form/toggle-switch.mjs +1 -1
  42. package/test/cases/components/form/tree-select.mjs +1 -1
  43. package/test/cases/components/host/details.mjs +1 -1
  44. package/test/cases/components/host/host.mjs +1 -1
  45. package/test/cases/components/host/overlay.mjs +1 -1
  46. package/test/cases/components/layout/panel.mjs +1 -1
  47. package/test/cases/components/layout/slit-panel.mjs +1 -1
  48. package/test/cases/components/layout/tabs.mjs +1 -1
  49. package/test/cases/components/notify/message.mjs +1 -1
  50. package/test/cases/components/notify/notify.mjs +1 -1
  51. package/test/cases/dom/customcontrol.mjs +1 -1
  52. package/test/cases/dom/customelement-initfromscripthost.mjs +1 -1
  53. package/test/cases/dom/customelement.mjs +1 -1
  54. package/test/cases/dom/resource/data.mjs +1 -1
  55. package/test/cases/dom/resource/link/stylesheet.mjs +1 -1
  56. package/test/cases/dom/resource/link.mjs +1 -1
  57. package/test/cases/dom/resource/script.mjs +1 -1
  58. package/test/cases/dom/updater.mjs +1 -1
  59. package/test/cases/monster.mjs +1 -1
  60. package/test/web/test.html +2 -2
  61. package/test/web/tests.js +6 -15
@@ -10,26 +10,19 @@
10
10
  * For more information about purchasing a commercial license, please contact schukai GmbH.
11
11
  */
12
12
 
13
- import {instanceSymbol} from "../../constants.mjs";
14
- import {addAttributeToken} from "../../dom/attributes.mjs";
13
+ import { instanceSymbol } from "../../constants.mjs";
14
+ import { ATTRIBUTE_PREFIX, ATTRIBUTE_ROLE } from "../../dom/constants.mjs";
15
+ import { CustomElement, getSlottedElements } from "../../dom/customelement.mjs";
15
16
  import {
16
- ATTRIBUTE_ERRORMESSAGE, ATTRIBUTE_PREFIX,
17
- ATTRIBUTE_ROLE,
18
- } from "../../dom/constants.mjs";
19
- import {CustomControl} from "../../dom/customcontrol.mjs";
20
- import {CustomElement, getSlottedElements} from "../../dom/customelement.mjs";
21
- import {
22
- assembleMethodSymbol,
23
- registerCustomElement,
17
+ assembleMethodSymbol,
18
+ registerCustomElement,
24
19
  } from "../../dom/customelement.mjs";
25
- import {findTargetElementFromEvent} from "../../dom/events.mjs";
26
- import {isFunction} from "../../types/is.mjs";
27
- import {SliderStyleSheet} from "./stylesheet/slider.mjs";
28
- import {fireCustomEvent} from "../../dom/events.mjs";
20
+ import { SliderStyleSheet } from "./stylesheet/slider.mjs";
21
+ import { fireCustomEvent } from "../../dom/events.mjs";
29
22
 
30
- import {getWindow} from "../../dom/util.mjs";
23
+ import { getWindow } from "../../dom/util.mjs";
31
24
 
32
- export {Slider};
25
+ export { Slider };
33
26
 
34
27
  /**
35
28
  * @private
@@ -65,166 +58,161 @@ const configSymbol = Symbol("config");
65
58
  * @private
66
59
  * @type {string}
67
60
  */
68
- const ATTRIBUTE_CLON_FROM = ATTRIBUTE_PREFIX + "clone-from"
61
+ const ATTRIBUTE_CLONE_FROM = ATTRIBUTE_PREFIX + "clone-from";
69
62
 
70
63
  /**
71
64
  * A Slider
72
65
  *
73
- * @fragments /fragments/components/form/slider/
66
+ * @fragments /fragments/components/layout/slider/
74
67
  *
75
- * @example /examples/components/form/slider-simple
68
+ * @example /examples/components/layout/slider-simple
76
69
  *
77
70
  * @since 3.74.0
78
71
  * @copyright schukai GmbH
79
72
  * @summary A beautiful Slider that can make your life easier and also looks good.
80
73
  */
81
74
  class Slider extends CustomElement {
82
- /**
83
- * This method is called by the `instanceof` operator.
84
- * @returns {symbol}
85
- */
86
- static get [instanceSymbol]() {
87
- return Symbol.for("@schukai/monster/components/layout/slider@@instance");
88
- }
89
-
90
- /**
91
- *
92
- * @return {Components.Layout.Slider
93
- */
94
- [assembleMethodSymbol]() {
95
- super[assembleMethodSymbol]();
96
-
97
- this[configSymbol] = {
98
- currentIndex: 0,
99
-
100
- isDragging: false,
101
- draggingPos: 0,
102
- startPos: 0,
103
- // currentTranslate: 0,
104
- // prevTranslate: 0,
105
- //
106
- // startPositions: null,
107
- // currentPositions: null,
108
-
109
- autoPlayInterval: null,
110
- }
111
-
112
- initControlReferences.call(this);
113
- initEventHandler.call(this);
114
- initStructure.call(this);
115
-
116
- return this;
117
- }
118
-
119
- /**
120
- * To set the options via the html tag the attribute `data-monster-options` must be used.
121
- * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
122
- *
123
- * The individual configuration values can be found in the table.
124
- *
125
- * @property {Object} templates Template definitions
126
- * @property {string} templates.main Main template
127
- * @property {Object} labels Label definitions
128
- * @property {Object} actions Callbacks
129
- * @property {string} actions.click="throw Error" Callback when clicked
130
- * @property {Object} features Features
131
- * @property {Object} classes CSS classes
132
- * @property {boolean} disabled=false Disabled state
133
- */
134
- get defaults() {
135
- return Object.assign({}, super.defaults, {
136
- templates: {
137
- main: getTemplate(),
138
- },
139
- labels: {},
140
- classes: {},
141
- disabled: false,
142
-
143
- features: {
144
- carousel: false,
145
- autoPlay: true,
146
- thumbnails: true,
147
- },
148
-
149
- autoPlay: {
150
- delay: 1500,
151
- startDelay: 1000,
152
- direction: "next",
153
- mouseOverPause: true,
154
- touchPause: true,
155
- drag: true,
156
- },
157
-
158
- actions: {
159
- click: () => {
160
- throw new Error("the click action is not defined");
161
- },
162
- }
163
- });
164
- }
165
-
166
- /**
167
- * @return {string}
168
- */
169
- static getTag() {
170
- return "monster-slider";
171
- }
172
-
173
- /**
174
- * @return {CSSStyleSheet[]}
175
- */
176
- static getCSSStyleSheet() {
177
- return [SliderStyleSheet];
178
- }
179
-
180
- /**
181
- * moves the slider to the given index
182
- *
183
- * @param index
184
- * @returns {void}
185
- */
186
- moveTo(index) {
187
- return moveTo.call(this, index)
188
- }
189
-
190
- /**
191
- * shows the previous slide
192
- *
193
- * @return {void}
194
- */
195
- previous() {
196
- return prev.call(this);
197
- }
198
-
199
- /**
200
- * shows the next slide
201
- *
202
- * @return {void}
203
- */
204
- next() {
205
- return next.call(this);
206
- }
207
-
208
- /**
209
- * stops the auto play
210
- *
211
- * @return {void}
212
- */
213
- stopAutoPlay() {
214
- if (this[configSymbol].autoPlayInterval) {
215
- clearInterval(this[configSymbol].autoPlayInterval);
216
- }
217
- }
218
-
219
- /**
220
- * starts the auto play
221
- *
222
- * @return {void}
223
- */
224
- startAutoPlay() {
225
- initAutoPlay.call(this);
226
- }
227
-
75
+ /**
76
+ * This method is called by the `instanceof` operator.
77
+ * @returns {symbol}
78
+ */
79
+ static get [instanceSymbol]() {
80
+ return Symbol.for("@schukai/monster/components/layout/slider@@instance");
81
+ }
82
+
83
+ /**
84
+ *
85
+ * @return {Components.Layout.Slider
86
+ */
87
+ [assembleMethodSymbol]() {
88
+ super[assembleMethodSymbol]();
89
+
90
+ this[configSymbol] = {
91
+ currentIndex: 0,
92
+
93
+ isDragging: false,
94
+ draggingPos: 0,
95
+ startPos: 0,
96
+ autoPlayInterval: null,
97
+ };
98
+
99
+ initControlReferences.call(this);
100
+ initEventHandler.call(this);
101
+ initStructure.call(this);
102
+
103
+ return this;
104
+ }
105
+
106
+ /**
107
+ * To set the options via the html tag the attribute `data-monster-options` must be used.
108
+ * @see {@link https://monsterjs.org/en/doc/#configurate-a-monster-control}
109
+ *
110
+ * The individual configuration values can be found in the table.
111
+ *
112
+ * @property {Object} templates Template definitions
113
+ * @property {string} templates.main Main template
114
+ * @property {string} actions.click="throw Error" Callback when clicked
115
+ * @property {Object} features Features
116
+ * @property {boolean} features.carousel=true Carousel feature
117
+ * @property {boolean} features.autoPlay=true Auto play feature
118
+ * @property {boolean} features.thumbnails=true Thumbnails feature
119
+ * @property {boolean} features.drag=true Drag feature
120
+ * @property {Object} autoPlay Auto play configuration
121
+ * @property {number} autoPlay.delay=1500 Delay between slides
122
+ * @property {number} autoPlay.startDelay=1000 Start delay
123
+ * @property {string} autoPlay.direction="next" Direction of the autoplay
124
+ * @property {boolean} autoPlay.mouseOverPause=true Pause on mouse over
125
+ * @property {boolean} autoPlay.touchPause=true Pause on touch
126
+ * @property {Object} classes CSS classes
127
+ * @property {boolean} disabled=false Disabled state
128
+ */
129
+ get defaults() {
130
+ return Object.assign({}, super.defaults, {
131
+ templates: {
132
+ main: getTemplate(),
133
+ },
134
+
135
+ classes: {},
136
+ disabled: false,
137
+
138
+ features: {
139
+ carousel: true,
140
+ autoPlay: true,
141
+ thumbnails: true,
142
+ drag: true,
143
+ },
144
+
145
+ autoPlay: {
146
+ delay: 1500,
147
+ startDelay: 1000,
148
+ direction: "next",
149
+ mouseOverPause: true,
150
+ touchPause: true,
151
+ },
152
+ });
153
+ }
154
+
155
+ /**
156
+ * @return {string}
157
+ */
158
+ static getTag() {
159
+ return "monster-slider";
160
+ }
161
+
162
+ /**
163
+ * @return {CSSStyleSheet[]}
164
+ */
165
+ static getCSSStyleSheet() {
166
+ return [SliderStyleSheet];
167
+ }
168
+
169
+ /**
170
+ * moves the slider to the given index
171
+ *
172
+ * @param index
173
+ * @returns {void}
174
+ */
175
+ moveTo(index) {
176
+ return moveTo.call(this, index);
177
+ }
178
+
179
+ /**
180
+ * shows the previous slide
181
+ *
182
+ * @return {void}
183
+ */
184
+ previous() {
185
+ return prev.call(this);
186
+ }
187
+
188
+ /**
189
+ * shows the next slide
190
+ *
191
+ * @return {void}
192
+ */
193
+ next() {
194
+ return next.call(this);
195
+ }
196
+
197
+ /**
198
+ * stops the auto play
199
+ *
200
+ * @return {void}
201
+ */
202
+ stopAutoPlay() {
203
+ if (this[configSymbol].autoPlayInterval) {
204
+ clearInterval(this[configSymbol].autoPlayInterval);
205
+ }
206
+ }
207
+
208
+ /**
209
+ * starts the auto play
210
+ *
211
+ * @return {void}
212
+ */
213
+ startAutoPlay() {
214
+ initAutoPlay.call(this);
215
+ }
228
216
  }
229
217
 
230
218
  /**
@@ -232,151 +220,148 @@ class Slider extends CustomElement {
232
220
  * @param name
233
221
  */
234
222
  function initNavigation(name) {
235
- const element = this.shadowRoot.querySelector("." + name + "");
236
- const elementHeight = element.offsetHeight;
237
- element.style.top = `calc(50% - ${elementHeight / 2}px)`;
223
+ const element = this.shadowRoot.querySelector("." + name + "");
224
+ const elementHeight = element.offsetHeight;
225
+ element.style.top = `calc(50% - ${elementHeight / 2}px)`;
238
226
  }
239
227
 
240
228
  /**
241
229
  * @private
242
230
  */
243
231
  function initStructure() {
244
- initNavigation.call(this, "next");
245
- initNavigation.call(this, "prev");
232
+ initNavigation.call(this, "next");
233
+ initNavigation.call(this, "prev");
246
234
 
247
- if (this.getOption("features.thumbnails")) {
248
- initThumbnails.call(this);
249
- }
235
+ if (this.getOption("features.thumbnails")) {
236
+ initThumbnails.call(this);
237
+ }
250
238
 
251
- if (this.getOption("features.carousel")) {
252
- initCarousel.call(this);
253
- }
239
+ if (this.getOption("features.carousel")) {
240
+ initCarousel.call(this);
241
+ }
254
242
 
255
- if (this.getOption("features.autoPlay")) {
256
- initAutoPlay.call(this);
257
- }
243
+ if (this.getOption("features.autoPlay")) {
244
+ initAutoPlay.call(this);
245
+ }
258
246
  }
259
247
 
260
248
  /**
261
249
  * @private
262
250
  */
263
251
  function initThumbnails() {
264
- const self = this;
265
- const thumbnails = this.shadowRoot.querySelector("[data-monster-role='thumbnails']");
266
- const slides = Array.from(getSlottedElements.call(this, ":scope", null));
267
-
268
- slides.forEach((slide, index) => {
269
- const thumbnail = document.createElement("div");
270
- thumbnail.classList.add("thumbnail");
271
- thumbnail.addEventListener("click", () => {
272
- if (self.getOption("features.carousel")) {
273
- this.moveTo(index + 1);
274
- } else {
275
- this.moveTo(index);
276
- }
277
- });
278
-
279
- thumbnails.appendChild(thumbnail);
280
- })
281
-
282
- this.addEventListener("monster-slider-moved", (e) => {
283
- const index = e.detail.index;
284
- const thumbnail = thumbnails.children[index];
285
-
286
- if (!thumbnail) {
287
- return;
288
- }
289
-
290
- Array.from(thumbnails.children).forEach((thumb) => {
291
- thumb.classList.remove("current");
292
- })
293
-
294
- thumbnail.classList.add("current");
295
- })
252
+ const self = this;
253
+ const thumbnails = this.shadowRoot.querySelector(
254
+ "[data-monster-role='thumbnails']",
255
+ );
256
+ const slides = Array.from(getSlottedElements.call(this, ":scope", null));
257
+
258
+ slides.forEach((slide, index) => {
259
+ const thumbnail = document.createElement("div");
260
+ thumbnail.classList.add("thumbnail");
261
+ thumbnail.addEventListener("click", () => {
262
+ if (self.getOption("features.carousel")) {
263
+ this.moveTo(index + 1);
264
+ } else {
265
+ this.moveTo(index);
266
+ }
267
+ });
268
+
269
+ thumbnails.appendChild(thumbnail);
270
+ });
271
+
272
+ this.addEventListener("monster-slider-moved", (e) => {
273
+ const index = e.detail.index;
274
+ const thumbnail = thumbnails.children[index];
275
+
276
+ if (!thumbnail) {
277
+ return;
278
+ }
279
+
280
+ Array.from(thumbnails.children).forEach((thumb) => {
281
+ thumb.classList.remove("current");
282
+ });
283
+
284
+ thumbnail.classList.add("current");
285
+ });
296
286
  }
297
287
 
298
288
  /**
299
289
  * @private
300
290
  */
301
291
  function initAutoPlay() {
302
- const self = this;
303
- const autoPlay = this.getOption("autoPlay");
304
- const delay = autoPlay.delay;
305
- const startDelay = autoPlay.startDelay;
306
- const direction = autoPlay.direction;
307
-
308
- function start() {
309
-
310
- if (self[configSymbol].autoPlayInterval) {
311
- clearInterval(self[configSymbol].autoPlayInterval);
312
- }
313
-
314
- self[configSymbol].autoPlayInterval = setInterval(() => {
315
- if (direction === "next") {
316
- if(self.next() === -1) {
317
- if (self.getOption("features.carousel")) {
318
- clearInterval(self[configSymbol].autoPlayInterval);
319
- }
320
- }
321
- } else {
322
- if (self.previous() === -1) {
323
- if (self.getOption("features.carousel")) {
324
- clearInterval(self[configSymbol].autoPlayInterval);
325
- }
326
- }
327
- }
328
- }, delay);
329
- }
330
-
331
- setTimeout(() => {
332
- start();
333
- }, startDelay);
334
-
335
- if (autoPlay.mouseOverPause) {
336
- this.addEventListener("mouseover", () => {
337
- clearInterval(this[configSymbol].autoPlayInterval);
338
- });
339
-
340
- this.addEventListener("mouseout", () => {
341
- if (this[configSymbol].isDragging) {
342
- return;
343
- }
344
- start();
345
- });
346
- }
347
-
348
- if (autoPlay.touchPause) {
349
- this.addEventListener("touchstart", () => {
350
- clearInterval(this[configSymbol].autoPlayInterval);
351
- });
352
-
353
- this.addEventListener("touchend", () => {
354
- start();
355
- });
356
- }
357
-
292
+ const self = this;
293
+ const autoPlay = this.getOption("autoPlay");
294
+ const delay = autoPlay.delay;
295
+ const startDelay = autoPlay.startDelay;
296
+ const direction = autoPlay.direction;
297
+
298
+ function start() {
299
+ if (self[configSymbol].autoPlayInterval) {
300
+ clearInterval(self[configSymbol].autoPlayInterval);
301
+ }
302
+
303
+ self[configSymbol].autoPlayInterval = setInterval(() => {
304
+ if (direction === "next") {
305
+ if (self.next() === -1) {
306
+ if (self.getOption("features.carousel")) {
307
+ clearInterval(self[configSymbol].autoPlayInterval);
308
+ }
309
+ }
310
+ } else {
311
+ if (self.previous() === -1) {
312
+ if (self.getOption("features.carousel")) {
313
+ clearInterval(self[configSymbol].autoPlayInterval);
314
+ }
315
+ }
316
+ }
317
+ }, delay);
318
+ }
319
+
320
+ setTimeout(() => {
321
+ start();
322
+ }, startDelay);
323
+
324
+ if (autoPlay.mouseOverPause) {
325
+ this.addEventListener("mouseover", () => {
326
+ clearInterval(this[configSymbol].autoPlayInterval);
327
+ });
328
+
329
+ this.addEventListener("mouseout", () => {
330
+ if (this[configSymbol].isDragging) {
331
+ return;
332
+ }
333
+ start();
334
+ });
335
+ }
336
+
337
+ if (autoPlay.touchPause) {
338
+ this.addEventListener("touchstart", () => {
339
+ clearInterval(this[configSymbol].autoPlayInterval);
340
+ });
341
+
342
+ this.addEventListener("touchend", () => {
343
+ start();
344
+ });
345
+ }
358
346
  }
359
347
 
360
348
  /**
361
349
  * @private
362
350
  */
363
351
  function initCarousel() {
352
+ const { slides, totalSlides } = getSlidesAndTotal.call(this);
353
+ if (this.getOption("features.carousel") && totalSlides > 2) {
354
+ const firstElement = slides[0].cloneNode(true);
355
+ firstElement.setAttribute(ATTRIBUTE_CLONE_FROM, 1);
364
356
 
365
- const {slides, totalSlides} = getSlidesAndTotal.call(this);
366
- if (this.getOption("features.carousel") && totalSlides > 2) {
367
-
368
- const firstElement = slides[0].cloneNode(true);
369
- firstElement.setAttribute(ATTRIBUTE_CLON_FROM, 1);
370
-
371
- const lastElement = slides[totalSlides - 1].cloneNode(true);
372
- lastElement.setAttribute(ATTRIBUTE_CLON_FROM, totalSlides);
373
- slides[totalSlides - 1].insertAdjacentElement("afterend", firstElement);
357
+ const lastElement = slides[totalSlides - 1].cloneNode(true);
358
+ lastElement.setAttribute(ATTRIBUTE_CLONE_FROM, totalSlides);
359
+ slides[totalSlides - 1].insertAdjacentElement("afterend", firstElement);
374
360
 
375
- slides[0].insertAdjacentElement("beforebegin", lastElement);
361
+ slides[0].insertAdjacentElement("beforebegin", lastElement);
376
362
 
377
- moveTo.call(this, 1);
378
-
379
- }
363
+ moveTo.call(this, 1);
364
+ }
380
365
  }
381
366
 
382
367
  /**
@@ -384,9 +369,9 @@ function initCarousel() {
384
369
  * @returns {{slides: unknown[], totalSlides: number}}
385
370
  */
386
371
  function getSlidesAndTotal() {
387
- const slides = Array.from(getSlottedElements.call(this, ":scope", null));
388
- const totalSlides = slides.length;
389
- return {slides, totalSlides};
372
+ const slides = Array.from(getSlottedElements.call(this, ":scope", null));
373
+ const totalSlides = slides.length;
374
+ return { slides, totalSlides };
390
375
  }
391
376
 
392
377
  /**
@@ -394,23 +379,22 @@ function getSlidesAndTotal() {
394
379
  * @returns {number}
395
380
  */
396
381
  function next() {
397
-
398
- const {slides, totalSlides} = getSlidesAndTotal.call(this);
399
- const nextIndex = this[configSymbol].currentIndex + 1;
400
-
401
- if (nextIndex >= totalSlides) {
402
- return -1;
403
- }
404
-
405
- queueMicrotask(() => {
406
- getWindow().requestAnimationFrame(() => {
407
- getWindow().requestAnimationFrame(() => {
408
- moveTo.call(this, nextIndex);
409
- });
410
- });
411
- });
412
-
413
- return 0;
382
+ const { slides, totalSlides } = getSlidesAndTotal.call(this);
383
+ const nextIndex = this[configSymbol].currentIndex + 1;
384
+
385
+ if (nextIndex >= totalSlides) {
386
+ return -1;
387
+ }
388
+
389
+ queueMicrotask(() => {
390
+ getWindow().requestAnimationFrame(() => {
391
+ getWindow().requestAnimationFrame(() => {
392
+ moveTo.call(this, nextIndex);
393
+ });
394
+ });
395
+ });
396
+
397
+ return 0;
414
398
  }
415
399
 
416
400
  /**
@@ -418,15 +402,14 @@ function next() {
418
402
  * @returns {number}
419
403
  */
420
404
  function prev() {
405
+ const prevIndex = this[configSymbol].currentIndex - 1;
421
406
 
422
- const prevIndex = this[configSymbol].currentIndex - 1;
423
-
424
- if (prevIndex < 0) {
425
- return -1;
426
- }
407
+ if (prevIndex < 0) {
408
+ return -1;
409
+ }
427
410
 
428
- moveTo.call(this, prevIndex);
429
- return 0;
411
+ moveTo.call(this, prevIndex);
412
+ return 0;
430
413
  }
431
414
 
432
415
  /**
@@ -435,21 +418,20 @@ function prev() {
435
418
  * @param index
436
419
  */
437
420
  function setMoveProperties(slides, index) {
421
+ this[configSymbol].currentIndex = index;
438
422
 
439
- this[configSymbol].currentIndex = index
440
-
441
- slides.forEach((slide) => {
442
- slide.classList.remove("current");
443
- })
444
-
445
- let offset = -(index * 100);
446
- if (offset !== 0) {
447
- offset += "%";
448
- }
423
+ slides.forEach((slide) => {
424
+ slide.classList.remove("current");
425
+ });
449
426
 
450
- this[sliderElementSymbol].style.transform = `translateX(calc(${offset} + ${this[configSymbol].draggingPos}px))`;
451
- slides[index].classList.add("current");
427
+ let offset = -(index * 100);
428
+ if (offset !== 0) {
429
+ offset += "%";
430
+ }
452
431
 
432
+ this[sliderElementSymbol].style.transform =
433
+ `translateX(calc(${offset} + ${this[configSymbol].draggingPos}px))`;
434
+ slides[index].classList.add("current");
453
435
  }
454
436
 
455
437
  /**
@@ -458,93 +440,97 @@ function setMoveProperties(slides, index) {
458
440
  * @fires monster-slider-moved
459
441
  */
460
442
  function moveTo(index) {
443
+ const { slides, totalSlides } = getSlidesAndTotal.call(this);
461
444
 
462
- const {slides, totalSlides} = getSlidesAndTotal.call(this);
445
+ if (index < 0) {
446
+ index = totalSlides - 1;
447
+ } else if (index >= totalSlides) {
448
+ index = 0;
449
+ }
463
450
 
464
- if (index < 0) {
465
- index = totalSlides - 1
466
- } else if (index >= totalSlides) {
467
- index = 0
468
- }
451
+ const slider = this[sliderElementSymbol];
469
452
 
470
- const slider = this[sliderElementSymbol];
453
+ setMoveProperties.call(this, slides, index);
471
454
 
472
- setMoveProperties.call(this, slides, index);
455
+ const style = getComputedStyle(this[sliderElementSymbol]);
456
+ const duration = style.transitionDuration;
457
+ const durationMilis = parseFloat(duration) * 1000;
473
458
 
474
- const style = getComputedStyle(this[sliderElementSymbol]);
475
- const duration = style.transitionDuration;
476
- const durationMilis = parseFloat(duration) * 1000;
459
+ let slideIndex = index;
460
+ let eventFired = false;
477
461
 
478
- let slideIndex = index;
479
- let eventFired = false;
462
+ if (this.getOption("features.carousel")) {
463
+ slideIndex = index - 1;
480
464
 
481
- if (this.getOption("features.carousel")) {
482
- slideIndex = index - 1;
465
+ if (slides[index].hasAttribute(ATTRIBUTE_CLONE_FROM)) {
466
+ const from = parseInt(slides[index].getAttribute(ATTRIBUTE_CLONE_FROM));
483
467
 
484
- if (slides[index].hasAttribute(ATTRIBUTE_CLON_FROM)) {
485
- const from = parseInt(slides[index].getAttribute(ATTRIBUTE_CLON_FROM));
468
+ getWindow().requestAnimationFrame(() => {
469
+ getWindow().requestAnimationFrame(() => {
470
+ setTimeout(() => {
471
+ slider.style.transitionProperty = "none";
486
472
 
487
- getWindow().requestAnimationFrame(() => {
488
- getWindow().requestAnimationFrame(() => {
489
- setTimeout(() => {
490
- slider.style.transitionProperty = "none";
473
+ setMoveProperties.call(this, slides, from);
474
+ slideIndex = from - 1;
491
475
 
492
- setMoveProperties.call(this, slides, from);
493
- slideIndex = from - 1;
476
+ getWindow().requestAnimationFrame(() => {
477
+ getWindow().requestAnimationFrame(() => {
478
+ slider.style.transitionProperty = "";
494
479
 
495
- getWindow().requestAnimationFrame(() => {
496
- getWindow().requestAnimationFrame(() => {
497
- slider.style.transitionProperty = "";
480
+ fireCustomEvent(this, "monster-slider-moved", {
481
+ index: slideIndex,
482
+ });
498
483
 
499
- fireCustomEvent(this, "monster-slider-moved", {
500
- index: slideIndex,
501
- })
484
+ eventFired = true;
485
+ });
486
+ });
487
+ }, durationMilis);
488
+ });
489
+ });
490
+ }
491
+ }
502
492
 
503
- eventFired = true;
504
- });
505
- });
506
- }, durationMilis);
507
- });
508
- });
509
- }
510
- }
511
-
512
- if (!eventFired) {
513
- fireCustomEvent(this, "monster-slider-moved", {
514
- index: slideIndex,
515
- })
516
- }
493
+ if (!eventFired) {
494
+ fireCustomEvent(this, "monster-slider-moved", {
495
+ index: slideIndex,
496
+ });
497
+ }
517
498
  }
518
499
 
519
-
520
500
  /**
521
501
  * @private
522
502
  * @return {initEventHandler}
523
503
  */
524
504
  function initEventHandler() {
525
- const self = this;
505
+ const self = this;
506
+
507
+ const nextElements = this[nextElementSymbol];
526
508
 
527
- const nextElements = this[nextElementSymbol];
509
+ if (nextElements) {
510
+ nextElements.addEventListener("click", () => {
511
+ self.next();
512
+ });
513
+ }
528
514
 
529
- if (nextElements) {
530
- nextElements.addEventListener("click", () => {
531
- self.next();
532
- });
533
- }
515
+ const prevElements = this[prevElementSymbol];
534
516
 
535
- const prevElements = this[prevElementSymbol];
517
+ if (prevElements) {
518
+ prevElements.addEventListener("click", () => {
519
+ self.previous();
520
+ });
521
+ }
536
522
 
537
- if (prevElements) {
538
- prevElements.addEventListener("click", () => {
539
- self.previous();
540
- });
541
- }
523
+ if (this.getOption("features.drag")) {
524
+ this[sliderElementSymbol].addEventListener("mousedown", (e) =>
525
+ startDragging.call(this, e, "mouse"),
526
+ );
542
527
 
543
- this[sliderElementSymbol].addEventListener('mousedown', (e) => startDragging.call(this, e, 'mouse'));
544
- this[sliderElementSymbol].addEventListener('touchstart', (e) => startDragging.call(this, e, 'touch'));
545
- // this[sliderElementSymbol].addEventListener('touchend', () => stopDragging.call(this, 'touch'));
546
- // this[sliderElementSymbol].addEventListener('touchmove', (e) => dragging.call(this, e, 'touch'));
547
- return this;
528
+ this[sliderElementSymbol].addEventListener("touchstart", (e) =>
529
+ startDragging.call(this, e, "touch"),
530
+ );
531
+ }
532
+
533
+ return this;
548
534
  }
549
535
 
550
536
  /**
@@ -553,49 +539,45 @@ function initEventHandler() {
553
539
  * @param type
554
540
  */
555
541
  function startDragging(e, type) {
542
+ this[configSymbol].isDragging = true;
543
+ this[configSymbol].startPos = getPositionX(e, type);
544
+ this[sliderElementSymbol].classList.add("grabbing");
545
+ this[sliderElementSymbol].style.transitionProperty = "none";
556
546
 
557
- this[configSymbol].isDragging = true;
558
- this[configSymbol].startPos = getPositionX(e, type);
559
- this[sliderElementSymbol].classList.add('grabbing');
560
- this[sliderElementSymbol].style.transitionProperty = "none";
561
-
562
- const callbackMousemove = (x) => {
563
- dragging.call(this, x, type);
564
- }
547
+ const callbackMousemove = (x) => {
548
+ dragging.call(this, x, type);
549
+ };
565
550
 
566
- const callbackMouseUp = () => {
567
-
568
- const endEvent = type === 'mouse' ? 'mouseup' : 'touchend';
569
- const moveEvent = type === 'mouse' ? 'mousemove' : 'touchmove';
551
+ const callbackMouseUp = () => {
552
+ const endEvent = type === "mouse" ? "mouseup" : "touchend";
553
+ const moveEvent = type === "mouse" ? "mousemove" : "touchmove";
570
554
 
571
- document.body.removeEventListener(endEvent, callbackMouseUp);
572
- document.body.removeEventListener(moveEvent, callbackMousemove);
555
+ document.body.removeEventListener(endEvent, callbackMouseUp);
556
+ document.body.removeEventListener(moveEvent, callbackMousemove);
573
557
 
574
- this[configSymbol].isDragging = false;
575
- this[configSymbol].startPos = 0;
576
- this[sliderElementSymbol].classList.remove('grabbing');
577
- this[sliderElementSymbol].style.transitionProperty = "";
558
+ this[configSymbol].isDragging = false;
559
+ this[configSymbol].startPos = 0;
560
+ this[sliderElementSymbol].classList.remove("grabbing");
561
+ this[sliderElementSymbol].style.transitionProperty = "";
578
562
 
579
- const lastPos = this[configSymbol].draggingPos;
580
- const widthOfSlider = this[sliderElementSymbol].offsetWidth;
581
- this[configSymbol].draggingPos = 0;
563
+ const lastPos = this[configSymbol].draggingPos;
564
+ const widthOfSlider = this[sliderElementSymbol].offsetWidth;
565
+ this[configSymbol].draggingPos = 0;
582
566
 
583
- let newIndex = this[configSymbol].currentIndex;
567
+ let newIndex = this[configSymbol].currentIndex;
584
568
 
585
- const x = lastPos / widthOfSlider;
586
- if (x > 0.5) {
587
- newIndex--;
588
- } else if (x < -0.5) {
589
- newIndex++;
590
- }
569
+ const x = lastPos / widthOfSlider;
570
+ if (x > 0.5) {
571
+ newIndex--;
572
+ } else if (x < -0.5) {
573
+ newIndex++;
574
+ }
591
575
 
592
- this.moveTo(newIndex);
593
-
594
- }
595
-
596
- document.body.addEventListener('mouseup', callbackMouseUp);
597
- document.body.addEventListener('mousemove', callbackMousemove);
576
+ this.moveTo(newIndex);
577
+ };
598
578
 
579
+ document.body.addEventListener("mouseup", callbackMouseUp);
580
+ document.body.addEventListener("mousemove", callbackMousemove);
599
581
  }
600
582
 
601
583
  /**
@@ -605,7 +587,7 @@ function startDragging(e, type) {
605
587
  * @returns {*|number|number}
606
588
  */
607
589
  function getPositionX(e, type) {
608
- return type === 'mouse' ? e.pageX : e.touches[0].clientX;
590
+ return type === "mouse" ? e.pageX : e.touches[0].clientX;
609
591
  }
610
592
 
611
593
  /**
@@ -614,10 +596,11 @@ function getPositionX(e, type) {
614
596
  * @param type
615
597
  */
616
598
  function dragging(e, type) {
617
- if (!this[configSymbol].isDragging) return;
618
- this[configSymbol].draggingPos = getPositionX(e, type) - this[configSymbol].startPos;
619
- const {slides, totalSlides} = getSlidesAndTotal.call(this);
620
- setMoveProperties.call(this, slides, this[configSymbol].currentIndex);
599
+ if (!this[configSymbol].isDragging) return;
600
+ this[configSymbol].draggingPos =
601
+ getPositionX(e, type) - this[configSymbol].startPos;
602
+ const { slides, totalSlides } = getSlidesAndTotal.call(this);
603
+ setMoveProperties.call(this, slides, this[configSymbol].currentIndex);
621
604
  }
622
605
 
623
606
  /**
@@ -625,22 +608,21 @@ function dragging(e, type) {
625
608
  * @return {void}
626
609
  */
627
610
  function initControlReferences() {
611
+ this[controlElementSymbol] = this.shadowRoot.querySelector(
612
+ `[${ATTRIBUTE_ROLE}="control"]`,
613
+ );
628
614
 
629
- this[controlElementSymbol] = this.shadowRoot.querySelector(
630
- `[${ATTRIBUTE_ROLE}="control"]`,
631
- );
615
+ this[sliderElementSymbol] = this.shadowRoot.querySelector(
616
+ `[${ATTRIBUTE_ROLE}="slider"]`,
617
+ );
632
618
 
633
- this[sliderElementSymbol] = this.shadowRoot.querySelector(
634
- `[${ATTRIBUTE_ROLE}="slider"]`,
635
- );
619
+ this[prevElementSymbol] = this.shadowRoot.querySelector(
620
+ `[${ATTRIBUTE_ROLE}="prev"]`,
621
+ );
636
622
 
637
- this[prevElementSymbol] = this.shadowRoot.querySelector(
638
- `[${ATTRIBUTE_ROLE}="prev"]`,
639
- );
640
-
641
- this[nextElementSymbol] = this.shadowRoot.querySelector(
642
- `[${ATTRIBUTE_ROLE}="next"]`,
643
- );
623
+ this[nextElementSymbol] = this.shadowRoot.querySelector(
624
+ `[${ATTRIBUTE_ROLE}="next"]`,
625
+ );
644
626
  }
645
627
 
646
628
  /**
@@ -648,21 +630,20 @@ function initControlReferences() {
648
630
  * @return {string}
649
631
  */
650
632
  function getTemplate() {
651
- // language=HTML
652
- return `
633
+ // language=HTML
634
+ return `
653
635
  <div data-monster-role="control" part="control">
654
- <div class="prev" data-monster-role="prev" part="prev">
636
+ <div class="prev" data-monster-role="prev" part="prev" part="prev">
655
637
  <slot name="prev"></slot>
656
638
  </div>
657
- <div data-monster-role="slider">
639
+ <div data-monster-role="slider" part="slides">
658
640
  <slot></slot>
659
641
  </div>
660
642
  <div data-monster-role="thumbnails"></div>
661
- <div class="next" data-monster-role="next" part="next">
643
+ <div class="next" data-monster-role="next" part="next" part="next">
662
644
  <slot name="next"></slot>
663
645
  </div>
664
646
  </div>`;
665
647
  }
666
648
 
667
-
668
649
  registerCustomElement(Slider);