@lumx/react 3.0.7 → 3.1.0

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 (517) hide show
  1. package/{CONTRIBUTING.md → dist/CONTRIBUTING.md} +0 -0
  2. package/{LICENSE.md → dist/LICENSE.md} +0 -0
  3. package/dist/README.md +38 -0
  4. package/{_internal → dist/_internal}/ClickAwayProvider.js +0 -0
  5. package/{_internal → dist/_internal}/ClickAwayProvider.js.map +0 -0
  6. package/{_internal → dist/_internal}/types.d.ts +1 -1
  7. package/{index.d.ts → dist/index.d.ts} +67 -8
  8. package/{index.js → dist/index.js} +766 -613
  9. package/dist/index.js.map +1 -0
  10. package/dist/package.json +117 -0
  11. package/dist/src/components/alert-dialog/AlertDialog.stories.tsx +196 -0
  12. package/dist/src/components/alert-dialog/AlertDialog.test.tsx +43 -0
  13. package/dist/src/components/alert-dialog/AlertDialog.tsx +185 -0
  14. package/dist/src/components/alert-dialog/__snapshots__/AlertDialog.test.tsx.snap +551 -0
  15. package/dist/src/components/alert-dialog/index.ts +1 -0
  16. package/dist/src/components/autocomplete/Autocomplete.stories.tsx +70 -0
  17. package/dist/src/components/autocomplete/Autocomplete.test.tsx +181 -0
  18. package/dist/src/components/autocomplete/Autocomplete.tsx +292 -0
  19. package/dist/src/components/autocomplete/AutocompleteMultiple.stories.tsx +170 -0
  20. package/dist/src/components/autocomplete/AutocompleteMultiple.test.tsx +94 -0
  21. package/dist/src/components/autocomplete/AutocompleteMultiple.tsx +156 -0
  22. package/dist/src/components/autocomplete/__mockData__/index.ts +34 -0
  23. package/dist/src/components/autocomplete/__snapshots__/Autocomplete.test.tsx.snap +213 -0
  24. package/dist/src/components/autocomplete/__snapshots__/AutocompleteMultiple.test.tsx.snap +88 -0
  25. package/dist/src/components/autocomplete/index.ts +2 -0
  26. package/dist/src/components/avatar/Avatar.stories.tsx +92 -0
  27. package/dist/src/components/avatar/Avatar.test.tsx +39 -0
  28. package/dist/src/components/avatar/Avatar.tsx +112 -0
  29. package/dist/src/components/avatar/__snapshots__/Avatar.test.tsx.snap +681 -0
  30. package/dist/src/components/avatar/index.ts +1 -0
  31. package/dist/src/components/badge/Badge.stories.tsx +45 -0
  32. package/dist/src/components/badge/Badge.test.tsx +91 -0
  33. package/dist/src/components/badge/Badge.tsx +55 -0
  34. package/dist/src/components/badge/__snapshots__/Badge.test.tsx.snap +11 -0
  35. package/dist/src/components/badge/index.ts +1 -0
  36. package/dist/src/components/button/Button.stories.tsx +156 -0
  37. package/dist/src/components/button/Button.test.tsx +152 -0
  38. package/dist/src/components/button/Button.tsx +81 -0
  39. package/dist/src/components/button/ButtonGroup.test.tsx +66 -0
  40. package/dist/src/components/button/ButtonGroup.tsx +46 -0
  41. package/dist/src/components/button/ButtonRoot.test.tsx +203 -0
  42. package/dist/src/components/button/ButtonRoot.tsx +190 -0
  43. package/dist/src/components/button/IconButton.test.tsx +103 -0
  44. package/dist/src/components/button/IconButton.tsx +80 -0
  45. package/dist/src/components/button/__snapshots__/Button.test.tsx.snap +96 -0
  46. package/dist/src/components/button/__snapshots__/ButtonGroup.test.tsx.snap +22 -0
  47. package/dist/src/components/button/__snapshots__/ButtonRoot.test.tsx.snap +160 -0
  48. package/dist/src/components/button/__snapshots__/IconButton.test.tsx.snap +83 -0
  49. package/dist/src/components/button/index.ts +4 -0
  50. package/dist/src/components/checkbox/Checkbox.stories.tsx +37 -0
  51. package/dist/src/components/checkbox/Checkbox.test.tsx +114 -0
  52. package/dist/src/components/checkbox/Checkbox.tsx +145 -0
  53. package/dist/src/components/checkbox/__snapshots__/Checkbox.test.tsx.snap +141 -0
  54. package/dist/src/components/checkbox/index.ts +1 -0
  55. package/dist/src/components/chip/Chip.stories.tsx +21 -0
  56. package/dist/src/components/chip/Chip.test.tsx +199 -0
  57. package/dist/src/components/chip/Chip.tsx +154 -0
  58. package/dist/src/components/chip/ChipGroup.test.tsx +29 -0
  59. package/dist/src/components/chip/ChipGroup.tsx +62 -0
  60. package/dist/src/components/chip/__snapshots__/Chip.test.tsx.snap +12 -0
  61. package/dist/src/components/chip/__snapshots__/ChipGroup.test.tsx.snap +29 -0
  62. package/dist/src/components/chip/index.ts +2 -0
  63. package/dist/src/components/comment-block/CommentBlock.stories.tsx +30 -0
  64. package/dist/src/components/comment-block/CommentBlock.test.tsx +28 -0
  65. package/dist/src/components/comment-block/CommentBlock.tsx +174 -0
  66. package/dist/src/components/comment-block/__snapshots__/CommentBlock.test.tsx.snap +92 -0
  67. package/dist/src/components/comment-block/index.ts +1 -0
  68. package/dist/src/components/date-picker/DatePicker.test.tsx +41 -0
  69. package/dist/src/components/date-picker/DatePicker.tsx +56 -0
  70. package/dist/src/components/date-picker/DatePickerControlled.test.tsx +44 -0
  71. package/dist/src/components/date-picker/DatePickerControlled.tsx +128 -0
  72. package/dist/src/components/date-picker/DatePickerField.stories.tsx +93 -0
  73. package/dist/src/components/date-picker/DatePickerField.test.tsx +47 -0
  74. package/dist/src/components/date-picker/DatePickerField.tsx +141 -0
  75. package/dist/src/components/date-picker/__snapshots__/DatePicker.test.tsx.snap +22 -0
  76. package/dist/src/components/date-picker/__snapshots__/DatePickerControlled.test.tsx.snap +597 -0
  77. package/dist/src/components/date-picker/__snapshots__/DatePickerField.test.tsx.snap +43 -0
  78. package/dist/src/components/date-picker/constants.ts +11 -0
  79. package/dist/src/components/date-picker/index.ts +4 -0
  80. package/dist/src/components/date-picker/types.ts +28 -0
  81. package/dist/src/components/dialog/Dialog.stories.tsx +426 -0
  82. package/dist/src/components/dialog/Dialog.test.tsx +93 -0
  83. package/dist/src/components/dialog/Dialog.tsx +263 -0
  84. package/dist/src/components/dialog/__snapshots__/Dialog.test.tsx.snap +960 -0
  85. package/dist/src/components/dialog/index.ts +1 -0
  86. package/dist/src/components/divider/Divider.test.tsx +93 -0
  87. package/dist/src/components/divider/Divider.tsx +51 -0
  88. package/dist/src/components/divider/__snapshots__/Divider.test.tsx.snap +9 -0
  89. package/dist/src/components/divider/index.ts +1 -0
  90. package/dist/src/components/drag-handle/DragHandle.tsx +50 -0
  91. package/dist/src/components/drag-handle/index.ts +1 -0
  92. package/dist/src/components/dropdown/Dropdown.stories.tsx +216 -0
  93. package/dist/src/components/dropdown/Dropdown.test.tsx +97 -0
  94. package/dist/src/components/dropdown/Dropdown.tsx +184 -0
  95. package/dist/src/components/dropdown/__snapshots__/Dropdown.test.tsx.snap +35 -0
  96. package/dist/src/components/dropdown/index.ts +1 -0
  97. package/dist/src/components/expansion-panel/ExpansionPanel.test.tsx +116 -0
  98. package/dist/src/components/expansion-panel/ExpansionPanel.tsx +170 -0
  99. package/dist/src/components/expansion-panel/index.ts +1 -0
  100. package/dist/src/components/flag/Flag.stories.tsx +23 -0
  101. package/dist/src/components/flag/Flag.test.tsx +86 -0
  102. package/dist/src/components/flag/Flag.tsx +47 -0
  103. package/dist/src/components/flag/__snapshots__/Flag.test.tsx.snap +133 -0
  104. package/dist/src/components/flag/index.ts +1 -0
  105. package/dist/src/components/flex-box/FlexBox.stories.tsx +245 -0
  106. package/dist/src/components/flex-box/FlexBox.test.tsx +65 -0
  107. package/dist/src/components/flex-box/FlexBox.tsx +98 -0
  108. package/dist/src/components/flex-box/__snapshots__/FlexBox.test.tsx.snap +492 -0
  109. package/dist/src/components/flex-box/index.ts +1 -0
  110. package/dist/src/components/generic-block/GenericBlock.stories.jsx +128 -0
  111. package/dist/src/components/generic-block/GenericBlock.test.tsx +152 -0
  112. package/dist/src/components/generic-block/GenericBlock.tsx +222 -0
  113. package/dist/src/components/generic-block/constants.ts +9 -0
  114. package/dist/src/components/generic-block/index.ts +2 -0
  115. package/dist/src/components/grid/Grid.tsx +73 -0
  116. package/dist/src/components/grid/GridItem.tsx +54 -0
  117. package/dist/src/components/grid/index.ts +2 -0
  118. package/dist/src/components/grid-column/GridColumn.stories.jsx +56 -0
  119. package/dist/src/components/grid-column/GridColumn.test.jsx +58 -0
  120. package/dist/src/components/grid-column/GridColumn.tsx +90 -0
  121. package/dist/src/components/grid-column/index.ts +1 -0
  122. package/dist/src/components/heading/Heading.stories.tsx +108 -0
  123. package/dist/src/components/heading/Heading.test.tsx +82 -0
  124. package/dist/src/components/heading/Heading.tsx +63 -0
  125. package/dist/src/components/heading/HeadingLevelProvider.tsx +30 -0
  126. package/dist/src/components/heading/constants.ts +16 -0
  127. package/dist/src/components/heading/context.tsx +13 -0
  128. package/dist/src/components/heading/index.ts +3 -0
  129. package/dist/src/components/heading/useHeadingLevel.tsx +8 -0
  130. package/dist/src/components/icon/Icon.stories.tsx +76 -0
  131. package/dist/src/components/icon/Icon.test.tsx +102 -0
  132. package/dist/src/components/icon/Icon.tsx +121 -0
  133. package/dist/src/components/icon/__snapshots__/Icon.test.tsx.snap +49 -0
  134. package/dist/src/components/icon/index.ts +1 -0
  135. package/dist/src/components/image-block/ImageBlock.stories.tsx +52 -0
  136. package/dist/src/components/image-block/ImageBlock.test.tsx +28 -0
  137. package/dist/src/components/image-block/ImageBlock.tsx +151 -0
  138. package/dist/src/components/image-block/__snapshots__/ImageBlock.test.tsx.snap +64 -0
  139. package/dist/src/components/image-block/index.ts +1 -0
  140. package/dist/src/components/index.ts +176 -0
  141. package/dist/src/components/inline-list/InlineList.stories.tsx +40 -0
  142. package/dist/src/components/inline-list/InlineList.test.tsx +41 -0
  143. package/dist/src/components/inline-list/InlineList.tsx +82 -0
  144. package/dist/src/components/inline-list/index.ts +1 -0
  145. package/dist/src/components/input-helper/InputHelper.stories.tsx +29 -0
  146. package/dist/src/components/input-helper/InputHelper.test.tsx +107 -0
  147. package/dist/src/components/input-helper/InputHelper.tsx +61 -0
  148. package/dist/src/components/input-helper/__snapshots__/InputHelper.test.tsx.snap +9 -0
  149. package/dist/src/components/input-helper/constants.ts +11 -0
  150. package/dist/src/components/input-helper/index.ts +1 -0
  151. package/dist/src/components/input-label/InputLabel.stories.tsx +15 -0
  152. package/dist/src/components/input-label/InputLabel.test.tsx +86 -0
  153. package/dist/src/components/input-label/InputLabel.tsx +59 -0
  154. package/dist/src/components/input-label/__snapshots__/InputLabel.test.tsx.snap +10 -0
  155. package/dist/src/components/input-label/index.ts +1 -0
  156. package/dist/src/components/lightbox/Lightbox.stories.tsx +83 -0
  157. package/dist/src/components/lightbox/Lightbox.test.tsx +30 -0
  158. package/dist/src/components/lightbox/Lightbox.tsx +153 -0
  159. package/dist/src/components/lightbox/__snapshots__/Lightbox.test.tsx.snap +194 -0
  160. package/dist/src/components/lightbox/index.ts +1 -0
  161. package/dist/src/components/link/Link.stories.tsx +141 -0
  162. package/dist/src/components/link/Link.test.tsx +60 -0
  163. package/dist/src/components/link/Link.tsx +156 -0
  164. package/dist/src/components/link/__snapshots__/Link.test.tsx.snap +29 -0
  165. package/dist/src/components/link/index.ts +1 -0
  166. package/dist/src/components/link-preview/LinkPreview.stories.tsx +88 -0
  167. package/dist/src/components/link-preview/LinkPreview.test.tsx +102 -0
  168. package/dist/src/components/link-preview/LinkPreview.tsx +158 -0
  169. package/dist/src/components/link-preview/index.ts +1 -0
  170. package/dist/src/components/list/List.stories.tsx +141 -0
  171. package/dist/src/components/list/List.test.tsx +29 -0
  172. package/dist/src/components/list/List.tsx +94 -0
  173. package/dist/src/components/list/ListDivider.stories.tsx +7 -0
  174. package/dist/src/components/list/ListDivider.test.tsx +29 -0
  175. package/dist/src/components/list/ListDivider.tsx +42 -0
  176. package/dist/src/components/list/ListItem.stories.tsx +62 -0
  177. package/{src/components/progress/Progress.test.tsx → dist/src/components/list/ListItem.test.tsx} +8 -7
  178. package/dist/src/components/list/ListItem.tsx +154 -0
  179. package/dist/src/components/list/ListSubheader.stories.tsx +8 -0
  180. package/dist/src/components/list/ListSubheader.test.tsx +29 -0
  181. package/dist/src/components/list/ListSubheader.tsx +43 -0
  182. package/dist/src/components/list/__snapshots__/List.test.tsx.snap +360 -0
  183. package/dist/src/components/list/__snapshots__/ListDivider.test.tsx.snap +7 -0
  184. package/dist/src/components/list/__snapshots__/ListItem.test.tsx.snap +160 -0
  185. package/dist/src/components/list/__snapshots__/ListSubheader.test.tsx.snap +9 -0
  186. package/dist/src/components/list/index.ts +4 -0
  187. package/dist/src/components/list/useInteractiveList.tsx +202 -0
  188. package/dist/src/components/message/Message.stories.tsx +27 -0
  189. package/dist/src/components/message/Message.test.tsx +76 -0
  190. package/dist/src/components/message/Message.tsx +74 -0
  191. package/dist/src/components/message/__snapshots__/Message.test.tsx.snap +15 -0
  192. package/dist/src/components/message/index.ts +1 -0
  193. package/dist/src/components/mosaic/Mosaic.stories.tsx +85 -0
  194. package/dist/src/components/mosaic/Mosaic.test.tsx +120 -0
  195. package/dist/src/components/mosaic/Mosaic.tsx +95 -0
  196. package/dist/src/components/mosaic/__snapshots__/Mosaic.test.tsx.snap +357 -0
  197. package/dist/src/components/mosaic/index.ts +1 -0
  198. package/dist/src/components/notification/Notification.test.tsx +108 -0
  199. package/dist/src/components/notification/Notification.tsx +130 -0
  200. package/dist/src/components/notification/Notifications.stories.tsx +77 -0
  201. package/dist/src/components/notification/__snapshots__/Notification.test.tsx.snap +34 -0
  202. package/dist/src/components/notification/constants.ts +28 -0
  203. package/dist/src/components/notification/index.ts +1 -0
  204. package/dist/src/components/popover/Popover.stories.tsx +386 -0
  205. package/dist/src/components/popover/Popover.test.tsx +30 -0
  206. package/dist/src/components/popover/Popover.tsx +382 -0
  207. package/dist/src/components/popover/__snapshots__/Popover.test.tsx.snap +343 -0
  208. package/dist/src/components/popover/index.ts +1 -0
  209. package/dist/src/components/popover-dialog/PopoverDialog.stories.tsx +75 -0
  210. package/dist/src/components/popover-dialog/PopoverDialog.test.tsx +65 -0
  211. package/dist/src/components/popover-dialog/PopoverDialog.tsx +65 -0
  212. package/dist/src/components/popover-dialog/index.tsx +1 -0
  213. package/dist/src/components/post-block/PostBlock.test.tsx +28 -0
  214. package/dist/src/components/post-block/PostBlock.tsx +123 -0
  215. package/dist/src/components/post-block/__snapshots__/PostBlock.test.tsx.snap +139 -0
  216. package/dist/src/components/post-block/index.ts +1 -0
  217. package/dist/src/components/progress/Progress.tsx +68 -0
  218. package/dist/src/components/progress/ProgressCircular.stories.tsx +18 -0
  219. package/dist/src/components/progress/ProgressCircular.test.tsx +49 -0
  220. package/dist/src/components/progress/ProgressCircular.tsx +68 -0
  221. package/dist/src/components/progress/ProgressLinear.stories.tsx +8 -0
  222. package/dist/src/components/progress/ProgressLinear.test.tsx +37 -0
  223. package/dist/src/components/progress/ProgressLinear.tsx +52 -0
  224. package/dist/src/components/progress/index.ts +3 -0
  225. package/dist/src/components/progress-tracker/ProgressTracker.stories.tsx +145 -0
  226. package/dist/src/components/progress-tracker/ProgressTracker.test.tsx +57 -0
  227. package/dist/src/components/progress-tracker/ProgressTracker.tsx +89 -0
  228. package/dist/src/components/progress-tracker/ProgressTrackerProvider.test.tsx +42 -0
  229. package/dist/src/components/progress-tracker/ProgressTrackerProvider.tsx +66 -0
  230. package/dist/src/components/progress-tracker/ProgressTrackerStep.test.tsx +128 -0
  231. package/dist/src/components/progress-tracker/ProgressTrackerStep.tsx +159 -0
  232. package/dist/src/components/progress-tracker/ProgressTrackerStepPanel.test.tsx +73 -0
  233. package/dist/src/components/progress-tracker/ProgressTrackerStepPanel.tsx +67 -0
  234. package/dist/src/components/progress-tracker/__snapshots__/ProgressTracker.test.tsx.snap +41 -0
  235. package/dist/src/components/progress-tracker/__snapshots__/ProgressTrackerStep.test.tsx.snap +141 -0
  236. package/dist/src/components/progress-tracker/__snapshots__/ProgressTrackerStepPanel.test.tsx.snap +25 -0
  237. package/dist/src/components/progress-tracker/index.ts +4 -0
  238. package/dist/src/components/radio-button/RadioButton.stories.tsx +28 -0
  239. package/dist/src/components/radio-button/RadioButton.test.tsx +123 -0
  240. package/dist/src/components/radio-button/RadioButton.tsx +141 -0
  241. package/dist/src/components/radio-button/RadioGroup.stories.tsx +42 -0
  242. package/dist/src/components/radio-button/RadioGroup.test.tsx +77 -0
  243. package/dist/src/components/radio-button/RadioGroup.tsx +52 -0
  244. package/dist/src/components/radio-button/__snapshots__/RadioButton.test.tsx.snap +113 -0
  245. package/dist/src/components/radio-button/__snapshots__/RadioGroup.test.tsx.snap +26 -0
  246. package/dist/src/components/radio-button/index.ts +2 -0
  247. package/dist/src/components/select/Select.stories.tsx +399 -0
  248. package/dist/src/components/select/Select.test.tsx +359 -0
  249. package/dist/src/components/select/Select.tsx +193 -0
  250. package/dist/src/components/select/SelectMultiple.stories.tsx +227 -0
  251. package/dist/src/components/select/SelectMultiple.test.tsx +405 -0
  252. package/dist/src/components/select/SelectMultiple.tsx +198 -0
  253. package/dist/src/components/select/WithSelectContext.tsx +143 -0
  254. package/dist/src/components/select/__snapshots__/Select.test.tsx.snap +43 -0
  255. package/dist/src/components/select/__snapshots__/SelectMultiple.test.tsx.snap +87 -0
  256. package/dist/src/components/select/constants.ts +53 -0
  257. package/dist/src/components/select/index.ts +2 -0
  258. package/dist/src/components/side-navigation/SideNavigation.stories.tsx +191 -0
  259. package/dist/src/components/side-navigation/SideNavigation.test.tsx +52 -0
  260. package/dist/src/components/side-navigation/SideNavigation.tsx +54 -0
  261. package/dist/src/components/side-navigation/SideNavigationItem.test.tsx +175 -0
  262. package/dist/src/components/side-navigation/SideNavigationItem.tsx +162 -0
  263. package/dist/src/components/side-navigation/__snapshots__/SideNavigation.test.tsx.snap +7 -0
  264. package/dist/src/components/side-navigation/__snapshots__/SideNavigationItem.test.tsx.snap +30 -0
  265. package/dist/src/components/side-navigation/index.ts +2 -0
  266. package/dist/src/components/skeleton/SkeletonCircle.stories.tsx +25 -0
  267. package/dist/src/components/skeleton/SkeletonCircle.test.tsx +28 -0
  268. package/dist/src/components/skeleton/SkeletonCircle.tsx +52 -0
  269. package/dist/src/components/skeleton/SkeletonRectangle.stories.tsx +107 -0
  270. package/dist/src/components/skeleton/SkeletonRectangle.test.tsx +28 -0
  271. package/dist/src/components/skeleton/SkeletonRectangle.tsx +78 -0
  272. package/dist/src/components/skeleton/SkeletonTypography.stories.tsx +26 -0
  273. package/dist/src/components/skeleton/SkeletonTypography.test.tsx +28 -0
  274. package/dist/src/components/skeleton/SkeletonTypography.tsx +57 -0
  275. package/dist/src/components/skeleton/__snapshots__/SkeletonCircle.test.tsx.snap +54 -0
  276. package/dist/src/components/skeleton/__snapshots__/SkeletonRectangle.test.tsx.snap +177 -0
  277. package/dist/src/components/skeleton/__snapshots__/SkeletonTypography.test.tsx.snap +174 -0
  278. package/dist/src/components/skeleton/index.ts +3 -0
  279. package/dist/src/components/slider/Slider.stories.tsx +29 -0
  280. package/dist/src/components/slider/Slider.test.tsx +31 -0
  281. package/dist/src/components/slider/Slider.tsx +299 -0
  282. package/dist/src/components/slider/__snapshots__/Slider.test.tsx.snap +122 -0
  283. package/dist/src/components/slider/index.ts +2 -0
  284. package/dist/src/components/slideshow/Slides.tsx +124 -0
  285. package/dist/src/components/slideshow/Slideshow.stories.tsx +212 -0
  286. package/dist/src/components/slideshow/Slideshow.test.tsx +39 -0
  287. package/dist/src/components/slideshow/Slideshow.tsx +170 -0
  288. package/dist/src/components/slideshow/SlideshowControls.stories.tsx +112 -0
  289. package/dist/src/components/slideshow/SlideshowControls.tsx +241 -0
  290. package/dist/src/components/slideshow/SlideshowItem.tsx +52 -0
  291. package/dist/src/components/slideshow/SlideshowItemGroup.tsx +64 -0
  292. package/dist/src/components/slideshow/__snapshots__/Slideshow.test.tsx.snap +157 -0
  293. package/dist/src/components/slideshow/constants.ts +24 -0
  294. package/dist/src/components/slideshow/index.ts +4 -0
  295. package/dist/src/components/slideshow/useKeyNavigate.ts +28 -0
  296. package/dist/src/components/slideshow/usePaginationVisibleRange.ts +37 -0
  297. package/dist/src/components/slideshow/useSlideFocusManagement.tsx +92 -0
  298. package/dist/src/components/slideshow/useSwipeNavigate.ts +18 -0
  299. package/dist/src/components/switch/Switch.stories.tsx +36 -0
  300. package/dist/src/components/switch/Switch.test.tsx +189 -0
  301. package/dist/src/components/switch/Switch.tsx +141 -0
  302. package/dist/src/components/switch/__snapshots__/Switch.test.tsx.snap +179 -0
  303. package/dist/src/components/switch/index.ts +1 -0
  304. package/dist/src/components/table/Table.test.tsx +28 -0
  305. package/dist/src/components/table/Table.tsx +59 -0
  306. package/dist/src/components/table/TableBody.test.tsx +22 -0
  307. package/dist/src/components/table/TableBody.tsx +44 -0
  308. package/dist/src/components/table/TableCell.test.tsx +23 -0
  309. package/dist/src/components/table/TableCell.tsx +125 -0
  310. package/dist/src/components/table/TableHeader.test.tsx +22 -0
  311. package/dist/src/components/table/TableHeader.tsx +50 -0
  312. package/dist/src/components/table/TableRow.test.tsx +22 -0
  313. package/dist/src/components/table/TableRow.tsx +68 -0
  314. package/dist/src/components/table/__snapshots__/Table.test.tsx.snap +263 -0
  315. package/dist/src/components/table/index.ts +5 -0
  316. package/dist/src/components/tabs/Tab.test.tsx +116 -0
  317. package/dist/src/components/tabs/Tab.tsx +120 -0
  318. package/dist/src/components/tabs/TabList.test.tsx +80 -0
  319. package/dist/src/components/tabs/TabList.tsx +82 -0
  320. package/dist/src/components/tabs/TabPanel.test.tsx +74 -0
  321. package/dist/src/components/tabs/TabPanel.tsx +65 -0
  322. package/dist/src/components/tabs/TabProvider.test.tsx +42 -0
  323. package/dist/src/components/tabs/TabProvider.tsx +59 -0
  324. package/dist/src/components/tabs/Tabs.stories.tsx +134 -0
  325. package/dist/src/components/tabs/__snapshots__/Tab.test.tsx.snap +62 -0
  326. package/dist/src/components/tabs/__snapshots__/TabList.test.tsx.snap +22 -0
  327. package/dist/src/components/tabs/__snapshots__/TabPanel.test.tsx.snap +25 -0
  328. package/dist/src/components/tabs/index.ts +4 -0
  329. package/dist/src/components/tabs/state.ts +116 -0
  330. package/dist/src/components/tabs/test.mocks.ts +33 -0
  331. package/dist/src/components/text/Text.stories.jsx +75 -0
  332. package/dist/src/components/text/Text.test.tsx +108 -0
  333. package/dist/src/components/text/Text.tsx +121 -0
  334. package/dist/src/components/text/index.ts +1 -0
  335. package/dist/src/components/text-field/TextField.stories.tsx +169 -0
  336. package/dist/src/components/text-field/TextField.test.tsx +171 -0
  337. package/dist/src/components/text-field/TextField.tsx +432 -0
  338. package/dist/src/components/text-field/__snapshots__/TextField.test.tsx.snap +42 -0
  339. package/dist/src/components/text-field/index.ts +1 -0
  340. package/dist/src/components/thumbnail/Thumbnail.stories.tsx +510 -0
  341. package/dist/src/components/thumbnail/Thumbnail.test.tsx +46 -0
  342. package/dist/src/components/thumbnail/Thumbnail.tsx +222 -0
  343. package/dist/src/components/thumbnail/__snapshots__/Thumbnail.test.tsx.snap +130 -0
  344. package/dist/src/components/thumbnail/index.ts +3 -0
  345. package/dist/src/components/thumbnail/types.ts +39 -0
  346. package/dist/src/components/thumbnail/useFocusPointStyle.test.ts +92 -0
  347. package/dist/src/components/thumbnail/useFocusPointStyle.tsx +111 -0
  348. package/dist/src/components/thumbnail/useImageLoad.ts +40 -0
  349. package/dist/src/components/toolbar/Toolbar.tsx +67 -0
  350. package/dist/src/components/toolbar/index.ts +1 -0
  351. package/dist/src/components/tooltip/Tooltip.stories.tsx +172 -0
  352. package/dist/src/components/tooltip/Tooltip.test.tsx +105 -0
  353. package/dist/src/components/tooltip/Tooltip.tsx +122 -0
  354. package/dist/src/components/tooltip/__snapshots__/Tooltip.test.tsx.snap +233 -0
  355. package/dist/src/components/tooltip/index.ts +1 -0
  356. package/dist/src/components/tooltip/useInjectTooltipRef.tsx +44 -0
  357. package/dist/src/components/tooltip/useTooltipOpen.tsx +113 -0
  358. package/dist/src/components/uploader/Uploader.test.tsx +87 -0
  359. package/dist/src/components/uploader/Uploader.tsx +105 -0
  360. package/dist/src/components/uploader/__snapshots__/Uploader.test.tsx.snap +14 -0
  361. package/dist/src/components/uploader/index.ts +1 -0
  362. package/dist/src/components/user-block/UserBlock.stories.tsx +76 -0
  363. package/dist/src/components/user-block/UserBlock.test.tsx +38 -0
  364. package/dist/src/components/user-block/UserBlock.tsx +179 -0
  365. package/dist/src/components/user-block/__snapshots__/UserBlock.test.tsx.snap +362 -0
  366. package/dist/src/components/user-block/index.ts +1 -0
  367. package/dist/src/constants.ts +17 -0
  368. package/dist/src/hooks/useBooleanState.tsx +13 -0
  369. package/dist/src/hooks/useCallbackOnEscape.ts +34 -0
  370. package/dist/src/hooks/useChipGroupNavigation.tsx +75 -0
  371. package/dist/src/hooks/useClickAway.tsx +47 -0
  372. package/dist/src/hooks/useDisableBodyScroll.ts +28 -0
  373. package/dist/src/hooks/useEventCallback.tsx +17 -0
  374. package/dist/src/hooks/useFocus.tsx +21 -0
  375. package/dist/src/hooks/useFocusTrap.ts +85 -0
  376. package/dist/src/hooks/useFocusWithin.ts +33 -0
  377. package/dist/src/hooks/useInfiniteScroll.tsx +60 -0
  378. package/dist/src/hooks/useIntersectionObserver.tsx +43 -0
  379. package/dist/src/hooks/useInterval.tsx +31 -0
  380. package/dist/src/hooks/useKeyboardListNavigation.tsx +204 -0
  381. package/dist/src/hooks/useListenFocus.tsx +26 -0
  382. package/dist/src/hooks/useOnResize.ts +41 -0
  383. package/dist/src/hooks/useRovingTabIndex.tsx +90 -0
  384. package/dist/src/hooks/useSlideshowControls.ts +243 -0
  385. package/dist/src/hooks/useStopPropagation.ts +21 -0
  386. package/dist/src/hooks/useTransitionVisibility.ts +54 -0
  387. package/dist/src/index.ts +58 -0
  388. package/dist/src/stories/chromaticForceScreenSize.tsx +7 -0
  389. package/dist/src/stories/generated/Autocomplete/Demos.stories.tsx +7 -0
  390. package/dist/src/stories/generated/Avatar/Demos.stories.tsx +7 -0
  391. package/dist/src/stories/generated/Badge/Demos.stories.tsx +9 -0
  392. package/dist/src/stories/generated/Button/Demos.stories.tsx +11 -0
  393. package/dist/src/stories/generated/Checkbox/Demos.stories.tsx +6 -0
  394. package/dist/src/stories/generated/Chip/Demos.stories.tsx +11 -0
  395. package/dist/src/stories/generated/CommentBlock/Demos.stories.tsx +8 -0
  396. package/dist/src/stories/generated/DatePicker/Demos.stories.tsx +8 -0
  397. package/dist/src/stories/generated/Dialog/Demos.stories.tsx +10 -0
  398. package/dist/src/stories/generated/Divider/Demos.stories.tsx +6 -0
  399. package/dist/src/stories/generated/Dropdown/Demos.stories.tsx +8 -0
  400. package/dist/src/stories/generated/ExpansionPanel/Demos.stories.tsx +9 -0
  401. package/dist/src/stories/generated/Flag/Demos.stories.tsx +6 -0
  402. package/dist/src/stories/generated/GenericBlock/Demos.stories.tsx +8 -0
  403. package/dist/src/stories/generated/Heading/Demos.stories.tsx +6 -0
  404. package/dist/src/stories/generated/Icon/Demos.stories.tsx +8 -0
  405. package/dist/src/stories/generated/ImageBlock/Demos.stories.tsx +9 -0
  406. package/dist/src/stories/generated/Lightbox/Demos.stories.tsx +6 -0
  407. package/dist/src/stories/generated/Link/Demos.stories.tsx +8 -0
  408. package/dist/src/stories/generated/LinkPreview/Demos.stories.tsx +7 -0
  409. package/dist/src/stories/generated/List/Demos.stories.tsx +11 -0
  410. package/dist/src/stories/generated/Message/Demos.stories.tsx +10 -0
  411. package/dist/src/stories/generated/Mosaic/Demos.stories.tsx +9 -0
  412. package/dist/src/stories/generated/Notification/Demos.stories.tsx +6 -0
  413. package/dist/src/stories/generated/Popover/Demos.stories.tsx +11 -0
  414. package/dist/src/stories/generated/PopoverDialog/Demos.stories.tsx +6 -0
  415. package/dist/src/stories/generated/PostBlock/Demos.stories.tsx +6 -0
  416. package/dist/src/stories/generated/Progress/Demos.stories.tsx +7 -0
  417. package/dist/src/stories/generated/ProgressTracker/Demos.stories.tsx +9 -0
  418. package/dist/src/stories/generated/RadioButton/Demos.stories.tsx +6 -0
  419. package/dist/src/stories/generated/Select/Demos.stories.tsx +14 -0
  420. package/dist/src/stories/generated/SideNavigation/Demos.stories.tsx +10 -0
  421. package/dist/src/stories/generated/Skeleton/Demos.stories.tsx +9 -0
  422. package/dist/src/stories/generated/Slider/Demos.stories.tsx +9 -0
  423. package/dist/src/stories/generated/Slideshow/Demos.stories.tsx +8 -0
  424. package/dist/src/stories/generated/Switch/Demos.stories.tsx +6 -0
  425. package/dist/src/stories/generated/Table/Demos.stories.tsx +6 -0
  426. package/dist/src/stories/generated/Tabs/Demos.stories.tsx +8 -0
  427. package/dist/src/stories/generated/TextField/Demos.stories.tsx +19 -0
  428. package/dist/src/stories/generated/Thumbnail/Demos.stories.tsx +12 -0
  429. package/dist/src/stories/generated/Toolbar/Demos.stories.tsx +10 -0
  430. package/dist/src/stories/generated/Tooltip/Demos.stories.tsx +8 -0
  431. package/dist/src/stories/generated/Uploader/Demos.stories.tsx +8 -0
  432. package/dist/src/stories/generated/UserBlock/Demos.stories.tsx +10 -0
  433. package/dist/src/stories/knobs/buttonKnob.ts +9 -0
  434. package/dist/src/stories/knobs/emphasisKnob.ts +8 -0
  435. package/dist/src/stories/knobs/enumKnob.ts +14 -0
  436. package/dist/src/stories/knobs/focusKnob.ts +3 -0
  437. package/dist/src/stories/knobs/image.ts +69 -0
  438. package/dist/src/stories/knobs/lorem.ts +59 -0
  439. package/dist/src/stories/knobs/sizeKnob.ts +5 -0
  440. package/dist/src/stories/knobs/thumbnailsKnob.ts +9 -0
  441. package/dist/src/stories/utils/CustomLink.tsx +7 -0
  442. package/dist/src/stories/withResizableBox.tsx +18 -0
  443. package/dist/src/testing/utils/commonTestsSuite.ts +71 -0
  444. package/dist/src/testing/utils/commonTestsSuiteRTL.ts +55 -0
  445. package/dist/src/testing/utils/index.ts +4 -0
  446. package/dist/src/testing/utils/itShouldRenderStories.tsx +103 -0
  447. package/dist/src/testing/utils/queries.ts +19 -0
  448. package/dist/src/untypped-modules.d.ts +7 -0
  449. package/dist/src/utils/ClickAwayProvider/ClickAwayProvider.stories.jsx +58 -0
  450. package/dist/src/utils/ClickAwayProvider/ClickAwayProvider.tsx +65 -0
  451. package/dist/src/utils/ClickAwayProvider/index.ts +1 -0
  452. package/dist/src/utils/MaterialThemeSwitcher/MaterialThemeSwitcher.tsx +54 -0
  453. package/dist/src/utils/MaterialThemeSwitcher/index.ts +1 -0
  454. package/dist/src/utils/browserDoesNotSupportHover.test.js +24 -0
  455. package/dist/src/utils/browserDoesNotSupportHover.ts +2 -0
  456. package/dist/src/utils/clamp.ts +17 -0
  457. package/dist/src/utils/className.ts +44 -0
  458. package/dist/src/utils/event.ts +1 -0
  459. package/dist/src/utils/flattenChildren.test.tsx +58 -0
  460. package/dist/src/utils/flattenChildren.ts +27 -0
  461. package/dist/src/utils/focus/constants.ts +5 -0
  462. package/dist/src/utils/focus/getFirstAndLastFocusable.test.ts +134 -0
  463. package/dist/src/utils/focus/getFirstAndLastFocusable.ts +21 -0
  464. package/dist/src/utils/focus/getFocusableElements.test.ts +151 -0
  465. package/dist/src/utils/focus/getFocusableElements.ts +7 -0
  466. package/dist/src/utils/index.ts +5 -0
  467. package/dist/src/utils/isInternetExplorer.ts +15 -0
  468. package/dist/src/utils/makeListenerTowerContext.ts +32 -0
  469. package/dist/src/utils/mergeRefs.ts +22 -0
  470. package/dist/src/utils/partitionMulti.ts +28 -0
  471. package/dist/src/utils/renderLink.tsx +17 -0
  472. package/dist/src/utils/type.ts +113 -0
  473. package/dist/src/utils/userHasReducedMotion.ts +7 -0
  474. package/dist/src/utils/utils.test.ts +48 -0
  475. package/{utils → dist/utils}/index.d.ts +0 -0
  476. package/{utils → dist/utils}/index.js +0 -0
  477. package/{utils → dist/utils}/index.js.map +0 -0
  478. package/jest/__mocks__/@storybook/addon-actions.js +3 -0
  479. package/jest/__mocks__/@storybook/addon-knobs.js +6 -0
  480. package/jest/__mocks__/emptyFileMockTransformer.js +8 -0
  481. package/jest/__mocks__/emptyModuleMock.js +1 -0
  482. package/jest/configure.js +6 -0
  483. package/jest/index.js +36 -0
  484. package/jest/transform.js +6 -0
  485. package/package.json +3 -5
  486. package/rollup.config.js +98 -0
  487. package/src/components/badge/Badge.tsx +2 -2
  488. package/src/components/button/ButtonRoot.tsx +2 -2
  489. package/src/components/chip/Chip.tsx +2 -2
  490. package/src/components/grid-column/GridColumn.stories.jsx +56 -0
  491. package/src/components/grid-column/GridColumn.test.jsx +58 -0
  492. package/src/components/grid-column/GridColumn.tsx +90 -0
  493. package/src/components/grid-column/index.ts +1 -0
  494. package/src/components/icon/Icon.tsx +2 -2
  495. package/src/components/link/Link.tsx +2 -2
  496. package/src/components/progress/Progress.tsx +6 -25
  497. package/src/components/progress/ProgressCircular.stories.tsx +18 -0
  498. package/src/components/progress/ProgressCircular.test.tsx +49 -0
  499. package/src/components/progress/ProgressCircular.tsx +68 -0
  500. package/src/components/progress/ProgressLinear.stories.tsx +8 -0
  501. package/src/components/progress/ProgressLinear.test.tsx +37 -0
  502. package/src/components/progress/ProgressLinear.tsx +52 -0
  503. package/src/components/progress/index.ts +2 -0
  504. package/src/index.ts +1 -0
  505. package/storybook/build +4 -0
  506. package/storybook/generate-demo-stories.js +59 -0
  507. package/storybook/main.js +67 -0
  508. package/storybook/package.json +13 -0
  509. package/storybook/preview.js +11 -0
  510. package/storybook/start +4 -0
  511. package/storybook/story-block/StoryBlock.tsx +49 -0
  512. package/storybook/story-block/decorator.jsx +7 -0
  513. package/storybook/story-block/index.scss +27 -0
  514. package/storybook/yarn.lock +13192 -0
  515. package/tsconfig.json +3 -0
  516. package/index.js.map +0 -1
  517. package/src/components/progress/__snapshots__/Progress.test.tsx.snap +0 -48
@@ -0,0 +1,19 @@
1
+ import { buildQueries } from '@testing-library/react';
2
+
3
+ export const queryAllByClassName = (container: HTMLElement, className: string) =>
4
+ Array.from(container.getElementsByClassName(className) as HTMLCollectionOf<HTMLElement>);
5
+
6
+ export const [queryByClassName, getAllByClassName, getByClassName, findAllByClassName, findByClassName] = buildQueries(
7
+ queryAllByClassName,
8
+ (_, className) => `Multiple \`.${className}\` found`,
9
+ (_, className) => `No \`.${className}\` found`,
10
+ );
11
+
12
+ export const queryAllByTagName = (container: HTMLElement, tagName: string) =>
13
+ Array.from(container.getElementsByTagName(tagName) as HTMLCollectionOf<HTMLElement>);
14
+
15
+ export const [queryByTagName, getAllByTagName, getByTagName, findAllByTagName, findByTagName] = buildQueries(
16
+ queryAllByTagName,
17
+ (_, tagName) => `Multiple \`${tagName}\` found`,
18
+ (_, tagName) => `No \`${tagName}\` found`,
19
+ );
@@ -0,0 +1,7 @@
1
+ /**
2
+ * List untypped modules here to declare them as explicit any.
3
+ */
4
+ declare module 'test-data-bot';
5
+ declare module '*.jpg';
6
+ declare module '@storybook/addon-knobs';
7
+ declare module '@storybook/addon-actions';
@@ -0,0 +1,58 @@
1
+ /* eslint-disable @typescript-eslint/no-use-before-define */
2
+ import { Button } from '@lumx/react';
3
+ import { ClickAwayProvider } from '@lumx/react/utils/ClickAwayProvider';
4
+ import React, { useCallback, useRef, useState } from 'react';
5
+ import { createPortal } from 'react-dom';
6
+
7
+ export default {
8
+ title: 'LumX components/ClickAwayProvider',
9
+ parameters: {
10
+ // Disables Chromatic snapshot (not relevant for this story).
11
+ chromatic: { disable: true },
12
+ },
13
+ };
14
+
15
+ // eslint-disable-next-line react/display-name
16
+ const Card = React.forwardRef(({ top, children, close }, ref) => (
17
+ <ClickAwayProvider callback={close} childrenRefs={useRef([ref])}>
18
+ {createPortal(
19
+ <div
20
+ className="lumx-spacing-padding"
21
+ ref={ref}
22
+ style={{ position: 'absolute', top, border: '1px solid red' }}
23
+ >
24
+ {children}
25
+ </div>,
26
+ document.body,
27
+ )}
28
+ </ClickAwayProvider>
29
+ ));
30
+
31
+ const ButtonWithCard = ({ level, parentRef }) => {
32
+ const ref3 = useRef();
33
+ const [isOpen3, setOpen3] = useState(false);
34
+ const open3 = useCallback(() => setOpen3(true), []);
35
+ const close3 = useCallback(() => setOpen3(false), []);
36
+ const nextLevel = level + 1;
37
+
38
+ return (
39
+ <>
40
+ Level {level} - <Button onClick={open3}>Open level {nextLevel}</Button>
41
+ {isOpen3 && (
42
+ <Card ref={ref3} close={close3} top={parentRef?.current?.getBoundingClientRect().bottom || '130px'}>
43
+ {nextLevel === 4 ? `Level ${nextLevel}` : <ButtonWithCard level={nextLevel} parentRef={ref3} />}
44
+ </Card>
45
+ )}
46
+ </>
47
+ );
48
+ };
49
+
50
+ /**
51
+ * This story showcases the detection of click away inside a nested React portal tree (i.e. not nested in the DOM)
52
+ */
53
+ export const NestedClickAway = () => (
54
+ <>
55
+ <p>Clicking inside a level should close all child levels but not parent levels</p>
56
+ <ButtonWithCard level={0} />
57
+ </>
58
+ );
@@ -0,0 +1,65 @@
1
+ import React, { createContext, RefObject, useContext, useEffect, useMemo, useRef } from 'react';
2
+ import { ClickAwayParameters, useClickAway } from '@lumx/react/hooks/useClickAway';
3
+
4
+ interface ContextValue {
5
+ childrenRefs: Array<RefObject<HTMLElement>>;
6
+ addRefs(...newChildrenRefs: Array<RefObject<HTMLElement>>): void;
7
+ }
8
+
9
+ const ClickAwayAncestorContext = createContext<ContextValue | null>(null);
10
+
11
+ interface ClickAwayProviderProps extends ClickAwayParameters {
12
+ /**
13
+ * (Optional) Element that should be considered as part of the parent
14
+ */
15
+ parentRef?: RefObject<HTMLElement>;
16
+ }
17
+
18
+ /**
19
+ * Component combining the `useClickAway` hook with a React context to hook into the React component tree and make sure
20
+ * we take into account both the DOM tree and the React tree to detect click away.
21
+ *
22
+ * @return the react component.
23
+ */
24
+ export const ClickAwayProvider: React.FC<ClickAwayProviderProps> = ({
25
+ children,
26
+ callback,
27
+ childrenRefs,
28
+ parentRef,
29
+ }) => {
30
+ const parentContext = useContext(ClickAwayAncestorContext);
31
+ const currentContext = useMemo(() => {
32
+ const context: ContextValue = {
33
+ childrenRefs: [],
34
+ /**
35
+ * Add element refs to the current context and propagate to the parent context.
36
+ */
37
+ addRefs(...newChildrenRefs) {
38
+ // Add element refs that should be considered as inside the click away context.
39
+ context.childrenRefs.push(...newChildrenRefs);
40
+
41
+ if (parentContext) {
42
+ // Also add then to the parent context
43
+ parentContext.addRefs(...newChildrenRefs);
44
+ if (parentRef) {
45
+ // The parent element is also considered as inside the parent click away context but not inside the current context
46
+ parentContext.addRefs(parentRef);
47
+ }
48
+ }
49
+ },
50
+ };
51
+ return context;
52
+ }, [parentContext, parentRef]);
53
+
54
+ useEffect(() => {
55
+ const { current: currentRefs } = childrenRefs;
56
+ if (!currentRefs) {
57
+ return;
58
+ }
59
+ currentContext.addRefs(...currentRefs);
60
+ }, [currentContext, childrenRefs]);
61
+
62
+ useClickAway({ callback, childrenRefs: useRef(currentContext.childrenRefs) });
63
+ return <ClickAwayAncestorContext.Provider value={currentContext}>{children}</ClickAwayAncestorContext.Provider>;
64
+ };
65
+ ClickAwayProvider.displayName = 'ClickAwayProvider';
@@ -0,0 +1 @@
1
+ export * from './ClickAwayProvider';
@@ -0,0 +1,54 @@
1
+ import React, { useCallback, useState } from 'react';
2
+ import { Switch } from '@lumx/react/components/switch';
3
+ import { Alignment } from '@lumx/react';
4
+
5
+ // Global state used to
6
+ const globalState = {
7
+ isEnabled: false,
8
+ styleSheet: null as any,
9
+ };
10
+
11
+ /** Toggle apply the material CSS override. */
12
+ async function toggleMaterialTheme(wasEnabled: boolean) {
13
+ globalState.isEnabled = !wasEnabled;
14
+
15
+ // Inject the material theme CSS file.
16
+ if (!globalState.styleSheet) {
17
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
18
+ // @ts-ignore
19
+ const cssCode = await import('!!raw-loader!@lumx/core/css/material.css');
20
+
21
+ // Inject CSS override in a <style> node in <head>
22
+ const style = document.createElement('style');
23
+ style.textContent = cssCode.default;
24
+ document.head.appendChild(style);
25
+
26
+ globalState.styleSheet = style.sheet;
27
+ }
28
+ // Disable/Enable stylesheet
29
+ globalState.styleSheet.disabled = !globalState.isEnabled;
30
+ }
31
+
32
+ export const MaterialThemeSwitcher: React.FC<any> = ({ theme }) => {
33
+ const [isEnabled, setEnabled] = useState(globalState.isEnabled);
34
+ const toggleTheme = useCallback(
35
+ () =>
36
+ setEnabled((wasEnabled) => {
37
+ toggleMaterialTheme(wasEnabled);
38
+ return !wasEnabled;
39
+ }),
40
+ [],
41
+ );
42
+
43
+ return (
44
+ <Switch
45
+ className="material-theme-switcher"
46
+ isChecked={isEnabled}
47
+ onChange={toggleTheme}
48
+ position={Alignment.right}
49
+ theme={theme}
50
+ >
51
+ Material theme
52
+ </Switch>
53
+ );
54
+ };
@@ -0,0 +1 @@
1
+ export * from './MaterialThemeSwitcher';
@@ -0,0 +1,24 @@
1
+ import { browserDoesNotSupportHover } from '@lumx/react/utils/browserDoesNotSupportHover';
2
+
3
+ const originalMatchMedia = global.matchMedia;
4
+
5
+ describe('browserDoesNotSupportHover', () => {
6
+ afterAll(() => {
7
+ global.matchMedia = originalMatchMedia;
8
+ });
9
+
10
+ it('should return `false` on browsers that do not support matchMedia', () => {
11
+ global.matchMedia = undefined;
12
+ expect(browserDoesNotSupportHover()).toBe(false);
13
+ });
14
+
15
+ it('should return `false` on browsers that support matchMedia and does support hover', () => {
16
+ global.matchMedia = () => ({ matches: false });
17
+ expect(browserDoesNotSupportHover()).toBe(false);
18
+ });
19
+
20
+ it('should return `true` on browsers that support matchMedia and does not support hover', () => {
21
+ global.matchMedia = () => ({ matches: true });
22
+ expect(browserDoesNotSupportHover()).toBe(true);
23
+ });
24
+ });
@@ -0,0 +1,2 @@
1
+ /** Return true if the browser does not support pointer hover */
2
+ export const browserDoesNotSupportHover = (): boolean => !!window.matchMedia?.('(hover: none)').matches;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Clamp value in range.
3
+ *
4
+ * @param value Value to clamp.
5
+ * @param min Minimum value.
6
+ * @param max Maximum value.
7
+ * @return Clamped value.
8
+ */
9
+ export const clamp = (value: number, min: number, max: number): number => {
10
+ if (value < min) {
11
+ return min;
12
+ }
13
+ if (value > max) {
14
+ return max;
15
+ }
16
+ return value;
17
+ };
@@ -0,0 +1,44 @@
1
+ import { CSS_PREFIX } from '@lumx/react/constants';
2
+
3
+ import kebabCase from 'lodash/kebabCase';
4
+ import { ColorPalette, ColorVariant, Typography } from '@lumx/react/components';
5
+
6
+ // See https://regex101.com/r/YjS1uI/3
7
+ const LAST_PART_CLASSNAME = /^(.*)-(.+)$/gi;
8
+
9
+ export { getBasicClass, handleBasicClasses } from '@lumx/core/js/utils';
10
+
11
+ /**
12
+ * Get the name of the root CSS class of a component based on its name.
13
+ *
14
+ * @param componentName The name of the component. This name should contains the component prefix and be
15
+ * written in PascalCase.
16
+ * @param subComponent Whether the current component is a sub component, if true, define the class according
17
+ * to BEM standards.
18
+ * @return The name of the root CSS class. This classname include the CSS classname prefix and is written in
19
+ * lower-snake-case.
20
+ */
21
+ export function getRootClassName(componentName: string, subComponent?: boolean): string {
22
+ const formattedClassName = `${CSS_PREFIX}-${kebabCase(componentName)}`;
23
+
24
+ if (subComponent) {
25
+ return formattedClassName.replace(LAST_PART_CLASSNAME, '$1__$2');
26
+ }
27
+ return formattedClassName;
28
+ }
29
+
30
+ /**
31
+ * Returns the classname associated to the given color and variant.
32
+ * For example, for 'dark' and 'L2' it returns `lumx-color-font-dark-l2`
33
+ */
34
+ export const getFontColorClassName = (color: ColorPalette, colorVariant: ColorVariant = ColorVariant.N) => {
35
+ return `lumx-color-font-${color}-${colorVariant}`;
36
+ };
37
+
38
+ /**
39
+ * Returns the classname associated to the given typography.
40
+ * For example, for `Typography.title` it returns `lumx-typography-title`
41
+ */
42
+ export const getTypographyClassName = (typography: Typography) => {
43
+ return `lumx-typography-${typography}`;
44
+ };
@@ -0,0 +1 @@
1
+ export { onEnterPressed, onButtonPressed, onEscapePressed } from '@lumx/core/js/utils';
@@ -0,0 +1,58 @@
1
+ import { flattenChildren } from '@lumx/react/utils/flattenChildren';
2
+ import { mount } from 'enzyme';
3
+ import React from 'react';
4
+
5
+ const Comp = ({ children }: any) => children;
6
+
7
+ describe('flattenChildren', () => {
8
+ it('should flatten children in arrays or fragments', () => {
9
+ const nodes = (
10
+ <Comp>
11
+ {flattenChildren(
12
+ <>
13
+ <Comp>foo</Comp>
14
+ {[
15
+ <Comp key="1">bar</Comp>,
16
+ <Comp key="2">{['baz', <Comp key="1">qux</Comp>]}</Comp>,
17
+ ['quux', <Comp key="2">quuz</Comp>],
18
+ ]}
19
+ corge
20
+ <>grault</>
21
+ </>,
22
+ )}
23
+ </Comp>
24
+ );
25
+ expect(mount(nodes)).toMatchInlineSnapshot(`
26
+ <Comp>
27
+ <Comp
28
+ key=".0..0"
29
+ >
30
+ foo
31
+ </Comp>
32
+ <Comp
33
+ key=".0..1:$1"
34
+ >
35
+ bar
36
+ </Comp>
37
+ <Comp
38
+ key=".0..1:$2"
39
+ >
40
+ baz
41
+ <Comp
42
+ key="1"
43
+ >
44
+ qux
45
+ </Comp>
46
+ </Comp>
47
+ quux
48
+ <Comp
49
+ key=".0..1:2:$2"
50
+ >
51
+ quuz
52
+ </Comp>
53
+ corge
54
+ grault
55
+ </Comp>
56
+ `);
57
+ });
58
+ });
@@ -0,0 +1,27 @@
1
+ import get from 'lodash/get';
2
+ import { Children, Key, ReactChild, ReactNode, cloneElement, isValidElement } from 'react';
3
+ import { isFragment } from 'react-is';
4
+
5
+ /**
6
+ * Flatten list of react nodes removing fragments and adding keys.
7
+ * based on: https://github.com/grrowl/react-keyed-flatten-children/blob/5d421644a449765ddd62b659946196b4b5d7b135/index.ts
8
+ *
9
+ * @param children React nodes to flatten.
10
+ * @return Flattened react nodes.
11
+ */
12
+ export function flattenChildren(children: ReactNode) {
13
+ function recur(nodes: ReactNode, keys: Key[] = []) {
14
+ return Children.toArray(nodes).reduce((acc: ReactChild[], node, index) => {
15
+ const nodeKeys = keys.concat(get(node, 'key') ?? index);
16
+ if (isFragment(node)) {
17
+ acc.push(...recur(node.props.children, nodeKeys));
18
+ } else if (isValidElement(node)) {
19
+ acc.push(cloneElement(node, { key: nodeKeys.join('.') }));
20
+ } else if (typeof node === 'string' || typeof node === 'number') {
21
+ acc.push(node);
22
+ }
23
+ return acc;
24
+ }, []);
25
+ }
26
+ return recur(children);
27
+ }
@@ -0,0 +1,5 @@
1
+ /** CSS selector listing all tabbable elements. */
2
+ export const TABBABLE_ELEMENTS_SELECTOR = `a[href], button, textarea, input:not([type="hidden"]):not([hidden]), [tabindex]`;
3
+
4
+ /** CSS selector matching element that are disabled (should not receive focus). */
5
+ export const DISABLED_SELECTOR = `[hidden], [tabindex="-1"], [disabled]:not([disabled="false"]), [aria-disabled]:not([aria-disabled="false"])`;
@@ -0,0 +1,134 @@
1
+ import { getFirstAndLastFocusable } from '@lumx/react/utils/focus/getFirstAndLastFocusable';
2
+
3
+ function htmlToElement(html: string): any {
4
+ const template = document.createElement('template');
5
+ template.innerHTML = html.trim();
6
+ return template.content.firstChild;
7
+ }
8
+
9
+ describe(getFirstAndLastFocusable.name, () => {
10
+ it('should get empty', () => {
11
+ const element = htmlToElement(`<div></div>`);
12
+ const focusable = getFirstAndLastFocusable(element);
13
+ expect(focusable).toEqual({});
14
+ });
15
+
16
+ it('should get single item', () => {
17
+ const element = htmlToElement(`<div><button /></div>`);
18
+ const focusable = getFirstAndLastFocusable(element);
19
+ expect(focusable.last).toBe(focusable.first);
20
+ });
21
+
22
+ it('should get first and last', () => {
23
+ const element = htmlToElement(`
24
+ <div>
25
+ <div>Non focusable div</div>
26
+ <button>Simple button</button>
27
+ <div>Non focusable div</div>
28
+ <input />
29
+ <div>Non focusable div</div>
30
+ </div>
31
+ `);
32
+ const focusable = getFirstAndLastFocusable(element);
33
+ expect(focusable.first).toMatchInlineSnapshot(`
34
+ <button>
35
+ Simple button
36
+ </button>
37
+ `);
38
+ expect(focusable.first).toMatchInlineSnapshot(`
39
+ <button>
40
+ Simple button
41
+ </button>
42
+ `);
43
+ });
44
+
45
+ describe('match focusable elements', () => {
46
+ it('should match input element', () => {
47
+ const element = htmlToElement(`<div><input /></div>`);
48
+ const focusable = getFirstAndLastFocusable(element);
49
+ expect(focusable.first).toMatchInlineSnapshot(`<input />`);
50
+ });
51
+
52
+ it('should match link element', () => {
53
+ const element = htmlToElement(`<div><a href="#" /></div>`);
54
+ const focusable = getFirstAndLastFocusable(element);
55
+ expect(focusable.first).toMatchInlineSnapshot(`
56
+ <a
57
+ href="#"
58
+ />
59
+ `);
60
+ });
61
+
62
+ it('should match textarea element', () => {
63
+ const element = htmlToElement(`<div><textarea /></div>`);
64
+ const focusable = getFirstAndLastFocusable(element);
65
+ expect(focusable.first).toMatchInlineSnapshot(`
66
+ <textarea>
67
+ &lt;/div&gt;
68
+ </textarea>
69
+ `);
70
+ });
71
+
72
+ it('should match element with tabindex', () => {
73
+ const element = htmlToElement(`<div><span tabindex="0" /></div>`);
74
+ const focusable = getFirstAndLastFocusable(element);
75
+ expect(focusable.first).toMatchInlineSnapshot(`
76
+ <span
77
+ tabindex="0"
78
+ />
79
+ `);
80
+ });
81
+
82
+ it('should keep disabled=false', () => {
83
+ const element = htmlToElement(`<div><button disabled="false" /><button /></div>`);
84
+ const focusable = getFirstAndLastFocusable(element);
85
+ expect(focusable.first).toMatchInlineSnapshot(`
86
+ <button
87
+ disabled="false"
88
+ />
89
+ `);
90
+ });
91
+
92
+ it('should keep aria-disabled=false', () => {
93
+ const element = htmlToElement(`<div><button aria-disabled="false" /><button /></div>`);
94
+ const focusable = getFirstAndLastFocusable(element);
95
+ expect(focusable.first).toMatchInlineSnapshot(`
96
+ <button
97
+ aria-disabled="false"
98
+ />
99
+ `);
100
+ });
101
+ });
102
+
103
+ describe('skip disabled elements', () => {
104
+ it('should skip disabled', () => {
105
+ const element = htmlToElement(`<div><button disabled /><button /></div>`);
106
+ const focusable = getFirstAndLastFocusable(element);
107
+ expect(focusable.first).toMatchInlineSnapshot(`<button />`);
108
+ });
109
+
110
+ it('should skip aria-disabled', () => {
111
+ const element = htmlToElement(`<div><button aria-disabled /><button /></div>`);
112
+ const focusable = getFirstAndLastFocusable(element);
113
+ expect(focusable.first).toMatchInlineSnapshot(`<button />`);
114
+ });
115
+
116
+ it('should skip tabindex=-1', () => {
117
+ const element = htmlToElement(`<div><button tabindex="-1" /><button /></div>`);
118
+ const focusable = getFirstAndLastFocusable(element);
119
+ expect(focusable.first).toMatchInlineSnapshot(`<button />`);
120
+ });
121
+
122
+ it('should skip input type hidden', () => {
123
+ const element = htmlToElement(`<div><input type="hidden" /><button /></div>`);
124
+ const focusable = getFirstAndLastFocusable(element);
125
+ expect(focusable.first).toMatchInlineSnapshot(`<button />`);
126
+ });
127
+
128
+ it('should skip hidden input', () => {
129
+ const element = htmlToElement(`<div><input hidden /><button /></div>`);
130
+ const focusable = getFirstAndLastFocusable(element);
131
+ expect(focusable.first).toMatchInlineSnapshot(`<button />`);
132
+ });
133
+ });
134
+ });
@@ -0,0 +1,21 @@
1
+ import { getFocusableElements } from './getFocusableElements';
2
+
3
+ /**
4
+ * Get first and last elements focusable in an element.
5
+ *
6
+ * @param parentElement The element in which to search focusable elements.
7
+ * @return first and last focusable elements
8
+ */
9
+ export function getFirstAndLastFocusable(parentElement: HTMLElement) {
10
+ const focusableElements = getFocusableElements(parentElement);
11
+
12
+ // First non disabled element.
13
+ const first = focusableElements[0];
14
+ // Last non disabled element.
15
+ const last = focusableElements[focusableElements.length - 1];
16
+
17
+ if (last && first) {
18
+ return { first, last };
19
+ }
20
+ return {};
21
+ }