@lumx/react 3.20.1-alpha.28 → 3.20.1-alpha.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/index.js +14033 -63
  2. package/index.js.map +1 -1
  3. package/package.json +3 -3
  4. package/utils/index.js +158 -3
  5. package/utils/index.js.map +1 -1
  6. package/_internal/Button-5a87fee9.js +0 -97
  7. package/_internal/Button-5a87fee9.js.map +0 -1
  8. package/_internal/ButtonRoot-bf682215.js +0 -117
  9. package/_internal/ButtonRoot-bf682215.js.map +0 -1
  10. package/_internal/Chip-8d0aae06.js +0 -143
  11. package/_internal/Chip-8d0aae06.js.map +0 -1
  12. package/_internal/ClickAwayProvider-1204f237.js +0 -95
  13. package/_internal/ClickAwayProvider-1204f237.js.map +0 -1
  14. package/_internal/DisabledStateContext-ea04260d.js +0 -29
  15. package/_internal/DisabledStateContext-ea04260d.js.map +0 -1
  16. package/_internal/HeadingLevelProvider-ebdcb0c7.js +0 -61
  17. package/_internal/HeadingLevelProvider-ebdcb0c7.js.map +0 -1
  18. package/_internal/IconButton-351389b0.js +0 -77
  19. package/_internal/IconButton-351389b0.js.map +0 -1
  20. package/_internal/ImageCaption-4109b433.js +0 -75
  21. package/_internal/ImageCaption-4109b433.js.map +0 -1
  22. package/_internal/List-b7882a99.js +0 -817
  23. package/_internal/List-b7882a99.js.map +0 -1
  24. package/_internal/PopoverDialog-2e7b9ed5.js +0 -655
  25. package/_internal/PopoverDialog-2e7b9ed5.js.map +0 -1
  26. package/_internal/Portal-3f86608e.js +0 -45
  27. package/_internal/Portal-3f86608e.js.map +0 -1
  28. package/_internal/RawClickable-2c2b6a89.js +0 -52
  29. package/_internal/RawClickable-2c2b6a89.js.map +0 -1
  30. package/_internal/Slides-83646e84.js +0 -679
  31. package/_internal/Slides-83646e84.js.map +0 -1
  32. package/_internal/ThemeContext-3181f000.js +0 -14
  33. package/_internal/ThemeContext-3181f000.js.map +0 -1
  34. package/_internal/Thumbnail-741501a5.js +0 -314
  35. package/_internal/Thumbnail-741501a5.js.map +0 -1
  36. package/_internal/check-circle-de24f857.js +0 -4
  37. package/_internal/check-circle-de24f857.js.map +0 -1
  38. package/_internal/chevron-right-827b804a.js +0 -6
  39. package/_internal/chevron-right-827b804a.js.map +0 -1
  40. package/_internal/chevron-up-0b9c76cb.js +0 -6
  41. package/_internal/chevron-up-0b9c76cb.js.map +0 -1
  42. package/_internal/close-circle-ef5d1aac.js +0 -4
  43. package/_internal/close-circle-ef5d1aac.js.map +0 -1
  44. package/_internal/close-eaf6c45a.js +0 -4
  45. package/_internal/close-eaf6c45a.js.map +0 -1
  46. package/_internal/components/alert-dialog-5df4f133.js +0 -163
  47. package/_internal/components/alert-dialog-5df4f133.js.map +0 -1
  48. package/_internal/components/autocomplete-824c779e.js +0 -261
  49. package/_internal/components/autocomplete-824c779e.js.map +0 -1
  50. package/_internal/components/avatar-69b66f01.js +0 -83
  51. package/_internal/components/avatar-69b66f01.js.map +0 -1
  52. package/_internal/components/badge-63cd3b1c.js +0 -81
  53. package/_internal/components/badge-63cd3b1c.js.map +0 -1
  54. package/_internal/components/button-eebd4e00.js +0 -47
  55. package/_internal/components/button-eebd4e00.js.map +0 -1
  56. package/_internal/components/checkbox-54943a02.js +0 -143
  57. package/_internal/components/checkbox-54943a02.js.map +0 -1
  58. package/_internal/components/chip-9ad6b318.js +0 -102
  59. package/_internal/components/chip-9ad6b318.js.map +0 -1
  60. package/_internal/components/comment-block-55a4ab3c.js +0 -138
  61. package/_internal/components/comment-block-55a4ab3c.js.map +0 -1
  62. package/_internal/components/date-picker-a824a3ae.js +0 -2
  63. package/_internal/components/date-picker-a824a3ae.js.map +0 -1
  64. package/_internal/components/dialog-5e6320b8.js +0 -238
  65. package/_internal/components/dialog-5e6320b8.js.map +0 -1
  66. package/_internal/components/divider-bdf11ba3.js +0 -50
  67. package/_internal/components/divider-bdf11ba3.js.map +0 -1
  68. package/_internal/components/drag-handle-45912fd3.js +0 -52
  69. package/_internal/components/drag-handle-45912fd3.js.map +0 -1
  70. package/_internal/components/dropdown-0216211d.js +0 -147
  71. package/_internal/components/dropdown-0216211d.js.map +0 -1
  72. package/_internal/components/expansion-panel-3ce73c6b.js +0 -167
  73. package/_internal/components/expansion-panel-3ce73c6b.js.map +0 -1
  74. package/_internal/components/flag-1b177f78.js +0 -59
  75. package/_internal/components/flag-1b177f78.js.map +0 -1
  76. package/_internal/components/flex-box-93b97715.js +0 -56
  77. package/_internal/components/flex-box-93b97715.js.map +0 -1
  78. package/_internal/components/generic-block-925f7c5b.js +0 -128
  79. package/_internal/components/generic-block-925f7c5b.js.map +0 -1
  80. package/_internal/components/grid-95fd1493.js +0 -104
  81. package/_internal/components/grid-95fd1493.js.map +0 -1
  82. package/_internal/components/grid-column-43f28cfb.js +0 -58
  83. package/_internal/components/grid-column-43f28cfb.js.map +0 -1
  84. package/_internal/components/heading-45d6e78e.js +0 -53
  85. package/_internal/components/heading-45d6e78e.js.map +0 -1
  86. package/_internal/components/icon-79195151.js +0 -2
  87. package/_internal/components/icon-79195151.js.map +0 -1
  88. package/_internal/components/image-block-aba6d2db.js +0 -110
  89. package/_internal/components/image-block-aba6d2db.js.map +0 -1
  90. package/_internal/components/image-lightbox-8b8e77c2.js +0 -759
  91. package/_internal/components/image-lightbox-8b8e77c2.js.map +0 -1
  92. package/_internal/components/inline-list-dfb9fd34.js +0 -74
  93. package/_internal/components/inline-list-dfb9fd34.js.map +0 -1
  94. package/_internal/components/input-helper-c8a0078b.js +0 -71
  95. package/_internal/components/input-helper-c8a0078b.js.map +0 -1
  96. package/_internal/components/input-label-9711398b.js +0 -59
  97. package/_internal/components/input-label-9711398b.js.map +0 -1
  98. package/_internal/components/lightbox-894abe64.js +0 -155
  99. package/_internal/components/lightbox-894abe64.js.map +0 -1
  100. package/_internal/components/link-e70e64ed.js +0 -72
  101. package/_internal/components/link-e70e64ed.js.map +0 -1
  102. package/_internal/components/link-preview-e56f3570.js +0 -117
  103. package/_internal/components/link-preview-e56f3570.js.map +0 -1
  104. package/_internal/components/list-59b7ce56.js +0 -71
  105. package/_internal/components/list-59b7ce56.js.map +0 -1
  106. package/_internal/components/message-a255dfd3.js +0 -98
  107. package/_internal/components/message-a255dfd3.js.map +0 -1
  108. package/_internal/components/mosaic-192f2270.js +0 -94
  109. package/_internal/components/mosaic-192f2270.js.map +0 -1
  110. package/_internal/components/navigation-dfe8aac0.js +0 -225
  111. package/_internal/components/navigation-dfe8aac0.js.map +0 -1
  112. package/_internal/components/notification-10f289b5.js +0 -143
  113. package/_internal/components/notification-10f289b5.js.map +0 -1
  114. package/_internal/components/popover-6c7f745b.js +0 -3
  115. package/_internal/components/popover-6c7f745b.js.map +0 -1
  116. package/_internal/components/post-block-f7dcc6e9.js +0 -109
  117. package/_internal/components/post-block-f7dcc6e9.js.map +0 -1
  118. package/_internal/components/progress-7a05fb0c.js +0 -182
  119. package/_internal/components/progress-7a05fb0c.js.map +0 -1
  120. package/_internal/components/progress-tracker-48876add.js +0 -309
  121. package/_internal/components/progress-tracker-48876add.js.map +0 -1
  122. package/_internal/components/radio-button-07cf45e9.js +0 -149
  123. package/_internal/components/radio-button-07cf45e9.js.map +0 -1
  124. package/_internal/components/select-8b54a444.js +0 -457
  125. package/_internal/components/select-8b54a444.js.map +0 -1
  126. package/_internal/components/side-navigation-7eeed3b4.js +0 -164
  127. package/_internal/components/side-navigation-7eeed3b4.js.map +0 -1
  128. package/_internal/components/skeleton-a4e84085.js +0 -166
  129. package/_internal/components/skeleton-a4e84085.js.map +0 -1
  130. package/_internal/components/slider-5d64b470.js +0 -311
  131. package/_internal/components/slider-5d64b470.js.map +0 -1
  132. package/_internal/components/slideshow-bce65cf6.js +0 -151
  133. package/_internal/components/slideshow-bce65cf6.js.map +0 -1
  134. package/_internal/components/switch-7ae55d89.js +0 -121
  135. package/_internal/components/switch-7ae55d89.js.map +0 -1
  136. package/_internal/components/table-5bdf4aec.js +0 -297
  137. package/_internal/components/table-5bdf4aec.js.map +0 -1
  138. package/_internal/components/tabs-2ad54592.js +0 -298
  139. package/_internal/components/tabs-2ad54592.js.map +0 -1
  140. package/_internal/components/text-09c81111.js +0 -2
  141. package/_internal/components/text-09c81111.js.map +0 -1
  142. package/_internal/components/text-field-3e1030f0.js +0 -359
  143. package/_internal/components/text-field-3e1030f0.js.map +0 -1
  144. package/_internal/components/thumbnail-1c5828b9.js +0 -42
  145. package/_internal/components/thumbnail-1c5828b9.js.map +0 -1
  146. package/_internal/components/toolbar-0d14efb7.js +0 -61
  147. package/_internal/components/toolbar-0d14efb7.js.map +0 -1
  148. package/_internal/components/tooltip-31181a24.js +0 -327
  149. package/_internal/components/tooltip-31181a24.js.map +0 -1
  150. package/_internal/components/uploader-845b2412.js +0 -153
  151. package/_internal/components/uploader-845b2412.js.map +0 -1
  152. package/_internal/components/user-block-91c30797.js +0 -144
  153. package/_internal/components/user-block-91c30797.js.map +0 -1
  154. package/_internal/constants-9b714e31.js +0 -2167
  155. package/_internal/constants-9b714e31.js.map +0 -1
  156. package/_internal/constants-d0e3f49e.js +0 -24
  157. package/_internal/constants-d0e3f49e.js.map +0 -1
  158. package/_internal/context-9d1336a1.js +0 -19
  159. package/_internal/context-9d1336a1.js.map +0 -1
  160. package/_internal/forwardRef-d0e90329.js +0 -82
  161. package/_internal/forwardRef-d0e90329.js.map +0 -1
  162. package/_internal/getFocusableElements-230173a8.js +0 -13
  163. package/_internal/getFocusableElements-230173a8.js.map +0 -1
  164. package/_internal/index-68e1b0af.js +0 -436
  165. package/_internal/index-68e1b0af.js.map +0 -1
  166. package/_internal/index-745f94ee.js +0 -103
  167. package/_internal/index-745f94ee.js.map +0 -1
  168. package/_internal/index-ab520e78.js +0 -117
  169. package/_internal/index-ab520e78.js.map +0 -1
  170. package/_internal/information-49bbeed3.js +0 -6
  171. package/_internal/information-49bbeed3.js.map +0 -1
  172. package/_internal/isComponent-b9762ff1.js +0 -18
  173. package/_internal/isComponent-b9762ff1.js.map +0 -1
  174. package/_internal/isComponentType-e806b848.js +0 -9
  175. package/_internal/isComponentType-e806b848.js.map +0 -1
  176. package/_internal/mergeRefs-f0d7d6ea.js +0 -30
  177. package/_internal/mergeRefs-f0d7d6ea.js.map +0 -1
  178. package/_internal/state-db358714.js +0 -130
  179. package/_internal/state-db358714.js.map +0 -1
  180. package/_internal/useBooleanState-2a3d237c.js +0 -12
  181. package/_internal/useBooleanState-2a3d237c.js.map +0 -1
  182. package/_internal/useCallbackOnEscape-0b220f9c.js +0 -62
  183. package/_internal/useCallbackOnEscape-0b220f9c.js.map +0 -1
  184. package/_internal/useDisableBodyScroll-36bd7352.js +0 -219
  185. package/_internal/useDisableBodyScroll-36bd7352.js.map +0 -1
  186. package/_internal/useDisableStateProps-69e16b7c.js +0 -36
  187. package/_internal/useDisableStateProps-69e16b7c.js.map +0 -1
  188. package/_internal/useFocusTrap-3114e5e8.js +0 -112
  189. package/_internal/useFocusTrap-3114e5e8.js.map +0 -1
  190. package/_internal/useId-3a1facc0.js +0 -18
  191. package/_internal/useId-3a1facc0.js.map +0 -1
  192. package/_internal/useRovingTabIndex-7daf0f24.js +0 -77
  193. package/_internal/useRovingTabIndex-7daf0f24.js.map +0 -1
  194. package/_internal/useTransitionVisibility-321fdbfa.js +0 -50
  195. package/_internal/useTransitionVisibility-321fdbfa.js.map +0 -1
  196. package/_internal/wrapChildrenIconWithSpaces-e6038f72.js +0 -20
  197. package/_internal/wrapChildrenIconWithSpaces-e6038f72.js.map +0 -1
@@ -1,679 +0,0 @@
1
- import { f as forwardRef, c as classNames } from './forwardRef-d0e90329.js';
2
- import { getRootClassName, handleBasicClasses } from '@lumx/core/js/utils/className';
3
- import { jsx, jsxs } from 'react/jsx-runtime';
4
- import React__default, { useRef, useEffect, useState, useCallback, useMemo, Children } from 'react';
5
- import { W as WINDOW } from './constants-d0e3f49e.js';
6
- import { u as useId } from './useId-3a1facc0.js';
7
- import { u as useRovingTabIndex } from './useRovingTabIndex-7daf0f24.js';
8
- import { u as useTheme } from './ThemeContext-3181f000.js';
9
- import { range } from '@lumx/core/js/utils/collection/range';
10
- import { detectHorizontalSwipe } from '@lumx/core/js/utils';
11
- import { Theme, Emphasis } from '@lumx/core/js/constants';
12
- import { I as IconButton } from './IconButton-351389b0.js';
13
- import { m as mdiChevronLeft, a as mdiChevronRight } from './chevron-right-827b804a.js';
14
- import { chunk } from '@lumx/core/js/utils/collection/chunk';
15
- import { m as mergeRefs } from './mergeRefs-f0d7d6ea.js';
16
- import { g as getFocusableElements } from './getFocusableElements-230173a8.js';
17
-
18
- const mdiPauseCircleOutline = 'M13 16V8h2v8zm-4 0V8h2v8zm3-14a10 10 0 0 1 10 10 10 10 0 0 1-10 10A10 10 0 0 1 2 12 10 10 0 0 1 12 2m0 2a8 8 0 0 0-8 8 8 8 0 0 0 8 8 8 8 0 0 0 8-8 8 8 0 0 0-8-8';
19
-
20
- const mdiPlayCircleOutline = 'M12 20a8.01 8.01 0 0 1 0-16 8.01 8.01 0 0 1 0 16m0-18A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m-2 14.5 6-4.5-6-4.5z';
21
-
22
- /**
23
- * Making setInterval Declarative with React Hooks.
24
- * Credits: https://overreacted.io/making-setinterval-declarative-with-react-hooks/
25
- *
26
- * @param callback Function called by setInterval.
27
- * @param delay Delay for setInterval.
28
- */
29
- function useInterval(callback, delay) {
30
- const savedCallback = useRef();
31
- useEffect(() => {
32
- savedCallback.current = callback;
33
- });
34
- useEffect(() => {
35
- if (delay === null) return undefined;
36
- function tick() {
37
- savedCallback.current?.();
38
- }
39
- const id = setInterval(tick, delay);
40
- return () => clearInterval(id);
41
- }, [delay]);
42
- }
43
-
44
- /**
45
- * Autoplay default interval in ms.
46
- */
47
- const AUTOPLAY_DEFAULT_INTERVAL = 5000;
48
-
49
- /**
50
- * Full width size in percent.
51
- */
52
- const FULL_WIDTH_PERCENT = 100;
53
-
54
- /**
55
- * Edge from the active index.
56
- */
57
- const EDGE_FROM_ACTIVE_INDEX = 2;
58
-
59
- /**
60
- * Max number of pagination items.
61
- */
62
- const PAGINATION_ITEMS_MAX = 5;
63
-
64
- /**
65
- * Size of a pagination item. Used to translate wrapper.
66
- */
67
- const PAGINATION_ITEM_SIZE = 12;
68
-
69
- const DEFAULT_OPTIONS = {
70
- activeIndex: 0,
71
- groupBy: 1,
72
- interval: AUTOPLAY_DEFAULT_INTERVAL
73
- };
74
- const useSlideshowControls = ({
75
- activeIndex = DEFAULT_OPTIONS.activeIndex,
76
- groupBy = DEFAULT_OPTIONS.groupBy,
77
- interval = DEFAULT_OPTIONS.interval,
78
- autoPlay,
79
- defaultActiveIndex,
80
- onChange,
81
- itemsCount,
82
- id,
83
- slidesId
84
- }) => {
85
- const [currentIndex, setCurrentIndex] = useState(activeIndex);
86
- // Use state instead of a ref to make the slideshow controls update directly when the element is set.
87
- const [element, setElement] = useState(null);
88
-
89
- // Number of slides when using groupBy prop.
90
- const slidesCount = Math.ceil(itemsCount / Math.min(groupBy, itemsCount));
91
-
92
- // Change current index to display next slide.
93
- const goToNextSlide = useCallback((loopback = true) => {
94
- setCurrentIndex(index => {
95
- if (loopback && index === slidesCount - 1) {
96
- // Loopback to the start.
97
- return 0;
98
- }
99
- if (index < slidesCount - 1) {
100
- // Next slide.
101
- return index + 1;
102
- }
103
- return index;
104
- });
105
- }, [slidesCount, setCurrentIndex]);
106
-
107
- // Change current index to display previous slide.
108
- const goToPreviousSlide = useCallback((loopback = true) => {
109
- setCurrentIndex(index => {
110
- if (loopback && index === 0) {
111
- // Loopback to the end.
112
- return slidesCount - 1;
113
- }
114
- if (index > 0) {
115
- // Previous slide.
116
- return index - 1;
117
- }
118
- return index;
119
- });
120
- }, [slidesCount, setCurrentIndex]);
121
-
122
- // Auto play
123
- const [isAutoPlaying, setIsAutoPlaying] = useState(Boolean(autoPlay));
124
- const [isForcePaused, setIsForcePaused] = useState(false);
125
- const isSlideshowAutoPlaying = isForcePaused ? false : isAutoPlaying;
126
- // Start
127
- useInterval(goToNextSlide, isSlideshowAutoPlaying && slidesCount > 1 ? interval : null);
128
-
129
- // Reset current index if it become invalid.
130
- useEffect(() => {
131
- if (currentIndex > slidesCount - 1) {
132
- setCurrentIndex(defaultActiveIndex);
133
- }
134
- }, [currentIndex, slidesCount, defaultActiveIndex]);
135
- const startAutoPlay = () => {
136
- setIsAutoPlaying(Boolean(autoPlay));
137
- };
138
- const stopAutoPlay = () => {
139
- setIsAutoPlaying(false);
140
- };
141
-
142
- // Handle click on a bullet to go to a specific slide.
143
- const onPaginationClick = useCallback(index => {
144
- stopAutoPlay();
145
- setIsForcePaused(true);
146
- if (index >= 0 && index < slidesCount) {
147
- setCurrentIndex(index);
148
- }
149
- }, [slidesCount, setCurrentIndex]);
150
-
151
- // Handle click or keyboard event to go to next slide.
152
- const onNextClick = useCallback((loopback = true) => {
153
- stopAutoPlay();
154
- setIsForcePaused(true);
155
- goToNextSlide(loopback);
156
- }, [goToNextSlide]);
157
-
158
- // Handle click or keyboard event to go to previous slide.
159
- const onPreviousClick = useCallback((loopback = true) => {
160
- stopAutoPlay();
161
- setIsForcePaused(true);
162
- goToPreviousSlide(loopback);
163
- }, [goToPreviousSlide]);
164
-
165
- // If the activeIndex props changes, update the current slide
166
- useEffect(() => {
167
- setCurrentIndex(activeIndex);
168
- }, [activeIndex]);
169
-
170
- // If the slide changes, with autoplay for example, trigger "onChange"
171
- useEffect(() => {
172
- if (!onChange) return;
173
- onChange(currentIndex);
174
- }, [currentIndex, onChange]);
175
- const generatedSlideshowId = useId();
176
- const slideshowId = id || generatedSlideshowId;
177
- const generatedSlidesId = useId();
178
- const slideshowSlidesId = slidesId || generatedSlidesId;
179
- const toggleAutoPlay = () => {
180
- if (isSlideshowAutoPlaying) {
181
- stopAutoPlay();
182
- } else {
183
- startAutoPlay();
184
- }
185
- };
186
- const toggleForcePause = () => {
187
- const shouldBePaused = !isForcePaused;
188
- setIsForcePaused(shouldBePaused);
189
- if (!shouldBePaused) {
190
- startAutoPlay();
191
- } else {
192
- stopAutoPlay();
193
- }
194
- };
195
-
196
- // Start index and end index of visible slides.
197
- const startIndexVisible = currentIndex * groupBy;
198
- const endIndexVisible = startIndexVisible + groupBy;
199
- return {
200
- startIndexVisible,
201
- endIndexVisible,
202
- setSlideshow: setElement,
203
- slideshow: element,
204
- slideshowId,
205
- slideshowSlidesId,
206
- onPreviousClick,
207
- onNextClick,
208
- onPaginationClick,
209
- isAutoPlaying: isSlideshowAutoPlaying,
210
- toggleAutoPlay,
211
- activeIndex: currentIndex,
212
- slidesCount,
213
- setActiveIndex: setCurrentIndex,
214
- startAutoPlay,
215
- stopAutoPlay,
216
- isForcePaused,
217
- toggleForcePause
218
- };
219
- };
220
-
221
- /**
222
- * Classname set on elements whose focus was blocked.
223
- * This is to easily find elements that have been tempered with,
224
- * and not elements whose focus was already initially blocked.
225
- * */
226
- const BLOCKED_FOCUS_CLASSNAME = 'focus-blocked';
227
-
228
- /**
229
- * Manage how slides must behave when visible or not.
230
- * When not visible, they should be hidden from screen readers and not focusable.
231
- */
232
- const useSlideFocusManagement = ({
233
- isSlideDisplayed,
234
- slideRef
235
- }) => {
236
- useEffect(() => {
237
- const element = slideRef?.current;
238
- if (!element) {
239
- return undefined;
240
- }
241
-
242
- /**
243
- * Display given slide to screen readers and, if focus was blocked, restore focus on elements.
244
- */
245
- const enableSlide = () => {
246
- // Hide from screen readers
247
- element.setAttribute('aria-hidden', 'false');
248
- // Find elements we have blocked focus on
249
- element.querySelectorAll(`.${BLOCKED_FOCUS_CLASSNAME}`).forEach(focusableElement => {
250
- focusableElement.removeAttribute('tabindex');
251
- focusableElement.classList.remove(BLOCKED_FOCUS_CLASSNAME);
252
- });
253
- };
254
-
255
- /**
256
- * Hide given slide from screen readers and block focus on all focusable elements within.
257
- */
258
- const blockSlide = () => {
259
- element.setAttribute('aria-hidden', 'true');
260
- getFocusableElements(element).forEach(focusableElement => {
261
- focusableElement.setAttribute('tabindex', '-1');
262
- focusableElement.classList.add(BLOCKED_FOCUS_CLASSNAME);
263
- });
264
- };
265
- const handleDisplay = () => {
266
- if (!element) {
267
- return;
268
- }
269
- if (isSlideDisplayed) {
270
- enableSlide();
271
- } else {
272
- blockSlide();
273
- }
274
- };
275
-
276
- // Callback function to execute when mutations are observed
277
- const callback = mutationsList => {
278
- if (element) {
279
- for (const mutation of mutationsList) {
280
- if (mutation.type === 'childList') {
281
- handleDisplay();
282
- }
283
- }
284
- }
285
- };
286
-
287
- // Create an observer instance linked to the callback function
288
- const observer = new MutationObserver(callback);
289
- if (element) {
290
- handleDisplay();
291
-
292
- /** If slide is hidden, start observing for elements to block focus */
293
- if (!isSlideDisplayed) {
294
- observer.observe(element, {
295
- attributes: true,
296
- childList: true,
297
- subtree: true
298
- });
299
- }
300
- }
301
- return () => {
302
- if (!isSlideDisplayed) {
303
- observer.disconnect();
304
- }
305
- };
306
- }, [isSlideDisplayed, slideRef]);
307
- };
308
-
309
- /**
310
- * Component display name.
311
- */
312
- const COMPONENT_NAME$3 = 'SlideshowItemGroup';
313
-
314
- /**
315
- * Component default class name and class prefix.
316
- */
317
- const CLASSNAME$3 = getRootClassName(COMPONENT_NAME$3);
318
- const buildSlideShowGroupId = (slidesId, index) => `${slidesId}-slide-${index}`;
319
-
320
- /**
321
- * SlideshowItemGroup component.
322
- *
323
- * @param props Component props.
324
- * @param ref Component ref.
325
- * @return React element.
326
- */
327
- const SlideshowItemGroup = forwardRef((props, ref) => {
328
- const {
329
- className,
330
- children,
331
- role = 'group',
332
- label,
333
- isDisplayed,
334
- ...forwardedProps
335
- } = props;
336
- const groupRef = React__default.useRef(null);
337
- useSlideFocusManagement({
338
- isSlideDisplayed: isDisplayed,
339
- slideRef: groupRef
340
- });
341
- return /*#__PURE__*/jsx("div", {
342
- ref: mergeRefs(groupRef, ref),
343
- role: role,
344
- className: classNames(className, CLASSNAME$3),
345
- "aria-roledescription": "slide",
346
- "aria-label": label,
347
- ...forwardedProps,
348
- children: children
349
- });
350
- });
351
- SlideshowItemGroup.displayName = COMPONENT_NAME$3;
352
- SlideshowItemGroup.className = CLASSNAME$3;
353
-
354
- /**
355
- * Component display name.
356
- */
357
- const COMPONENT_NAME$2 = 'SlideshowItem';
358
-
359
- /**
360
- * Component default class name and class prefix.
361
- */
362
- const CLASSNAME$2 = getRootClassName(COMPONENT_NAME$2);
363
-
364
- /**
365
- * SlideshowItem component.
366
- *
367
- * @param props Component props.
368
- * @param ref Component ref.
369
- * @return React element.
370
- */
371
- const SlideshowItem = forwardRef((props, ref) => {
372
- const {
373
- className,
374
- children,
375
- ...forwardedProps
376
- } = props;
377
- return /*#__PURE__*/jsx("div", {
378
- ref: ref,
379
- className: classNames(className, CLASSNAME$2),
380
- ...forwardedProps,
381
- children: children
382
- });
383
- });
384
- SlideshowItem.displayName = COMPONENT_NAME$2;
385
- SlideshowItem.className = CLASSNAME$2;
386
-
387
- const isTouchDevice = () => 'ontouchstart' in window;
388
-
389
- /**
390
- * Listen swipe to navigate left and right.
391
- */
392
- function useSwipeNavigate(element, onNext, onPrevious) {
393
- useEffect(() => {
394
- if (!element || !isTouchDevice()) return undefined;
395
- return detectHorizontalSwipe(element, swipe => {
396
- const callback = swipe === 'right' ? onPrevious : onNext;
397
- callback?.();
398
- });
399
- }, [onPrevious, onNext, element]);
400
- }
401
-
402
- /**
403
- * Calculate the currently visible pagination "bullet" range.
404
- */
405
- function usePaginationVisibleRange(activeIndex, slideCount) {
406
- const previousVisibleRangeRef = useRef();
407
- return useMemo(() => {
408
- const lastSlide = slideCount - 1;
409
- const {
410
- current: previousVisibleRange
411
- } = previousVisibleRangeRef;
412
- let newVisibleRange;
413
- if (activeIndex === previousVisibleRange?.max && activeIndex < lastSlide) {
414
- newVisibleRange = {
415
- min: previousVisibleRange.min + 1,
416
- max: previousVisibleRange.max + 1
417
- };
418
- } else if (activeIndex === previousVisibleRange?.min && activeIndex > 0) {
419
- newVisibleRange = {
420
- min: previousVisibleRange.min - 1,
421
- max: previousVisibleRange.max - 1
422
- };
423
- } else {
424
- const deltaItems = PAGINATION_ITEMS_MAX - 1;
425
- let min = activeIndex - EDGE_FROM_ACTIVE_INDEX;
426
- let max = activeIndex + EDGE_FROM_ACTIVE_INDEX;
427
- if (activeIndex > lastSlide - EDGE_FROM_ACTIVE_INDEX) {
428
- min = lastSlide - deltaItems;
429
- max = lastSlide;
430
- } else if (activeIndex < deltaItems) {
431
- min = 0;
432
- max = deltaItems;
433
- }
434
- newVisibleRange = {
435
- min,
436
- max
437
- };
438
- }
439
- previousVisibleRangeRef.current = newVisibleRange;
440
- return newVisibleRange;
441
- }, [activeIndex, slideCount]);
442
- }
443
-
444
- /**
445
- * Component display name.
446
- */
447
- const COMPONENT_NAME$1 = 'SlideshowControls';
448
-
449
- /**
450
- * Component default class name and class prefix.
451
- */
452
- const CLASSNAME$1 = getRootClassName(COMPONENT_NAME$1);
453
-
454
- /**
455
- * Component default props.
456
- */
457
- const DEFAULT_PROPS = {
458
- activeIndex: 0
459
- };
460
-
461
- /**
462
- * SlideshowControls component.
463
- *
464
- * @param props Component props.
465
- * @param ref Component ref.
466
- * @return React element.
467
- */
468
- const InternalSlideshowControls = forwardRef((props, ref) => {
469
- const defaultTheme = useTheme() || Theme.light;
470
- const {
471
- activeIndex = DEFAULT_PROPS.activeIndex,
472
- className,
473
- nextButtonProps,
474
- onNextClick,
475
- onPaginationClick,
476
- onPreviousClick,
477
- parentRef,
478
- previousButtonProps,
479
- paginationProps,
480
- slidesCount,
481
- theme = defaultTheme,
482
- isAutoPlaying = false,
483
- playButtonProps,
484
- paginationItemLabel,
485
- paginationItemProps,
486
- ...forwardedProps
487
- } = props;
488
- let parent;
489
- if (WINDOW) {
490
- // Checking window object to avoid errors in SSR.
491
- parent = parentRef instanceof HTMLElement ? parentRef : parentRef?.current;
492
- }
493
- const paginationRef = React__default.useRef(null);
494
- // Listen to touch swipe navigate left & right.
495
- useSwipeNavigate(parent,
496
- // Go next without loopback.
497
- useCallback(() => onNextClick?.(false), [onNextClick]),
498
- // Go previous without loopback.
499
- useCallback(() => onPreviousClick?.(false), [onPreviousClick]));
500
-
501
- /**
502
- * Add roving tab index pattern to pagination items and activate slide on focus.
503
- */
504
- useRovingTabIndex({
505
- parentRef: paginationRef,
506
- elementSelector: 'button',
507
- keepTabIndex: true,
508
- onElementFocus: element => {
509
- element.click();
510
- }
511
- });
512
-
513
- // Pagination "bullet" range.
514
- const visibleRange = usePaginationVisibleRange(activeIndex, slidesCount);
515
-
516
- // Inline style of wrapper element.
517
- const wrapperStyle = {
518
- transform: `translateX(-${PAGINATION_ITEM_SIZE * visibleRange.min}px)`
519
- };
520
- return /*#__PURE__*/jsxs("div", {
521
- ref: ref,
522
- ...forwardedProps,
523
- className: classNames(className, handleBasicClasses({
524
- prefix: CLASSNAME$1,
525
- theme
526
- }), {
527
- [`${CLASSNAME$1}--has-infinite-pagination`]: slidesCount > PAGINATION_ITEMS_MAX
528
- }),
529
- children: [/*#__PURE__*/jsx(IconButton, {
530
- ...previousButtonProps,
531
- icon: mdiChevronLeft,
532
- className: `${CLASSNAME$1}__navigation`,
533
- color: theme === Theme.dark ? 'light' : 'dark',
534
- emphasis: Emphasis.low,
535
- onClick: onPreviousClick
536
- }), /*#__PURE__*/jsx("div", {
537
- ref: paginationRef,
538
- className: `${CLASSNAME$1}__pagination`,
539
- children: /*#__PURE__*/jsx("div", {
540
- className: `${CLASSNAME$1}__pagination-items`,
541
- style: wrapperStyle,
542
- role: "tablist",
543
- ...paginationProps,
544
- children: useMemo(() => range(slidesCount).map(index => {
545
- const isOnEdge = index !== 0 && index !== slidesCount - 1 && (index === visibleRange.min || index === visibleRange.max);
546
- const isActive = activeIndex === index;
547
- const isOutRange = index < visibleRange.min || index > visibleRange.max;
548
- const {
549
- className: itemClassName = undefined,
550
- label = undefined,
551
- ...itemProps
552
- } = paginationItemProps ? paginationItemProps(index) : {};
553
- const ariaLabel = label || paginationItemLabel?.(index) || `${index + 1} / ${slidesCount}`;
554
- return /*#__PURE__*/jsx("button", {
555
- className: classNames(handleBasicClasses({
556
- prefix: `${CLASSNAME$1}__pagination-item`,
557
- isActive,
558
- isOnEdge,
559
- isOutRange
560
- }), itemClassName),
561
- type: "button",
562
- tabIndex: isActive ? undefined : -1,
563
- role: "tab",
564
- "aria-selected": isActive,
565
- onClick: () => onPaginationClick?.(index),
566
- "aria-label": ariaLabel,
567
- ...itemProps
568
- }, index);
569
- }), [slidesCount, visibleRange.min, visibleRange.max, activeIndex, paginationItemProps, paginationItemLabel, onPaginationClick])
570
- })
571
- }), playButtonProps ? /*#__PURE__*/jsx(IconButton, {
572
- ...playButtonProps,
573
- icon: isAutoPlaying ? mdiPauseCircleOutline : mdiPlayCircleOutline,
574
- className: `${CLASSNAME$1}__play`,
575
- color: theme === Theme.dark ? 'light' : 'dark',
576
- emphasis: Emphasis.low
577
- }) : null, /*#__PURE__*/jsx(IconButton, {
578
- ...nextButtonProps,
579
- icon: mdiChevronRight,
580
- className: `${CLASSNAME$1}__navigation`,
581
- color: theme === Theme.dark ? 'light' : 'dark',
582
- emphasis: Emphasis.low,
583
- onClick: onNextClick
584
- })]
585
- });
586
- });
587
- InternalSlideshowControls.displayName = COMPONENT_NAME$1;
588
- InternalSlideshowControls.className = CLASSNAME$1;
589
- InternalSlideshowControls.defaultProps = DEFAULT_PROPS;
590
- const SlideshowControls = Object.assign(InternalSlideshowControls, {
591
- useSlideshowControls,
592
- useSlideshowControlsDefaultOptions: DEFAULT_OPTIONS
593
- });
594
-
595
- /**
596
- * Component display name.
597
- */
598
- const COMPONENT_NAME = 'Slideshow';
599
-
600
- /**
601
- * Component default class name and class prefix.
602
- */
603
- const CLASSNAME = getRootClassName(COMPONENT_NAME);
604
-
605
- /**
606
- * Slides component.
607
- *
608
- * @param props Component props.
609
- * @param ref Component ref.
610
- * @return React element.
611
- */
612
- const Slides = forwardRef((props, ref) => {
613
- const defaultTheme = useTheme();
614
- const {
615
- activeIndex,
616
- id,
617
- className,
618
- theme = defaultTheme,
619
- fillHeight,
620
- groupBy,
621
- isAutoPlaying,
622
- toggleAutoPlay,
623
- slidesId,
624
- children,
625
- afterSlides,
626
- hasControls,
627
- slideGroupLabel,
628
- ...forwardedProps
629
- } = props;
630
- const wrapperRef = React__default.useRef(null);
631
- const startIndexVisible = activeIndex;
632
- const endIndexVisible = startIndexVisible + 1;
633
-
634
- // Inline style of wrapper element.
635
- const wrapperStyle = {
636
- transform: `translateX(-${FULL_WIDTH_PERCENT * activeIndex}%)`
637
- };
638
- const groups = React__default.useMemo(() => {
639
- const childrenArray = Children.toArray(children);
640
- return groupBy && groupBy > 1 ? chunk(childrenArray, groupBy) : childrenArray;
641
- }, [children, groupBy]);
642
- return /*#__PURE__*/jsxs("section", {
643
- id: id,
644
- ref: ref,
645
- ...forwardedProps,
646
- className: classNames(className, handleBasicClasses({
647
- prefix: CLASSNAME,
648
- theme
649
- }), {
650
- [`${CLASSNAME}--fill-height`]: fillHeight,
651
- [`${CLASSNAME}--group-by-${groupBy}`]: Boolean(groupBy)
652
- }),
653
- "aria-roledescription": "carousel",
654
- children: [/*#__PURE__*/jsx("div", {
655
- id: slidesId,
656
- className: `${CLASSNAME}__slides`,
657
- onMouseEnter: toggleAutoPlay,
658
- onMouseLeave: toggleAutoPlay,
659
- "aria-live": isAutoPlaying ? 'off' : 'polite',
660
- children: /*#__PURE__*/jsx("div", {
661
- ref: wrapperRef,
662
- className: `${CLASSNAME}__wrapper`,
663
- style: wrapperStyle,
664
- children: groups.map((group, index) => /*#__PURE__*/jsx(SlideshowItemGroup, {
665
- id: slidesId && buildSlideShowGroupId(slidesId, index),
666
- role: hasControls ? 'tabpanel' : 'group',
667
- label: slideGroupLabel ? slideGroupLabel(index + 1, groups.length) : undefined,
668
- isDisplayed: index >= startIndexVisible && index < endIndexVisible,
669
- children: group
670
- }, index))
671
- })
672
- }), afterSlides]
673
- });
674
- });
675
- Slides.displayName = COMPONENT_NAME;
676
- Slides.className = CLASSNAME;
677
-
678
- export { DEFAULT_OPTIONS as D, SlideshowItem as S, SlideshowControls as a, Slides as b, buildSlideShowGroupId as c };
679
- //# sourceMappingURL=Slides-83646e84.js.map