@lumx/react 2.2.26-alpha-a11y-slideshow.3 → 2.2.26-alpha-a11y-slideshow.4
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/Slides.js +111 -69
- package/esm/_internal/Slides.js.map +1 -1
- package/package.json +4 -4
- package/src/components/slideshow/Slides.tsx +3 -2
- package/src/components/slideshow/Slideshow.stories.tsx +30 -18
- package/src/components/slideshow/SlideshowItemGroup.tsx +86 -3
- package/src/components/slideshow/useSlideFocusManagement.tsx +34 -10
package/esm/_internal/Slides.js
CHANGED
|
@@ -275,10 +275,115 @@ var SlideshowItemGroup = forwardRef(function (props, ref) {
|
|
|
275
275
|
_props$role = props.role,
|
|
276
276
|
role = _props$role === void 0 ? 'group' : _props$role,
|
|
277
277
|
label = props.label,
|
|
278
|
-
|
|
278
|
+
isDisplayed = props.isDisplayed,
|
|
279
|
+
forwardedProps = _objectWithoutProperties(props, ["className", "children", "role", "label", "isDisplayed"]);
|
|
279
280
|
|
|
281
|
+
var groupRef = React.useRef(null);
|
|
282
|
+
useEffect(function () {
|
|
283
|
+
var element = groupRef === null || groupRef === void 0 ? void 0 : groupRef.current;
|
|
284
|
+
/**
|
|
285
|
+
* Classname set on elements whose focus was blocked.
|
|
286
|
+
* This is to easily find elements that have been tempered with,
|
|
287
|
+
* and not elements whose focus was already initially blocked.
|
|
288
|
+
* */
|
|
289
|
+
|
|
290
|
+
var elementWithBlockedFocusClass = "".concat(CLASSNAME, "__no-focus");
|
|
291
|
+
/**
|
|
292
|
+
* Display given slide to screen readers and, if focus was blocked, restore focus on elements..
|
|
293
|
+
*/
|
|
294
|
+
|
|
295
|
+
var enableSlide = function enableSlide(slide) {
|
|
296
|
+
// Hide from screen readers
|
|
297
|
+
slide.setAttribute('aria-hidden', 'false'); // Find elements we have blocked focus on
|
|
298
|
+
|
|
299
|
+
slide.querySelectorAll(".".concat(elementWithBlockedFocusClass)).forEach(function (focusableElement) {
|
|
300
|
+
focusableElement.removeAttribute('tabindex');
|
|
301
|
+
focusableElement.classList.remove(elementWithBlockedFocusClass);
|
|
302
|
+
});
|
|
303
|
+
};
|
|
304
|
+
/**
|
|
305
|
+
* Hide given slide from screen readers and block focus on all focusable elements within.
|
|
306
|
+
*/
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
var blockSlide = function blockSlide(slide) {
|
|
310
|
+
slide.setAttribute('aria-hidden', 'true');
|
|
311
|
+
getFocusableElements(slide).forEach(function (focusableElement) {
|
|
312
|
+
focusableElement.setAttribute('tabindex', '-1');
|
|
313
|
+
focusableElement.classList.add(elementWithBlockedFocusClass);
|
|
314
|
+
});
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
var handleDisplay = function handleDisplay() {
|
|
318
|
+
if (!element) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (isDisplayed) {
|
|
323
|
+
enableSlide(element);
|
|
324
|
+
} else {
|
|
325
|
+
blockSlide(element);
|
|
326
|
+
}
|
|
327
|
+
}; // Options for the observer (which mutations to observe)
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
var config = {
|
|
331
|
+
attributes: true,
|
|
332
|
+
childList: true,
|
|
333
|
+
subtree: true
|
|
334
|
+
}; // Callback function to execute when mutations are observed
|
|
335
|
+
|
|
336
|
+
var callback = function callback(mutationsList) {
|
|
337
|
+
if (element) {
|
|
338
|
+
var _iteratorNormalCompletion = true;
|
|
339
|
+
var _didIteratorError = false;
|
|
340
|
+
var _iteratorError = undefined;
|
|
341
|
+
|
|
342
|
+
try {
|
|
343
|
+
for (var _iterator = mutationsList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
344
|
+
var mutation = _step.value;
|
|
345
|
+
|
|
346
|
+
if (mutation.type === 'childList') {
|
|
347
|
+
handleDisplay();
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
} catch (err) {
|
|
351
|
+
_didIteratorError = true;
|
|
352
|
+
_iteratorError = err;
|
|
353
|
+
} finally {
|
|
354
|
+
try {
|
|
355
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
356
|
+
_iterator.return();
|
|
357
|
+
}
|
|
358
|
+
} finally {
|
|
359
|
+
if (_didIteratorError) {
|
|
360
|
+
throw _iteratorError;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}; // Create an observer instance linked to the callback function
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
var observer = new MutationObserver(callback); // Start observing the target node for configured mutations
|
|
369
|
+
|
|
370
|
+
if (element) {
|
|
371
|
+
handleDisplay();
|
|
372
|
+
|
|
373
|
+
if (!isDisplayed) {
|
|
374
|
+
observer.observe(element, config);
|
|
375
|
+
}
|
|
376
|
+
} // Later, you can stop observing
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
return function () {
|
|
380
|
+
if (!isDisplayed) {
|
|
381
|
+
observer.disconnect();
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
}, [isDisplayed]);
|
|
280
385
|
return React.createElement("div", _extends({
|
|
281
|
-
ref:
|
|
386
|
+
ref: groupRef,
|
|
282
387
|
role: role,
|
|
283
388
|
className: classnames(className, handleBasicClasses({
|
|
284
389
|
prefix: CLASSNAME
|
|
@@ -659,67 +764,6 @@ var SlideshowControls = Object.assign(InternalSlideshowControls, {
|
|
|
659
764
|
useSlideshowControlsDefaultOptions: DEFAULT_OPTIONS
|
|
660
765
|
});
|
|
661
766
|
|
|
662
|
-
/**
|
|
663
|
-
* Manage how slides must behave when visible or not.
|
|
664
|
-
* When not visible, they should be hidden from screen readers and not focusable.
|
|
665
|
-
*/
|
|
666
|
-
var useSlideFocusManagement = function useSlideFocusManagement(_ref) {
|
|
667
|
-
var activeIndex = _ref.activeIndex,
|
|
668
|
-
_ref$groupBy = _ref.groupBy,
|
|
669
|
-
groupBy = _ref$groupBy === void 0 ? 1 : _ref$groupBy,
|
|
670
|
-
wrapperRef = _ref.wrapperRef;
|
|
671
|
-
useEffect(function () {
|
|
672
|
-
var element = wrapperRef === null || wrapperRef === void 0 ? void 0 : wrapperRef.current;
|
|
673
|
-
var startIndexVisible = activeIndex;
|
|
674
|
-
var endIndexVisible = startIndexVisible + 1;
|
|
675
|
-
var slideshowChildren = element === null || element === void 0 ? void 0 : element.querySelectorAll(".".concat(CLASSNAME));
|
|
676
|
-
/**
|
|
677
|
-
* Classname set on elements whose focus was blocked.
|
|
678
|
-
* This is to easily find elements that have been tempered with,
|
|
679
|
-
* and not elements whose focus was already initially blocked.
|
|
680
|
-
* */
|
|
681
|
-
|
|
682
|
-
var elementWithBlockedFocusClass = "".concat(CLASSNAME, "__no-focus");
|
|
683
|
-
/**
|
|
684
|
-
* Display given slide to screen readers and, if focus was blocked, restore focus on elements..
|
|
685
|
-
*/
|
|
686
|
-
|
|
687
|
-
var enableSlide = function enableSlide(slide) {
|
|
688
|
-
// Hide from screen readers
|
|
689
|
-
slide.setAttribute('aria-hidden', 'false'); // Find elements we have blocked focus on
|
|
690
|
-
|
|
691
|
-
slide.querySelectorAll(".".concat(elementWithBlockedFocusClass)).forEach(function (focusableElement) {
|
|
692
|
-
focusableElement.removeAttribute('tabindex');
|
|
693
|
-
focusableElement.classList.remove(elementWithBlockedFocusClass);
|
|
694
|
-
});
|
|
695
|
-
};
|
|
696
|
-
/**
|
|
697
|
-
* Hide given slide from screen readers and block focus on all focusable elements within.
|
|
698
|
-
*/
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
var blockSlide = function blockSlide(slide) {
|
|
702
|
-
slide.setAttribute('aria-hidden', 'true');
|
|
703
|
-
getFocusableElements(slide).forEach(function (focusableElement) {
|
|
704
|
-
focusableElement.setAttribute('tabindex', '-1');
|
|
705
|
-
focusableElement.classList.add(elementWithBlockedFocusClass);
|
|
706
|
-
});
|
|
707
|
-
};
|
|
708
|
-
|
|
709
|
-
if (slideshowChildren && (slideshowChildren === null || slideshowChildren === void 0 ? void 0 : slideshowChildren.length) > 0) {
|
|
710
|
-
Array.from(slideshowChildren).forEach(function (slide, slideIndex) {
|
|
711
|
-
var slideIsVisible = slideIndex >= startIndexVisible && slideIndex < endIndexVisible;
|
|
712
|
-
|
|
713
|
-
if (slideIsVisible) {
|
|
714
|
-
enableSlide(slide);
|
|
715
|
-
} else {
|
|
716
|
-
blockSlide(slide);
|
|
717
|
-
}
|
|
718
|
-
});
|
|
719
|
-
}
|
|
720
|
-
}, [activeIndex, groupBy, wrapperRef]);
|
|
721
|
-
};
|
|
722
|
-
|
|
723
767
|
/**
|
|
724
768
|
* Component display name.
|
|
725
769
|
*/
|
|
@@ -756,11 +800,8 @@ var Slides = forwardRef(function (props, ref) {
|
|
|
756
800
|
forwardedProps = _objectWithoutProperties(props, ["activeIndex", "id", "className", "theme", "fillHeight", "groupBy", "isAutoPlaying", "toggleAutoPlay", "slidesId", "children", "afterSlides", "hasControls", "slideGroupLabel"]);
|
|
757
801
|
|
|
758
802
|
var wrapperRef = React.useRef(null);
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
activeIndex: activeIndex,
|
|
762
|
-
groupBy: groupBy
|
|
763
|
-
}); // Inline style of wrapper element.
|
|
803
|
+
var startIndexVisible = activeIndex;
|
|
804
|
+
var endIndexVisible = startIndexVisible + 1; // Inline style of wrapper element.
|
|
764
805
|
|
|
765
806
|
var wrapperStyle = {
|
|
766
807
|
transform: "translateX(-".concat(FULL_WIDTH_PERCENT * activeIndex, "%)")
|
|
@@ -793,7 +834,8 @@ var Slides = forwardRef(function (props, ref) {
|
|
|
793
834
|
key: index,
|
|
794
835
|
id: slidesId && buildSlideShowGroupId(slidesId, index),
|
|
795
836
|
role: hasControls ? 'tabpanel' : 'group',
|
|
796
|
-
label: slideGroupLabel ? slideGroupLabel(index + 1, groups.length) : undefined
|
|
837
|
+
label: slideGroupLabel ? slideGroupLabel(index + 1, groups.length) : undefined,
|
|
838
|
+
isDisplayed: index >= startIndexVisible && index < endIndexVisible
|
|
797
839
|
}, group);
|
|
798
840
|
}))), afterSlides);
|
|
799
841
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Slides.js","sources":["../../../src/hooks/useInterval.tsx","../../../src/components/slideshow/constants.ts","../../../src/hooks/useSlideshowControls.ts","../../../src/components/slideshow/SlideshowItemGroup.tsx","../../../src/components/slideshow/Slideshow.tsx","../../../src/components/slideshow/SlideshowItem.tsx","../../../src/components/slideshow/useSwipeNavigate.ts","../../../src/components/slideshow/usePaginationVisibleRange.ts","../../../src/components/slideshow/SlideshowControls.tsx","../../../src/components/slideshow/useSlideFocusManagement.tsx","../../../src/components/slideshow/Slides.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 { 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\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 | null) => void;\n /** reference to the slideshow element */\n slideshow: HTMLDivElement | null;\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 /** whether the slideshow was force paused or not */\n isForcePaused: boolean;\n /** callback to change whether the slideshow is autoplaying or not */\n toggleAutoPlay: () => void;\n /** calback to change whether the slideshow should be force paused or not */\n toggleForcePause: () => void;\n /** current active slide index */\n activeIndex: number;\n /** set the current index as the active one */\n setActiveIndex: (index: number) => void;\n /** callback that stops the auto play */\n stopAutoPlay: () => void;\n /** callback that starts the auto play */\n startAutoPlay: () => 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 | null>(null);\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 const [isForcePaused, setIsForcePaused] = useState(false);\n\n const isSlideshowAutoPlaying = isForcePaused ? false : isAutoPlaying;\n // Start\n useInterval(goToNextSlide, isSlideshowAutoPlaying && 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 const startAutoPlay = () => {\n setIsAutoPlaying(Boolean(autoPlay));\n };\n\n const stopAutoPlay = () => {\n setIsAutoPlaying(false);\n };\n\n // Handle click on a bullet to go to a specific slide.\n const onPaginationClick = useCallback(\n (index: number) => {\n stopAutoPlay();\n setIsForcePaused(true);\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 stopAutoPlay();\n setIsForcePaused(true);\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 stopAutoPlay();\n setIsForcePaused(true);\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 toggleAutoPlay = () => {\n if (isSlideshowAutoPlaying) {\n stopAutoPlay();\n } else {\n startAutoPlay();\n }\n };\n\n const toggleForcePause = () => {\n const shouldBePaused = !isForcePaused;\n\n setIsForcePaused(shouldBePaused);\n\n if (!shouldBePaused) {\n startAutoPlay();\n } else {\n stopAutoPlay();\n }\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: isSlideshowAutoPlaying,\n toggleAutoPlay,\n activeIndex: currentIndex,\n slidesCount,\n setActiveIndex: setCurrentIndex,\n startAutoPlay,\n stopAutoPlay,\n isForcePaused,\n toggleForcePause,\n };\n};\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 interface SlideshowItemGroupProps extends GenericProps {\n role?: 'tabpanel' | 'group';\n label?: string;\n}\n\n/**\n * Component display name.\n */\nconst COMPONENT_NAME = 'SlideshowItemGroup';\n\n/**\n * Component default class name and class prefix.\n */\nexport const CLASSNAME = getRootClassName(COMPONENT_NAME);\n\nexport const buildSlideShowGroupId = (slidesId: string, index: number) => `${slidesId}-slide-${index}`;\n\n/**\n * SlideshowItemGroup component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nexport const SlideshowItemGroup: Comp<SlideshowItemGroupProps, HTMLDivElement> = forwardRef((props, ref) => {\n const { className, children, role = 'group', label, ...forwardedProps } = props;\n return (\n <div\n ref={ref}\n role={role}\n className={classNames(\n className,\n handleBasicClasses({\n prefix: CLASSNAME,\n }),\n )}\n aria-roledescription=\"slide\"\n aria-label={label}\n {...forwardedProps}\n >\n {children}\n </div>\n );\n});\n\nSlideshowItemGroup.displayName = COMPONENT_NAME;\nSlideshowItemGroup.className = CLASSNAME;\n","import React, { forwardRef } from 'react';\n\nimport { SlideshowControls, SlideshowControlsProps, Theme, Slides, SlidesProps } from '@lumx/react';\nimport { DEFAULT_OPTIONS } from '@lumx/react/hooks/useSlideshowControls';\nimport { Comp, GenericProps } from '@lumx/react/utils';\nimport { useFocusWithin } from '@lumx/react/hooks/useFocusWithin';\nimport { mergeRefs } from '@lumx/react/utils/mergeRefs';\nimport { buildSlideShowGroupId } from './SlideshowItemGroup';\n\n/**\n * Defines the props of the component.\n */\nexport interface SlideshowProps\n extends GenericProps,\n Pick<SlidesProps, 'autoPlay' | 'slidesId' | 'id' | 'theme' | 'fillHeight' | 'groupBy' | 'slideGroupLabel'> {\n /** current slide active */\n activeIndex?: SlidesProps['activeIndex'];\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<\n SlideshowControlsProps,\n 'nextButtonProps' | 'previousButtonProps' | 'paginationItemProps'\n > &\n Omit<\n SlideshowControlsProps,\n | 'activeIndex'\n | 'onPaginationClick'\n | 'onNextClick'\n | 'onPreviousClick'\n | 'slidesCount'\n | 'parentRef'\n | 'theme'\n >;\n /** Callback when slide changes */\n onChange?(index: number): void;\n}\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 slideGroupLabel,\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 slidesCount,\n onNextClick,\n onPaginationClick,\n onPreviousClick,\n slideshow,\n stopAutoPlay,\n startAutoPlay,\n toggleAutoPlay,\n toggleForcePause,\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 useFocusWithin({\n element: slideshow,\n onFocusIn: stopAutoPlay,\n onFocusOut: startAutoPlay,\n });\n\n const showControls = slideshowControlsProps && slidesCount > 1;\n\n return (\n <Slides\n activeIndex={currentIndex}\n id={slideshowId}\n className={className}\n theme={theme}\n fillHeight={fillHeight}\n groupBy={groupBy}\n isAutoPlaying={isAutoPlaying}\n autoPlay={autoPlay}\n slidesId={slideshowSlidesId}\n toggleAutoPlay={toggleAutoPlay}\n ref={mergeRefs(ref, setSlideshow)}\n hasControls={showControls}\n slideGroupLabel={slideGroupLabel}\n afterSlides={\n slideshowControlsProps && slidesCount > 1 ? (\n <div className={`${Slides.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 isAutoPlaying={isAutoPlaying}\n nextButtonProps={{\n 'aria-controls': slideshowSlidesId,\n ...slideshowControlsProps.nextButtonProps,\n }}\n previousButtonProps={{\n 'aria-controls': slideshowSlidesId,\n ...slideshowControlsProps.previousButtonProps,\n }}\n playButtonProps={\n autoPlay\n ? {\n 'aria-controls': slideshowSlidesId,\n onClick: toggleForcePause,\n ...slideshowControlsProps.playButtonProps,\n }\n : undefined\n }\n paginationItemProps={(index) => ({\n 'aria-controls': buildSlideShowGroupId(slideshowSlidesId, index),\n ...slideshowControlsProps.paginationItemProps?.(index),\n })}\n />\n </div>\n ) : undefined\n }\n {...forwardedProps}\n >\n {children}\n </Slides>\n );\n});\n\nSlideshow.displayName = 'Slideshow';\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 interface SlideshowItemProps extends GenericProps {\n /** interval in which slides are automatically shown */\n interval?: number;\n}\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 return (\n <div\n ref={ref}\n className={classNames(\n className,\n handleBasicClasses({\n prefix: CLASSNAME,\n }),\n )}\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 { 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, mdiPlayCircleOutline, mdiPauseCircleOutline } from '@lumx/icons';\nimport { Emphasis, IconButton, IconButtonProps, Theme } from '@lumx/react';\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses, HasTheme } from '@lumx/react/utils';\nimport { WINDOW } from '@lumx/react/constants';\nimport { useSlideshowControls, DEFAULT_OPTIONS } from '@lumx/react/hooks/useSlideshowControls';\nimport { useRovingTabIndex } from '@lumx/react/hooks/useRovingTabIndex';\n\nimport { useSwipeNavigate } from './useSwipeNavigate';\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, HasTheme {\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 | null;\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 /** Props to pass to the pagination wrapper */\n paginationProps?: Omit<React.HTMLAttributes<HTMLDivElement>, 'className' | 'style' | 'role'>;\n /** Number of slides. */\n slidesCount: number;\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 /** whether the slideshow is currently playing */\n isAutoPlaying?: boolean;\n /**\n * function to be executed in order to retrieve the label for the pagination item\n * @deprecated Use paginationItemProps instead.\n * */\n paginationItemLabel?: (index: number) => string;\n /**\n * function to be executed in order to retrieve the props for a pagination item.\n */\n paginationItemProps?: (itemIndex: number) => React.HTMLAttributes<HTMLButtonElement>;\n /** Props to pass to the lay button (minus those already set by the SlideshowControls props). */\n playButtonProps?: Pick<IconButtonProps, 'label'> &\n Omit<IconButtonProps, 'label' | 'onClick' | 'icon' | 'emphasis' | 'color'>;\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 paginationProps,\n slidesCount,\n theme,\n isAutoPlaying = false,\n playButtonProps,\n paginationItemLabel,\n paginationItemProps,\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 const paginationRef = React.useRef(null);\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 /**\n * Add roving tab index pattern to pagination items and activate slide on focus.\n */\n useRovingTabIndex({\n parentRef: paginationRef,\n elementSelector: 'button',\n keepTabIndex: true,\n onElementFocus: (element) => {\n element.click();\n },\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 ref={paginationRef} className={`${CLASSNAME}__pagination`}>\n <div\n className={`${CLASSNAME}__pagination-items`}\n style={wrapperStyle}\n role=\"tablist\"\n {...paginationProps}\n >\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 const { className: itemClassName = undefined, ...itemProps } = paginationItemProps\n ? paginationItemProps(index)\n : {};\n\n return (\n <button\n className={classNames(\n handleBasicClasses({\n prefix: `${CLASSNAME}__pagination-item`,\n isActive,\n isOnEdge,\n isOutRange,\n }),\n itemClassName,\n )}\n key={index}\n type=\"button\"\n tabIndex={isActive ? undefined : -1}\n role=\"tab\"\n aria-selected={isActive}\n onClick={() => onPaginationClick?.(index)}\n {...{\n 'aria-label': paginationItemLabel\n ? paginationItemLabel(index)\n : `${index + 1} / ${slidesCount}`,\n }}\n {...itemProps}\n />\n );\n }),\n [\n slidesCount,\n visibleRange.min,\n visibleRange.max,\n activeIndex,\n paginationItemProps,\n paginationItemLabel,\n onPaginationClick,\n ],\n )}\n </div>\n </div>\n\n {playButtonProps ? (\n <IconButton\n {...playButtonProps}\n icon={isAutoPlaying ? mdiPauseCircleOutline : mdiPlayCircleOutline}\n className={`${CLASSNAME}__play`}\n color={theme === Theme.dark ? 'light' : 'dark'}\n emphasis={Emphasis.low}\n />\n ) : null}\n\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","import React, { useEffect } from 'react';\nimport { getFocusableElements } from '@lumx/react/utils/focus/getFocusableElements';\n\nimport { CLASSNAME as ITEM_GROUP_CLASSNAME } from './SlideshowItemGroup';\n\nexport interface UseSlideFocusManagementProps {\n activeIndex: number;\n groupBy?: number;\n wrapperRef: React.RefObject<HTMLDivElement>;\n}\n\n/**\n * Manage how slides must behave when visible or not.\n * When not visible, they should be hidden from screen readers and not focusable.\n */\nexport const useSlideFocusManagement = ({ activeIndex, groupBy = 1, wrapperRef }: UseSlideFocusManagementProps) => {\n useEffect(() => {\n const element = wrapperRef?.current;\n const startIndexVisible = activeIndex;\n const endIndexVisible = startIndexVisible + 1;\n\n const slideshowChildren = element?.querySelectorAll<HTMLElement>(`.${ITEM_GROUP_CLASSNAME}`);\n\n /**\n * Classname set on elements whose focus was blocked.\n * This is to easily find elements that have been tempered with,\n * and not elements whose focus was already initially blocked.\n * */\n const elementWithBlockedFocusClass = `${ITEM_GROUP_CLASSNAME}__no-focus`;\n\n /**\n * Display given slide to screen readers and, if focus was blocked, restore focus on elements..\n */\n const enableSlide = (slide: HTMLElement) => {\n // Hide from screen readers\n slide.setAttribute('aria-hidden', 'false');\n // Find elements we have blocked focus on\n slide.querySelectorAll(`.${elementWithBlockedFocusClass}`).forEach((focusableElement) => {\n focusableElement.removeAttribute('tabindex');\n focusableElement.classList.remove(elementWithBlockedFocusClass);\n });\n };\n\n /**\n * Hide given slide from screen readers and block focus on all focusable elements within.\n */\n const blockSlide = (slide: HTMLElement) => {\n slide.setAttribute('aria-hidden', 'true');\n getFocusableElements(slide).forEach((focusableElement) => {\n focusableElement.setAttribute('tabindex', '-1');\n focusableElement.classList.add(elementWithBlockedFocusClass);\n });\n };\n\n if (slideshowChildren && slideshowChildren?.length > 0) {\n Array.from(slideshowChildren).forEach((slide, slideIndex) => {\n const slideIsVisible = slideIndex >= startIndexVisible && slideIndex < endIndexVisible;\n\n if (slideIsVisible) {\n enableSlide(slide);\n } else {\n blockSlide(slide);\n }\n });\n }\n }, [activeIndex, groupBy, wrapperRef]);\n};\n","import React, { Children, CSSProperties, forwardRef } from 'react';\nimport chunk from 'lodash/chunk';\n\nimport classNames from 'classnames';\n\nimport { FULL_WIDTH_PERCENT } from '@lumx/react/components/slideshow/constants';\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses, HasTheme } from '@lumx/react/utils';\nimport { useSlideFocusManagement } from './useSlideFocusManagement';\nimport { buildSlideShowGroupId, SlideshowItemGroup } from './SlideshowItemGroup';\n\nexport interface SlidesProps extends GenericProps, HasTheme {\n /** current slide active */\n activeIndex: number;\n /** slides id to be added to the wrapper */\n id?: string;\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 /** whether the slides are currently playing or not */\n isAutoPlaying?: boolean;\n /** id to be passed in into the slides */\n slidesId?: string;\n /** callback to change whether the slideshow is playing or not */\n toggleAutoPlay: () => void;\n /** component to be rendered after the slides */\n afterSlides?: React.ReactNode;\n /** Whether the slides have controls linked */\n hasControls?: boolean;\n /**\n * Accessible label to set on a slide group.\n * Receives the group position starting from 1 and the total number of groups.\n * */\n slideGroupLabel?: (groupPosition: number, groupTotal: number) => 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 * Slides component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nexport const Slides: Comp<SlidesProps, HTMLDivElement> = forwardRef((props, ref) => {\n const {\n activeIndex,\n id,\n className,\n theme,\n fillHeight,\n groupBy,\n isAutoPlaying,\n toggleAutoPlay,\n slidesId,\n children,\n afterSlides,\n hasControls,\n slideGroupLabel,\n ...forwardedProps\n } = props;\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n\n useSlideFocusManagement({ wrapperRef, activeIndex, groupBy });\n\n // Inline style of wrapper element.\n const wrapperStyle: CSSProperties = { transform: `translateX(-${FULL_WIDTH_PERCENT * activeIndex}%)` };\n\n const groups = React.useMemo(() => {\n const childrenArray = Children.toArray(children);\n return groupBy && groupBy > 1 ? chunk(childrenArray, groupBy) : childrenArray;\n }, [children, groupBy]);\n\n return (\n <section\n id={id}\n ref={ref}\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 >\n <div\n id={slidesId}\n className={`${CLASSNAME}__slides`}\n onMouseEnter={toggleAutoPlay}\n onMouseLeave={toggleAutoPlay}\n aria-live={isAutoPlaying ? 'off' : 'polite'}\n >\n <div ref={wrapperRef} className={`${CLASSNAME}__wrapper`} style={wrapperStyle}>\n {groups.map((group, index) => (\n <SlideshowItemGroup\n key={index}\n id={slidesId && buildSlideShowGroupId(slidesId, index)}\n role={hasControls ? 'tabpanel' : 'group'}\n label={slideGroupLabel ? slideGroupLabel(index + 1, groups.length) : undefined}\n >\n {group}\n </SlideshowItemGroup>\n ))}\n </div>\n </div>\n\n {afterSlides}\n </section>\n );\n});\n\nSlides.displayName = COMPONENT_NAME;\nSlides.className = CLASSNAME;\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","DEFAULT_OPTIONS","activeIndex","groupBy","interval","useSlideshowControls","autoPlay","defaultActiveIndex","onChange","itemsCount","slidesId","useState","currentIndex","setCurrentIndex","element","setElement","slidesCount","Math","ceil","min","goToNextSlide","useCallback","loopback","index","goToPreviousSlide","Boolean","isAutoPlaying","setIsAutoPlaying","isForcePaused","setIsForcePaused","isSlideshowAutoPlaying","startAutoPlay","stopAutoPlay","onPaginationClick","onNextClick","onPreviousClick","slideshowId","useMemo","uniqueId","slideshowSlidesId","toggleAutoPlay","toggleForcePause","shouldBePaused","startIndexVisible","endIndexVisible","setSlideshow","slideshow","setActiveIndex","COMPONENT_NAME","CLASSNAME","getRootClassName","buildSlideShowGroupId","SlideshowItemGroup","forwardRef","props","ref","className","children","role","label","forwardedProps","classNames","handleBasicClasses","prefix","displayName","DEFAULT_PROPS","theme","Theme","light","Slideshow","fillHeight","slideshowControlsProps","slideGroupLabel","React","Children","count","SlideshowControls","useFocusWithin","onFocusIn","onFocusOut","showControls","mergeRefs","Slides","nextButtonProps","previousButtonProps","onClick","playButtonProps","paginationItemProps","defaultProps","SlideshowItem","isTouchDevice","window","useSwipeNavigate","onNext","onPrevious","detectHorizontalSwipe","swipe","usePaginationVisibleRange","slideCount","previousVisibleRangeRef","lastSlide","previousVisibleRange","newVisibleRange","max","deltaItems","InternalSlideshowControls","parentRef","paginationProps","paginationItemLabel","parent","WINDOW","HTMLElement","paginationRef","useRovingTabIndex","elementSelector","keepTabIndex","onElementFocus","click","visibleRange","wrapperStyle","transform","mdiChevronLeft","dark","Emphasis","low","range","map","isOnEdge","isActive","isOutRange","itemClassName","itemProps","mdiPauseCircleOutline","mdiPlayCircleOutline","mdiChevronRight","Object","assign","useSlideshowControlsDefaultOptions","useSlideFocusManagement","wrapperRef","slideshowChildren","querySelectorAll","ITEM_GROUP_CLASSNAME","elementWithBlockedFocusClass","enableSlide","slide","setAttribute","forEach","focusableElement","removeAttribute","classList","remove","blockSlide","getFocusableElements","add","length","Array","from","slideIndex","slideIsVisible","afterSlides","hasControls","groups","childrenArray","toArray","chunk","group"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Slides.js","sources":["../../../src/hooks/useInterval.tsx","../../../src/components/slideshow/constants.ts","../../../src/hooks/useSlideshowControls.ts","../../../src/components/slideshow/SlideshowItemGroup.tsx","../../../src/components/slideshow/Slideshow.tsx","../../../src/components/slideshow/SlideshowItem.tsx","../../../src/components/slideshow/useSwipeNavigate.ts","../../../src/components/slideshow/usePaginationVisibleRange.ts","../../../src/components/slideshow/SlideshowControls.tsx","../../../src/components/slideshow/Slides.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 { 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\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 | null) => void;\n /** reference to the slideshow element */\n slideshow: HTMLDivElement | null;\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 /** whether the slideshow was force paused or not */\n isForcePaused: boolean;\n /** callback to change whether the slideshow is autoplaying or not */\n toggleAutoPlay: () => void;\n /** calback to change whether the slideshow should be force paused or not */\n toggleForcePause: () => void;\n /** current active slide index */\n activeIndex: number;\n /** set the current index as the active one */\n setActiveIndex: (index: number) => void;\n /** callback that stops the auto play */\n stopAutoPlay: () => void;\n /** callback that starts the auto play */\n startAutoPlay: () => 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 | null>(null);\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 const [isForcePaused, setIsForcePaused] = useState(false);\n\n const isSlideshowAutoPlaying = isForcePaused ? false : isAutoPlaying;\n // Start\n useInterval(goToNextSlide, isSlideshowAutoPlaying && 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 const startAutoPlay = () => {\n setIsAutoPlaying(Boolean(autoPlay));\n };\n\n const stopAutoPlay = () => {\n setIsAutoPlaying(false);\n };\n\n // Handle click on a bullet to go to a specific slide.\n const onPaginationClick = useCallback(\n (index: number) => {\n stopAutoPlay();\n setIsForcePaused(true);\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 stopAutoPlay();\n setIsForcePaused(true);\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 stopAutoPlay();\n setIsForcePaused(true);\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 toggleAutoPlay = () => {\n if (isSlideshowAutoPlaying) {\n stopAutoPlay();\n } else {\n startAutoPlay();\n }\n };\n\n const toggleForcePause = () => {\n const shouldBePaused = !isForcePaused;\n\n setIsForcePaused(shouldBePaused);\n\n if (!shouldBePaused) {\n startAutoPlay();\n } else {\n stopAutoPlay();\n }\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: isSlideshowAutoPlaying,\n toggleAutoPlay,\n activeIndex: currentIndex,\n slidesCount,\n setActiveIndex: setCurrentIndex,\n startAutoPlay,\n stopAutoPlay,\n isForcePaused,\n toggleForcePause,\n };\n};\n","import React, { forwardRef, useEffect } from 'react';\n\nimport classNames from 'classnames';\n\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/react/utils';\nimport { getFocusableElements } from '@lumx/react/utils/focus/getFocusableElements';\n\n/**\n * Defines the props of the component.\n */\nexport interface SlideshowItemGroupProps extends GenericProps {\n role?: 'tabpanel' | 'group';\n label?: string;\n isDisplayed?: boolean;\n}\n\n/**\n * Component display name.\n */\nconst COMPONENT_NAME = 'SlideshowItemGroup';\n\n/**\n * Component default class name and class prefix.\n */\nexport const CLASSNAME = getRootClassName(COMPONENT_NAME);\n\nexport const buildSlideShowGroupId = (slidesId: string, index: number) => `${slidesId}-slide-${index}`;\n\n/**\n * SlideshowItemGroup component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nexport const SlideshowItemGroup: Comp<SlideshowItemGroupProps, HTMLDivElement> = forwardRef((props, ref) => {\n const { className, children, role = 'group', label, isDisplayed, ...forwardedProps } = props;\n const groupRef = React.useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const element = groupRef?.current;\n\n /**\n * Classname set on elements whose focus was blocked.\n * This is to easily find elements that have been tempered with,\n * and not elements whose focus was already initially blocked.\n * */\n const elementWithBlockedFocusClass = `${CLASSNAME}__no-focus`;\n\n /**\n * Display given slide to screen readers and, if focus was blocked, restore focus on elements..\n */\n const enableSlide = (slide: HTMLElement) => {\n // Hide from screen readers\n slide.setAttribute('aria-hidden', 'false');\n // Find elements we have blocked focus on\n slide.querySelectorAll(`.${elementWithBlockedFocusClass}`).forEach((focusableElement) => {\n focusableElement.removeAttribute('tabindex');\n focusableElement.classList.remove(elementWithBlockedFocusClass);\n });\n };\n\n /**\n * Hide given slide from screen readers and block focus on all focusable elements within.\n */\n const blockSlide = (slide: HTMLElement) => {\n slide.setAttribute('aria-hidden', 'true');\n getFocusableElements(slide).forEach((focusableElement) => {\n focusableElement.setAttribute('tabindex', '-1');\n focusableElement.classList.add(elementWithBlockedFocusClass);\n });\n };\n\n const handleDisplay = () => {\n if (!element) {\n return;\n }\n if (isDisplayed) {\n enableSlide(element);\n } else {\n blockSlide(element);\n }\n };\n\n // Options for the observer (which mutations to observe)\n const config = { attributes: true, childList: true, subtree: true };\n\n // Callback function to execute when mutations are observed\n const callback: MutationCallback = (mutationsList) => {\n if (element) {\n for (const mutation of mutationsList) {\n if (mutation.type === 'childList') {\n handleDisplay();\n }\n }\n }\n };\n\n // Create an observer instance linked to the callback function\n const observer = new MutationObserver(callback);\n\n // Start observing the target node for configured mutations\n if (element) {\n handleDisplay();\n\n if (!isDisplayed) {\n observer.observe(element, config);\n }\n }\n\n // Later, you can stop observing\n return () => {\n if (!isDisplayed) {\n observer.disconnect();\n }\n };\n }, [isDisplayed]);\n\n return (\n <div\n ref={groupRef}\n role={role}\n className={classNames(\n className,\n handleBasicClasses({\n prefix: CLASSNAME,\n }),\n )}\n aria-roledescription=\"slide\"\n aria-label={label}\n {...forwardedProps}\n >\n {children}\n </div>\n );\n});\n\nSlideshowItemGroup.displayName = COMPONENT_NAME;\nSlideshowItemGroup.className = CLASSNAME;\n","import React, { forwardRef } from 'react';\n\nimport { SlideshowControls, SlideshowControlsProps, Theme, Slides, SlidesProps } from '@lumx/react';\nimport { DEFAULT_OPTIONS } from '@lumx/react/hooks/useSlideshowControls';\nimport { Comp, GenericProps } from '@lumx/react/utils';\nimport { useFocusWithin } from '@lumx/react/hooks/useFocusWithin';\nimport { mergeRefs } from '@lumx/react/utils/mergeRefs';\nimport { buildSlideShowGroupId } from './SlideshowItemGroup';\n\n/**\n * Defines the props of the component.\n */\nexport interface SlideshowProps\n extends GenericProps,\n Pick<SlidesProps, 'autoPlay' | 'slidesId' | 'id' | 'theme' | 'fillHeight' | 'groupBy' | 'slideGroupLabel'> {\n /** current slide active */\n activeIndex?: SlidesProps['activeIndex'];\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<\n SlideshowControlsProps,\n 'nextButtonProps' | 'previousButtonProps' | 'paginationItemProps'\n > &\n Omit<\n SlideshowControlsProps,\n | 'activeIndex'\n | 'onPaginationClick'\n | 'onNextClick'\n | 'onPreviousClick'\n | 'slidesCount'\n | 'parentRef'\n | 'theme'\n >;\n /** Callback when slide changes */\n onChange?(index: number): void;\n}\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 slideGroupLabel,\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 slidesCount,\n onNextClick,\n onPaginationClick,\n onPreviousClick,\n slideshow,\n stopAutoPlay,\n startAutoPlay,\n toggleAutoPlay,\n toggleForcePause,\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 useFocusWithin({\n element: slideshow,\n onFocusIn: stopAutoPlay,\n onFocusOut: startAutoPlay,\n });\n\n const showControls = slideshowControlsProps && slidesCount > 1;\n\n return (\n <Slides\n activeIndex={currentIndex}\n id={slideshowId}\n className={className}\n theme={theme}\n fillHeight={fillHeight}\n groupBy={groupBy}\n isAutoPlaying={isAutoPlaying}\n autoPlay={autoPlay}\n slidesId={slideshowSlidesId}\n toggleAutoPlay={toggleAutoPlay}\n ref={mergeRefs(ref, setSlideshow)}\n hasControls={showControls}\n slideGroupLabel={slideGroupLabel}\n afterSlides={\n slideshowControlsProps && slidesCount > 1 ? (\n <div className={`${Slides.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 isAutoPlaying={isAutoPlaying}\n nextButtonProps={{\n 'aria-controls': slideshowSlidesId,\n ...slideshowControlsProps.nextButtonProps,\n }}\n previousButtonProps={{\n 'aria-controls': slideshowSlidesId,\n ...slideshowControlsProps.previousButtonProps,\n }}\n playButtonProps={\n autoPlay\n ? {\n 'aria-controls': slideshowSlidesId,\n onClick: toggleForcePause,\n ...slideshowControlsProps.playButtonProps,\n }\n : undefined\n }\n paginationItemProps={(index) => ({\n 'aria-controls': buildSlideShowGroupId(slideshowSlidesId, index),\n ...slideshowControlsProps.paginationItemProps?.(index),\n })}\n />\n </div>\n ) : undefined\n }\n {...forwardedProps}\n >\n {children}\n </Slides>\n );\n});\n\nSlideshow.displayName = 'Slideshow';\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 interface SlideshowItemProps extends GenericProps {\n /** interval in which slides are automatically shown */\n interval?: number;\n}\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 return (\n <div\n ref={ref}\n className={classNames(\n className,\n handleBasicClasses({\n prefix: CLASSNAME,\n }),\n )}\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 { 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, mdiPlayCircleOutline, mdiPauseCircleOutline } from '@lumx/icons';\nimport { Emphasis, IconButton, IconButtonProps, Theme } from '@lumx/react';\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses, HasTheme } from '@lumx/react/utils';\nimport { WINDOW } from '@lumx/react/constants';\nimport { useSlideshowControls, DEFAULT_OPTIONS } from '@lumx/react/hooks/useSlideshowControls';\nimport { useRovingTabIndex } from '@lumx/react/hooks/useRovingTabIndex';\n\nimport { useSwipeNavigate } from './useSwipeNavigate';\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, HasTheme {\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 | null;\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 /** Props to pass to the pagination wrapper */\n paginationProps?: Omit<React.HTMLAttributes<HTMLDivElement>, 'className' | 'style' | 'role'>;\n /** Number of slides. */\n slidesCount: number;\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 /** whether the slideshow is currently playing */\n isAutoPlaying?: boolean;\n /**\n * function to be executed in order to retrieve the label for the pagination item\n * @deprecated Use paginationItemProps instead.\n * */\n paginationItemLabel?: (index: number) => string;\n /**\n * function to be executed in order to retrieve the props for a pagination item.\n */\n paginationItemProps?: (itemIndex: number) => React.HTMLAttributes<HTMLButtonElement>;\n /** Props to pass to the lay button (minus those already set by the SlideshowControls props). */\n playButtonProps?: Pick<IconButtonProps, 'label'> &\n Omit<IconButtonProps, 'label' | 'onClick' | 'icon' | 'emphasis' | 'color'>;\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 paginationProps,\n slidesCount,\n theme,\n isAutoPlaying = false,\n playButtonProps,\n paginationItemLabel,\n paginationItemProps,\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 const paginationRef = React.useRef(null);\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 /**\n * Add roving tab index pattern to pagination items and activate slide on focus.\n */\n useRovingTabIndex({\n parentRef: paginationRef,\n elementSelector: 'button',\n keepTabIndex: true,\n onElementFocus: (element) => {\n element.click();\n },\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 ref={paginationRef} className={`${CLASSNAME}__pagination`}>\n <div\n className={`${CLASSNAME}__pagination-items`}\n style={wrapperStyle}\n role=\"tablist\"\n {...paginationProps}\n >\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 const { className: itemClassName = undefined, ...itemProps } = paginationItemProps\n ? paginationItemProps(index)\n : {};\n\n return (\n <button\n className={classNames(\n handleBasicClasses({\n prefix: `${CLASSNAME}__pagination-item`,\n isActive,\n isOnEdge,\n isOutRange,\n }),\n itemClassName,\n )}\n key={index}\n type=\"button\"\n tabIndex={isActive ? undefined : -1}\n role=\"tab\"\n aria-selected={isActive}\n onClick={() => onPaginationClick?.(index)}\n {...{\n 'aria-label': paginationItemLabel\n ? paginationItemLabel(index)\n : `${index + 1} / ${slidesCount}`,\n }}\n {...itemProps}\n />\n );\n }),\n [\n slidesCount,\n visibleRange.min,\n visibleRange.max,\n activeIndex,\n paginationItemProps,\n paginationItemLabel,\n onPaginationClick,\n ],\n )}\n </div>\n </div>\n\n {playButtonProps ? (\n <IconButton\n {...playButtonProps}\n icon={isAutoPlaying ? mdiPauseCircleOutline : mdiPlayCircleOutline}\n className={`${CLASSNAME}__play`}\n color={theme === Theme.dark ? 'light' : 'dark'}\n emphasis={Emphasis.low}\n />\n ) : null}\n\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","import React, { Children, CSSProperties, forwardRef } from 'react';\nimport chunk from 'lodash/chunk';\n\nimport classNames from 'classnames';\n\nimport { FULL_WIDTH_PERCENT } from '@lumx/react/components/slideshow/constants';\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses, HasTheme } from '@lumx/react/utils';\nimport { useSlideFocusManagement } from './useSlideFocusManagement';\nimport { buildSlideShowGroupId, SlideshowItemGroup } from './SlideshowItemGroup';\n\nexport interface SlidesProps extends GenericProps, HasTheme {\n /** current slide active */\n activeIndex: number;\n /** slides id to be added to the wrapper */\n id?: string;\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 /** whether the slides are currently playing or not */\n isAutoPlaying?: boolean;\n /** id to be passed in into the slides */\n slidesId?: string;\n /** callback to change whether the slideshow is playing or not */\n toggleAutoPlay: () => void;\n /** component to be rendered after the slides */\n afterSlides?: React.ReactNode;\n /** Whether the slides have controls linked */\n hasControls?: boolean;\n /**\n * Accessible label to set on a slide group.\n * Receives the group position starting from 1 and the total number of groups.\n * */\n slideGroupLabel?: (groupPosition: number, groupTotal: number) => 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 * Slides component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nexport const Slides: Comp<SlidesProps, HTMLDivElement> = forwardRef((props, ref) => {\n const {\n activeIndex,\n id,\n className,\n theme,\n fillHeight,\n groupBy,\n isAutoPlaying,\n toggleAutoPlay,\n slidesId,\n children,\n afterSlides,\n hasControls,\n slideGroupLabel,\n ...forwardedProps\n } = props;\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n const startIndexVisible = activeIndex;\n const endIndexVisible = startIndexVisible + 1;\n\n // Inline style of wrapper element.\n const wrapperStyle: CSSProperties = { transform: `translateX(-${FULL_WIDTH_PERCENT * activeIndex}%)` };\n\n const groups = React.useMemo(() => {\n const childrenArray = Children.toArray(children);\n return groupBy && groupBy > 1 ? chunk(childrenArray, groupBy) : childrenArray;\n }, [children, groupBy]);\n\n return (\n <section\n id={id}\n ref={ref}\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 >\n <div\n id={slidesId}\n className={`${CLASSNAME}__slides`}\n onMouseEnter={toggleAutoPlay}\n onMouseLeave={toggleAutoPlay}\n aria-live={isAutoPlaying ? 'off' : 'polite'}\n >\n <div ref={wrapperRef} className={`${CLASSNAME}__wrapper`} style={wrapperStyle}>\n {groups.map((group, index) => (\n <SlideshowItemGroup\n key={index}\n id={slidesId && buildSlideShowGroupId(slidesId, index)}\n role={hasControls ? 'tabpanel' : 'group'}\n label={slideGroupLabel ? slideGroupLabel(index + 1, groups.length) : undefined}\n isDisplayed={index >= startIndexVisible && index < endIndexVisible}\n >\n {group}\n </SlideshowItemGroup>\n ))}\n </div>\n </div>\n\n {afterSlides}\n </section>\n );\n});\n\nSlides.displayName = COMPONENT_NAME;\nSlides.className = CLASSNAME;\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","DEFAULT_OPTIONS","activeIndex","groupBy","interval","useSlideshowControls","autoPlay","defaultActiveIndex","onChange","itemsCount","slidesId","useState","currentIndex","setCurrentIndex","element","setElement","slidesCount","Math","ceil","min","goToNextSlide","useCallback","loopback","index","goToPreviousSlide","Boolean","isAutoPlaying","setIsAutoPlaying","isForcePaused","setIsForcePaused","isSlideshowAutoPlaying","startAutoPlay","stopAutoPlay","onPaginationClick","onNextClick","onPreviousClick","slideshowId","useMemo","uniqueId","slideshowSlidesId","toggleAutoPlay","toggleForcePause","shouldBePaused","startIndexVisible","endIndexVisible","setSlideshow","slideshow","setActiveIndex","COMPONENT_NAME","CLASSNAME","getRootClassName","buildSlideShowGroupId","SlideshowItemGroup","forwardRef","props","ref","className","children","role","label","isDisplayed","forwardedProps","groupRef","React","elementWithBlockedFocusClass","enableSlide","slide","setAttribute","querySelectorAll","forEach","focusableElement","removeAttribute","classList","remove","blockSlide","getFocusableElements","add","handleDisplay","config","attributes","childList","subtree","mutationsList","mutation","type","observer","MutationObserver","observe","disconnect","classNames","handleBasicClasses","prefix","displayName","DEFAULT_PROPS","theme","Theme","light","Slideshow","fillHeight","slideshowControlsProps","slideGroupLabel","Children","count","SlideshowControls","useFocusWithin","onFocusIn","onFocusOut","showControls","mergeRefs","Slides","nextButtonProps","previousButtonProps","onClick","playButtonProps","paginationItemProps","defaultProps","SlideshowItem","isTouchDevice","window","useSwipeNavigate","onNext","onPrevious","detectHorizontalSwipe","swipe","usePaginationVisibleRange","slideCount","previousVisibleRangeRef","lastSlide","previousVisibleRange","newVisibleRange","max","deltaItems","InternalSlideshowControls","parentRef","paginationProps","paginationItemLabel","parent","WINDOW","HTMLElement","paginationRef","useRovingTabIndex","elementSelector","keepTabIndex","onElementFocus","click","visibleRange","wrapperStyle","transform","mdiChevronLeft","dark","Emphasis","low","range","map","isOnEdge","isActive","isOutRange","itemClassName","itemProps","mdiPauseCircleOutline","mdiPlayCircleOutline","mdiChevronRight","Object","assign","useSlideshowControlsDefaultOptions","afterSlides","hasControls","wrapperRef","groups","childrenArray","toArray","chunk","group","length"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
},
|
|
8
8
|
"dependencies": {
|
|
9
9
|
"@juggle/resize-observer": "^3.2.0",
|
|
10
|
-
"@lumx/core": "^2.2.26-alpha-a11y-slideshow.
|
|
11
|
-
"@lumx/icons": "^2.2.26-alpha-a11y-slideshow.
|
|
10
|
+
"@lumx/core": "^2.2.26-alpha-a11y-slideshow.4",
|
|
11
|
+
"@lumx/icons": "^2.2.26-alpha-a11y-slideshow.4",
|
|
12
12
|
"@popperjs/core": "^2.5.4",
|
|
13
13
|
"body-scroll-lock": "^3.1.5",
|
|
14
14
|
"classnames": "^2.2.6",
|
|
@@ -120,6 +120,6 @@
|
|
|
120
120
|
"build:storybook": "cd storybook && ./build"
|
|
121
121
|
},
|
|
122
122
|
"sideEffects": false,
|
|
123
|
-
"version": "2.2.26-alpha-a11y-slideshow.
|
|
124
|
-
"gitHead": "
|
|
123
|
+
"version": "2.2.26-alpha-a11y-slideshow.4",
|
|
124
|
+
"gitHead": "2d3907edc17661f68dc93ec6123a140a708e36bf"
|
|
125
125
|
}
|
|
@@ -71,8 +71,8 @@ export const Slides: Comp<SlidesProps, HTMLDivElement> = forwardRef((props, ref)
|
|
|
71
71
|
...forwardedProps
|
|
72
72
|
} = props;
|
|
73
73
|
const wrapperRef = React.useRef<HTMLDivElement>(null);
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
const startIndexVisible = activeIndex;
|
|
75
|
+
const endIndexVisible = startIndexVisible + 1;
|
|
76
76
|
|
|
77
77
|
// Inline style of wrapper element.
|
|
78
78
|
const wrapperStyle: CSSProperties = { transform: `translateX(-${FULL_WIDTH_PERCENT * activeIndex}%)` };
|
|
@@ -107,6 +107,7 @@ export const Slides: Comp<SlidesProps, HTMLDivElement> = forwardRef((props, ref)
|
|
|
107
107
|
id={slidesId && buildSlideShowGroupId(slidesId, index)}
|
|
108
108
|
role={hasControls ? 'tabpanel' : 'group'}
|
|
109
109
|
label={slideGroupLabel ? slideGroupLabel(index + 1, groups.length) : undefined}
|
|
110
|
+
isDisplayed={index >= startIndexVisible && index < endIndexVisible}
|
|
110
111
|
>
|
|
111
112
|
{group}
|
|
112
113
|
</SlideshowItemGroup>
|
|
@@ -180,25 +180,37 @@ export const WithComplexContent = () => (
|
|
|
180
180
|
playButtonProps: { label: 'Play/Pause' },
|
|
181
181
|
paginationItemProps: (index) => ({ 'aria-label': `Slide ${index + 1}` }),
|
|
182
182
|
}}
|
|
183
|
-
autoPlay
|
|
184
183
|
slideGroupLabel={(currentGroup, totalGroup) => `${currentGroup} of ${totalGroup}`}
|
|
185
184
|
>
|
|
186
|
-
{
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
<
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
185
|
+
{range(number('Slides', 1)).map((nb) => {
|
|
186
|
+
const slide = slides[nb % slides.length];
|
|
187
|
+
|
|
188
|
+
return (
|
|
189
|
+
<SlideshowItem key={slide.id}>
|
|
190
|
+
<a href={slide.link}>
|
|
191
|
+
<img src={slide.src} alt={slide.alt} />
|
|
192
|
+
</a>
|
|
193
|
+
<FlexBox orientation={Orientation.vertical}>
|
|
194
|
+
<h3>
|
|
195
|
+
<a href={slide.link}>{slide.title}</a>
|
|
196
|
+
{/* Add a non focusable element to test that it stays that way after a page change. */}
|
|
197
|
+
<button type="button" tabIndex={-1} aria-hidden="true">
|
|
198
|
+
Not focusable
|
|
199
|
+
</button>
|
|
200
|
+
<button
|
|
201
|
+
aria-pressed="false"
|
|
202
|
+
data-id="block-reactions-button-like"
|
|
203
|
+
aria-disabled="false"
|
|
204
|
+
aria-label="39 likes. Like"
|
|
205
|
+
type="button"
|
|
206
|
+
>
|
|
207
|
+
Focusable
|
|
208
|
+
</button>
|
|
209
|
+
</h3>
|
|
210
|
+
{slide.subtitle && <p>{slide.subtitle}</p>}
|
|
211
|
+
</FlexBox>
|
|
212
|
+
</SlideshowItem>
|
|
213
|
+
);
|
|
214
|
+
})}
|
|
203
215
|
</Slideshow>
|
|
204
216
|
);
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import React, { forwardRef } from 'react';
|
|
1
|
+
import React, { forwardRef, useEffect } from 'react';
|
|
2
2
|
|
|
3
3
|
import classNames from 'classnames';
|
|
4
4
|
|
|
5
5
|
import { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/react/utils';
|
|
6
|
+
import { getFocusableElements } from '@lumx/react/utils/focus/getFocusableElements';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Defines the props of the component.
|
|
@@ -10,6 +11,7 @@ import { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/
|
|
|
10
11
|
export interface SlideshowItemGroupProps extends GenericProps {
|
|
11
12
|
role?: 'tabpanel' | 'group';
|
|
12
13
|
label?: string;
|
|
14
|
+
isDisplayed?: boolean;
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
/**
|
|
@@ -32,10 +34,91 @@ export const buildSlideShowGroupId = (slidesId: string, index: number) => `${sli
|
|
|
32
34
|
* @return React element.
|
|
33
35
|
*/
|
|
34
36
|
export const SlideshowItemGroup: Comp<SlideshowItemGroupProps, HTMLDivElement> = forwardRef((props, ref) => {
|
|
35
|
-
const { className, children, role = 'group', label, ...forwardedProps } = props;
|
|
37
|
+
const { className, children, role = 'group', label, isDisplayed, ...forwardedProps } = props;
|
|
38
|
+
const groupRef = React.useRef<HTMLDivElement>(null);
|
|
39
|
+
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
const element = groupRef?.current;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Classname set on elements whose focus was blocked.
|
|
45
|
+
* This is to easily find elements that have been tempered with,
|
|
46
|
+
* and not elements whose focus was already initially blocked.
|
|
47
|
+
* */
|
|
48
|
+
const elementWithBlockedFocusClass = `${CLASSNAME}__no-focus`;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Display given slide to screen readers and, if focus was blocked, restore focus on elements..
|
|
52
|
+
*/
|
|
53
|
+
const enableSlide = (slide: HTMLElement) => {
|
|
54
|
+
// Hide from screen readers
|
|
55
|
+
slide.setAttribute('aria-hidden', 'false');
|
|
56
|
+
// Find elements we have blocked focus on
|
|
57
|
+
slide.querySelectorAll(`.${elementWithBlockedFocusClass}`).forEach((focusableElement) => {
|
|
58
|
+
focusableElement.removeAttribute('tabindex');
|
|
59
|
+
focusableElement.classList.remove(elementWithBlockedFocusClass);
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Hide given slide from screen readers and block focus on all focusable elements within.
|
|
65
|
+
*/
|
|
66
|
+
const blockSlide = (slide: HTMLElement) => {
|
|
67
|
+
slide.setAttribute('aria-hidden', 'true');
|
|
68
|
+
getFocusableElements(slide).forEach((focusableElement) => {
|
|
69
|
+
focusableElement.setAttribute('tabindex', '-1');
|
|
70
|
+
focusableElement.classList.add(elementWithBlockedFocusClass);
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const handleDisplay = () => {
|
|
75
|
+
if (!element) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (isDisplayed) {
|
|
79
|
+
enableSlide(element);
|
|
80
|
+
} else {
|
|
81
|
+
blockSlide(element);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Options for the observer (which mutations to observe)
|
|
86
|
+
const config = { attributes: true, childList: true, subtree: true };
|
|
87
|
+
|
|
88
|
+
// Callback function to execute when mutations are observed
|
|
89
|
+
const callback: MutationCallback = (mutationsList) => {
|
|
90
|
+
if (element) {
|
|
91
|
+
for (const mutation of mutationsList) {
|
|
92
|
+
if (mutation.type === 'childList') {
|
|
93
|
+
handleDisplay();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// Create an observer instance linked to the callback function
|
|
100
|
+
const observer = new MutationObserver(callback);
|
|
101
|
+
|
|
102
|
+
// Start observing the target node for configured mutations
|
|
103
|
+
if (element) {
|
|
104
|
+
handleDisplay();
|
|
105
|
+
|
|
106
|
+
if (!isDisplayed) {
|
|
107
|
+
observer.observe(element, config);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Later, you can stop observing
|
|
112
|
+
return () => {
|
|
113
|
+
if (!isDisplayed) {
|
|
114
|
+
observer.disconnect();
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}, [isDisplayed]);
|
|
118
|
+
|
|
36
119
|
return (
|
|
37
120
|
<div
|
|
38
|
-
ref={
|
|
121
|
+
ref={groupRef}
|
|
39
122
|
role={role}
|
|
40
123
|
className={classNames(
|
|
41
124
|
className,
|
|
@@ -19,8 +19,6 @@ export const useSlideFocusManagement = ({ activeIndex, groupBy = 1, wrapperRef }
|
|
|
19
19
|
const startIndexVisible = activeIndex;
|
|
20
20
|
const endIndexVisible = startIndexVisible + 1;
|
|
21
21
|
|
|
22
|
-
const slideshowChildren = element?.querySelectorAll<HTMLElement>(`.${ITEM_GROUP_CLASSNAME}`);
|
|
23
|
-
|
|
24
22
|
/**
|
|
25
23
|
* Classname set on elements whose focus was blocked.
|
|
26
24
|
* This is to easily find elements that have been tempered with,
|
|
@@ -52,16 +50,42 @@ export const useSlideFocusManagement = ({ activeIndex, groupBy = 1, wrapperRef }
|
|
|
52
50
|
});
|
|
53
51
|
};
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
// Options for the observer (which mutations to observe)
|
|
54
|
+
const config = { attributes: true, childList: true };
|
|
55
|
+
|
|
56
|
+
// Callback function to execute when mutations are observed
|
|
57
|
+
const callback: MutationCallback = (mutationsList) => {
|
|
58
|
+
for (const mutation of mutationsList) {
|
|
59
|
+
if (mutation.type === 'childList') {
|
|
60
|
+
const slideshowChildren = element?.querySelectorAll<HTMLElement>(`.${ITEM_GROUP_CLASSNAME}`);
|
|
61
|
+
console.log('HIDE');
|
|
62
|
+
if (slideshowChildren && slideshowChildren?.length > 0) {
|
|
63
|
+
Array.from(slideshowChildren).forEach((slide, slideIndex) => {
|
|
64
|
+
const slideIsVisible = slideIndex >= startIndexVisible && slideIndex < endIndexVisible;
|
|
58
65
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
if (slideIsVisible) {
|
|
67
|
+
enableSlide(slide);
|
|
68
|
+
} else {
|
|
69
|
+
blockSlide(slide);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
63
73
|
}
|
|
64
|
-
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Create an observer instance linked to the callback function
|
|
78
|
+
const observer = new MutationObserver(callback);
|
|
79
|
+
|
|
80
|
+
// Start observing the target node for configured mutations
|
|
81
|
+
if (wrapperRef.current) {
|
|
82
|
+
observer.observe(wrapperRef.current, config);
|
|
65
83
|
}
|
|
84
|
+
|
|
85
|
+
// Later, you can stop observing
|
|
86
|
+
return () => {
|
|
87
|
+
console.log('here');
|
|
88
|
+
// observer.disconnect();
|
|
89
|
+
};
|
|
66
90
|
}, [activeIndex, groupBy, wrapperRef]);
|
|
67
91
|
};
|