@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.
@@ -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
- forwardedProps = _objectWithoutProperties(props, ["className", "children", "role", "label"]);
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: 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
- useSlideFocusManagement({
760
- wrapperRef: wrapperRef,
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.3",
11
- "@lumx/icons": "^2.2.26-alpha-a11y-slideshow.3",
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.3",
124
- "gitHead": "ea78a765afc65f2d2861b69c27d07149a23cc9f2"
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
- useSlideFocusManagement({ wrapperRef, activeIndex, groupBy });
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
- {slides.map((slide) => (
187
- <SlideshowItem key={slide.id}>
188
- <a href={slide.link}>
189
- <img src={slide.src} alt={slide.alt} />
190
- </a>
191
- <FlexBox orientation={Orientation.vertical}>
192
- <h3>
193
- <a href={slide.link}>{slide.title}</a>
194
- {/* Add a non focusable element to test that it stays that way after a page change. */}
195
- <button type="button" tabIndex={-1} aria-hidden="true">
196
- Not focusable
197
- </button>
198
- </h3>
199
- {slide.subtitle && <p>{slide.subtitle}</p>}
200
- </FlexBox>
201
- </SlideshowItem>
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={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
- if (slideshowChildren && slideshowChildren?.length > 0) {
56
- Array.from(slideshowChildren).forEach((slide, slideIndex) => {
57
- const slideIsVisible = slideIndex >= startIndexVisible && slideIndex < endIndexVisible;
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
- if (slideIsVisible) {
60
- enableSlide(slide);
61
- } else {
62
- blockSlide(slide);
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
  };