@lumx/react 2.2.26-alpha-a11y-slideshow.4 → 2.2.26-alpha-a11y-slideshow.5

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.
@@ -246,59 +246,37 @@ var useSlideshowControls = function useSlideshowControls(_ref) {
246
246
  };
247
247
 
248
248
  /**
249
- * Defines the props of the component.
250
- */
251
-
252
- /**
253
- * Component display name.
254
- */
255
- var COMPONENT_NAME = 'SlideshowItemGroup';
249
+ * Classname set on elements whose focus was blocked.
250
+ * This is to easily find elements that have been tempered with,
251
+ * and not elements whose focus was already initially blocked.
252
+ * */
253
+ var BLOCKED_FOCUS_CLASSNAME = "focus-blocked";
256
254
  /**
257
- * Component default class name and class prefix.
258
- */
259
-
260
- var CLASSNAME = getRootClassName(COMPONENT_NAME);
261
- var buildSlideShowGroupId = function buildSlideShowGroupId(slidesId, index) {
262
- return "".concat(slidesId, "-slide-").concat(index);
263
- };
264
- /**
265
- * SlideshowItemGroup component.
266
- *
267
- * @param props Component props.
268
- * @param ref Component ref.
269
- * @return React element.
255
+ * Manage how slides must behave when visible or not.
256
+ * When not visible, they should be hidden from screen readers and not focusable.
270
257
  */
271
258
 
272
- var SlideshowItemGroup = forwardRef(function (props, ref) {
273
- var className = props.className,
274
- children = props.children,
275
- _props$role = props.role,
276
- role = _props$role === void 0 ? 'group' : _props$role,
277
- label = props.label,
278
- isDisplayed = props.isDisplayed,
279
- forwardedProps = _objectWithoutProperties(props, ["className", "children", "role", "label", "isDisplayed"]);
280
-
281
- var groupRef = React.useRef(null);
259
+ var useSlideFocusManagement = function useSlideFocusManagement(_ref) {
260
+ var isSlideDisplayed = _ref.isSlideDisplayed,
261
+ slideRef = _ref.slideRef;
282
262
  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
- * */
263
+ var element = slideRef === null || slideRef === void 0 ? void 0 : slideRef.current;
289
264
 
290
- var elementWithBlockedFocusClass = "".concat(CLASSNAME, "__no-focus");
265
+ if (!element) {
266
+ return undefined;
267
+ }
291
268
  /**
292
- * Display given slide to screen readers and, if focus was blocked, restore focus on elements..
269
+ * Display given slide to screen readers and, if focus was blocked, restore focus on elements.
293
270
  */
294
271
 
295
- var enableSlide = function enableSlide(slide) {
272
+
273
+ var enableSlide = function enableSlide() {
296
274
  // Hide from screen readers
297
- slide.setAttribute('aria-hidden', 'false'); // Find elements we have blocked focus on
275
+ element.setAttribute('aria-hidden', 'false'); // Find elements we have blocked focus on
298
276
 
299
- slide.querySelectorAll(".".concat(elementWithBlockedFocusClass)).forEach(function (focusableElement) {
277
+ element.querySelectorAll(".".concat(BLOCKED_FOCUS_CLASSNAME)).forEach(function (focusableElement) {
300
278
  focusableElement.removeAttribute('tabindex');
301
- focusableElement.classList.remove(elementWithBlockedFocusClass);
279
+ focusableElement.classList.remove(BLOCKED_FOCUS_CLASSNAME);
302
280
  });
303
281
  };
304
282
  /**
@@ -306,11 +284,11 @@ var SlideshowItemGroup = forwardRef(function (props, ref) {
306
284
  */
307
285
 
308
286
 
309
- var blockSlide = function blockSlide(slide) {
310
- slide.setAttribute('aria-hidden', 'true');
311
- getFocusableElements(slide).forEach(function (focusableElement) {
287
+ var blockSlide = function blockSlide() {
288
+ element.setAttribute('aria-hidden', 'true');
289
+ getFocusableElements(element).forEach(function (focusableElement) {
312
290
  focusableElement.setAttribute('tabindex', '-1');
313
- focusableElement.classList.add(elementWithBlockedFocusClass);
291
+ focusableElement.classList.add(BLOCKED_FOCUS_CLASSNAME);
314
292
  });
315
293
  };
316
294
 
@@ -319,20 +297,14 @@ var SlideshowItemGroup = forwardRef(function (props, ref) {
319
297
  return;
320
298
  }
321
299
 
322
- if (isDisplayed) {
323
- enableSlide(element);
300
+ if (isSlideDisplayed) {
301
+ enableSlide();
324
302
  } else {
325
- blockSlide(element);
303
+ blockSlide();
326
304
  }
327
- }; // Options for the observer (which mutations to observe)
328
-
329
-
330
- var config = {
331
- attributes: true,
332
- childList: true,
333
- subtree: true
334
305
  }; // Callback function to execute when mutations are observed
335
306
 
307
+
336
308
  var callback = function callback(mutationsList) {
337
309
  if (element) {
338
310
  var _iteratorNormalCompletion = true;
@@ -365,25 +337,69 @@ var SlideshowItemGroup = forwardRef(function (props, ref) {
365
337
  }; // Create an observer instance linked to the callback function
366
338
 
367
339
 
368
- var observer = new MutationObserver(callback); // Start observing the target node for configured mutations
340
+ var observer = new MutationObserver(callback);
369
341
 
370
342
  if (element) {
371
343
  handleDisplay();
372
-
373
- if (!isDisplayed) {
374
- observer.observe(element, config);
344
+ /** If slide is hidden, start observing for elements to block focus */
345
+
346
+ if (!isSlideDisplayed) {
347
+ observer.observe(element, {
348
+ attributes: true,
349
+ childList: true,
350
+ subtree: true
351
+ });
375
352
  }
376
- } // Later, you can stop observing
377
-
353
+ }
378
354
 
379
355
  return function () {
380
- if (!isDisplayed) {
356
+ if (!isSlideDisplayed) {
381
357
  observer.disconnect();
382
358
  }
383
359
  };
384
- }, [isDisplayed]);
360
+ }, [isSlideDisplayed, slideRef]);
361
+ };
362
+
363
+ /**
364
+ * Defines the props of the component.
365
+ */
366
+
367
+ /**
368
+ * Component display name.
369
+ */
370
+ var COMPONENT_NAME = 'SlideshowItemGroup';
371
+ /**
372
+ * Component default class name and class prefix.
373
+ */
374
+
375
+ var CLASSNAME = getRootClassName(COMPONENT_NAME);
376
+ var buildSlideShowGroupId = function buildSlideShowGroupId(slidesId, index) {
377
+ return "".concat(slidesId, "-slide-").concat(index);
378
+ };
379
+ /**
380
+ * SlideshowItemGroup component.
381
+ *
382
+ * @param props Component props.
383
+ * @param ref Component ref.
384
+ * @return React element.
385
+ */
386
+
387
+ var SlideshowItemGroup = forwardRef(function (props, ref) {
388
+ var className = props.className,
389
+ children = props.children,
390
+ _props$role = props.role,
391
+ role = _props$role === void 0 ? 'group' : _props$role,
392
+ label = props.label,
393
+ isDisplayed = props.isDisplayed,
394
+ forwardedProps = _objectWithoutProperties(props, ["className", "children", "role", "label", "isDisplayed"]);
395
+
396
+ var groupRef = React.useRef(null);
397
+ useSlideFocusManagement({
398
+ isSlideDisplayed: isDisplayed,
399
+ slideRef: groupRef
400
+ });
385
401
  return React.createElement("div", _extends({
386
- ref: groupRef,
402
+ ref: mergeRefs(groupRef, ref),
387
403
  role: role,
388
404
  className: classnames(className, handleBasicClasses({
389
405
  prefix: CLASSNAME
@@ -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/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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"}
1
+ {"version":3,"file":"Slides.js","sources":["../../../src/hooks/useInterval.tsx","../../../src/components/slideshow/constants.ts","../../../src/hooks/useSlideshowControls.ts","../../../src/components/slideshow/useSlideFocusManagement.tsx","../../../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, { useEffect } from 'react';\nimport { getFocusableElements } from '@lumx/react/utils/focus/getFocusableElements';\n\nexport interface UseSlideFocusManagementProps {\n isSlideDisplayed?: boolean;\n slideRef: React.RefObject<HTMLDivElement>;\n}\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 * */\nconst BLOCKED_FOCUS_CLASSNAME = `focus-blocked`;\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 = ({ isSlideDisplayed, slideRef }: UseSlideFocusManagementProps) => {\n useEffect(() => {\n const element = slideRef?.current;\n\n if (!element) {\n return undefined;\n }\n\n /**\n * Display given slide to screen readers and, if focus was blocked, restore focus on elements.\n */\n const enableSlide = () => {\n // Hide from screen readers\n element.setAttribute('aria-hidden', 'false');\n // Find elements we have blocked focus on\n element.querySelectorAll(`.${BLOCKED_FOCUS_CLASSNAME}`).forEach((focusableElement) => {\n focusableElement.removeAttribute('tabindex');\n focusableElement.classList.remove(BLOCKED_FOCUS_CLASSNAME);\n });\n };\n\n /**\n * Hide given slide from screen readers and block focus on all focusable elements within.\n */\n const blockSlide = () => {\n element.setAttribute('aria-hidden', 'true');\n getFocusableElements(element).forEach((focusableElement) => {\n focusableElement.setAttribute('tabindex', '-1');\n focusableElement.classList.add(BLOCKED_FOCUS_CLASSNAME);\n });\n };\n\n const handleDisplay = () => {\n if (!element) {\n return;\n }\n if (isSlideDisplayed) {\n enableSlide();\n } else {\n blockSlide();\n }\n };\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 if (element) {\n handleDisplay();\n\n /** If slide is hidden, start observing for elements to block focus */\n if (!isSlideDisplayed) {\n observer.observe(element, { attributes: true, childList: true, subtree: true });\n }\n }\n\n return () => {\n if (!isSlideDisplayed) {\n observer.disconnect();\n }\n };\n }, [isSlideDisplayed, slideRef]);\n};\n","import React, { forwardRef } from 'react';\n\nimport classNames from 'classnames';\nimport { mergeRefs } from '@lumx/react/utils/mergeRefs';\n\nimport { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/react/utils';\nimport { useSlideFocusManagement } from './useSlideFocusManagement';\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 useSlideFocusManagement({ isSlideDisplayed: isDisplayed, slideRef: groupRef });\n\n return (\n <div\n ref={mergeRefs(groupRef, 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, { 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 { 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","BLOCKED_FOCUS_CLASSNAME","useSlideFocusManagement","isSlideDisplayed","slideRef","enableSlide","setAttribute","querySelectorAll","forEach","focusableElement","removeAttribute","classList","remove","blockSlide","getFocusableElements","add","handleDisplay","mutationsList","mutation","type","observer","MutationObserver","observe","attributes","childList","subtree","disconnect","COMPONENT_NAME","CLASSNAME","getRootClassName","buildSlideShowGroupId","SlideshowItemGroup","forwardRef","props","ref","className","children","role","label","isDisplayed","forwardedProps","groupRef","React","mergeRefs","classNames","handleBasicClasses","prefix","displayName","DEFAULT_PROPS","theme","Theme","light","Slideshow","fillHeight","slideshowControlsProps","slideGroupLabel","Children","count","SlideshowControls","useFocusWithin","onFocusIn","onFocusOut","showControls","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.4",
11
- "@lumx/icons": "^2.2.26-alpha-a11y-slideshow.4",
10
+ "@lumx/core": "^2.2.26-alpha-a11y-slideshow.5",
11
+ "@lumx/icons": "^2.2.26-alpha-a11y-slideshow.5",
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.4",
124
- "gitHead": "2d3907edc17661f68dc93ec6123a140a708e36bf"
123
+ "version": "2.2.26-alpha-a11y-slideshow.5",
124
+ "gitHead": "021c9ff4240a569879f818a53d59a2772b1f4168"
125
125
  }
@@ -5,7 +5,6 @@ import classNames from 'classnames';
5
5
 
6
6
  import { FULL_WIDTH_PERCENT } from '@lumx/react/components/slideshow/constants';
7
7
  import { Comp, GenericProps, getRootClassName, handleBasicClasses, HasTheme } from '@lumx/react/utils';
8
- import { useSlideFocusManagement } from './useSlideFocusManagement';
9
8
  import { buildSlideShowGroupId, SlideshowItemGroup } from './SlideshowItemGroup';
10
9
 
11
10
  export interface SlidesProps extends GenericProps, HasTheme {
@@ -188,7 +188,11 @@ export const WithComplexContent = () => (
188
188
  return (
189
189
  <SlideshowItem key={slide.id}>
190
190
  <a href={slide.link}>
191
- <img src={slide.src} alt={slide.alt} />
191
+ <ImageBlock
192
+ thumbnailProps={{ aspectRatio: AspectRatio.horizontal, loading: 'eager' }}
193
+ image={slide.src}
194
+ alt={slide.alt}
195
+ />
192
196
  </a>
193
197
  <FlexBox orientation={Orientation.vertical}>
194
198
  <h3>
@@ -197,15 +201,7 @@ export const WithComplexContent = () => (
197
201
  <button type="button" tabIndex={-1} aria-hidden="true">
198
202
  Not focusable
199
203
  </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>
204
+ <button type="button">Focusable</button>
209
205
  </h3>
210
206
  {slide.subtitle && <p>{slide.subtitle}</p>}
211
207
  </FlexBox>
@@ -1,9 +1,10 @@
1
- import React, { forwardRef, useEffect } from 'react';
1
+ import React, { forwardRef } from 'react';
2
2
 
3
3
  import classNames from 'classnames';
4
+ import { mergeRefs } from '@lumx/react/utils/mergeRefs';
4
5
 
5
6
  import { Comp, GenericProps, getRootClassName, handleBasicClasses } from '@lumx/react/utils';
6
- import { getFocusableElements } from '@lumx/react/utils/focus/getFocusableElements';
7
+ import { useSlideFocusManagement } from './useSlideFocusManagement';
7
8
 
8
9
  /**
9
10
  * Defines the props of the component.
@@ -37,88 +38,11 @@ export const SlideshowItemGroup: Comp<SlideshowItemGroupProps, HTMLDivElement> =
37
38
  const { className, children, role = 'group', label, isDisplayed, ...forwardedProps } = props;
38
39
  const groupRef = React.useRef<HTMLDivElement>(null);
39
40
 
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]);
41
+ useSlideFocusManagement({ isSlideDisplayed: isDisplayed, slideRef: groupRef });
118
42
 
119
43
  return (
120
44
  <div
121
- ref={groupRef}
45
+ ref={mergeRefs(groupRef, ref)}
122
46
  role={role}
123
47
  className={classNames(
124
48
  className,
@@ -1,74 +1,71 @@
1
1
  import React, { useEffect } from 'react';
2
2
  import { getFocusableElements } from '@lumx/react/utils/focus/getFocusableElements';
3
3
 
4
- import { CLASSNAME as ITEM_GROUP_CLASSNAME } from './SlideshowItemGroup';
5
-
6
4
  export interface UseSlideFocusManagementProps {
7
- activeIndex: number;
8
- groupBy?: number;
9
- wrapperRef: React.RefObject<HTMLDivElement>;
5
+ isSlideDisplayed?: boolean;
6
+ slideRef: React.RefObject<HTMLDivElement>;
10
7
  }
11
8
 
9
+ /**
10
+ * Classname set on elements whose focus was blocked.
11
+ * This is to easily find elements that have been tempered with,
12
+ * and not elements whose focus was already initially blocked.
13
+ * */
14
+ const BLOCKED_FOCUS_CLASSNAME = `focus-blocked`;
15
+
12
16
  /**
13
17
  * Manage how slides must behave when visible or not.
14
18
  * When not visible, they should be hidden from screen readers and not focusable.
15
19
  */
16
- export const useSlideFocusManagement = ({ activeIndex, groupBy = 1, wrapperRef }: UseSlideFocusManagementProps) => {
20
+ export const useSlideFocusManagement = ({ isSlideDisplayed, slideRef }: UseSlideFocusManagementProps) => {
17
21
  useEffect(() => {
18
- const element = wrapperRef?.current;
19
- const startIndexVisible = activeIndex;
20
- const endIndexVisible = startIndexVisible + 1;
22
+ const element = slideRef?.current;
21
23
 
22
- /**
23
- * Classname set on elements whose focus was blocked.
24
- * This is to easily find elements that have been tempered with,
25
- * and not elements whose focus was already initially blocked.
26
- * */
27
- const elementWithBlockedFocusClass = `${ITEM_GROUP_CLASSNAME}__no-focus`;
24
+ if (!element) {
25
+ return undefined;
26
+ }
28
27
 
29
28
  /**
30
- * Display given slide to screen readers and, if focus was blocked, restore focus on elements..
29
+ * Display given slide to screen readers and, if focus was blocked, restore focus on elements.
31
30
  */
32
- const enableSlide = (slide: HTMLElement) => {
31
+ const enableSlide = () => {
33
32
  // Hide from screen readers
34
- slide.setAttribute('aria-hidden', 'false');
33
+ element.setAttribute('aria-hidden', 'false');
35
34
  // Find elements we have blocked focus on
36
- slide.querySelectorAll(`.${elementWithBlockedFocusClass}`).forEach((focusableElement) => {
35
+ element.querySelectorAll(`.${BLOCKED_FOCUS_CLASSNAME}`).forEach((focusableElement) => {
37
36
  focusableElement.removeAttribute('tabindex');
38
- focusableElement.classList.remove(elementWithBlockedFocusClass);
37
+ focusableElement.classList.remove(BLOCKED_FOCUS_CLASSNAME);
39
38
  });
40
39
  };
41
40
 
42
41
  /**
43
42
  * Hide given slide from screen readers and block focus on all focusable elements within.
44
43
  */
45
- const blockSlide = (slide: HTMLElement) => {
46
- slide.setAttribute('aria-hidden', 'true');
47
- getFocusableElements(slide).forEach((focusableElement) => {
44
+ const blockSlide = () => {
45
+ element.setAttribute('aria-hidden', 'true');
46
+ getFocusableElements(element).forEach((focusableElement) => {
48
47
  focusableElement.setAttribute('tabindex', '-1');
49
- focusableElement.classList.add(elementWithBlockedFocusClass);
48
+ focusableElement.classList.add(BLOCKED_FOCUS_CLASSNAME);
50
49
  });
51
50
  };
52
51
 
53
- // Options for the observer (which mutations to observe)
54
- const config = { attributes: true, childList: true };
52
+ const handleDisplay = () => {
53
+ if (!element) {
54
+ return;
55
+ }
56
+ if (isSlideDisplayed) {
57
+ enableSlide();
58
+ } else {
59
+ blockSlide();
60
+ }
61
+ };
55
62
 
56
63
  // Callback function to execute when mutations are observed
57
64
  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;
65
-
66
- if (slideIsVisible) {
67
- enableSlide(slide);
68
- } else {
69
- blockSlide(slide);
70
- }
71
- });
65
+ if (element) {
66
+ for (const mutation of mutationsList) {
67
+ if (mutation.type === 'childList') {
68
+ handleDisplay();
72
69
  }
73
70
  }
74
71
  }
@@ -77,15 +74,19 @@ export const useSlideFocusManagement = ({ activeIndex, groupBy = 1, wrapperRef }
77
74
  // Create an observer instance linked to the callback function
78
75
  const observer = new MutationObserver(callback);
79
76
 
80
- // Start observing the target node for configured mutations
81
- if (wrapperRef.current) {
82
- observer.observe(wrapperRef.current, config);
77
+ if (element) {
78
+ handleDisplay();
79
+
80
+ /** If slide is hidden, start observing for elements to block focus */
81
+ if (!isSlideDisplayed) {
82
+ observer.observe(element, { attributes: true, childList: true, subtree: true });
83
+ }
83
84
  }
84
85
 
85
- // Later, you can stop observing
86
86
  return () => {
87
- console.log('here');
88
- // observer.disconnect();
87
+ if (!isSlideDisplayed) {
88
+ observer.disconnect();
89
+ }
89
90
  };
90
- }, [activeIndex, groupBy, wrapperRef]);
91
+ }, [isSlideDisplayed, slideRef]);
91
92
  };