@lumx/react 2.2.5 → 2.2.8
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/esm/_internal/AutocompleteMultiple.js.map +1 -1
- package/esm/_internal/DatePickerField.js.map +1 -1
- package/esm/_internal/Icon2.js +5 -2
- package/esm/_internal/Icon2.js.map +1 -1
- package/esm/_internal/Lightbox2.js +6 -4
- package/esm/_internal/Lightbox2.js.map +1 -1
- package/esm/_internal/List2.js.map +1 -1
- package/esm/_internal/Notification2.js +2 -1
- package/esm/_internal/Notification2.js.map +1 -1
- package/esm/_internal/SelectMultiple.js.map +1 -1
- package/esm/_internal/SlideshowControls.js +234 -94
- package/esm/_internal/SlideshowControls.js.map +1 -1
- package/esm/_internal/Thumbnail2.js +1 -1
- package/esm/_internal/Thumbnail2.js.map +1 -1
- package/esm/_internal/Tooltip2.js +110 -113
- package/esm/_internal/Tooltip2.js.map +1 -1
- package/esm/_internal/autocomplete.js +0 -1
- package/esm/_internal/autocomplete.js.map +1 -1
- package/esm/_internal/button.js +0 -1
- package/esm/_internal/button.js.map +1 -1
- package/esm/_internal/constants.js.map +1 -1
- package/esm/_internal/date-picker.js +0 -1
- package/esm/_internal/date-picker.js.map +1 -1
- package/esm/_internal/expansion-panel.js +0 -1
- package/esm/_internal/expansion-panel.js.map +1 -1
- package/esm/_internal/getRootClassName.js +19 -1
- package/esm/_internal/getRootClassName.js.map +1 -1
- package/esm/_internal/lightbox.js +0 -1
- package/esm/_internal/lightbox.js.map +1 -1
- package/esm/_internal/mergeRefs.js.map +1 -1
- package/esm/_internal/select.js +0 -1
- package/esm/_internal/select.js.map +1 -1
- package/esm/_internal/side-navigation.js +0 -1
- package/esm/_internal/side-navigation.js.map +1 -1
- package/esm/_internal/slideshow.js +1 -1
- package/esm/_internal/text-field.js +0 -1
- package/esm/_internal/text-field.js.map +1 -1
- package/esm/_internal/tooltip.js +0 -1
- package/esm/_internal/tooltip.js.map +1 -1
- package/esm/_internal/useRovingTabIndex.js.map +1 -1
- package/esm/index.js +1 -1
- package/package.json +4 -4
- package/src/components/alert-dialog/AlertDialog.test.tsx +1 -0
- package/src/components/autocomplete/AutocompleteMultiple.tsx +3 -1
- package/src/components/button/__snapshots__/IconButton.test.tsx.snap +0 -5
- package/src/components/icon/Icon.tsx +6 -2
- package/src/components/image-block/ImageBlock.stories.tsx +1 -2
- package/src/components/lightbox/Lightbox.stories.tsx +1 -0
- package/src/components/lightbox/Lightbox.tsx +5 -3
- package/src/components/notification/Notification.tsx +1 -0
- package/src/components/select/SelectMultiple.tsx +0 -1
- package/src/components/slideshow/Slideshow.stories.tsx +1 -1
- package/src/components/slideshow/Slideshow.tsx +76 -112
- package/src/components/slideshow/SlideshowControls.stories.tsx +18 -12
- package/src/components/slideshow/SlideshowControls.tsx +11 -7
- package/src/components/slideshow/SlideshowItem.tsx +4 -1
- package/src/components/slideshow/__snapshots__/Slideshow.test.tsx.snap +52 -17
- package/src/components/tabs/state.ts +0 -1
- package/src/components/thumbnail/Thumbnail.stories.tsx +25 -1
- package/src/components/thumbnail/Thumbnail.test.tsx +9 -1
- package/src/components/thumbnail/Thumbnail.tsx +3 -0
- package/src/components/thumbnail/__snapshots__/Thumbnail.test.tsx.snap +26 -0
- package/src/components/tooltip/Tooltip.tsx +1 -2
- package/src/components/tooltip/useTooltipOpen.tsx +90 -91
- package/src/constants.ts +7 -1
- package/src/hooks/useFocusWithin.ts +33 -0
- package/src/hooks/useSlideshowControls.ts +213 -0
- package/src/utils/browserDoesNotSupportHover.test.js +24 -0
- package/src/utils/browserDoesNotSupportHover.ts +2 -0
- package/src/utils/index.tsx +0 -2
- package/src/utils/mergeRefs.ts +1 -1
- package/types.d.ts +62 -8
- package/src/utils/htmlDecode.ts +0 -13
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { d as _slicedToArray, _ as _objectSpread2, b as _objectWithoutProperties, c as _extends, a as _defineProperty } from './_rollupPluginBabelHelpers.js';
|
|
2
2
|
import { Theme, Emphasis } from './components.js';
|
|
3
|
-
import React, { useRef, useEffect,
|
|
3
|
+
import React, { useRef, useEffect, useState, useCallback, useMemo, forwardRef } from 'react';
|
|
4
4
|
import { g as getRootClassName, c as classnames, h as handleBasicClasses, e as detectHorizontalSwipe } from './getRootClassName.js';
|
|
5
5
|
import { g as mdiChevronLeft, f as mdiChevronRight } from './Icon2.js';
|
|
6
6
|
import { W as WINDOW } from './constants.js';
|
|
@@ -8,31 +8,7 @@ import { m as mergeRefs } from './mergeRefs.js';
|
|
|
8
8
|
import { I as IconButton } from './IconButton.js';
|
|
9
9
|
import isFunction from 'lodash/isFunction';
|
|
10
10
|
import range from 'lodash/range';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Autoplay default interval in ms.
|
|
14
|
-
*/
|
|
15
|
-
var AUTOPLAY_DEFAULT_INTERVAL = 5000;
|
|
16
|
-
/**
|
|
17
|
-
* Full width size in percent.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
var FULL_WIDTH_PERCENT = 100;
|
|
21
|
-
/**
|
|
22
|
-
* Edge from the active index.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
var EDGE_FROM_ACTIVE_INDEX = 2;
|
|
26
|
-
/**
|
|
27
|
-
* Max number of pagination items.
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
|
-
var PAGINATION_ITEMS_MAX = 5;
|
|
31
|
-
/**
|
|
32
|
-
* Size of a pagination item. Used to translate wrapper.
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
var PAGINATION_ITEM_SIZE = 12;
|
|
11
|
+
import uniqueId from 'lodash/uniqueId';
|
|
36
12
|
|
|
37
13
|
/**
|
|
38
14
|
* Making setInterval Declarative with React Hooks.
|
|
@@ -63,50 +39,72 @@ function useInterval(callback, delay) {
|
|
|
63
39
|
}
|
|
64
40
|
|
|
65
41
|
/**
|
|
66
|
-
*
|
|
42
|
+
* Autoplay default interval in ms.
|
|
43
|
+
*/
|
|
44
|
+
var AUTOPLAY_DEFAULT_INTERVAL = 5000;
|
|
45
|
+
/**
|
|
46
|
+
* Full width size in percent.
|
|
67
47
|
*/
|
|
68
48
|
|
|
49
|
+
var FULL_WIDTH_PERCENT = 100;
|
|
69
50
|
/**
|
|
70
|
-
*
|
|
51
|
+
* Edge from the active index.
|
|
71
52
|
*/
|
|
72
|
-
|
|
53
|
+
|
|
54
|
+
var EDGE_FROM_ACTIVE_INDEX = 2;
|
|
73
55
|
/**
|
|
74
|
-
*
|
|
56
|
+
* Max number of pagination items.
|
|
75
57
|
*/
|
|
76
58
|
|
|
77
|
-
var
|
|
59
|
+
var PAGINATION_ITEMS_MAX = 5;
|
|
78
60
|
/**
|
|
79
|
-
*
|
|
61
|
+
* Size of a pagination item. Used to translate wrapper.
|
|
80
62
|
*/
|
|
81
63
|
|
|
82
|
-
var
|
|
83
|
-
|
|
84
|
-
groupBy: 1,
|
|
85
|
-
interval: AUTOPLAY_DEFAULT_INTERVAL,
|
|
86
|
-
theme: Theme.light
|
|
87
|
-
};
|
|
64
|
+
var PAGINATION_ITEM_SIZE = 12;
|
|
65
|
+
|
|
88
66
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* @param
|
|
92
|
-
* @param ref Component ref.
|
|
93
|
-
* @return React element.
|
|
67
|
+
* Hook that allows to control when there is a focus event within a given element, meaning
|
|
68
|
+
* that any element within the given target will trigger the focus in and focus out events.
|
|
69
|
+
* @param options - UseFocusWithinOptions
|
|
94
70
|
*/
|
|
71
|
+
var useFocusWithin = function useFocusWithin(_ref) {
|
|
72
|
+
var element = _ref.element,
|
|
73
|
+
onFocusIn = _ref.onFocusIn,
|
|
74
|
+
onFocusOut = _ref.onFocusOut;
|
|
75
|
+
useEffect(function () {
|
|
76
|
+
if (element) {
|
|
77
|
+
element.addEventListener('focusin', onFocusIn);
|
|
78
|
+
element.addEventListener('focusout', onFocusOut);
|
|
79
|
+
}
|
|
95
80
|
|
|
96
|
-
|
|
97
|
-
|
|
81
|
+
return function () {
|
|
82
|
+
if (element) {
|
|
83
|
+
element.removeEventListener('focusin', onFocusIn);
|
|
84
|
+
element.addEventListener('focusout', onFocusOut);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}, [onFocusIn, element, onFocusOut]);
|
|
88
|
+
};
|
|
98
89
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
90
|
+
var DEFAULT_OPTIONS = {
|
|
91
|
+
activeIndex: 0,
|
|
92
|
+
groupBy: 1,
|
|
93
|
+
interval: AUTOPLAY_DEFAULT_INTERVAL
|
|
94
|
+
};
|
|
95
|
+
var useSlideshowControls = function useSlideshowControls(_ref) {
|
|
96
|
+
var _ref$activeIndex = _ref.activeIndex,
|
|
97
|
+
activeIndex = _ref$activeIndex === void 0 ? DEFAULT_OPTIONS.activeIndex : _ref$activeIndex,
|
|
98
|
+
_ref$groupBy = _ref.groupBy,
|
|
99
|
+
groupBy = _ref$groupBy === void 0 ? DEFAULT_OPTIONS.groupBy : _ref$groupBy,
|
|
100
|
+
_ref$interval = _ref.interval,
|
|
101
|
+
interval = _ref$interval === void 0 ? DEFAULT_OPTIONS.interval : _ref$interval,
|
|
102
|
+
autoPlay = _ref.autoPlay,
|
|
103
|
+
defaultActiveIndex = _ref.defaultActiveIndex,
|
|
104
|
+
onChange = _ref.onChange,
|
|
105
|
+
itemsCount = _ref.itemsCount,
|
|
106
|
+
id = _ref.id,
|
|
107
|
+
slidesId = _ref.slidesId;
|
|
110
108
|
|
|
111
109
|
var _useState = useState(activeIndex),
|
|
112
110
|
_useState2 = _slicedToArray(_useState, 2),
|
|
@@ -117,16 +115,10 @@ var Slideshow = forwardRef(function (props, ref) {
|
|
|
117
115
|
var _useState3 = useState(),
|
|
118
116
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
119
117
|
element = _useState4[0],
|
|
120
|
-
setElement = _useState4[1]; // Number of
|
|
121
|
-
|
|
118
|
+
setElement = _useState4[1]; // Number of slides when using groupBy prop.
|
|
122
119
|
|
|
123
|
-
var itemsCount = React.Children.count(children); // Number of slides when using groupBy prop.
|
|
124
120
|
|
|
125
|
-
var slidesCount = Math.ceil(itemsCount / Math.min(groupBy, itemsCount)); //
|
|
126
|
-
|
|
127
|
-
var wrapperStyle = {
|
|
128
|
-
transform: "translateX(-".concat(FULL_WIDTH_PERCENT * currentIndex, "%)")
|
|
129
|
-
}; // Change current index to display next slide.
|
|
121
|
+
var slidesCount = Math.ceil(itemsCount / Math.min(groupBy, itemsCount)); // Change current index to display next slide.
|
|
130
122
|
|
|
131
123
|
var goToNextSlide = useCallback(function () {
|
|
132
124
|
var loopback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
@@ -172,11 +164,11 @@ var Slideshow = forwardRef(function (props, ref) {
|
|
|
172
164
|
|
|
173
165
|
useEffect(function () {
|
|
174
166
|
if (currentIndex > slidesCount - 1) {
|
|
175
|
-
setCurrentIndex(
|
|
167
|
+
setCurrentIndex(defaultActiveIndex);
|
|
176
168
|
}
|
|
177
|
-
}, [currentIndex, slidesCount]); // Handle click on a bullet to go to a specific slide.
|
|
169
|
+
}, [currentIndex, slidesCount, defaultActiveIndex]); // Handle click on a bullet to go to a specific slide.
|
|
178
170
|
|
|
179
|
-
var
|
|
171
|
+
var onPaginationClick = useCallback(function (index) {
|
|
180
172
|
setIsAutoPlaying(false);
|
|
181
173
|
|
|
182
174
|
if (index >= 0 && index < slidesCount) {
|
|
@@ -184,13 +176,13 @@ var Slideshow = forwardRef(function (props, ref) {
|
|
|
184
176
|
}
|
|
185
177
|
}, [slidesCount, setCurrentIndex]); // Handle click or keyboard event to go to next slide.
|
|
186
178
|
|
|
187
|
-
var
|
|
179
|
+
var onNextClick = useCallback(function () {
|
|
188
180
|
var loopback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
189
181
|
setIsAutoPlaying(false);
|
|
190
182
|
goToNextSlide(loopback);
|
|
191
183
|
}, [goToNextSlide]); // Handle click or keyboard event to go to previous slide.
|
|
192
184
|
|
|
193
|
-
var
|
|
185
|
+
var onPreviousClick = useCallback(function () {
|
|
194
186
|
var loopback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
195
187
|
setIsAutoPlaying(false);
|
|
196
188
|
goToPreviousSlide(loopback);
|
|
@@ -204,31 +196,177 @@ var Slideshow = forwardRef(function (props, ref) {
|
|
|
204
196
|
if (!onChange) return;
|
|
205
197
|
onChange(currentIndex);
|
|
206
198
|
}, [currentIndex, onChange]);
|
|
199
|
+
var slideshowId = useMemo(function () {
|
|
200
|
+
return id || uniqueId('slideshow');
|
|
201
|
+
}, [id]);
|
|
202
|
+
var slideshowSlidesId = useMemo(function () {
|
|
203
|
+
return slidesId || uniqueId('slideshow-slides');
|
|
204
|
+
}, [slidesId]);
|
|
205
|
+
|
|
206
|
+
var startAutoPlay = function startAutoPlay() {
|
|
207
|
+
setIsAutoPlaying(Boolean(autoPlay));
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
var stopAutoPlay = function stopAutoPlay() {
|
|
211
|
+
setIsAutoPlaying(false);
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
useFocusWithin({
|
|
215
|
+
element: element,
|
|
216
|
+
onFocusIn: stopAutoPlay,
|
|
217
|
+
onFocusOut: startAutoPlay
|
|
218
|
+
}); // Start index and end index of visible slides.
|
|
219
|
+
|
|
220
|
+
var startIndexVisible = currentIndex * groupBy;
|
|
221
|
+
var endIndexVisible = startIndexVisible + groupBy;
|
|
222
|
+
return {
|
|
223
|
+
startIndexVisible: startIndexVisible,
|
|
224
|
+
endIndexVisible: endIndexVisible,
|
|
225
|
+
setSlideshow: setElement,
|
|
226
|
+
slideshow: element,
|
|
227
|
+
slideshowId: slideshowId,
|
|
228
|
+
slideshowSlidesId: slideshowSlidesId,
|
|
229
|
+
onPreviousClick: onPreviousClick,
|
|
230
|
+
onNextClick: onNextClick,
|
|
231
|
+
onPaginationClick: onPaginationClick,
|
|
232
|
+
isAutoPlaying: isAutoPlaying,
|
|
233
|
+
setIsAutoPlaying: setIsAutoPlaying,
|
|
234
|
+
activeIndex: currentIndex,
|
|
235
|
+
slidesCount: slidesCount,
|
|
236
|
+
setActiveIndex: setCurrentIndex
|
|
237
|
+
};
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Defines the props of the component.
|
|
242
|
+
*/
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Component display name.
|
|
246
|
+
*/
|
|
247
|
+
var COMPONENT_NAME = 'Slideshow';
|
|
248
|
+
/**
|
|
249
|
+
* Component default class name and class prefix.
|
|
250
|
+
*/
|
|
251
|
+
|
|
252
|
+
var CLASSNAME = getRootClassName(COMPONENT_NAME);
|
|
253
|
+
/**
|
|
254
|
+
* Component default props.
|
|
255
|
+
*/
|
|
256
|
+
|
|
257
|
+
var DEFAULT_PROPS = _objectSpread2({}, DEFAULT_OPTIONS, {
|
|
258
|
+
theme: Theme.light
|
|
259
|
+
});
|
|
260
|
+
/**
|
|
261
|
+
* Slideshow component.
|
|
262
|
+
*
|
|
263
|
+
* @param props Component props.
|
|
264
|
+
* @param ref Component ref.
|
|
265
|
+
* @return React element.
|
|
266
|
+
*/
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
var Slideshow = forwardRef(function (props, ref) {
|
|
270
|
+
var _classNames;
|
|
271
|
+
|
|
272
|
+
var activeIndex = props.activeIndex,
|
|
273
|
+
autoPlay = props.autoPlay,
|
|
274
|
+
children = props.children,
|
|
275
|
+
className = props.className,
|
|
276
|
+
fillHeight = props.fillHeight,
|
|
277
|
+
groupBy = props.groupBy,
|
|
278
|
+
interval = props.interval,
|
|
279
|
+
onChange = props.onChange,
|
|
280
|
+
slideshowControlsProps = props.slideshowControlsProps,
|
|
281
|
+
theme = props.theme,
|
|
282
|
+
id = props.id,
|
|
283
|
+
slidesId = props.slidesId,
|
|
284
|
+
forwardedProps = _objectWithoutProperties(props, ["activeIndex", "autoPlay", "children", "className", "fillHeight", "groupBy", "interval", "onChange", "slideshowControlsProps", "theme", "id", "slidesId"]); // Number of slideshow items.
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
var itemsCount = React.Children.count(children);
|
|
288
|
+
|
|
289
|
+
var _SlideshowControls$us = SlideshowControls.useSlideshowControls({
|
|
290
|
+
activeIndex: activeIndex,
|
|
291
|
+
defaultActiveIndex: DEFAULT_PROPS.activeIndex,
|
|
292
|
+
autoPlay: Boolean(autoPlay),
|
|
293
|
+
itemsCount: itemsCount,
|
|
294
|
+
groupBy: groupBy,
|
|
295
|
+
id: id,
|
|
296
|
+
interval: interval,
|
|
297
|
+
onChange: onChange,
|
|
298
|
+
slidesId: slidesId
|
|
299
|
+
}),
|
|
300
|
+
currentIndex = _SlideshowControls$us.activeIndex,
|
|
301
|
+
slideshowId = _SlideshowControls$us.slideshowId,
|
|
302
|
+
setSlideshow = _SlideshowControls$us.setSlideshow,
|
|
303
|
+
isAutoPlaying = _SlideshowControls$us.isAutoPlaying,
|
|
304
|
+
slideshowSlidesId = _SlideshowControls$us.slideshowSlidesId,
|
|
305
|
+
setIsAutoPlaying = _SlideshowControls$us.setIsAutoPlaying,
|
|
306
|
+
startIndexVisible = _SlideshowControls$us.startIndexVisible,
|
|
307
|
+
endIndexVisible = _SlideshowControls$us.endIndexVisible,
|
|
308
|
+
slidesCount = _SlideshowControls$us.slidesCount,
|
|
309
|
+
onNextClick = _SlideshowControls$us.onNextClick,
|
|
310
|
+
onPaginationClick = _SlideshowControls$us.onPaginationClick,
|
|
311
|
+
onPreviousClick = _SlideshowControls$us.onPreviousClick,
|
|
312
|
+
slideshow = _SlideshowControls$us.slideshow; // Inline style of wrapper element.
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
var wrapperStyle = {
|
|
316
|
+
transform: "translateX(-".concat(FULL_WIDTH_PERCENT * currentIndex, "%)")
|
|
317
|
+
};
|
|
207
318
|
/* eslint-disable jsx-a11y/no-noninteractive-tabindex */
|
|
208
319
|
|
|
209
|
-
return React.createElement("
|
|
210
|
-
|
|
320
|
+
return React.createElement("section", _extends({
|
|
321
|
+
id: slideshowId,
|
|
322
|
+
ref: mergeRefs(ref, setSlideshow)
|
|
211
323
|
}, forwardedProps, {
|
|
212
324
|
className: classnames(className, handleBasicClasses({
|
|
213
325
|
prefix: CLASSNAME,
|
|
214
326
|
theme: theme
|
|
215
327
|
}), (_classNames = {}, _defineProperty(_classNames, "".concat(CLASSNAME, "--fill-height"), fillHeight), _defineProperty(_classNames, "".concat(CLASSNAME, "--group-by-").concat(groupBy), Boolean(groupBy)), _classNames)),
|
|
216
|
-
|
|
328
|
+
"aria-roledescription": "carousel",
|
|
329
|
+
"aria-live": isAutoPlaying ? 'off' : 'polite'
|
|
217
330
|
}), React.createElement("div", {
|
|
218
|
-
|
|
331
|
+
id: slideshowSlidesId,
|
|
332
|
+
className: "".concat(CLASSNAME, "__slides"),
|
|
333
|
+
onMouseEnter: function onMouseEnter() {
|
|
334
|
+
return setIsAutoPlaying(false);
|
|
335
|
+
},
|
|
336
|
+
onMouseLeave: function onMouseLeave() {
|
|
337
|
+
return setIsAutoPlaying(Boolean(autoPlay));
|
|
338
|
+
}
|
|
219
339
|
}, React.createElement("div", {
|
|
220
340
|
className: "".concat(CLASSNAME, "__wrapper"),
|
|
221
341
|
style: wrapperStyle
|
|
222
|
-
}, children
|
|
342
|
+
}, React.Children.map(children, function (child, index) {
|
|
343
|
+
if (React.isValidElement(child)) {
|
|
344
|
+
var isCurrentlyVisible = index >= startIndexVisible && index <= endIndexVisible;
|
|
345
|
+
return React.cloneElement(child, {
|
|
346
|
+
style: !isCurrentlyVisible ? _objectSpread2({
|
|
347
|
+
visibility: 'hidden'
|
|
348
|
+
}, child.props.style || {}) : child.props.style || {},
|
|
349
|
+
'aria-hidden': !isCurrentlyVisible
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
return null;
|
|
354
|
+
}))), slideshowControlsProps && slidesCount > 1 && React.createElement("div", {
|
|
223
355
|
className: "".concat(CLASSNAME, "__controls")
|
|
224
356
|
}, React.createElement(SlideshowControls, _extends({}, slideshowControlsProps, {
|
|
225
357
|
activeIndex: currentIndex,
|
|
226
|
-
onPaginationClick:
|
|
227
|
-
onNextClick:
|
|
228
|
-
onPreviousClick:
|
|
358
|
+
onPaginationClick: onPaginationClick,
|
|
359
|
+
onNextClick: onNextClick,
|
|
360
|
+
onPreviousClick: onPreviousClick,
|
|
229
361
|
slidesCount: slidesCount,
|
|
230
|
-
parentRef:
|
|
231
|
-
theme: theme
|
|
362
|
+
parentRef: slideshow,
|
|
363
|
+
theme: theme,
|
|
364
|
+
nextButtonProps: _objectSpread2({
|
|
365
|
+
'aria-controls': slideshowSlidesId
|
|
366
|
+
}, slideshowControlsProps.nextButtonProps),
|
|
367
|
+
previousButtonProps: _objectSpread2({
|
|
368
|
+
'aria-controls': slideshowSlidesId
|
|
369
|
+
}, slideshowControlsProps.previousButtonProps)
|
|
232
370
|
}))));
|
|
233
371
|
});
|
|
234
372
|
Slideshow.displayName = COMPONENT_NAME;
|
|
@@ -262,12 +400,13 @@ var SlideshowItem = forwardRef(function (props, ref) {
|
|
|
262
400
|
forwardedProps = _objectWithoutProperties(props, ["className", "children"]);
|
|
263
401
|
|
|
264
402
|
return React.createElement("div", _extends({
|
|
265
|
-
ref: ref
|
|
266
|
-
}, forwardedProps, {
|
|
403
|
+
ref: ref,
|
|
267
404
|
className: classnames(className, handleBasicClasses({
|
|
268
405
|
prefix: CLASSNAME$1
|
|
269
|
-
}))
|
|
270
|
-
|
|
406
|
+
})),
|
|
407
|
+
"aria-roledescription": "slide",
|
|
408
|
+
role: "group"
|
|
409
|
+
}, forwardedProps), children);
|
|
271
410
|
});
|
|
272
411
|
SlideshowItem.displayName = COMPONENT_NAME$1;
|
|
273
412
|
SlideshowItem.className = CLASSNAME$1;
|
|
@@ -393,7 +532,7 @@ var DEFAULT_PROPS$1 = {
|
|
|
393
532
|
* @return React element.
|
|
394
533
|
*/
|
|
395
534
|
|
|
396
|
-
var
|
|
535
|
+
var InternalSlideshowControls = forwardRef(function (props, ref) {
|
|
397
536
|
var activeIndex = props.activeIndex,
|
|
398
537
|
className = props.className,
|
|
399
538
|
nextButtonProps = props.nextButtonProps,
|
|
@@ -441,8 +580,7 @@ var SlideshowControls = forwardRef(function (props, ref) {
|
|
|
441
580
|
className: "".concat(CLASSNAME$2, "__navigation"),
|
|
442
581
|
color: theme === Theme.dark ? 'light' : 'dark',
|
|
443
582
|
emphasis: Emphasis.low,
|
|
444
|
-
onClick: onPreviousClick
|
|
445
|
-
tabIndex: -1
|
|
583
|
+
onClick: onPreviousClick
|
|
446
584
|
})), React.createElement("div", {
|
|
447
585
|
className: "".concat(CLASSNAME$2, "__pagination")
|
|
448
586
|
}, React.createElement("div", {
|
|
@@ -465,8 +603,7 @@ var SlideshowControls = forwardRef(function (props, ref) {
|
|
|
465
603
|
type: "button",
|
|
466
604
|
onClick: function onClick() {
|
|
467
605
|
return onPaginationClick === null || onPaginationClick === void 0 ? void 0 : onPaginationClick(index);
|
|
468
|
-
}
|
|
469
|
-
tabIndex: -1
|
|
606
|
+
}
|
|
470
607
|
})
|
|
471
608
|
);
|
|
472
609
|
});
|
|
@@ -475,13 +612,16 @@ var SlideshowControls = forwardRef(function (props, ref) {
|
|
|
475
612
|
className: "".concat(CLASSNAME$2, "__navigation"),
|
|
476
613
|
color: theme === Theme.dark ? 'light' : 'dark',
|
|
477
614
|
emphasis: Emphasis.low,
|
|
478
|
-
onClick: onNextClick
|
|
479
|
-
tabIndex: -1
|
|
615
|
+
onClick: onNextClick
|
|
480
616
|
})));
|
|
481
617
|
});
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
618
|
+
InternalSlideshowControls.displayName = COMPONENT_NAME$2;
|
|
619
|
+
InternalSlideshowControls.className = CLASSNAME$2;
|
|
620
|
+
InternalSlideshowControls.defaultProps = DEFAULT_PROPS$1;
|
|
621
|
+
var SlideshowControls = Object.assign(InternalSlideshowControls, {
|
|
622
|
+
useSlideshowControls: useSlideshowControls,
|
|
623
|
+
useSlideshowControlsDefaultOptions: DEFAULT_OPTIONS
|
|
624
|
+
});
|
|
485
625
|
|
|
486
626
|
export { Slideshow as S, SlideshowItem as a, SlideshowControls as b };
|
|
487
627
|
//# sourceMappingURL=SlideshowControls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlideshowControls.js","sources":["../../../src/components/slideshow/constants.ts","../../../src/hooks/useInterval.tsx","../../../src/components/slideshow/Slideshow.tsx","../../../src/components/slideshow/SlideshowItem.tsx","../../../src/components/slideshow/useSwipeNavigate.ts","../../../src/components/slideshow/useKeyNavigate.ts","../../../src/components/slideshow/usePaginationVisibleRange.ts","../../../src/components/slideshow/SlideshowControls.tsx"],"sourcesContent":["/**\n * Autoplay default interval in ms.\n */\nexport const AUTOPLAY_DEFAULT_INTERVAL = 5000;\n\n/**\n * Full width size in percent.\n */\nexport const FULL_WIDTH_PERCENT = 100;\n\n/**\n * Edge from the active index.\n */\nexport const EDGE_FROM_ACTIVE_INDEX = 2;\n\n/**\n * Max number of pagination items.\n */\nexport const PAGINATION_ITEMS_MAX = 5;\n\n/**\n * Size of a pagination item. Used to translate wrapper.\n */\nexport const PAGINATION_ITEM_SIZE = 12;\n","import { useEffect, useRef } from 'react';\n\nimport isFunction from 'lodash/isFunction';\nimport { Callback } from '../utils';\n\n/**\n * Making setInterval Declarative with React Hooks.\n * Credits: https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n *\n * @param callback Function called by setInterval.\n * @param delay Delay for setInterval.\n */\nexport function useInterval(callback: Callback, delay: number | null): void {\n const savedCallback = useRef<Callback>();\n\n useEffect(() => {\n savedCallback.current = callback;\n });\n\n useEffect(() => {\n if (delay === null) return undefined;\n\n function tick() {\n if (isFunction(savedCallback.current)) {\n savedCallback.current();\n }\n }\n const id = setInterval(tick, delay);\n return () => clearInterval(id);\n }, [delay]);\n}\n","import React, { CSSProperties, forwardRef, useCallback, useEffect, useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport { SlideshowControls, SlideshowControlsProps, Theme } from '@lumx/react';\n\nimport { AUTOPLAY_DEFAULT_INTERVAL, FULL_WIDTH_PERCENT } from '@lumx/react/components/slideshow/constants';\nimport { useInterval } from '@lumx/react/hooks/useInterval';\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/react/utils';\nimport { mergeRefs } from '@lumx/react/utils/mergeRefs';\n\n/**\n * Defines the props of the component.\n */\nexport interface SlideshowProps extends GenericProps {\n /** Index of the current slide. */\n activeIndex?: number;\n /** Whether the automatic rotation of the slideshow is enabled or not. */\n autoPlay?: boolean;\n /** Whether the image has to fill its container height or not. */\n fillHeight?: boolean;\n /** Number of slides to group together. */\n groupBy?: number;\n /** Interval between each slide when automatic rotation is enabled. */\n interval?: number;\n /** Props to pass to the slideshow controls (minus those already set by the Slideshow props). */\n slideshowControlsProps?: Pick<SlideshowControlsProps, 'nextButtonProps' | 'previousButtonProps'> &\n Omit<\n SlideshowControlsProps,\n | 'activeIndex'\n | 'onPaginationClick'\n | 'onNextClick'\n | 'onPreviousClick'\n | 'slidesCount'\n | 'parentRef'\n | 'theme'\n >;\n /** Theme adapting the component to light or dark background. */\n theme?: Theme;\n /** Callback when slide changes */\n onChange?(index: number): void;\n}\n\n/**\n * Component display name.\n */\nconst COMPONENT_NAME = 'Slideshow';\n\n/**\n * Component default class name and class prefix.\n */\nconst CLASSNAME = getRootClassName(COMPONENT_NAME);\n\n/**\n * Component default props.\n */\nconst DEFAULT_PROPS: Partial<SlideshowProps> = {\n activeIndex: 0,\n groupBy: 1,\n interval: AUTOPLAY_DEFAULT_INTERVAL,\n theme: Theme.light,\n};\n\n/**\n * Slideshow component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nexport const Slideshow: Comp<SlideshowProps, HTMLDivElement> = forwardRef((props, ref) => {\n const {\n activeIndex,\n autoPlay,\n children,\n className,\n fillHeight,\n groupBy,\n interval,\n onChange,\n slideshowControlsProps,\n theme,\n ...forwardedProps\n } = props;\n const [currentIndex, setCurrentIndex] = useState(activeIndex as number);\n // Use state instead of a ref to make the slideshow controls update directly when the element is set.\n const [element, setElement] = useState<HTMLDivElement>();\n\n // Number of slideshow items.\n const itemsCount = React.Children.count(children);\n // Number of slides when using groupBy prop.\n const slidesCount = Math.ceil(itemsCount / Math.min(groupBy as number, itemsCount));\n // Inline style of wrapper element.\n const wrapperStyle: CSSProperties = { transform: `translateX(-${FULL_WIDTH_PERCENT * currentIndex}%)` };\n\n // Change current index to display next slide.\n const goToNextSlide = useCallback(\n (loopback = true) => {\n setCurrentIndex((index) => {\n if (loopback && index === slidesCount - 1) {\n // Loopback to the start.\n return 0;\n }\n if (index < slidesCount - 1) {\n // Next slide.\n return index + 1;\n }\n return index;\n });\n },\n [slidesCount, setCurrentIndex],\n );\n\n // Change current index to display previous slide.\n const goToPreviousSlide = useCallback(\n (loopback = true) => {\n setCurrentIndex((index) => {\n if (loopback && index === 0) {\n // Loopback to the end.\n return slidesCount - 1;\n }\n if (index > 0) {\n // Previous slide.\n return index - 1;\n }\n return index;\n });\n },\n [slidesCount, setCurrentIndex],\n );\n\n // Auto play\n const [isAutoPlaying, setIsAutoPlaying] = useState(Boolean(autoPlay));\n // Start\n useInterval(goToNextSlide, isAutoPlaying && slidesCount > 1 ? (interval as number) : null);\n\n // Reset current index if it become invalid.\n useEffect(() => {\n if (currentIndex > slidesCount - 1) {\n setCurrentIndex(DEFAULT_PROPS.activeIndex as number);\n }\n }, [currentIndex, slidesCount]);\n\n // Handle click on a bullet to go to a specific slide.\n const handleControlGotToSlide = useCallback(\n (index: number) => {\n setIsAutoPlaying(false);\n\n if (index >= 0 && index < slidesCount) {\n setCurrentIndex(index);\n }\n },\n [slidesCount, setCurrentIndex],\n );\n\n // Handle click or keyboard event to go to next slide.\n const handleControlNextSlide = useCallback(\n (loopback = true) => {\n setIsAutoPlaying(false);\n goToNextSlide(loopback);\n },\n [goToNextSlide],\n );\n\n // Handle click or keyboard event to go to previous slide.\n const handleControlPreviousSlide = useCallback(\n (loopback = true) => {\n setIsAutoPlaying(false);\n goToPreviousSlide(loopback);\n },\n [goToPreviousSlide],\n );\n\n // If the activeIndex props changes, update the current slide\n useEffect(() => {\n setCurrentIndex(activeIndex as number);\n }, [activeIndex]);\n\n // If the slide changes, with autoplay for example, trigger \"onChange\"\n useEffect(() => {\n if (!onChange) return;\n onChange(currentIndex);\n }, [currentIndex, onChange]);\n\n /* eslint-disable jsx-a11y/no-noninteractive-tabindex */\n return (\n <div\n ref={mergeRefs(ref, setElement)}\n {...forwardedProps}\n className={classNames(className, handleBasicClasses({ prefix: CLASSNAME, theme }), {\n [`${CLASSNAME}--fill-height`]: fillHeight,\n [`${CLASSNAME}--group-by-${groupBy}`]: Boolean(groupBy),\n })}\n tabIndex={0}\n >\n <div className={`${CLASSNAME}__slides`}>\n <div className={`${CLASSNAME}__wrapper`} style={wrapperStyle}>\n {children}\n </div>\n </div>\n\n {slideshowControlsProps && slidesCount > 1 && (\n <div className={`${CLASSNAME}__controls`}>\n <SlideshowControls\n {...slideshowControlsProps}\n activeIndex={currentIndex}\n onPaginationClick={handleControlGotToSlide}\n onNextClick={handleControlNextSlide}\n onPreviousClick={handleControlPreviousSlide}\n slidesCount={slidesCount}\n parentRef={element}\n theme={theme}\n />\n </div>\n )}\n </div>\n );\n});\nSlideshow.displayName = COMPONENT_NAME;\nSlideshow.className = CLASSNAME;\nSlideshow.defaultProps = DEFAULT_PROPS;\n","import React, { forwardRef } from 'react';\n\nimport classNames from 'classnames';\n\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/react/utils';\n\n/**\n * Defines the props of the component.\n */\nexport type SlideshowItemProps = GenericProps;\n\n/**\n * Component display name.\n */\nconst COMPONENT_NAME = 'SlideshowItem';\n\n/**\n * Component default class name and class prefix.\n */\nconst CLASSNAME = getRootClassName(COMPONENT_NAME);\n\n/**\n * SlideshowItem component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nexport const SlideshowItem: Comp<SlideshowItemProps, HTMLDivElement> = forwardRef((props, ref) => {\n const { className, children, ...forwardedProps } = props;\n\n return (\n <div\n ref={ref}\n {...forwardedProps}\n className={classNames(\n className,\n handleBasicClasses({\n prefix: CLASSNAME,\n }),\n )}\n >\n {children}\n </div>\n );\n});\nSlideshowItem.displayName = COMPONENT_NAME;\nSlideshowItem.className = CLASSNAME;\n","import { useEffect } from 'react';\nimport { detectHorizontalSwipe } from '@lumx/core/js/utils';\n\nconst isTouchDevice = () => 'ontouchstart' in window;\n\n/**\n * Listen swipe to navigate left and right.\n */\nexport function useSwipeNavigate(element?: HTMLElement | null, onNext?: () => void, onPrevious?: () => void): void {\n useEffect(() => {\n if (!element || !isTouchDevice()) return undefined;\n\n return detectHorizontalSwipe(element, (swipe) => {\n const callback = swipe === 'right' ? onPrevious : onNext;\n callback?.();\n });\n }, [onPrevious, onNext, element]);\n}\n","import { useEffect } from 'react';\n\n/**\n * Listen keyboard to navigate left and right.\n */\nexport function useKeyNavigate(element?: HTMLElement | null, onNext?: () => void, onPrevious?: () => void): void {\n useEffect(() => {\n if (!element) return undefined;\n const onKeyNavigate = (evt: KeyboardEvent) => {\n let callback;\n if (evt?.key === 'ArrowRight') {\n callback = onNext;\n } else if (evt?.key === 'ArrowLeft') {\n callback = onPrevious;\n }\n if (!callback) return;\n\n callback();\n evt.preventDefault();\n evt.stopPropagation();\n };\n\n element.addEventListener('keydown', onKeyNavigate);\n return () => {\n element.removeEventListener('keydown', onKeyNavigate);\n };\n }, [onPrevious, onNext, element]);\n}\n","import { useMemo, useRef } from 'react';\nimport { EDGE_FROM_ACTIVE_INDEX, PAGINATION_ITEMS_MAX } from '@lumx/react/components/slideshow/constants';\n\ntype Range = { min: number; max: number };\n\n/**\n * Calculate the currently visible pagination \"bullet\" range.\n */\nexport function usePaginationVisibleRange(activeIndex: number, slideCount: number): Range {\n const previousVisibleRangeRef = useRef<Range>();\n return useMemo(() => {\n const lastSlide = slideCount - 1;\n const { current: previousVisibleRange } = previousVisibleRangeRef;\n let newVisibleRange: Range;\n if (activeIndex === previousVisibleRange?.max && activeIndex < lastSlide) {\n newVisibleRange = { min: previousVisibleRange.min + 1, max: previousVisibleRange.max + 1 };\n } else if (activeIndex === previousVisibleRange?.min && activeIndex > 0) {\n newVisibleRange = { min: previousVisibleRange.min - 1, max: previousVisibleRange.max - 1 };\n } else {\n const deltaItems = PAGINATION_ITEMS_MAX - 1;\n let min = activeIndex - EDGE_FROM_ACTIVE_INDEX;\n let max = activeIndex + EDGE_FROM_ACTIVE_INDEX;\n\n if (activeIndex > lastSlide - EDGE_FROM_ACTIVE_INDEX) {\n min = lastSlide - deltaItems;\n max = lastSlide;\n } else if (activeIndex < deltaItems) {\n min = 0;\n max = deltaItems;\n }\n\n newVisibleRange = { min, max };\n }\n previousVisibleRangeRef.current = newVisibleRange;\n return newVisibleRange;\n }, [activeIndex, slideCount]);\n}\n","import React, { forwardRef, RefObject, useCallback, useMemo } from 'react';\n\nimport classNames from 'classnames';\nimport range from 'lodash/range';\n\nimport { mdiChevronLeft, mdiChevronRight } from '@lumx/icons';\nimport { Emphasis, IconButton, IconButtonProps, Theme } from '@lumx/react';\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/react/utils';\nimport { WINDOW } from '@lumx/react/constants';\n\nimport { useSwipeNavigate } from './useSwipeNavigate';\nimport { useKeyNavigate } from './useKeyNavigate';\nimport { PAGINATION_ITEM_SIZE, PAGINATION_ITEMS_MAX } from './constants';\nimport { usePaginationVisibleRange } from './usePaginationVisibleRange';\n\n/**\n * Defines the props of the component.\n */\nexport interface SlideshowControlsProps extends GenericProps {\n /** Index of the current slide. */\n activeIndex?: number;\n /** Props to pass to the next button (minus those already set by the SlideshowControls props). */\n nextButtonProps: Pick<IconButtonProps, 'label'> &\n Omit<IconButtonProps, 'label' | 'onClick' | 'icon' | 'emphasis' | 'color'>;\n /** Reference to the parent element on which we want to listen touch swipe. */\n parentRef?: RefObject<HTMLDivElement> | HTMLDivElement;\n /** Props to pass to the previous button (minus those already set by the SlideshowControls props). */\n previousButtonProps: Pick<IconButtonProps, 'label'> &\n Omit<IconButtonProps, 'label' | 'onClick' | 'icon' | 'emphasis' | 'color'>;\n /** Number of slides. */\n slidesCount: number;\n /** Theme adapting the component to light or dark background. */\n theme?: Theme;\n /** On next button click callback. */\n onNextClick?(loopback?: boolean): void;\n /** On pagination change callback. */\n onPaginationClick?(index: number): void;\n /** On previous button click callback. */\n onPreviousClick?(loopback?: boolean): void;\n}\n\n/**\n * Component display name.\n */\nconst COMPONENT_NAME = 'SlideshowControls';\n\n/**\n * Component default class name and class prefix.\n */\nconst CLASSNAME = getRootClassName(COMPONENT_NAME);\n\n/**\n * Component default props.\n */\nconst DEFAULT_PROPS: Partial<SlideshowControlsProps> = {\n activeIndex: 0,\n theme: Theme.light,\n};\n\n/**\n * SlideshowControls component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nexport const SlideshowControls: Comp<SlideshowControlsProps, HTMLDivElement> = forwardRef((props, ref) => {\n const {\n activeIndex,\n className,\n nextButtonProps,\n onNextClick,\n onPaginationClick,\n onPreviousClick,\n parentRef,\n previousButtonProps,\n slidesCount,\n theme,\n ...forwardedProps\n } = props;\n\n let parent;\n if (WINDOW) {\n // Checking window object to avoid errors in SSR.\n parent = parentRef instanceof HTMLElement ? parentRef : parentRef?.current;\n }\n // Listen to keyboard navigate left & right.\n useKeyNavigate(parent, onNextClick, onPreviousClick);\n // Listen to touch swipe navigate left & right.\n useSwipeNavigate(\n parent,\n // Go next without loopback.\n useCallback(() => onNextClick?.(false), [onNextClick]),\n // Go previous without loopback.\n useCallback(() => onPreviousClick?.(false), [onPreviousClick]),\n );\n\n // Pagination \"bullet\" range.\n const visibleRange = usePaginationVisibleRange(activeIndex as number, slidesCount);\n\n // Inline style of wrapper element.\n const wrapperStyle = { transform: `translateX(-${PAGINATION_ITEM_SIZE * visibleRange.min}px)` };\n\n return (\n <div\n ref={ref}\n {...forwardedProps}\n className={classNames(className, handleBasicClasses({ prefix: CLASSNAME, theme }), {\n [`${CLASSNAME}--has-infinite-pagination`]: slidesCount > PAGINATION_ITEMS_MAX,\n })}\n >\n <IconButton\n {...previousButtonProps}\n icon={mdiChevronLeft}\n className={`${CLASSNAME}__navigation`}\n color={theme === Theme.dark ? 'light' : 'dark'}\n emphasis={Emphasis.low}\n onClick={onPreviousClick}\n tabIndex={-1}\n />\n <div className={`${CLASSNAME}__pagination`}>\n <div className={`${CLASSNAME}__pagination-items`} style={wrapperStyle}>\n {useMemo(\n () =>\n range(slidesCount).map((index) => {\n const isOnEdge =\n index !== 0 &&\n index !== slidesCount - 1 &&\n (index === visibleRange.min || index === visibleRange.max);\n const isActive = activeIndex === index;\n const isOutRange = index < visibleRange.min || index > visibleRange.max;\n return (\n // eslint-disable-next-line jsx-a11y/control-has-associated-label\n <button\n className={classNames(\n handleBasicClasses({\n prefix: `${CLASSNAME}__pagination-item`,\n isActive,\n isOnEdge,\n isOutRange,\n }),\n )}\n key={index}\n type=\"button\"\n onClick={() => onPaginationClick?.(index)}\n tabIndex={-1}\n />\n );\n }),\n [slidesCount, visibleRange.min, visibleRange.max, activeIndex, onPaginationClick],\n )}\n </div>\n </div>\n <IconButton\n {...nextButtonProps}\n icon={mdiChevronRight}\n className={`${CLASSNAME}__navigation`}\n color={theme === Theme.dark ? 'light' : 'dark'}\n emphasis={Emphasis.low}\n onClick={onNextClick}\n tabIndex={-1}\n />\n </div>\n );\n});\nSlideshowControls.displayName = COMPONENT_NAME;\nSlideshowControls.className = CLASSNAME;\nSlideshowControls.defaultProps = DEFAULT_PROPS;\n"],"names":["AUTOPLAY_DEFAULT_INTERVAL","FULL_WIDTH_PERCENT","EDGE_FROM_ACTIVE_INDEX","PAGINATION_ITEMS_MAX","PAGINATION_ITEM_SIZE","useInterval","callback","delay","savedCallback","useRef","useEffect","current","undefined","tick","isFunction","id","setInterval","clearInterval","COMPONENT_NAME","CLASSNAME","getRootClassName","DEFAULT_PROPS","activeIndex","groupBy","interval","theme","Theme","light","Slideshow","forwardRef","props","ref","autoPlay","children","className","fillHeight","onChange","slideshowControlsProps","forwardedProps","useState","currentIndex","setCurrentIndex","element","setElement","itemsCount","React","Children","count","slidesCount","Math","ceil","min","wrapperStyle","transform","goToNextSlide","useCallback","loopback","index","goToPreviousSlide","Boolean","isAutoPlaying","setIsAutoPlaying","handleControlGotToSlide","handleControlNextSlide","handleControlPreviousSlide","mergeRefs","classNames","handleBasicClasses","prefix","displayName","defaultProps","SlideshowItem","isTouchDevice","window","useSwipeNavigate","onNext","onPrevious","detectHorizontalSwipe","swipe","useKeyNavigate","onKeyNavigate","evt","key","preventDefault","stopPropagation","addEventListener","removeEventListener","usePaginationVisibleRange","slideCount","previousVisibleRangeRef","useMemo","lastSlide","previousVisibleRange","newVisibleRange","max","deltaItems","SlideshowControls","nextButtonProps","onNextClick","onPaginationClick","onPreviousClick","parentRef","previousButtonProps","parent","WINDOW","HTMLElement","visibleRange","mdiChevronLeft","dark","Emphasis","low","range","map","isOnEdge","isActive","isOutRange","mdiChevronRight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SlideshowControls.js","sources":["../../../src/hooks/useInterval.tsx","../../../src/components/slideshow/constants.ts","../../../src/hooks/useFocusWithin.ts","../../../src/hooks/useSlideshowControls.ts","../../../src/components/slideshow/Slideshow.tsx","../../../src/components/slideshow/SlideshowItem.tsx","../../../src/components/slideshow/useSwipeNavigate.ts","../../../src/components/slideshow/useKeyNavigate.ts","../../../src/components/slideshow/usePaginationVisibleRange.ts","../../../src/components/slideshow/SlideshowControls.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport isFunction from 'lodash/isFunction';\nimport { Callback } from '../utils';\n\n/**\n * Making setInterval Declarative with React Hooks.\n * Credits: https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n *\n * @param callback Function called by setInterval.\n * @param delay Delay for setInterval.\n */\nexport function useInterval(callback: Callback, delay: number | null): void {\n const savedCallback = useRef<Callback>();\n\n useEffect(() => {\n savedCallback.current = callback;\n });\n\n useEffect(() => {\n if (delay === null) return undefined;\n\n function tick() {\n if (isFunction(savedCallback.current)) {\n savedCallback.current();\n }\n }\n const id = setInterval(tick, delay);\n return () => clearInterval(id);\n }, [delay]);\n}\n","/**\n * Autoplay default interval in ms.\n */\nexport const AUTOPLAY_DEFAULT_INTERVAL = 5000;\n\n/**\n * Full width size in percent.\n */\nexport const FULL_WIDTH_PERCENT = 100;\n\n/**\n * Edge from the active index.\n */\nexport const EDGE_FROM_ACTIVE_INDEX = 2;\n\n/**\n * Max number of pagination items.\n */\nexport const PAGINATION_ITEMS_MAX = 5;\n\n/**\n * Size of a pagination item. Used to translate wrapper.\n */\nexport const PAGINATION_ITEM_SIZE = 12;\n","import { useEffect } from 'react';\n\nexport interface UseFocusWithinOptions {\n /** element to add the focus within to */\n element: HTMLElement | undefined;\n /** callback to be executed on focus in */\n onFocusIn: (ev: FocusEvent) => void;\n /** callback to be executed on focus out */\n onFocusOut: (ev: FocusEvent) => void;\n}\n\n/**\n * Hook that allows to control when there is a focus event within a given element, meaning\n * that any element within the given target will trigger the focus in and focus out events.\n * @param options - UseFocusWithinOptions\n */\nexport const useFocusWithin = ({ element, onFocusIn, onFocusOut }: UseFocusWithinOptions) => {\n useEffect(() => {\n if (element) {\n element.addEventListener('focusin', onFocusIn);\n\n element.addEventListener('focusout', onFocusOut);\n }\n\n return () => {\n if (element) {\n element.removeEventListener('focusin', onFocusIn);\n\n element.addEventListener('focusout', onFocusOut);\n }\n };\n }, [onFocusIn, element, onFocusOut]);\n};\n","import { useState, useCallback, useEffect, useMemo } from 'react';\n\nimport { useInterval } from '@lumx/react/hooks/useInterval';\nimport uniqueId from 'lodash/uniqueId';\nimport { AUTOPLAY_DEFAULT_INTERVAL } from '@lumx/react/components/slideshow/constants';\n\nimport { useFocusWithin } from './useFocusWithin';\n\nexport interface UseSlideshowControlsOptions {\n /** default active index to be displayed */\n defaultActiveIndex?: number;\n /** total slides to display */\n itemsCount: number;\n /** Index of the current slide. */\n activeIndex?: number;\n /** Whether the automatic rotation of the slideshow is enabled or not. */\n autoPlay?: boolean;\n /** Whether the image has to fill its container height or not. */\n fillHeight?: boolean;\n /** Number of slides to group together. */\n groupBy?: number;\n /** Interval between each slide when automatic rotation is enabled. */\n interval?: number;\n /** Callback when slide changes */\n onChange?(index: number): void;\n /** slideshow HTML id attribute */\n id?: string;\n /** slides wrapper HTML id attribute */\n slidesId?: string;\n}\n\nexport interface UseSlideshowControls {\n /** Index for the first visible slide, should be used when groupBy is passed in */\n startIndexVisible: number;\n /** Index for the last visible slide, should be used when groupBy is passed in */\n endIndexVisible: number;\n /** total slides to be displayed */\n slidesCount: number;\n /** callback to set */\n setSlideshow: (element: HTMLDivElement | undefined) => void;\n /** reference to the slideshow element */\n slideshow: HTMLDivElement | undefined;\n /** id to be used for the slideshow */\n slideshowId: string;\n /** id to be used for the wrapper that contains the slides */\n slideshowSlidesId: string;\n /** callback that triggers the previous slide while using the slideshow controls */\n onPreviousClick: (loopback: boolean) => void;\n /** callback that triggers the next slide while using the slideshow controls */\n onNextClick: (loopback: boolean) => void;\n /** callback that triggers a specific page while using the slideshow controls */\n onPaginationClick: (index: number) => void;\n /** whether the slideshow is autoplaying or not */\n isAutoPlaying: boolean;\n /** callback to change whether the slideshow is autoplaying or not */\n setIsAutoPlaying: (isAutoPlaying: boolean) => void;\n /** current active slide index */\n activeIndex: number;\n /** set the current index as the active one */\n setActiveIndex: (index: number) => void;\n}\n\nexport const DEFAULT_OPTIONS: Partial<UseSlideshowControlsOptions> = {\n activeIndex: 0,\n groupBy: 1,\n interval: AUTOPLAY_DEFAULT_INTERVAL,\n};\n\nexport const useSlideshowControls = ({\n activeIndex = DEFAULT_OPTIONS.activeIndex,\n groupBy = DEFAULT_OPTIONS.groupBy,\n interval = DEFAULT_OPTIONS.interval,\n autoPlay,\n defaultActiveIndex,\n onChange,\n itemsCount,\n id,\n slidesId,\n}: UseSlideshowControlsOptions): UseSlideshowControls => {\n const [currentIndex, setCurrentIndex] = useState(activeIndex as number);\n // Use state instead of a ref to make the slideshow controls update directly when the element is set.\n const [element, setElement] = useState<HTMLDivElement>();\n\n // Number of slides when using groupBy prop.\n const slidesCount = Math.ceil(itemsCount / Math.min(groupBy as number, itemsCount));\n\n // Change current index to display next slide.\n const goToNextSlide = useCallback(\n (loopback = true) => {\n setCurrentIndex((index) => {\n if (loopback && index === slidesCount - 1) {\n // Loopback to the start.\n return 0;\n }\n if (index < slidesCount - 1) {\n // Next slide.\n return index + 1;\n }\n return index;\n });\n },\n [slidesCount, setCurrentIndex],\n );\n\n // Change current index to display previous slide.\n const goToPreviousSlide = useCallback(\n (loopback = true) => {\n setCurrentIndex((index) => {\n if (loopback && index === 0) {\n // Loopback to the end.\n return slidesCount - 1;\n }\n if (index > 0) {\n // Previous slide.\n return index - 1;\n }\n return index;\n });\n },\n [slidesCount, setCurrentIndex],\n );\n\n // Auto play\n const [isAutoPlaying, setIsAutoPlaying] = useState(Boolean(autoPlay));\n // Start\n useInterval(goToNextSlide, isAutoPlaying && slidesCount > 1 ? (interval as number) : null);\n\n // Reset current index if it become invalid.\n useEffect(() => {\n if (currentIndex > slidesCount - 1) {\n setCurrentIndex(defaultActiveIndex as number);\n }\n }, [currentIndex, slidesCount, defaultActiveIndex]);\n\n // Handle click on a bullet to go to a specific slide.\n const onPaginationClick = useCallback(\n (index: number) => {\n setIsAutoPlaying(false);\n\n if (index >= 0 && index < slidesCount) {\n setCurrentIndex(index);\n }\n },\n [slidesCount, setCurrentIndex],\n );\n\n // Handle click or keyboard event to go to next slide.\n const onNextClick = useCallback(\n (loopback = true) => {\n setIsAutoPlaying(false);\n goToNextSlide(loopback);\n },\n [goToNextSlide],\n );\n\n // Handle click or keyboard event to go to previous slide.\n const onPreviousClick = useCallback(\n (loopback = true) => {\n setIsAutoPlaying(false);\n goToPreviousSlide(loopback);\n },\n [goToPreviousSlide],\n );\n\n // If the activeIndex props changes, update the current slide\n useEffect(() => {\n setCurrentIndex(activeIndex as number);\n }, [activeIndex]);\n\n // If the slide changes, with autoplay for example, trigger \"onChange\"\n useEffect(() => {\n if (!onChange) return;\n onChange(currentIndex);\n }, [currentIndex, onChange]);\n\n const slideshowId = useMemo(() => id || uniqueId('slideshow'), [id]);\n const slideshowSlidesId = useMemo(() => slidesId || uniqueId('slideshow-slides'), [slidesId]);\n\n const startAutoPlay = () => {\n setIsAutoPlaying(Boolean(autoPlay));\n };\n\n const stopAutoPlay = () => {\n setIsAutoPlaying(false);\n };\n\n useFocusWithin({\n element,\n onFocusIn: stopAutoPlay,\n onFocusOut: startAutoPlay,\n });\n\n // Start index and end index of visible slides.\n const startIndexVisible = currentIndex * (groupBy as number);\n const endIndexVisible = startIndexVisible + (groupBy as number);\n\n return {\n startIndexVisible,\n endIndexVisible,\n setSlideshow: setElement,\n slideshow: element,\n slideshowId,\n slideshowSlidesId,\n onPreviousClick,\n onNextClick,\n onPaginationClick,\n isAutoPlaying,\n setIsAutoPlaying,\n activeIndex: currentIndex,\n slidesCount,\n setActiveIndex: setCurrentIndex,\n };\n};\n","import React, { CSSProperties, forwardRef } from 'react';\n\nimport classNames from 'classnames';\n\nimport { SlideshowControls, SlideshowControlsProps, Theme } from '@lumx/react';\nimport { DEFAULT_OPTIONS } from '@lumx/react/hooks/useSlideshowControls';\nimport { FULL_WIDTH_PERCENT } from '@lumx/react/components/slideshow/constants';\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/react/utils';\nimport { mergeRefs } from '@lumx/react/utils/mergeRefs';\n\n/**\n * Defines the props of the component.\n */\nexport interface SlideshowProps extends GenericProps {\n /** Index of the current slide. */\n activeIndex?: number;\n /** Whether the automatic rotation of the slideshow is enabled or not. */\n autoPlay?: boolean;\n /** Whether the image has to fill its container height or not. */\n fillHeight?: boolean;\n /** Number of slides to group together. */\n groupBy?: number;\n /** Interval between each slide when automatic rotation is enabled. */\n interval?: number;\n /** Props to pass to the slideshow controls (minus those already set by the Slideshow props). */\n slideshowControlsProps?: Pick<SlideshowControlsProps, 'nextButtonProps' | 'previousButtonProps'> &\n Omit<\n SlideshowControlsProps,\n | 'activeIndex'\n | 'onPaginationClick'\n | 'onNextClick'\n | 'onPreviousClick'\n | 'slidesCount'\n | 'parentRef'\n | 'theme'\n >;\n /** Theme adapting the component to light or dark background. */\n theme?: Theme;\n /** Callback when slide changes */\n onChange?(index: number): void;\n /** slideshow HTML id attribute */\n id?: string;\n /** slides wrapper HTML id attribute */\n slidesId?: string;\n}\n\n/**\n * Component display name.\n */\nconst COMPONENT_NAME = 'Slideshow';\n\n/**\n * Component default class name and class prefix.\n */\nconst CLASSNAME = getRootClassName(COMPONENT_NAME);\n\n/**\n * Component default props.\n */\nconst DEFAULT_PROPS: Partial<SlideshowProps> = {\n ...DEFAULT_OPTIONS,\n theme: Theme.light,\n};\n\n/**\n * Slideshow component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nexport const Slideshow: Comp<SlideshowProps, HTMLDivElement> = forwardRef((props, ref) => {\n const {\n activeIndex,\n autoPlay,\n children,\n className,\n fillHeight,\n groupBy,\n interval,\n onChange,\n slideshowControlsProps,\n theme,\n id,\n slidesId,\n ...forwardedProps\n } = props;\n // Number of slideshow items.\n const itemsCount = React.Children.count(children);\n\n const {\n activeIndex: currentIndex,\n slideshowId,\n setSlideshow,\n isAutoPlaying,\n slideshowSlidesId,\n setIsAutoPlaying,\n startIndexVisible,\n endIndexVisible,\n slidesCount,\n onNextClick,\n onPaginationClick,\n onPreviousClick,\n slideshow,\n } = SlideshowControls.useSlideshowControls({\n activeIndex,\n defaultActiveIndex: DEFAULT_PROPS.activeIndex as number,\n autoPlay: Boolean(autoPlay),\n itemsCount,\n groupBy,\n id,\n interval,\n onChange,\n slidesId,\n });\n\n // Inline style of wrapper element.\n const wrapperStyle: CSSProperties = { transform: `translateX(-${FULL_WIDTH_PERCENT * currentIndex}%)` };\n\n /* eslint-disable jsx-a11y/no-noninteractive-tabindex */\n return (\n <section\n id={slideshowId}\n ref={mergeRefs(ref, setSlideshow)}\n {...forwardedProps}\n className={classNames(className, handleBasicClasses({ prefix: CLASSNAME, theme }), {\n [`${CLASSNAME}--fill-height`]: fillHeight,\n [`${CLASSNAME}--group-by-${groupBy}`]: Boolean(groupBy),\n })}\n aria-roledescription=\"carousel\"\n aria-live={isAutoPlaying ? 'off' : 'polite'}\n >\n <div\n id={slideshowSlidesId}\n className={`${CLASSNAME}__slides`}\n onMouseEnter={() => setIsAutoPlaying(false)}\n onMouseLeave={() => setIsAutoPlaying(Boolean(autoPlay))}\n >\n <div className={`${CLASSNAME}__wrapper`} style={wrapperStyle}>\n {React.Children.map(children, (child: React.ReactNode, index: number) => {\n if (React.isValidElement(child)) {\n const isCurrentlyVisible = index >= startIndexVisible && index <= endIndexVisible;\n\n return React.cloneElement(child, {\n style: !isCurrentlyVisible\n ? { visibility: 'hidden', ...(child.props.style || {}) }\n : child.props.style || {},\n 'aria-hidden': !isCurrentlyVisible,\n });\n }\n\n return null;\n })}\n </div>\n </div>\n\n {slideshowControlsProps && slidesCount > 1 && (\n <div className={`${CLASSNAME}__controls`}>\n <SlideshowControls\n {...slideshowControlsProps}\n activeIndex={currentIndex}\n onPaginationClick={onPaginationClick}\n onNextClick={onNextClick}\n onPreviousClick={onPreviousClick}\n slidesCount={slidesCount}\n parentRef={slideshow}\n theme={theme}\n nextButtonProps={{\n 'aria-controls': slideshowSlidesId,\n ...slideshowControlsProps.nextButtonProps,\n }}\n previousButtonProps={{\n 'aria-controls': slideshowSlidesId,\n ...slideshowControlsProps.previousButtonProps,\n }}\n />\n </div>\n )}\n </section>\n );\n});\n\nSlideshow.displayName = COMPONENT_NAME;\nSlideshow.className = CLASSNAME;\nSlideshow.defaultProps = DEFAULT_PROPS;\n","import React, { forwardRef } from 'react';\n\nimport classNames from 'classnames';\n\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/react/utils';\n\n/**\n * Defines the props of the component.\n */\nexport type SlideshowItemProps = GenericProps;\n\n/**\n * Component display name.\n */\nconst COMPONENT_NAME = 'SlideshowItem';\n\n/**\n * Component default class name and class prefix.\n */\nconst CLASSNAME = getRootClassName(COMPONENT_NAME);\n\n/**\n * SlideshowItem component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nexport const SlideshowItem: Comp<SlideshowItemProps, HTMLDivElement> = forwardRef((props, ref) => {\n const { className, children, ...forwardedProps } = props;\n\n return (\n <div\n ref={ref}\n className={classNames(\n className,\n handleBasicClasses({\n prefix: CLASSNAME,\n }),\n )}\n aria-roledescription=\"slide\"\n role=\"group\"\n {...forwardedProps}\n >\n {children}\n </div>\n );\n});\n\nSlideshowItem.displayName = COMPONENT_NAME;\nSlideshowItem.className = CLASSNAME;\n","import { useEffect } from 'react';\nimport { detectHorizontalSwipe } from '@lumx/core/js/utils';\n\nconst isTouchDevice = () => 'ontouchstart' in window;\n\n/**\n * Listen swipe to navigate left and right.\n */\nexport function useSwipeNavigate(element?: HTMLElement | null, onNext?: () => void, onPrevious?: () => void): void {\n useEffect(() => {\n if (!element || !isTouchDevice()) return undefined;\n\n return detectHorizontalSwipe(element, (swipe) => {\n const callback = swipe === 'right' ? onPrevious : onNext;\n callback?.();\n });\n }, [onPrevious, onNext, element]);\n}\n","import { useEffect } from 'react';\n\n/**\n * Listen keyboard to navigate left and right.\n */\nexport function useKeyNavigate(element?: HTMLElement | null, onNext?: () => void, onPrevious?: () => void): void {\n useEffect(() => {\n if (!element) return undefined;\n const onKeyNavigate = (evt: KeyboardEvent) => {\n let callback;\n if (evt?.key === 'ArrowRight') {\n callback = onNext;\n } else if (evt?.key === 'ArrowLeft') {\n callback = onPrevious;\n }\n if (!callback) return;\n\n callback();\n evt.preventDefault();\n evt.stopPropagation();\n };\n\n element.addEventListener('keydown', onKeyNavigate);\n return () => {\n element.removeEventListener('keydown', onKeyNavigate);\n };\n }, [onPrevious, onNext, element]);\n}\n","import { useMemo, useRef } from 'react';\nimport { EDGE_FROM_ACTIVE_INDEX, PAGINATION_ITEMS_MAX } from '@lumx/react/components/slideshow/constants';\n\ntype Range = { min: number; max: number };\n\n/**\n * Calculate the currently visible pagination \"bullet\" range.\n */\nexport function usePaginationVisibleRange(activeIndex: number, slideCount: number): Range {\n const previousVisibleRangeRef = useRef<Range>();\n return useMemo(() => {\n const lastSlide = slideCount - 1;\n const { current: previousVisibleRange } = previousVisibleRangeRef;\n let newVisibleRange: Range;\n if (activeIndex === previousVisibleRange?.max && activeIndex < lastSlide) {\n newVisibleRange = { min: previousVisibleRange.min + 1, max: previousVisibleRange.max + 1 };\n } else if (activeIndex === previousVisibleRange?.min && activeIndex > 0) {\n newVisibleRange = { min: previousVisibleRange.min - 1, max: previousVisibleRange.max - 1 };\n } else {\n const deltaItems = PAGINATION_ITEMS_MAX - 1;\n let min = activeIndex - EDGE_FROM_ACTIVE_INDEX;\n let max = activeIndex + EDGE_FROM_ACTIVE_INDEX;\n\n if (activeIndex > lastSlide - EDGE_FROM_ACTIVE_INDEX) {\n min = lastSlide - deltaItems;\n max = lastSlide;\n } else if (activeIndex < deltaItems) {\n min = 0;\n max = deltaItems;\n }\n\n newVisibleRange = { min, max };\n }\n previousVisibleRangeRef.current = newVisibleRange;\n return newVisibleRange;\n }, [activeIndex, slideCount]);\n}\n","import React, { forwardRef, RefObject, useCallback, useMemo } from 'react';\n\nimport classNames from 'classnames';\nimport range from 'lodash/range';\n\nimport { mdiChevronLeft, mdiChevronRight } from '@lumx/icons';\nimport { Emphasis, IconButton, IconButtonProps, Theme } from '@lumx/react';\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/react/utils';\nimport { WINDOW } from '@lumx/react/constants';\nimport { useSlideshowControls, DEFAULT_OPTIONS } from '@lumx/react/hooks/useSlideshowControls';\n\nimport { useSwipeNavigate } from './useSwipeNavigate';\nimport { useKeyNavigate } from './useKeyNavigate';\nimport { PAGINATION_ITEM_SIZE, PAGINATION_ITEMS_MAX } from './constants';\nimport { usePaginationVisibleRange } from './usePaginationVisibleRange';\n\n/**\n * Defines the props of the component.\n */\nexport interface SlideshowControlsProps extends GenericProps {\n /** Index of the current slide. */\n activeIndex?: number;\n /** Props to pass to the next button (minus those already set by the SlideshowControls props). */\n nextButtonProps: Pick<IconButtonProps, 'label'> &\n Omit<IconButtonProps, 'label' | 'onClick' | 'icon' | 'emphasis' | 'color'>;\n /** Reference to the parent element on which we want to listen touch swipe. */\n parentRef?: RefObject<HTMLDivElement> | HTMLDivElement;\n /** Props to pass to the previous button (minus those already set by the SlideshowControls props). */\n previousButtonProps: Pick<IconButtonProps, 'label'> &\n Omit<IconButtonProps, 'label' | 'onClick' | 'icon' | 'emphasis' | 'color'>;\n /** Number of slides. */\n slidesCount: number;\n /** Theme adapting the component to light or dark background. */\n theme?: Theme;\n /** On next button click callback. */\n onNextClick?(loopback?: boolean): void;\n /** On pagination change callback. */\n onPaginationClick?(index: number): void;\n /** On previous button click callback. */\n onPreviousClick?(loopback?: boolean): void;\n}\n\n/**\n * Component display name.\n */\nconst COMPONENT_NAME = 'SlideshowControls';\n\n/**\n * Component default class name and class prefix.\n */\nconst CLASSNAME = getRootClassName(COMPONENT_NAME);\n\n/**\n * Component default props.\n */\nconst DEFAULT_PROPS: Partial<SlideshowControlsProps> = {\n activeIndex: 0,\n theme: Theme.light,\n};\n\n/**\n * SlideshowControls component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nconst InternalSlideshowControls: Comp<SlideshowControlsProps, HTMLDivElement> = forwardRef((props, ref) => {\n const {\n activeIndex,\n className,\n nextButtonProps,\n onNextClick,\n onPaginationClick,\n onPreviousClick,\n parentRef,\n previousButtonProps,\n slidesCount,\n theme,\n ...forwardedProps\n } = props;\n\n let parent;\n if (WINDOW) {\n // Checking window object to avoid errors in SSR.\n parent = parentRef instanceof HTMLElement ? parentRef : parentRef?.current;\n }\n // Listen to keyboard navigate left & right.\n useKeyNavigate(parent, onNextClick, onPreviousClick);\n // Listen to touch swipe navigate left & right.\n useSwipeNavigate(\n parent,\n // Go next without loopback.\n useCallback(() => onNextClick?.(false), [onNextClick]),\n // Go previous without loopback.\n useCallback(() => onPreviousClick?.(false), [onPreviousClick]),\n );\n\n // Pagination \"bullet\" range.\n const visibleRange = usePaginationVisibleRange(activeIndex as number, slidesCount);\n\n // Inline style of wrapper element.\n const wrapperStyle = { transform: `translateX(-${PAGINATION_ITEM_SIZE * visibleRange.min}px)` };\n\n return (\n <div\n ref={ref}\n {...forwardedProps}\n className={classNames(className, handleBasicClasses({ prefix: CLASSNAME, theme }), {\n [`${CLASSNAME}--has-infinite-pagination`]: slidesCount > PAGINATION_ITEMS_MAX,\n })}\n >\n <IconButton\n {...previousButtonProps}\n icon={mdiChevronLeft}\n className={`${CLASSNAME}__navigation`}\n color={theme === Theme.dark ? 'light' : 'dark'}\n emphasis={Emphasis.low}\n onClick={onPreviousClick}\n />\n <div className={`${CLASSNAME}__pagination`}>\n <div className={`${CLASSNAME}__pagination-items`} style={wrapperStyle}>\n {useMemo(\n () =>\n range(slidesCount).map((index) => {\n const isOnEdge =\n index !== 0 &&\n index !== slidesCount - 1 &&\n (index === visibleRange.min || index === visibleRange.max);\n const isActive = activeIndex === index;\n const isOutRange = index < visibleRange.min || index > visibleRange.max;\n return (\n // eslint-disable-next-line jsx-a11y/control-has-associated-label\n <button\n className={classNames(\n handleBasicClasses({\n prefix: `${CLASSNAME}__pagination-item`,\n isActive,\n isOnEdge,\n isOutRange,\n }),\n )}\n key={index}\n type=\"button\"\n onClick={() => onPaginationClick?.(index)}\n />\n );\n }),\n [slidesCount, visibleRange.min, visibleRange.max, activeIndex, onPaginationClick],\n )}\n </div>\n </div>\n <IconButton\n {...nextButtonProps}\n icon={mdiChevronRight}\n className={`${CLASSNAME}__navigation`}\n color={theme === Theme.dark ? 'light' : 'dark'}\n emphasis={Emphasis.low}\n onClick={onNextClick}\n />\n </div>\n );\n});\n\nInternalSlideshowControls.displayName = COMPONENT_NAME;\nInternalSlideshowControls.className = CLASSNAME;\nInternalSlideshowControls.defaultProps = DEFAULT_PROPS;\n\nexport const SlideshowControls = Object.assign(InternalSlideshowControls, {\n useSlideshowControls,\n useSlideshowControlsDefaultOptions: DEFAULT_OPTIONS,\n});\n"],"names":["useInterval","callback","delay","savedCallback","useRef","useEffect","current","undefined","tick","isFunction","id","setInterval","clearInterval","AUTOPLAY_DEFAULT_INTERVAL","FULL_WIDTH_PERCENT","EDGE_FROM_ACTIVE_INDEX","PAGINATION_ITEMS_MAX","PAGINATION_ITEM_SIZE","useFocusWithin","element","onFocusIn","onFocusOut","addEventListener","removeEventListener","DEFAULT_OPTIONS","activeIndex","groupBy","interval","useSlideshowControls","autoPlay","defaultActiveIndex","onChange","itemsCount","slidesId","useState","currentIndex","setCurrentIndex","setElement","slidesCount","Math","ceil","min","goToNextSlide","useCallback","loopback","index","goToPreviousSlide","Boolean","isAutoPlaying","setIsAutoPlaying","onPaginationClick","onNextClick","onPreviousClick","slideshowId","useMemo","uniqueId","slideshowSlidesId","startAutoPlay","stopAutoPlay","startIndexVisible","endIndexVisible","setSlideshow","slideshow","setActiveIndex","COMPONENT_NAME","CLASSNAME","getRootClassName","DEFAULT_PROPS","theme","Theme","light","Slideshow","forwardRef","props","ref","children","className","fillHeight","slideshowControlsProps","forwardedProps","React","Children","count","SlideshowControls","wrapperStyle","transform","mergeRefs","classNames","handleBasicClasses","prefix","map","child","isValidElement","isCurrentlyVisible","cloneElement","style","visibility","nextButtonProps","previousButtonProps","displayName","defaultProps","SlideshowItem","isTouchDevice","window","useSwipeNavigate","onNext","onPrevious","detectHorizontalSwipe","swipe","useKeyNavigate","onKeyNavigate","evt","key","preventDefault","stopPropagation","usePaginationVisibleRange","slideCount","previousVisibleRangeRef","lastSlide","previousVisibleRange","newVisibleRange","max","deltaItems","InternalSlideshowControls","parentRef","parent","WINDOW","HTMLElement","visibleRange","mdiChevronLeft","dark","Emphasis","low","range","isOnEdge","isActive","isOutRange","mdiChevronRight","Object","assign","useSlideshowControlsDefaultOptions"],"mappings":"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"}
|