@lumx/react 3.20.1-alpha.12 → 3.20.1-alpha.14

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 (721) hide show
  1. package/_internal/index.js +236 -0
  2. package/_internal/index.js.map +1 -0
  3. package/index.d.ts +1 -1
  4. package/index.js +14440 -65
  5. package/index.js.map +1 -1
  6. package/package.json +11 -3
  7. package/src/components/alert-dialog/AlertDialog.stories.tsx +127 -0
  8. package/src/components/alert-dialog/AlertDialog.test.tsx +34 -0
  9. package/src/components/alert-dialog/AlertDialog.tsx +189 -0
  10. package/src/components/alert-dialog/index.ts +1 -0
  11. package/src/components/autocomplete/Autocomplete.stories.tsx +75 -0
  12. package/src/components/autocomplete/Autocomplete.test.tsx +99 -0
  13. package/src/components/autocomplete/Autocomplete.tsx +294 -0
  14. package/src/components/autocomplete/AutocompleteMultiple.stories.tsx +167 -0
  15. package/src/components/autocomplete/AutocompleteMultiple.test.tsx +61 -0
  16. package/src/components/autocomplete/AutocompleteMultiple.tsx +156 -0
  17. package/src/components/autocomplete/__mockData__/index.ts +39 -0
  18. package/src/components/autocomplete/index.ts +2 -0
  19. package/src/components/avatar/Avatar.stories.tsx +119 -0
  20. package/src/components/avatar/Avatar.test.tsx +32 -0
  21. package/src/components/avatar/Avatar.tsx +114 -0
  22. package/src/components/avatar/index.ts +1 -0
  23. package/src/components/badge/Badge.stories.tsx +69 -0
  24. package/src/components/badge/Badge.test.tsx +45 -0
  25. package/src/components/badge/Badge.tsx +58 -0
  26. package/src/components/badge/BadgeWrapper.stories.tsx +75 -0
  27. package/src/components/badge/BadgeWrapper.test.tsx +47 -0
  28. package/src/components/badge/BadgeWrapper.tsx +37 -0
  29. package/src/components/badge/index.ts +2 -0
  30. package/src/components/button/Button.stories.tsx +355 -0
  31. package/src/components/button/Button.test.tsx +125 -0
  32. package/src/components/button/Button.tsx +101 -0
  33. package/src/components/button/ButtonGroup.stories.tsx +52 -0
  34. package/src/components/button/ButtonGroup.test.tsx +41 -0
  35. package/src/components/button/ButtonGroup.tsx +50 -0
  36. package/src/components/button/ButtonRoot.tsx +163 -0
  37. package/src/components/button/IconButton.stories.tsx +52 -0
  38. package/src/components/button/IconButton.test.tsx +66 -0
  39. package/src/components/button/IconButton.tsx +91 -0
  40. package/src/components/button/index.ts +4 -0
  41. package/src/components/checkbox/Checkbox.stories.tsx +64 -0
  42. package/src/components/checkbox/Checkbox.test.tsx +154 -0
  43. package/src/components/checkbox/Checkbox.tsx +164 -0
  44. package/src/components/checkbox/index.ts +1 -0
  45. package/src/components/chip/Chip.stories.tsx +164 -0
  46. package/src/components/chip/Chip.test.tsx +243 -0
  47. package/src/components/chip/Chip.tsx +168 -0
  48. package/src/components/chip/ChipGroup.stories.tsx +47 -0
  49. package/src/components/chip/ChipGroup.test.tsx +37 -0
  50. package/src/components/chip/ChipGroup.tsx +60 -0
  51. package/src/components/chip/index.ts +2 -0
  52. package/src/components/comment-block/CommentBlock.stories.tsx +91 -0
  53. package/src/components/comment-block/CommentBlock.test.tsx +28 -0
  54. package/src/components/comment-block/CommentBlock.tsx +172 -0
  55. package/src/components/comment-block/index.ts +1 -0
  56. package/src/components/date-picker/DatePicker.stories.tsx +118 -0
  57. package/src/components/date-picker/DatePicker.test.tsx +34 -0
  58. package/src/components/date-picker/DatePicker.tsx +52 -0
  59. package/src/components/date-picker/DatePickerControlled.test.tsx +91 -0
  60. package/src/components/date-picker/DatePickerControlled.tsx +259 -0
  61. package/src/components/date-picker/DatePickerField.stories.tsx +100 -0
  62. package/src/components/date-picker/DatePickerField.test.tsx +70 -0
  63. package/src/components/date-picker/DatePickerField.tsx +135 -0
  64. package/src/components/date-picker/constants.ts +11 -0
  65. package/src/components/date-picker/index.ts +4 -0
  66. package/src/components/date-picker/types.ts +28 -0
  67. package/src/components/dialog/Dialog.stories.tsx +318 -0
  68. package/src/components/dialog/Dialog.test.tsx +97 -0
  69. package/src/components/dialog/Dialog.tsx +288 -0
  70. package/src/components/dialog/index.ts +1 -0
  71. package/src/components/divider/Divider.test.tsx +51 -0
  72. package/src/components/divider/Divider.tsx +50 -0
  73. package/src/components/divider/index.ts +1 -0
  74. package/src/components/drag-handle/DragHandle.test.tsx +36 -0
  75. package/src/components/drag-handle/DragHandle.tsx +51 -0
  76. package/src/components/drag-handle/index.ts +1 -0
  77. package/src/components/dropdown/Dropdown.stories.tsx +31 -0
  78. package/src/components/dropdown/Dropdown.test.tsx +66 -0
  79. package/src/components/dropdown/Dropdown.tsx +186 -0
  80. package/src/components/dropdown/index.ts +1 -0
  81. package/src/components/expansion-panel/ExpansionPanel.stories.tsx +91 -0
  82. package/src/components/expansion-panel/ExpansionPanel.test.tsx +185 -0
  83. package/src/components/expansion-panel/ExpansionPanel.tsx +195 -0
  84. package/src/components/expansion-panel/index.ts +1 -0
  85. package/src/components/flag/Flag.stories.tsx +48 -0
  86. package/src/components/flag/Flag.test.tsx +62 -0
  87. package/src/components/flag/Flag.tsx +52 -0
  88. package/src/components/flag/index.ts +1 -0
  89. package/src/components/flex-box/FlexBox.stories.tsx +156 -0
  90. package/src/components/flex-box/FlexBox.test.tsx +24 -0
  91. package/src/components/flex-box/FlexBox.tsx +100 -0
  92. package/src/components/flex-box/index.ts +1 -0
  93. package/src/components/generic-block/GenericBlock.stories.jsx +128 -0
  94. package/src/components/generic-block/GenericBlock.test.tsx +156 -0
  95. package/src/components/generic-block/GenericBlock.tsx +225 -0
  96. package/src/components/generic-block/constants.ts +9 -0
  97. package/src/components/generic-block/index.ts +2 -0
  98. package/src/components/grid/Grid.tsx +83 -0
  99. package/src/components/grid/GridItem.tsx +55 -0
  100. package/src/components/grid/index.ts +2 -0
  101. package/src/components/grid-column/GridColumn.stories.tsx +45 -0
  102. package/src/components/grid-column/GridColumn.test.jsx +56 -0
  103. package/src/components/grid-column/GridColumn.tsx +83 -0
  104. package/src/components/grid-column/index.ts +1 -0
  105. package/src/components/heading/Heading.stories.tsx +69 -0
  106. package/src/components/heading/Heading.test.tsx +82 -0
  107. package/src/components/heading/Heading.tsx +65 -0
  108. package/src/components/heading/HeadingLevelProvider.tsx +30 -0
  109. package/src/components/heading/constants.ts +16 -0
  110. package/src/components/heading/context.tsx +13 -0
  111. package/src/components/heading/index.ts +3 -0
  112. package/src/components/heading/useHeadingLevel.tsx +8 -0
  113. package/src/components/icon/Icon.stories.tsx +73 -0
  114. package/src/components/icon/Icon.test.tsx +125 -0
  115. package/src/components/icon/Icon.tsx +133 -0
  116. package/src/components/icon/index.ts +1 -0
  117. package/src/components/image-block/ImageBlock.stories.tsx +117 -0
  118. package/src/components/image-block/ImageBlock.test.tsx +58 -0
  119. package/src/components/image-block/ImageBlock.tsx +142 -0
  120. package/src/components/image-block/ImageCaption.tsx +115 -0
  121. package/src/components/image-block/index.ts +1 -0
  122. package/src/components/image-lightbox/ImageLightbox.stories.tsx +160 -0
  123. package/src/components/image-lightbox/ImageLightbox.test.tsx +254 -0
  124. package/src/components/image-lightbox/ImageLightbox.tsx +90 -0
  125. package/src/components/image-lightbox/constants.ts +11 -0
  126. package/src/components/image-lightbox/index.ts +2 -0
  127. package/src/components/image-lightbox/internal/ImageSlide.tsx +107 -0
  128. package/src/components/image-lightbox/internal/ImageSlideshow.tsx +164 -0
  129. package/src/components/image-lightbox/internal/useAnimateScroll.ts +55 -0
  130. package/src/components/image-lightbox/internal/usePointerZoom.ts +148 -0
  131. package/src/components/image-lightbox/types.ts +48 -0
  132. package/src/components/image-lightbox/useImageLightbox.tsx +141 -0
  133. package/src/components/inline-list/InlineList.stories.tsx +77 -0
  134. package/src/components/inline-list/InlineList.test.tsx +52 -0
  135. package/src/components/inline-list/InlineList.tsx +96 -0
  136. package/src/components/inline-list/index.ts +1 -0
  137. package/src/components/input-helper/InputHelper.stories.tsx +35 -0
  138. package/src/components/input-helper/InputHelper.test.tsx +55 -0
  139. package/src/components/input-helper/InputHelper.tsx +65 -0
  140. package/src/components/input-helper/constants.ts +11 -0
  141. package/src/components/input-helper/index.ts +1 -0
  142. package/src/components/input-label/InputLabel.stories.tsx +45 -0
  143. package/src/components/input-label/InputLabel.test.tsx +59 -0
  144. package/src/components/input-label/InputLabel.tsx +69 -0
  145. package/src/components/input-label/index.ts +1 -0
  146. package/src/components/lightbox/Lightbox.stories.tsx +101 -0
  147. package/src/components/lightbox/Lightbox.test.tsx +53 -0
  148. package/src/components/lightbox/Lightbox.tsx +180 -0
  149. package/src/components/lightbox/index.ts +1 -0
  150. package/src/components/link/Link.stories.tsx +195 -0
  151. package/src/components/link/Link.test.tsx +127 -0
  152. package/src/components/link/Link.tsx +106 -0
  153. package/src/components/link/index.ts +1 -0
  154. package/src/components/link-preview/LinkPreview.stories.tsx +61 -0
  155. package/src/components/link-preview/LinkPreview.test.tsx +105 -0
  156. package/src/components/link-preview/LinkPreview.tsx +158 -0
  157. package/src/components/link-preview/index.ts +1 -0
  158. package/src/components/list/List.stories.tsx +116 -0
  159. package/src/components/list/List.test.tsx +18 -0
  160. package/src/components/list/List.tsx +104 -0
  161. package/src/components/list/ListDivider.stories.tsx +12 -0
  162. package/src/components/list/ListDivider.test.tsx +22 -0
  163. package/src/components/list/ListDivider.tsx +35 -0
  164. package/src/components/list/ListItem.stories.tsx +66 -0
  165. package/src/components/list/ListItem.test.tsx +93 -0
  166. package/src/components/list/ListItem.tsx +157 -0
  167. package/src/components/list/ListSubheader.stories.tsx +11 -0
  168. package/src/components/list/ListSubheader.test.tsx +21 -0
  169. package/src/components/list/ListSubheader.tsx +44 -0
  170. package/src/components/list/index.ts +4 -0
  171. package/src/components/list/useInteractiveList.tsx +202 -0
  172. package/src/components/message/Message.stories.tsx +72 -0
  173. package/src/components/message/Message.test.tsx +76 -0
  174. package/src/components/message/Message.tsx +100 -0
  175. package/src/components/message/index.ts +1 -0
  176. package/src/components/mosaic/Mosaic.stories.tsx +89 -0
  177. package/src/components/mosaic/Mosaic.test.tsx +77 -0
  178. package/src/components/mosaic/Mosaic.tsx +98 -0
  179. package/src/components/mosaic/index.ts +1 -0
  180. package/src/components/navigation/Navigation.stories.tsx +234 -0
  181. package/src/components/navigation/Navigation.test.tsx +65 -0
  182. package/src/components/navigation/Navigation.tsx +79 -0
  183. package/src/components/navigation/NavigationItem.test.tsx +35 -0
  184. package/src/components/navigation/NavigationItem.tsx +82 -0
  185. package/src/components/navigation/NavigationSection.test.tsx +137 -0
  186. package/src/components/navigation/NavigationSection.tsx +108 -0
  187. package/src/components/navigation/context.tsx +7 -0
  188. package/src/components/navigation/index.ts +1 -0
  189. package/src/components/notification/Notification.test.tsx +94 -0
  190. package/src/components/notification/Notification.tsx +138 -0
  191. package/src/components/notification/Notifications.stories.tsx +92 -0
  192. package/src/components/notification/constants.ts +28 -0
  193. package/src/components/notification/index.ts +1 -0
  194. package/src/components/popover/Popover.stories.tsx +264 -0
  195. package/src/components/popover/Popover.test.tsx +62 -0
  196. package/src/components/popover/Popover.tsx +201 -0
  197. package/src/components/popover/constants.ts +62 -0
  198. package/src/components/popover/index.ts +3 -0
  199. package/src/components/popover/usePopoverStyle.tsx +184 -0
  200. package/src/components/popover/useRestoreFocusOnClose.tsx +47 -0
  201. package/src/components/popover-dialog/PopoverDialog.stories.tsx +64 -0
  202. package/src/components/popover-dialog/PopoverDialog.test.tsx +139 -0
  203. package/src/components/popover-dialog/PopoverDialog.tsx +74 -0
  204. package/src/components/popover-dialog/index.tsx +1 -0
  205. package/src/components/post-block/PostBlock.test.tsx +27 -0
  206. package/src/components/post-block/PostBlock.tsx +122 -0
  207. package/src/components/post-block/index.ts +1 -0
  208. package/src/components/progress/Progress.tsx +68 -0
  209. package/src/components/progress/ProgressCircular.stories.tsx +43 -0
  210. package/src/components/progress/ProgressCircular.test.tsx +46 -0
  211. package/src/components/progress/ProgressCircular.tsx +82 -0
  212. package/src/components/progress/ProgressLinear.stories.tsx +12 -0
  213. package/src/components/progress/ProgressLinear.test.tsx +30 -0
  214. package/src/components/progress/ProgressLinear.tsx +50 -0
  215. package/src/components/progress/index.ts +3 -0
  216. package/src/components/progress-tracker/ProgressTracker.stories.tsx +145 -0
  217. package/src/components/progress-tracker/ProgressTracker.test.tsx +42 -0
  218. package/src/components/progress-tracker/ProgressTracker.tsx +87 -0
  219. package/src/components/progress-tracker/ProgressTrackerProvider.test.tsx +65 -0
  220. package/src/components/progress-tracker/ProgressTrackerProvider.tsx +67 -0
  221. package/src/components/progress-tracker/ProgressTrackerStep.test.tsx +36 -0
  222. package/src/components/progress-tracker/ProgressTrackerStep.tsx +159 -0
  223. package/src/components/progress-tracker/ProgressTrackerStepPanel.test.tsx +34 -0
  224. package/src/components/progress-tracker/ProgressTrackerStepPanel.tsx +67 -0
  225. package/src/components/progress-tracker/index.ts +4 -0
  226. package/src/components/radio-button/RadioButton.stories.tsx +71 -0
  227. package/src/components/radio-button/RadioButton.test.tsx +143 -0
  228. package/src/components/radio-button/RadioButton.tsx +143 -0
  229. package/src/components/radio-button/RadioGroup.stories.tsx +39 -0
  230. package/src/components/radio-button/RadioGroup.test.tsx +29 -0
  231. package/src/components/radio-button/RadioGroup.tsx +44 -0
  232. package/src/components/radio-button/index.ts +2 -0
  233. package/src/components/select/Select.stories.tsx +385 -0
  234. package/src/components/select/Select.test.tsx +199 -0
  235. package/src/components/select/Select.tsx +199 -0
  236. package/src/components/select/SelectMultiple.stories.tsx +315 -0
  237. package/src/components/select/SelectMultiple.test.tsx +213 -0
  238. package/src/components/select/SelectMultiple.tsx +206 -0
  239. package/src/components/select/WithSelectContext.tsx +147 -0
  240. package/src/components/select/constants.ts +55 -0
  241. package/src/components/select/index.ts +2 -0
  242. package/src/components/side-navigation/SideNavigation.stories.tsx +191 -0
  243. package/src/components/side-navigation/SideNavigation.test.tsx +37 -0
  244. package/src/components/side-navigation/SideNavigation.tsx +52 -0
  245. package/src/components/side-navigation/SideNavigationItem.stories.tsx +133 -0
  246. package/src/components/side-navigation/SideNavigationItem.test.tsx +136 -0
  247. package/src/components/side-navigation/SideNavigationItem.tsx +165 -0
  248. package/src/components/side-navigation/index.ts +2 -0
  249. package/src/components/skeleton/SkeletonCircle.stories.tsx +41 -0
  250. package/src/components/skeleton/SkeletonCircle.test.tsx +27 -0
  251. package/src/components/skeleton/SkeletonCircle.tsx +52 -0
  252. package/src/components/skeleton/SkeletonRectangle.stories.tsx +82 -0
  253. package/src/components/skeleton/SkeletonRectangle.test.tsx +27 -0
  254. package/src/components/skeleton/SkeletonRectangle.tsx +88 -0
  255. package/src/components/skeleton/SkeletonTypography.stories.tsx +19 -0
  256. package/src/components/skeleton/SkeletonTypography.test.tsx +27 -0
  257. package/src/components/skeleton/SkeletonTypography.tsx +59 -0
  258. package/src/components/skeleton/index.ts +3 -0
  259. package/src/components/slider/Slider.stories.tsx +45 -0
  260. package/src/components/slider/Slider.test.tsx +29 -0
  261. package/src/components/slider/Slider.tsx +299 -0
  262. package/src/components/slider/index.ts +2 -0
  263. package/src/components/slideshow/Slides.tsx +130 -0
  264. package/src/components/slideshow/Slideshow.stories.tsx +179 -0
  265. package/src/components/slideshow/Slideshow.test.tsx +35 -0
  266. package/src/components/slideshow/Slideshow.tsx +173 -0
  267. package/src/components/slideshow/SlideshowControls.stories.tsx +100 -0
  268. package/src/components/slideshow/SlideshowControls.tsx +243 -0
  269. package/src/components/slideshow/SlideshowItem.tsx +44 -0
  270. package/src/components/slideshow/SlideshowItemGroup.tsx +60 -0
  271. package/src/components/slideshow/constants.ts +24 -0
  272. package/src/components/slideshow/index.ts +4 -0
  273. package/src/components/slideshow/useKeyNavigate.ts +28 -0
  274. package/src/components/slideshow/usePaginationVisibleRange.ts +37 -0
  275. package/src/components/slideshow/useSlideFocusManagement.tsx +92 -0
  276. package/src/components/slideshow/useSwipeNavigate.ts +18 -0
  277. package/src/components/switch/Switch.stories.tsx +49 -0
  278. package/src/components/switch/Switch.test.tsx +144 -0
  279. package/src/components/switch/Switch.tsx +145 -0
  280. package/src/components/switch/index.ts +1 -0
  281. package/src/components/table/Table.test.tsx +29 -0
  282. package/src/components/table/Table.tsx +59 -0
  283. package/src/components/table/TableBody.test.tsx +30 -0
  284. package/src/components/table/TableBody.tsx +42 -0
  285. package/src/components/table/TableCell.test.tsx +72 -0
  286. package/src/components/table/TableCell.tsx +130 -0
  287. package/src/components/table/TableHeader.test.tsx +30 -0
  288. package/src/components/table/TableHeader.tsx +48 -0
  289. package/src/components/table/TableRow.test.tsx +40 -0
  290. package/src/components/table/TableRow.tsx +71 -0
  291. package/src/components/table/index.ts +5 -0
  292. package/src/components/tabs/Tab.test.tsx +50 -0
  293. package/src/components/tabs/Tab.tsx +133 -0
  294. package/src/components/tabs/TabList.test.tsx +49 -0
  295. package/src/components/tabs/TabList.tsx +94 -0
  296. package/src/components/tabs/TabPanel.test.tsx +37 -0
  297. package/src/components/tabs/TabPanel.tsx +67 -0
  298. package/src/components/tabs/TabProvider.test.tsx +161 -0
  299. package/src/components/tabs/TabProvider.tsx +67 -0
  300. package/src/components/tabs/Tabs.stories.tsx +170 -0
  301. package/src/components/tabs/index.ts +4 -0
  302. package/src/components/tabs/state.ts +114 -0
  303. package/src/components/tabs/test-utils.ts +39 -0
  304. package/src/components/text/Text.stories.tsx +177 -0
  305. package/src/components/text/Text.test.tsx +92 -0
  306. package/src/components/text/Text.tsx +139 -0
  307. package/src/components/text/index.ts +1 -0
  308. package/src/components/text-field/TextField.stories.tsx +180 -0
  309. package/src/components/text-field/TextField.test.tsx +298 -0
  310. package/src/components/text-field/TextField.tsx +493 -0
  311. package/src/components/text-field/index.ts +1 -0
  312. package/src/components/thumbnail/Thumbnail.stories.tsx +448 -0
  313. package/src/components/thumbnail/Thumbnail.test.tsx +88 -0
  314. package/src/components/thumbnail/Thumbnail.tsx +248 -0
  315. package/src/components/thumbnail/index.ts +3 -0
  316. package/src/components/thumbnail/types.ts +48 -0
  317. package/src/components/thumbnail/useFocusPointStyle.test.ts +92 -0
  318. package/src/components/thumbnail/useFocusPointStyle.tsx +107 -0
  319. package/src/components/thumbnail/useImageLoad.ts +40 -0
  320. package/src/components/toolbar/Toolbar.tsx +68 -0
  321. package/src/components/toolbar/index.ts +1 -0
  322. package/src/components/tooltip/Tooltip.stories.tsx +118 -0
  323. package/src/components/tooltip/Tooltip.test.tsx +417 -0
  324. package/src/components/tooltip/Tooltip.tsx +165 -0
  325. package/src/components/tooltip/constants.ts +8 -0
  326. package/src/components/tooltip/context.tsx +17 -0
  327. package/src/components/tooltip/index.ts +1 -0
  328. package/src/components/tooltip/useInjectTooltipRef.tsx +55 -0
  329. package/src/components/tooltip/useTooltipOpen.tsx +143 -0
  330. package/src/components/uploader/Uploader.stories.tsx +109 -0
  331. package/src/components/uploader/Uploader.test.tsx +146 -0
  332. package/src/components/uploader/Uploader.tsx +177 -0
  333. package/src/components/uploader/index.ts +1 -0
  334. package/src/components/user-block/UserBlock.stories.tsx +133 -0
  335. package/src/components/user-block/UserBlock.test.tsx +106 -0
  336. package/src/components/user-block/UserBlock.tsx +193 -0
  337. package/src/components/user-block/index.ts +1 -0
  338. package/src/constants.ts +27 -0
  339. package/src/hooks/useBooleanState.tsx +13 -0
  340. package/src/hooks/useCallbackOnEscape.ts +34 -0
  341. package/src/hooks/useChipGroupNavigation.tsx +75 -0
  342. package/src/hooks/useClickAway.tsx +48 -0
  343. package/src/hooks/useDisableBodyScroll.ts +28 -0
  344. package/src/hooks/useEventCallback.tsx +17 -0
  345. package/src/hooks/useFocus.tsx +21 -0
  346. package/src/hooks/useFocusTrap.ts +93 -0
  347. package/src/hooks/useFocusWithin.ts +33 -0
  348. package/src/hooks/useId.test.tsx +22 -0
  349. package/src/hooks/useId.ts +15 -0
  350. package/src/hooks/useImageSize.ts +17 -0
  351. package/src/hooks/useInfiniteScroll.tsx +60 -0
  352. package/src/hooks/useIntersectionObserver.tsx +43 -0
  353. package/src/hooks/useInterval.tsx +31 -0
  354. package/src/hooks/useKeyboardListNavigation.tsx +204 -0
  355. package/src/hooks/useListenFocus.tsx +26 -0
  356. package/src/hooks/useOverflowTooltipLabel.tsx +32 -0
  357. package/src/hooks/usePopper.ts +12 -0
  358. package/src/hooks/usePreviousValue.ts +12 -0
  359. package/src/hooks/useRovingTabIndex.tsx +90 -0
  360. package/src/hooks/useSizeOnWindowResize.ts +30 -0
  361. package/src/hooks/useSlideshowControls.ts +246 -0
  362. package/src/hooks/useStopPropagation.ts +21 -0
  363. package/src/hooks/useTransitionVisibility.ts +48 -0
  364. package/src/index.ts +63 -0
  365. package/src/stories/controls/color.ts +7 -0
  366. package/src/stories/controls/element.ts +6 -0
  367. package/src/stories/controls/focusPoint.ts +1 -0
  368. package/src/stories/controls/icons.ts +126 -0
  369. package/src/stories/controls/image.ts +84 -0
  370. package/src/stories/controls/selectArgType.ts +8 -0
  371. package/src/stories/controls/theme.ts +3 -0
  372. package/src/stories/controls/typography.ts +5 -0
  373. package/src/stories/controls/withUndefined.ts +1 -0
  374. package/src/stories/decorators/withChromaticForceScreenSize.tsx +7 -0
  375. package/src/stories/decorators/withCombinations.tsx +132 -0
  376. package/src/stories/decorators/withNestedProps.tsx +22 -0
  377. package/src/stories/decorators/withResizableBox.tsx +21 -0
  378. package/src/stories/decorators/withThemedBackground.tsx +16 -0
  379. package/src/stories/decorators/withValueOnChange.tsx +18 -0
  380. package/src/stories/decorators/withWrapper.tsx +19 -0
  381. package/src/stories/generated/Autocomplete/Demos.stories.tsx +7 -0
  382. package/src/stories/generated/Avatar/Demos.stories.tsx +7 -0
  383. package/src/stories/generated/Badge/Demos.stories.tsx +9 -0
  384. package/src/stories/generated/Button/Demos.stories.tsx +11 -0
  385. package/src/stories/generated/Checkbox/Demos.stories.tsx +6 -0
  386. package/src/stories/generated/Chip/Demos.stories.tsx +11 -0
  387. package/src/stories/generated/CommentBlock/Demos.stories.tsx +8 -0
  388. package/src/stories/generated/DatePicker/Demos.stories.tsx +8 -0
  389. package/src/stories/generated/Dialog/Demos.stories.tsx +10 -0
  390. package/src/stories/generated/Divider/Demos.stories.tsx +6 -0
  391. package/src/stories/generated/Dropdown/Demos.stories.tsx +8 -0
  392. package/src/stories/generated/ExpansionPanel/Demos.stories.tsx +9 -0
  393. package/src/stories/generated/Flag/Demos.stories.tsx +6 -0
  394. package/src/stories/generated/GenericBlock/Demos.stories.tsx +8 -0
  395. package/src/stories/generated/Heading/Demos.stories.tsx +6 -0
  396. package/src/stories/generated/Icon/Demos.stories.tsx +8 -0
  397. package/src/stories/generated/ImageBlock/Demos.stories.tsx +9 -0
  398. package/src/stories/generated/ImageLightbox/Demos.stories.tsx +6 -0
  399. package/src/stories/generated/Lightbox/Demos.stories.tsx +6 -0
  400. package/src/stories/generated/LinkPreview/Demos.stories.tsx +7 -0
  401. package/src/stories/generated/List/Demos.stories.tsx +11 -0
  402. package/src/stories/generated/Message/Demos.stories.tsx +11 -0
  403. package/src/stories/generated/Mosaic/Demos.stories.tsx +10 -0
  404. package/src/stories/generated/Notification/Demos.stories.tsx +6 -0
  405. package/src/stories/generated/Popover/Demos.stories.tsx +11 -0
  406. package/src/stories/generated/PopoverDialog/Demos.stories.tsx +6 -0
  407. package/src/stories/generated/PostBlock/Demos.stories.tsx +6 -0
  408. package/src/stories/generated/Progress/Demos.stories.tsx +7 -0
  409. package/src/stories/generated/ProgressTracker/Demos.stories.tsx +9 -0
  410. package/src/stories/generated/RadioButton/Demos.stories.tsx +6 -0
  411. package/src/stories/generated/Select/Demos.stories.tsx +14 -0
  412. package/src/stories/generated/SideNavigation/Demos.stories.tsx +10 -0
  413. package/src/stories/generated/Skeleton/Demos.stories.tsx +9 -0
  414. package/src/stories/generated/Slider/Demos.stories.tsx +9 -0
  415. package/src/stories/generated/Slideshow/Demos.stories.tsx +8 -0
  416. package/src/stories/generated/Switch/Demos.stories.tsx +6 -0
  417. package/src/stories/generated/Table/Demos.stories.tsx +7 -0
  418. package/src/stories/generated/Tabs/Demos.stories.tsx +8 -0
  419. package/src/stories/generated/TextField/Demos.stories.tsx +20 -0
  420. package/src/stories/generated/Thumbnail/Demos.stories.tsx +12 -0
  421. package/src/stories/generated/Toolbar/Demos.stories.tsx +10 -0
  422. package/src/stories/generated/Tooltip/Demos.stories.tsx +8 -0
  423. package/src/stories/generated/Uploader/Demos.stories.tsx +8 -0
  424. package/src/stories/generated/UserBlock/Demos.stories.tsx +11 -0
  425. package/src/stories/utils/CustomLink.tsx +12 -0
  426. package/src/stories/utils/concatPath.tsx +17 -0
  427. package/src/stories/utils/disableArgTypes.ts +3 -0
  428. package/src/stories/utils/initDemoShadowDOMPortal.ts +10 -0
  429. package/src/stories/utils/lorem.ts +59 -0
  430. package/src/stories/utils/theming.tsx +166 -0
  431. package/src/stories/utils/toFlattenProps.ts +28 -0
  432. package/src/stories/utils/withCategory.ts +12 -0
  433. package/src/testing/utils/ThemeSentinel.tsx +10 -0
  434. package/src/testing/utils/commonTestsSuiteRTL.tsx +193 -0
  435. package/src/testing/utils/index.ts +1 -0
  436. package/src/testing/utils/queries.ts +19 -0
  437. package/src/untypped-modules.d.ts +9 -0
  438. package/src/utils/ClickAwayProvider/ClickAwayProvider.stories.jsx +70 -0
  439. package/src/utils/ClickAwayProvider/ClickAwayProvider.tsx +69 -0
  440. package/src/utils/ClickAwayProvider/index.ts +1 -0
  441. package/src/utils/MaterialThemeSwitcher/MaterialThemeSwitcher.tsx +54 -0
  442. package/src/utils/MaterialThemeSwitcher/index.ts +1 -0
  443. package/src/utils/Portal/Portal.test.tsx +31 -0
  444. package/src/utils/Portal/Portal.tsx +33 -0
  445. package/src/utils/Portal/PortalProvider.stories.jsx +22 -0
  446. package/src/utils/Portal/PortalProvider.test.tsx +72 -0
  447. package/src/utils/Portal/PortalProvider.tsx +24 -0
  448. package/src/utils/Portal/index.tsx +2 -0
  449. package/src/utils/browser/DOM/findImage.tsx +3 -0
  450. package/src/utils/browser/DOM/startViewTransition.ts +68 -0
  451. package/src/utils/browser/focus/constants.ts +7 -0
  452. package/src/utils/browser/focus/getFirstAndLastFocusable.test.ts +134 -0
  453. package/src/utils/browser/focus/getFirstAndLastFocusable.ts +21 -0
  454. package/src/utils/browser/focus/getFocusableElements.test.ts +151 -0
  455. package/src/utils/browser/focus/getFocusableElements.ts +7 -0
  456. package/src/utils/browser/isFocusVisible.ts +9 -0
  457. package/src/utils/browser/isHoverNotSupported.test.js +24 -0
  458. package/src/utils/browser/isHoverNotSupported.ts +2 -0
  459. package/src/utils/browser/isReducedMotion.ts +6 -0
  460. package/src/utils/date/addMonthResetDay.test.ts +13 -0
  461. package/src/utils/date/addMonthResetDay.ts +9 -0
  462. package/src/utils/date/formatDayNumber.test.ts +12 -0
  463. package/src/utils/date/formatDayNumber.ts +5 -0
  464. package/src/utils/date/getFirstDayOfWeek.test.ts +20 -0
  465. package/src/utils/date/getFirstDayOfWeek.ts +59 -0
  466. package/src/utils/date/getMonthCalendar.test.ts +127 -0
  467. package/src/utils/date/getMonthCalendar.ts +69 -0
  468. package/src/utils/date/getWeekDays.test.ts +48 -0
  469. package/src/utils/date/getWeekDays.ts +34 -0
  470. package/src/utils/date/getYearDisplayName.test.ts +20 -0
  471. package/src/utils/date/getYearDisplayName.ts +12 -0
  472. package/src/utils/date/isDateValid.test.ts +15 -0
  473. package/src/utils/date/isDateValid.ts +4 -0
  474. package/src/utils/date/isSameDay.test.ts +37 -0
  475. package/src/utils/date/isSameDay.ts +11 -0
  476. package/src/utils/disabled/DisabledStateContext.tsx +29 -0
  477. package/src/utils/disabled/DisabledStateProvider.stories.tsx +92 -0
  478. package/src/utils/disabled/index.ts +2 -0
  479. package/src/utils/disabled/useDisableStateProps.test.tsx +74 -0
  480. package/src/utils/disabled/useDisableStateProps.tsx +37 -0
  481. package/src/utils/function/makeListenerTowerContext.ts +32 -0
  482. package/src/utils/index.ts +7 -0
  483. package/src/utils/locale/getCurrentLocale.ts +4 -0
  484. package/src/utils/locale/parseLocale.test.ts +17 -0
  485. package/src/utils/locale/parseLocale.ts +23 -0
  486. package/src/utils/locale/types.ts +8 -0
  487. package/src/utils/number/clamp.ts +17 -0
  488. package/src/utils/object/isEqual.test.ts +25 -0
  489. package/src/utils/object/isEqual.ts +11 -0
  490. package/src/utils/partitionMulti.test.ts +27 -0
  491. package/{_internal/4daccdd5.js → src/utils/partitionMulti.ts} +9 -5
  492. package/src/utils/react/OnBeforeUnmount.tsx +20 -0
  493. package/src/utils/react/RawClickable.test.tsx +153 -0
  494. package/src/utils/react/RawClickable.tsx +65 -0
  495. package/src/utils/react/flattenChildren.ts +32 -0
  496. package/src/utils/react/forwardRef.ts +11 -0
  497. package/src/utils/react/forwardRefPolymorphic.ts +9 -0
  498. package/src/utils/react/mergeRefs.ts +33 -0
  499. package/src/utils/react/renderLink.tsx +17 -0
  500. package/src/utils/react/skipRender.tsx +18 -0
  501. package/src/utils/react/unref.ts +7 -0
  502. package/src/utils/react/wrapChildrenIconWithSpaces.test.tsx +37 -0
  503. package/src/utils/react/wrapChildrenIconWithSpaces.tsx +22 -0
  504. package/src/utils/theme/ThemeContext.ts +16 -0
  505. package/src/utils/theme/invertTheme.ts +4 -0
  506. package/src/utils/type/Comp.ts +14 -0
  507. package/src/utils/type/ComponentRef.ts +16 -0
  508. package/src/utils/type/HasAriaDisabled.ts +6 -0
  509. package/src/utils/type/HasPolymorphicAs.ts +6 -0
  510. package/src/utils/type/HasRequiredLinkHref.ts +1 -0
  511. package/src/utils/type/MaybeElementOrRef.ts +6 -0
  512. package/src/utils/type/index.ts +9 -0
  513. package/src/utils/type/isComponent.ts +33 -0
  514. package/src/utils/type/isComponentType.ts +9 -0
  515. package/utils/index.d.ts +1 -1
  516. package/utils/index.js +1 -3
  517. package/utils/index.js.map +1 -1
  518. package/_internal/0420e67b.js +0 -119
  519. package/_internal/0420e67b.js.map +0 -1
  520. package/_internal/0a490b07.js +0 -75
  521. package/_internal/0a490b07.js.map +0 -1
  522. package/_internal/0b9c76cb.js +0 -6
  523. package/_internal/0b9c76cb.js.map +0 -1
  524. package/_internal/0be1006e.js +0 -97
  525. package/_internal/0be1006e.js.map +0 -1
  526. package/_internal/0d1a078c.js +0 -144
  527. package/_internal/0d1a078c.js.map +0 -1
  528. package/_internal/15eab19b.js +0 -75
  529. package/_internal/15eab19b.js.map +0 -1
  530. package/_internal/179a84d1.js +0 -259
  531. package/_internal/179a84d1.js.map +0 -1
  532. package/_internal/193521fa.js +0 -52
  533. package/_internal/193521fa.js.map +0 -1
  534. package/_internal/1a90ea3d.js +0 -51
  535. package/_internal/1a90ea3d.js.map +0 -1
  536. package/_internal/1deba7d7.js +0 -224
  537. package/_internal/1deba7d7.js.map +0 -1
  538. package/_internal/1ea72630.js +0 -146
  539. package/_internal/1ea72630.js.map +0 -1
  540. package/_internal/21b83d16.js +0 -137
  541. package/_internal/21b83d16.js.map +0 -1
  542. package/_internal/230173a8.js +0 -13
  543. package/_internal/230173a8.js.map +0 -1
  544. package/_internal/297bed8f.js +0 -457
  545. package/_internal/297bed8f.js.map +0 -1
  546. package/_internal/2a3d237c.js +0 -12
  547. package/_internal/2a3d237c.js.map +0 -1
  548. package/_internal/2c2b6a89.js +0 -52
  549. package/_internal/2c2b6a89.js.map +0 -1
  550. package/_internal/2f1716fa.js +0 -237
  551. package/_internal/2f1716fa.js.map +0 -1
  552. package/_internal/2f6c7f84.js +0 -103
  553. package/_internal/2f6c7f84.js.map +0 -1
  554. package/_internal/3181f000.js +0 -14
  555. package/_internal/3181f000.js.map +0 -1
  556. package/_internal/329b5f12.js +0 -55
  557. package/_internal/329b5f12.js.map +0 -1
  558. package/_internal/332e9844.js +0 -2
  559. package/_internal/332e9844.js.map +0 -1
  560. package/_internal/34c59f5b.js +0 -681
  561. package/_internal/34c59f5b.js.map +0 -1
  562. package/_internal/36bd7352.js +0 -219
  563. package/_internal/36bd7352.js.map +0 -1
  564. package/_internal/370bdaed.js +0 -61
  565. package/_internal/370bdaed.js.map +0 -1
  566. package/_internal/37b007a4.js +0 -20
  567. package/_internal/37b007a4.js.map +0 -1
  568. package/_internal/3a1facc0.js +0 -18
  569. package/_internal/3a1facc0.js.map +0 -1
  570. package/_internal/3a4e4636.js +0 -162
  571. package/_internal/3a4e4636.js.map +0 -1
  572. package/_internal/3e653144.js +0 -49
  573. package/_internal/3e653144.js.map +0 -1
  574. package/_internal/3f86608e.js +0 -45
  575. package/_internal/3f86608e.js.map +0 -1
  576. package/_internal/478b5c92.js +0 -24
  577. package/_internal/478b5c92.js.map +0 -1
  578. package/_internal/4962be5b.js +0 -121
  579. package/_internal/4962be5b.js.map +0 -1
  580. package/_internal/49bbeed3.js +0 -6
  581. package/_internal/49bbeed3.js.map +0 -1
  582. package/_internal/4cd870a5.js +0 -2155
  583. package/_internal/4cd870a5.js.map +0 -1
  584. package/_internal/4daccdd5.js.map +0 -1
  585. package/_internal/501f2f9f.js +0 -58
  586. package/_internal/501f2f9f.js.map +0 -1
  587. package/_internal/5e7b90e2.js +0 -2
  588. package/_internal/5e7b90e2.js.map +0 -1
  589. package/_internal/5ec059fe.js +0 -145
  590. package/_internal/5ec059fe.js.map +0 -1
  591. package/_internal/5f8f9454.js +0 -70
  592. package/_internal/5f8f9454.js.map +0 -1
  593. package/_internal/5fe09341.js +0 -112
  594. package/_internal/5fe09341.js.map +0 -1
  595. package/_internal/628468c4.js +0 -313
  596. package/_internal/628468c4.js.map +0 -1
  597. package/_internal/6589b796.js +0 -280
  598. package/_internal/6589b796.js.map +0 -1
  599. package/_internal/65f91970.js +0 -297
  600. package/_internal/65f91970.js.map +0 -1
  601. package/_internal/66f691d3.js +0 -74
  602. package/_internal/66f691d3.js.map +0 -1
  603. package/_internal/68c10f98.js +0 -166
  604. package/_internal/68c10f98.js.map +0 -1
  605. package/_internal/690ca33e.js +0 -109
  606. package/_internal/690ca33e.js.map +0 -1
  607. package/_internal/6ca04271.js +0 -108
  608. package/_internal/6ca04271.js.map +0 -1
  609. package/_internal/6da19518.js +0 -165
  610. package/_internal/6da19518.js.map +0 -1
  611. package/_internal/7093ba23.js +0 -95
  612. package/_internal/7093ba23.js.map +0 -1
  613. package/_internal/74a4a214.js +0 -82
  614. package/_internal/74a4a214.js.map +0 -1
  615. package/_internal/76be70dd.js +0 -42
  616. package/_internal/76be70dd.js.map +0 -1
  617. package/_internal/78df9309.js +0 -20
  618. package/_internal/78df9309.js.map +0 -1
  619. package/_internal/7b221b05.js +0 -9
  620. package/_internal/7b221b05.js.map +0 -1
  621. package/_internal/7daf0f24.js +0 -77
  622. package/_internal/7daf0f24.js.map +0 -1
  623. package/_internal/7f54e947.js +0 -758
  624. package/_internal/7f54e947.js.map +0 -1
  625. package/_internal/825ac334.js +0 -130
  626. package/_internal/825ac334.js.map +0 -1
  627. package/_internal/827b804a.js +0 -6
  628. package/_internal/827b804a.js.map +0 -1
  629. package/_internal/84dfe68f.js +0 -436
  630. package/_internal/84dfe68f.js.map +0 -1
  631. package/_internal/85e3a5ca.js +0 -145
  632. package/_internal/85e3a5ca.js.map +0 -1
  633. package/_internal/86aa4aa4.js +0 -154
  634. package/_internal/86aa4aa4.js.map +0 -1
  635. package/_internal/88ec77c2.js +0 -130
  636. package/_internal/88ec77c2.js.map +0 -1
  637. package/_internal/8ab42752.js +0 -103
  638. package/_internal/8ab42752.js.map +0 -1
  639. package/_internal/95cfd814.js +0 -70
  640. package/_internal/95cfd814.js.map +0 -1
  641. package/_internal/9a4dfad0.js +0 -326
  642. package/_internal/9a4dfad0.js.map +0 -1
  643. package/_internal/9c9df5f2.js +0 -80
  644. package/_internal/9c9df5f2.js.map +0 -1
  645. package/_internal/9d1336a1.js +0 -19
  646. package/_internal/9d1336a1.js.map +0 -1
  647. package/_internal/9fdc715b.js +0 -152
  648. package/_internal/9fdc715b.js.map +0 -1
  649. package/_internal/a003602b.js +0 -116
  650. package/_internal/a003602b.js.map +0 -1
  651. package/_internal/a34639bd.js +0 -97
  652. package/_internal/a34639bd.js.map +0 -1
  653. package/_internal/a84f4981.js +0 -122
  654. package/_internal/a84f4981.js.map +0 -1
  655. package/_internal/b0a7a999.js +0 -59
  656. package/_internal/b0a7a999.js.map +0 -1
  657. package/_internal/b0b2e33d.js +0 -359
  658. package/_internal/b0b2e33d.js.map +0 -1
  659. package/_internal/b1af5979.js +0 -653
  660. package/_internal/b1af5979.js.map +0 -1
  661. package/_internal/b477da26.js +0 -164
  662. package/_internal/b477da26.js.map +0 -1
  663. package/_internal/b8667090.js +0 -36
  664. package/_internal/b8667090.js.map +0 -1
  665. package/_internal/bae266a9.js +0 -61
  666. package/_internal/bae266a9.js.map +0 -1
  667. package/_internal/be6da9b0.js +0 -296
  668. package/_internal/be6da9b0.js.map +0 -1
  669. package/_internal/c0414b89.js +0 -101
  670. package/_internal/c0414b89.js.map +0 -1
  671. package/_internal/c2388b10.js +0 -58
  672. package/_internal/c2388b10.js.map +0 -1
  673. package/_internal/c459a04d.js +0 -148
  674. package/_internal/c459a04d.js.map +0 -1
  675. package/_internal/c6ca7494.js +0 -2
  676. package/_internal/c6ca7494.js.map +0 -1
  677. package/_internal/cdddaed8.js +0 -116
  678. package/_internal/cdddaed8.js.map +0 -1
  679. package/_internal/d0dd1815.js +0 -10
  680. package/_internal/d0dd1815.js.map +0 -1
  681. package/_internal/d45e3f16.js +0 -15
  682. package/_internal/d45e3f16.js.map +0 -1
  683. package/_internal/d5f316cb.js +0 -62
  684. package/_internal/d5f316cb.js.map +0 -1
  685. package/_internal/db4fdc7b.js +0 -310
  686. package/_internal/db4fdc7b.js.map +0 -1
  687. package/_internal/dbe0cf24.js +0 -75
  688. package/_internal/dbe0cf24.js.map +0 -1
  689. package/_internal/de24f857.js +0 -4
  690. package/_internal/de24f857.js.map +0 -1
  691. package/_internal/e2afb13f.js +0 -75
  692. package/_internal/e2afb13f.js.map +0 -1
  693. package/_internal/e52f0d3f.js +0 -94
  694. package/_internal/e52f0d3f.js.map +0 -1
  695. package/_internal/e6dd117e.js +0 -50
  696. package/_internal/e6dd117e.js.map +0 -1
  697. package/_internal/e806b848.js +0 -9
  698. package/_internal/e806b848.js.map +0 -1
  699. package/_internal/ea04260d.js +0 -29
  700. package/_internal/ea04260d.js.map +0 -1
  701. package/_internal/eaa8b1d8.js +0 -150
  702. package/_internal/eaa8b1d8.js.map +0 -1
  703. package/_internal/eaf6c45a.js +0 -4
  704. package/_internal/eaf6c45a.js.map +0 -1
  705. package/_internal/edab29ce.js +0 -308
  706. package/_internal/edab29ce.js.map +0 -1
  707. package/_internal/ef5d1aac.js +0 -4
  708. package/_internal/ef5d1aac.js.map +0 -1
  709. package/_internal/f0900583.js +0 -142
  710. package/_internal/f0900583.js.map +0 -1
  711. package/_internal/f0d7d6ea.js +0 -30
  712. package/_internal/f0d7d6ea.js.map +0 -1
  713. package/_internal/f23cdf84.js +0 -181
  714. package/_internal/f23cdf84.js.map +0 -1
  715. package/_internal/f52e979e.js +0 -3
  716. package/_internal/f52e979e.js.map +0 -1
  717. package/_internal/f5508d3d.js +0 -792
  718. package/_internal/f5508d3d.js.map +0 -1
  719. package/_internal/f93fe83e.js +0 -46
  720. package/_internal/f93fe83e.js.map +0 -1
  721. /package/_internal/{d95844c1.d.ts → Falsy.d.ts} +0 -0
@@ -0,0 +1,164 @@
1
+ import React from 'react';
2
+
3
+ import { mdiMagnifyMinusOutline, mdiMagnifyPlusOutline } from '@lumx/icons';
4
+ import { FlexBox, IconButton, Slides, SlideshowControls } from '@lumx/react';
5
+ import { mergeRefs } from '@lumx/react/utils/react/mergeRefs';
6
+
7
+ import memoize from 'lodash/memoize';
8
+ import { ImageCaption } from '../../image-block/ImageCaption';
9
+ import { CLASSNAME } from '../constants';
10
+ import type { ImagesProps, InheritedSlideShowProps, ZoomButtonProps } from '../types';
11
+ import { ImageSlide } from './ImageSlide';
12
+
13
+ export interface ImageSlideshowProps extends InheritedSlideShowProps, ZoomButtonProps, ImagesProps {
14
+ currentPaginationItemRef?: React.Ref<HTMLButtonElement>;
15
+ footerRef?: React.Ref<HTMLDivElement>;
16
+ }
17
+
18
+ /** Internal image slideshow component for ImageLightbox */
19
+ export const ImageSlideshow: React.FC<ImageSlideshowProps> = ({
20
+ activeImageIndex,
21
+ images,
22
+ slideGroupLabel,
23
+ zoomInButtonProps,
24
+ zoomOutButtonProps,
25
+ slideshowControlsProps,
26
+ currentPaginationItemRef,
27
+ footerRef,
28
+ activeImageRef,
29
+ }) => {
30
+ const {
31
+ activeIndex,
32
+ slideshowId,
33
+ setSlideshow,
34
+ slideshowSlidesId,
35
+ slidesCount,
36
+ onNextClick,
37
+ onPaginationClick,
38
+ onPreviousClick,
39
+ toggleAutoPlay,
40
+ } = SlideshowControls.useSlideshowControls({
41
+ itemsCount: images.length,
42
+ activeIndex: activeImageIndex,
43
+ });
44
+
45
+ // Image metadata (caption)
46
+ const title = images[activeIndex]?.title;
47
+ const description = images[activeIndex]?.description;
48
+ const tags = images[activeIndex]?.tags;
49
+ const metadata =
50
+ title || description || tags ? (
51
+ <ImageCaption as="div" title={title} description={description} tags={tags} align="center" />
52
+ ) : null;
53
+
54
+ // Slideshow controls
55
+ const slideShowControls =
56
+ slidesCount > 1 && slideshowControlsProps ? (
57
+ <SlideshowControls
58
+ activeIndex={activeIndex}
59
+ slidesCount={slidesCount}
60
+ onNextClick={onNextClick}
61
+ onPreviousClick={onPreviousClick}
62
+ onPaginationClick={onPaginationClick}
63
+ {...slideshowControlsProps}
64
+ paginationItemProps={(index: number) => {
65
+ const props = slideshowControlsProps?.paginationItemProps?.(index) || {};
66
+ return {
67
+ ...props,
68
+ ref: mergeRefs(
69
+ (props as any)?.ref,
70
+ // Focus the active pagination item once on mount
71
+ activeIndex === index ? currentPaginationItemRef : undefined,
72
+ ),
73
+ };
74
+ }}
75
+ />
76
+ ) : null;
77
+
78
+ // Zoom controls
79
+ const [scale, setScale] = React.useState<number | undefined>(undefined);
80
+ const zoomEnabled = zoomInButtonProps && zoomOutButtonProps;
81
+ const onScaleChange = React.useMemo(() => {
82
+ if (!zoomEnabled) return undefined;
83
+ return (newScale: number) => {
84
+ setScale((prevScale = 1) => Math.max(1, newScale * prevScale));
85
+ };
86
+ }, [zoomEnabled]);
87
+ const zoomIn = React.useCallback(() => onScaleChange?.(1.5), [onScaleChange]);
88
+ const zoomOut = React.useCallback(() => onScaleChange?.(0.5), [onScaleChange]);
89
+ React.useEffect(() => {
90
+ // Reset scale on slide change
91
+ if (typeof activeIndex === 'number') setScale(undefined);
92
+ }, [activeIndex]);
93
+ const zoomControls = zoomEnabled && (
94
+ <>
95
+ <IconButton {...zoomInButtonProps} emphasis="low" icon={mdiMagnifyPlusOutline} onClick={zoomIn} />
96
+ <IconButton
97
+ {...zoomOutButtonProps}
98
+ emphasis="low"
99
+ isDisabled={!scale || scale <= 1}
100
+ icon={mdiMagnifyMinusOutline}
101
+ onClick={zoomOut}
102
+ />
103
+ </>
104
+ );
105
+
106
+ const getImgRef = React.useMemo(
107
+ () =>
108
+ memoize(
109
+ (index: number, isActive: boolean) => {
110
+ return mergeRefs(images?.[index].imgRef, isActive ? activeImageRef : undefined);
111
+ },
112
+ // memoize based on both arguments
113
+ (...args) => args.join(),
114
+ ),
115
+ [images, activeImageRef],
116
+ );
117
+
118
+ return (
119
+ <>
120
+ <Slides
121
+ activeIndex={activeIndex}
122
+ slideGroupLabel={slideGroupLabel}
123
+ fillHeight
124
+ id={slideshowId}
125
+ ref={setSlideshow}
126
+ slidesId={slideshowSlidesId}
127
+ toggleAutoPlay={toggleAutoPlay}
128
+ >
129
+ {images.map(({ image, imgRef, ...imageProps }, index) => {
130
+ const isActive = index === activeIndex;
131
+ return (
132
+ <ImageSlide
133
+ isActive={isActive}
134
+ key={image}
135
+ image={{
136
+ ...imageProps,
137
+ image,
138
+ imgRef: getImgRef(index, isActive),
139
+ }}
140
+ scale={isActive ? scale : undefined}
141
+ onScaleChange={onScaleChange}
142
+ />
143
+ );
144
+ })}
145
+ </Slides>
146
+ {(metadata || slideShowControls || zoomControls) && (
147
+ <FlexBox
148
+ ref={footerRef}
149
+ className={`${CLASSNAME}__footer`}
150
+ orientation="vertical"
151
+ vAlign="center"
152
+ gap="big"
153
+ >
154
+ {metadata}
155
+
156
+ <FlexBox className={`${CLASSNAME}__footer-actions`} orientation="horizontal" gap="regular">
157
+ {slideShowControls}
158
+ {zoomControls}
159
+ </FlexBox>
160
+ </FlexBox>
161
+ )}
162
+ </>
163
+ );
164
+ };
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import type { Point, RectSize } from '@lumx/react/utils/type';
3
+
4
+ /** Maintains the scroll position centered relative to the original scroll area's dimensions when the content scales. */
5
+ export function useAnimateScroll(scrollAreaRef: React.RefObject<HTMLDivElement>) {
6
+ return React.useMemo(() => {
7
+ let animationFrame: number | null = null;
8
+
9
+ return function animate(centerPoint?: Point, initialScrollAreaSize?: RectSize) {
10
+ const scrollArea = scrollAreaRef.current as HTMLDivElement;
11
+ if (!scrollArea) {
12
+ return;
13
+ }
14
+
15
+ // Cancel previously running animation
16
+ if (animationFrame) cancelAnimationFrame(animationFrame);
17
+
18
+ // Center on the given point or else on the scroll area visual center
19
+ const clientHeightRatio = centerPoint?.y ? centerPoint.y / scrollArea.clientHeight : 0.5;
20
+ const clientWidthRatio = centerPoint?.x ? centerPoint.x / scrollArea.clientWidth : 0.5;
21
+
22
+ const initialScrollHeight = initialScrollAreaSize?.height || scrollArea.scrollHeight;
23
+ const initialScrollWidth = initialScrollAreaSize?.width || scrollArea.scrollWidth;
24
+
25
+ const heightCenter = scrollArea.scrollTop + scrollArea.clientHeight * clientHeightRatio;
26
+ const heightRatio = heightCenter / initialScrollHeight;
27
+
28
+ const widthCenter = scrollArea.scrollLeft + scrollArea.clientWidth * clientWidthRatio;
29
+ const widthRatio = widthCenter / initialScrollWidth;
30
+
31
+ let prevScrollHeight = 0;
32
+ let prevScrollWidth = 0;
33
+
34
+ function nextFrame() {
35
+ const { scrollHeight, scrollWidth, clientHeight, clientWidth } = scrollArea;
36
+
37
+ // Scroll area stopped expanding => stop animation
38
+ if (scrollHeight === prevScrollHeight && scrollWidth === prevScrollWidth) {
39
+ animationFrame = null;
40
+ return;
41
+ }
42
+
43
+ // Compute next scroll position
44
+ const top = heightRatio * scrollHeight - clientHeight * clientHeightRatio;
45
+ const left = widthRatio * scrollWidth - clientWidth * clientWidthRatio;
46
+
47
+ scrollArea.scrollTo({ top, left });
48
+ prevScrollHeight = scrollHeight;
49
+ prevScrollWidth = scrollWidth;
50
+ animationFrame = requestAnimationFrame(nextFrame);
51
+ }
52
+ animationFrame = requestAnimationFrame(nextFrame);
53
+ };
54
+ }, [scrollAreaRef]);
55
+ }
@@ -0,0 +1,148 @@
1
+ import React from 'react';
2
+ import type { Point } from '@lumx/react/utils/type';
3
+ import type { useAnimateScroll } from './useAnimateScroll';
4
+
5
+ /**
6
+ * Listen to mouse wheel + ctrl and multi-pointer pinch to zoom
7
+ */
8
+ export function usePointerZoom(
9
+ scrollAreaRef: React.RefObject<HTMLDivElement>,
10
+ onScaleChange: ((value: number) => void) | undefined,
11
+ animateScroll: ReturnType<typeof useAnimateScroll>,
12
+ ) {
13
+ const [isPointerZooming, setPointerZooming] = React.useState(false);
14
+ React.useEffect(() => {
15
+ const scrollArea = scrollAreaRef.current as HTMLDivElement;
16
+ if (!scrollArea || !onScaleChange) {
17
+ return undefined;
18
+ }
19
+
20
+ let animationFrame: number | null;
21
+ let zoomStateTimeoutId: ReturnType<typeof setTimeout> | null;
22
+
23
+ function updateScaleOnNextFrame(newScale: number, mousePosition: Point): void {
24
+ // Cancel previously scheduled frame
25
+ if (animationFrame) cancelAnimationFrame(animationFrame);
26
+
27
+ // Cancel previously scheduled zoom state change
28
+ if (zoomStateTimeoutId) clearTimeout(zoomStateTimeoutId);
29
+
30
+ function nextFrame() {
31
+ setPointerZooming(true);
32
+ onScaleChange?.(newScale);
33
+
34
+ animationFrame = null;
35
+ // Wait a bit before indicating the pointer zooming is finished
36
+ zoomStateTimeoutId = setTimeout(() => setPointerZooming(false), 100);
37
+ }
38
+ animationFrame = requestAnimationFrame(nextFrame);
39
+
40
+ // Animate scroll in parallel (centering on the current mouse position)
41
+ animateScroll(mousePosition, {
42
+ width: scrollArea.scrollWidth,
43
+ height: scrollArea.scrollHeight,
44
+ });
45
+ }
46
+
47
+ function onWheel(event: WheelEvent) {
48
+ if (!event.ctrlKey) {
49
+ return;
50
+ }
51
+ event.preventDefault();
52
+ const newScale = Math.exp(-event.deltaY / 50);
53
+
54
+ // Update scale on next frame (focused on the mouse position)
55
+ updateScaleOnNextFrame(newScale, {
56
+ x: event.clientX,
57
+ y: event.clientY,
58
+ });
59
+ }
60
+
61
+ const activePointers: Record<PointerEvent['pointerId'], PointerEvent> = {};
62
+ let prevDistance: number | null = null;
63
+ let previousCenterPoint: Point | null = null;
64
+
65
+ function onPointerDown(event: PointerEvent) {
66
+ activePointers[event.pointerId] = event;
67
+ }
68
+ function onPointerMove(event: PointerEvent) {
69
+ // Update pointer in cache
70
+ if (activePointers[event.pointerId]) {
71
+ activePointers[event.pointerId] = event;
72
+ }
73
+
74
+ const pointers = Object.values(activePointers);
75
+
76
+ // Make sure we run computation on one of the pointer in the group
77
+ if (pointers[0]?.pointerId !== event.pointerId) {
78
+ return;
79
+ }
80
+
81
+ // Centered point between all pointers
82
+ const centerPoint: Point = {
83
+ x: pointers.reduce((x, { clientX }) => x + clientX, 0) / pointers.length,
84
+ y: pointers.reduce((y, { clientY }) => y + clientY, 0) / pointers.length,
85
+ };
86
+
87
+ // Movement of the center point
88
+ const deltaCenterPoint = previousCenterPoint && {
89
+ left: previousCenterPoint.x - centerPoint.x,
90
+ top: previousCenterPoint.y - centerPoint.y,
91
+ };
92
+
93
+ // Pan X & Y
94
+ if (deltaCenterPoint) {
95
+ // Apply movement of the center point to the scroll
96
+ scrollArea.scrollBy({
97
+ top: deltaCenterPoint.top / 2,
98
+ left: deltaCenterPoint.left / 2,
99
+ });
100
+ }
101
+
102
+ // Pinch to zoom
103
+ if (pointers.length === 2) {
104
+ const [pointer1, pointer2] = pointers;
105
+ const distance = Math.hypot(pointer2.clientX - pointer1.clientX, pointer2.clientY - pointer1.clientY);
106
+
107
+ if (prevDistance && deltaCenterPoint) {
108
+ const delta = prevDistance - distance;
109
+ const absDelta = Math.abs(delta);
110
+
111
+ // Zoom only if we are "pinching" more than we are moving the pointers
112
+ if (absDelta > Math.abs(deltaCenterPoint.left) && absDelta > Math.abs(deltaCenterPoint.top)) {
113
+ // Update scale on next frame (focused on the center point between the two pointers)
114
+ const newScale = Math.exp(-delta / 100);
115
+ updateScaleOnNextFrame(newScale, centerPoint);
116
+ }
117
+ }
118
+
119
+ prevDistance = distance;
120
+ }
121
+
122
+ previousCenterPoint = centerPoint;
123
+ }
124
+ function onPointerUp(event: PointerEvent) {
125
+ prevDistance = null;
126
+ previousCenterPoint = null;
127
+ delete activePointers[event.pointerId];
128
+ }
129
+
130
+ scrollArea.addEventListener('wheel', onWheel, { passive: false });
131
+ const isMultiTouch = navigator.maxTouchPoints >= 2;
132
+ if (isMultiTouch) {
133
+ scrollArea.addEventListener('pointerdown', onPointerDown);
134
+ scrollArea.addEventListener('pointermove', onPointerMove);
135
+ scrollArea.addEventListener('pointerup', onPointerUp);
136
+ }
137
+ return () => {
138
+ scrollArea.removeEventListener('wheel', onWheel);
139
+ if (isMultiTouch) {
140
+ scrollArea.removeEventListener('pointerdown', onPointerDown);
141
+ scrollArea.removeEventListener('pointermove', onPointerMove);
142
+ scrollArea.removeEventListener('pointerup', onPointerUp);
143
+ }
144
+ };
145
+ }, [animateScroll, onScaleChange, scrollAreaRef]);
146
+
147
+ return isPointerZooming;
148
+ }
@@ -0,0 +1,48 @@
1
+ import type { IconButtonProps, LightboxProps, SlideshowProps, ThumbnailProps } from '@lumx/react';
2
+ import type { HasClassName } from '@lumx/react/utils/type';
3
+ import type { ImageCaptionMetadata } from '@lumx/react/components/image-block/ImageCaption';
4
+
5
+ export type InheritedSlideShowProps = Pick<SlideshowProps, 'slideshowControlsProps' | 'slideGroupLabel'>;
6
+
7
+ export interface ZoomButtonProps {
8
+ /** Zoom in button props */
9
+ zoomInButtonProps?: IconButtonProps;
10
+ /** Zoom out button props */
11
+ zoomOutButtonProps?: IconButtonProps;
12
+ }
13
+
14
+ export type InheritedThumbnailProps = Pick<
15
+ ThumbnailProps,
16
+ 'image' | 'alt' | 'imgProps' | 'imgRef' | 'loadingPlaceholderImageRef'
17
+ >;
18
+
19
+ export type InheritedImageMetadata = Pick<ImageCaptionMetadata, 'title' | 'description' | 'tags'>;
20
+
21
+ export type ImageProps = InheritedThumbnailProps & InheritedImageMetadata;
22
+
23
+ export interface ImagesProps {
24
+ /** Index of the active image to show on open */
25
+ activeImageIndex?: number;
26
+ /** List of images to display */
27
+ images: Array<ImageProps>;
28
+ /** Ref of the active image when the lightbox is open */
29
+ activeImageRef?: React.Ref<HTMLImageElement>;
30
+ }
31
+
32
+ export type InheritedLightboxProps = Pick<
33
+ LightboxProps,
34
+ 'isOpen' | 'parentElement' | 'onClose' | 'closeButtonProps' | 'aria-label' | 'aria-labelledby'
35
+ >;
36
+
37
+ export type ForwardedProps = React.ComponentPropsWithoutRef<'div'>;
38
+
39
+ /**
40
+ * ImageLightbox component props
41
+ */
42
+ export interface ImageLightboxProps
43
+ extends HasClassName,
44
+ ZoomButtonProps,
45
+ ImagesProps,
46
+ InheritedSlideShowProps,
47
+ InheritedLightboxProps,
48
+ ForwardedProps {}
@@ -0,0 +1,141 @@
1
+ import React from 'react';
2
+
3
+ import memoize from 'lodash/memoize';
4
+
5
+ import { startViewTransition } from '@lumx/react/utils/browser/DOM/startViewTransition';
6
+ import { findImage } from '@lumx/react/utils/browser/DOM/findImage';
7
+
8
+ import type { ImageLightboxProps } from './types';
9
+ import { CLASSNAME } from './constants';
10
+
11
+ /** Subset of the ImageLightboxProps managed by the useImageLightbox hook */
12
+ type ManagedProps = Pick<
13
+ ImageLightboxProps,
14
+ 'isOpen' | 'images' | 'parentElement' | 'activeImageRef' | 'onClose' | 'activeImageIndex'
15
+ >;
16
+
17
+ const EMPTY_PROPS: ManagedProps = { isOpen: false, images: [], parentElement: React.createRef() };
18
+
19
+ type TriggerOptions = Pick<ImageLightboxProps, 'activeImageIndex'>;
20
+
21
+ /**
22
+ * Set up an ImageLightbox with images and triggers.
23
+ *
24
+ * - Associate a trigger with the lightbox to properly focus the trigger on close
25
+ * - Associate a trigger with an image to display on open
26
+ * - Automatically provide a view transition between an image trigger and the displayed image on open & close
27
+ *
28
+ * @param props Images to display in the image lightbox
29
+ */
30
+ export function useImageLightbox<P extends Partial<ImageLightboxProps>>(
31
+ props: P,
32
+ ): {
33
+ /**
34
+ * Generates trigger props
35
+ * @param index Provide an index to choose which image to display when the image lightbox opens.
36
+ * */
37
+ getTriggerProps: (options?: TriggerOptions) => { onClick: React.MouseEventHandler; ref: React.Ref<any> };
38
+ /** Props to forward to the ImageLightbox */
39
+ imageLightboxProps: ManagedProps & P;
40
+ } {
41
+ const propsRef = React.useRef(props);
42
+
43
+ React.useEffect(() => {
44
+ propsRef.current = props;
45
+ }, [props]);
46
+
47
+ // Keep reference for each image elements
48
+ const imageRefsRef = React.useRef<Array<React.RefObject<HTMLImageElement>>>([]);
49
+
50
+ const currentImageRef = React.useRef<HTMLImageElement>(null);
51
+ const [imageLightboxProps, setImageLightboxProps] = React.useState(
52
+ () => ({ ...EMPTY_PROPS, ...props }) as ManagedProps & P,
53
+ );
54
+
55
+ const getTriggerProps = React.useMemo(() => {
56
+ const triggerImageRefs: Record<number, React.RefObject<HTMLImageElement>> = {};
57
+
58
+ async function close() {
59
+ const currentImage = currentImageRef.current;
60
+ if (!currentImage) {
61
+ return;
62
+ }
63
+ const currentIndex = imageRefsRef.current.findIndex(
64
+ (imageRef) => imageRef.current === currentImage,
65
+ ) as number;
66
+
67
+ await startViewTransition({
68
+ changes() {
69
+ // Close lightbox
70
+ setImageLightboxProps((prevProps) => ({ ...prevProps, isOpen: false }));
71
+ },
72
+ // Morph from the image in lightbox to the image in trigger
73
+ viewTransitionName: {
74
+ source: currentImageRef,
75
+ target: triggerImageRefs[currentIndex],
76
+ name: CLASSNAME,
77
+ },
78
+ });
79
+ }
80
+
81
+ async function open(triggerElement: HTMLElement, { activeImageIndex }: TriggerOptions = {}) {
82
+ // If we find an image inside the trigger, animate it in transition with the opening image
83
+ const triggerImage = triggerImageRefs[activeImageIndex as any]?.current || findImage(triggerElement);
84
+
85
+ // Inject refs to improve transition and loading style
86
+ const images = propsRef.current?.images?.map((image, idx) => {
87
+ // Get or create image reference
88
+ let imgRef = imageRefsRef.current[idx];
89
+ if (!imgRef) {
90
+ imgRef = React.createRef();
91
+ imageRefsRef.current[idx] = imgRef;
92
+ }
93
+
94
+ // Try to use the trigger image as the loading placeholder
95
+ const loadingPlaceholderImageRef =
96
+ triggerImage && idx === activeImageIndex ? { current: triggerImage } : undefined;
97
+
98
+ return { loadingPlaceholderImageRef, ...image, imgRef };
99
+ });
100
+
101
+ await startViewTransition({
102
+ changes: () => {
103
+ // Open lightbox with setup props
104
+ setImageLightboxProps((prevProps) => ({
105
+ ...prevProps,
106
+ ...propsRef.current,
107
+ activeImageRef: currentImageRef,
108
+ parentElement: { current: triggerElement },
109
+ isOpen: true,
110
+ onClose: () => {
111
+ close();
112
+ propsRef.current?.onClose?.();
113
+ },
114
+ images,
115
+ activeImageIndex: activeImageIndex || 0,
116
+ }));
117
+ },
118
+ // Morph from the image in trigger to the image in lightbox
119
+ viewTransitionName: {
120
+ source: triggerImage,
121
+ target: currentImageRef,
122
+ name: CLASSNAME,
123
+ },
124
+ });
125
+ }
126
+
127
+ return memoize((options?: TriggerOptions) => ({
128
+ ref(element: HTMLElement | null) {
129
+ // Track trigger image ref if any
130
+ if (options?.activeImageIndex !== undefined && element) {
131
+ triggerImageRefs[options.activeImageIndex] = { current: findImage(element) };
132
+ }
133
+ },
134
+ onClick(e: React.MouseEvent) {
135
+ open(e.target as HTMLElement, options);
136
+ },
137
+ }));
138
+ }, []);
139
+
140
+ return { getTriggerProps, imageLightboxProps };
141
+ }
@@ -0,0 +1,77 @@
1
+ import { mdiEarth } from '@lumx/icons';
2
+ import { Icon, Text } from '@lumx/react';
3
+ import { withResizableBox } from '@lumx/react/stories/decorators/withResizableBox';
4
+ import { allTypographyArgType } from '@lumx/react/stories/controls/typography';
5
+ import { colorArgType, colorVariantArgType } from '@lumx/react/stories/controls/color';
6
+ import { InlineList } from '.';
7
+
8
+ export default {
9
+ title: 'LumX components/inline-list/InlineList',
10
+ component: InlineList,
11
+ argTypes: {
12
+ typography: allTypographyArgType,
13
+ color: colorArgType,
14
+ colorVariant: colorVariantArgType,
15
+ children: { control: false },
16
+ },
17
+ };
18
+
19
+ /**
20
+ * Inline list with three simple text elements
21
+ */
22
+ export const WithElements = {
23
+ args: {
24
+ children: [
25
+ <span key="1">Some text</span>,
26
+ <span key="2">Some other text</span>,
27
+ <span key="3">Some other other text</span>,
28
+ ],
29
+ },
30
+ };
31
+
32
+ /**
33
+ * Using color, typography and more complex elements
34
+ */
35
+ export const MixedNoWrapAndTruncate = {
36
+ args: {
37
+ typography: 'body1',
38
+ color: 'dark',
39
+ colorVariant: 'L2',
40
+ style: { width: '100%' },
41
+ children: [
42
+ <Text key="1" as="span" truncate>
43
+ Very very very very very long text
44
+ </Text>,
45
+ <Text key="2" as="span" noWrap>
46
+ <Icon icon={mdiEarth} />
47
+ Some text
48
+ </Text>,
49
+ <Text key="3" as="span" truncate>
50
+ Very very very very very long text
51
+ </Text>,
52
+ ],
53
+ },
54
+ decorators: [withResizableBox({ width: 400 })],
55
+ };
56
+
57
+ /**
58
+ * Line wrap on overflow
59
+ */
60
+ export const Wrap = {
61
+ args: {
62
+ wrap: true,
63
+ children: [
64
+ <Text key="1" as="span">
65
+ Very very very very very long text
66
+ </Text>,
67
+ <Text key="2" as="span">
68
+ <Icon icon={mdiEarth} />
69
+ Some text
70
+ </Text>,
71
+ <Text key="3" as="span">
72
+ Very very very very very long text
73
+ </Text>,
74
+ ],
75
+ },
76
+ decorators: [withResizableBox({ width: 400 })],
77
+ };
@@ -0,0 +1,52 @@
1
+ import { commonTestsSuiteRTL } from '@lumx/react/testing/utils';
2
+ import { render, screen, within } from '@testing-library/react';
3
+ import { queryByClassName } from '@lumx/react/testing/utils/queries';
4
+ import { InlineList, InlineListProps } from '.';
5
+
6
+ const CLASSNAME = InlineList.className as string;
7
+
8
+ const setup = (props: Partial<InlineListProps> = {}) => {
9
+ render(<InlineList {...props} />);
10
+ const inlineList = queryByClassName(document.body, CLASSNAME);
11
+ return { props, inlineList };
12
+ };
13
+
14
+ describe(`<${InlineList.displayName}>`, () => {
15
+ describe('Snapshots and structure', () => {
16
+ it('should render default', () => {
17
+ const { inlineList } = setup({ children: ['Some text', 'Some other text'] });
18
+
19
+ expect(inlineList).toBeInTheDocument();
20
+
21
+ const list = screen.getByRole('list');
22
+ expect(list).toBeInTheDocument();
23
+
24
+ const listItems = within(list).queryAllByRole('listitem');
25
+ expect(listItems.length).toBe(2);
26
+ expect(listItems[0]).toHaveTextContent('Some text');
27
+ expect(listItems[1]).toHaveTextContent('Some other text');
28
+ });
29
+
30
+ it('should render with typography', () => {
31
+ const { inlineList } = setup({ typography: 'body2', children: 'Some text' });
32
+ expect(inlineList).toHaveClass('lumx-typography-body2');
33
+ });
34
+
35
+ it('should render with color', () => {
36
+ const { inlineList } = setup({ color: 'blue', children: 'Some text' });
37
+ expect(inlineList).toHaveClass('lumx-color-font-blue-N');
38
+ });
39
+
40
+ it('should render with color and variant', () => {
41
+ const { inlineList } = setup({ color: 'blue', colorVariant: 'D2', children: 'Some text' });
42
+ expect(inlineList).toHaveClass('lumx-color-font-blue-D2');
43
+ });
44
+ });
45
+
46
+ // Common tests suite.
47
+ commonTestsSuiteRTL(setup, {
48
+ baseClassName: CLASSNAME,
49
+ forwardClassName: 'inlineList',
50
+ forwardAttributes: 'inlineList',
51
+ });
52
+ });