@itwin/itwinui-react 3.0.4 → 3.0.6

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 (500) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/cjs/core/Alert/Alert.js +46 -106
  3. package/cjs/core/Avatar/Avatar.js +21 -58
  4. package/cjs/core/AvatarGroup/AvatarGroup.js +26 -64
  5. package/cjs/core/Backdrop/Backdrop.js +8 -16
  6. package/cjs/core/Badge/Badge.js +22 -39
  7. package/cjs/core/Breadcrumbs/Breadcrumbs.js +61 -138
  8. package/cjs/core/ButtonGroup/ButtonGroup.js +32 -68
  9. package/cjs/core/Buttons/Button.js +11 -57
  10. package/cjs/core/Buttons/DropdownButton.js +15 -49
  11. package/cjs/core/Buttons/IconButton.js +13 -53
  12. package/cjs/core/Buttons/IdeasButton.js +8 -20
  13. package/cjs/core/Buttons/SplitButton.js +43 -103
  14. package/cjs/core/Carousel/Carousel.js +54 -78
  15. package/cjs/core/Carousel/CarouselContext.js +4 -4
  16. package/cjs/core/Carousel/CarouselDot.js +12 -23
  17. package/cjs/core/Carousel/CarouselDotsList.js +92 -153
  18. package/cjs/core/Carousel/CarouselNavigation.js +41 -84
  19. package/cjs/core/Carousel/CarouselSlide.js +26 -49
  20. package/cjs/core/Carousel/CarouselSlider.js +47 -66
  21. package/cjs/core/Checkbox/Checkbox.js +32 -88
  22. package/cjs/core/ColorPicker/ColorBuilder.js +174 -292
  23. package/cjs/core/ColorPicker/ColorInputPanel.js +246 -411
  24. package/cjs/core/ColorPicker/ColorPalette.js +23 -47
  25. package/cjs/core/ColorPicker/ColorPicker.js +53 -87
  26. package/cjs/core/ColorPicker/ColorPickerContext.js +9 -11
  27. package/cjs/core/ColorPicker/ColorSwatch.js +15 -40
  28. package/cjs/core/ComboBox/ComboBox.js +280 -402
  29. package/cjs/core/ComboBox/ComboBoxEndIcon.js +12 -28
  30. package/cjs/core/ComboBox/ComboBoxInput.js +131 -207
  31. package/cjs/core/ComboBox/ComboBoxInputContainer.js +12 -35
  32. package/cjs/core/ComboBox/ComboBoxMenu.js +43 -87
  33. package/cjs/core/ComboBox/ComboBoxMenuItem.js +21 -73
  34. package/cjs/core/ComboBox/ComboBoxMultipleContainer.js +7 -13
  35. package/cjs/core/ComboBox/helpers.js +43 -47
  36. package/cjs/core/DatePicker/DatePicker.js +333 -569
  37. package/cjs/core/Dialog/Dialog.js +36 -65
  38. package/cjs/core/Dialog/DialogBackdrop.js +27 -47
  39. package/cjs/core/Dialog/DialogButtonBar.js +3 -3
  40. package/cjs/core/Dialog/DialogContent.js +18 -26
  41. package/cjs/core/Dialog/DialogContext.js +5 -5
  42. package/cjs/core/Dialog/DialogDragContext.js +8 -8
  43. package/cjs/core/Dialog/DialogMain.js +137 -183
  44. package/cjs/core/Dialog/DialogTitleBar.js +20 -67
  45. package/cjs/core/Dialog/DialogTitleBarTitle.js +3 -3
  46. package/cjs/core/Divider/Divider.js +8 -14
  47. package/cjs/core/DropdownMenu/DropdownMenu.js +46 -80
  48. package/cjs/core/ExpandableBlock/ExpandableBlock.js +101 -206
  49. package/cjs/core/Fieldset/Fieldset.js +14 -25
  50. package/cjs/core/FileUpload/FileEmptyCard.js +17 -43
  51. package/cjs/core/FileUpload/FileUpload.js +42 -88
  52. package/cjs/core/FileUpload/FileUploadCard.js +84 -169
  53. package/cjs/core/FileUpload/FileUploadTemplate.js +16 -51
  54. package/cjs/core/Flex/Flex.js +77 -93
  55. package/cjs/core/Footer/Footer.js +64 -103
  56. package/cjs/core/Footer/FooterItem.js +3 -3
  57. package/cjs/core/Footer/FooterList.js +3 -3
  58. package/cjs/core/Footer/FooterSeparator.js +5 -8
  59. package/cjs/core/Header/Header.js +22 -67
  60. package/cjs/core/Header/HeaderBasicButton.js +13 -24
  61. package/cjs/core/Header/HeaderBreadcrumbs.js +14 -38
  62. package/cjs/core/Header/HeaderButton.js +22 -76
  63. package/cjs/core/Header/HeaderDropdownButton.js +20 -48
  64. package/cjs/core/Header/HeaderLogo.js +11 -42
  65. package/cjs/core/Header/HeaderSplitButton.js +21 -66
  66. package/cjs/core/Icon/Icon.js +18 -32
  67. package/cjs/core/InformationPanel/InformationPanel.js +42 -77
  68. package/cjs/core/InformationPanel/InformationPanelBody.js +4 -6
  69. package/cjs/core/InformationPanel/InformationPanelContent.js +8 -20
  70. package/cjs/core/InformationPanel/InformationPanelHeader.js +14 -34
  71. package/cjs/core/InformationPanel/InformationPanelWrapper.js +4 -6
  72. package/cjs/core/Input/Input.js +10 -18
  73. package/cjs/core/InputGrid/InputGrid.js +8 -17
  74. package/cjs/core/InputGroup/InputGroup.js +25 -72
  75. package/cjs/core/InputWithDecorations/InputWithDecorations.js +23 -51
  76. package/cjs/core/Label/Label.js +11 -32
  77. package/cjs/core/LabeledInput/LabeledInput.js +20 -70
  78. package/cjs/core/LabeledSelect/LabeledSelect.js +28 -77
  79. package/cjs/core/LabeledTextarea/LabeledTextarea.js +7 -13
  80. package/cjs/core/LinkAction/LinkAction.js +3 -3
  81. package/cjs/core/List/List.js +3 -3
  82. package/cjs/core/List/ListItem.js +35 -55
  83. package/cjs/core/Menu/Menu.js +53 -66
  84. package/cjs/core/Menu/MenuDivider.js +4 -4
  85. package/cjs/core/Menu/MenuExtraContent.js +4 -4
  86. package/cjs/core/Menu/MenuItem.js +92 -168
  87. package/cjs/core/Menu/MenuItemSkeleton.js +19 -54
  88. package/cjs/core/Modal/Modal.js +11 -38
  89. package/cjs/core/Modal/ModalButtonBar.js +4 -7
  90. package/cjs/core/Modal/ModalContent.js +3 -3
  91. package/cjs/core/NonIdealState/ErrorPage.js +131 -187
  92. package/cjs/core/NonIdealState/NonIdealState.js +12 -77
  93. package/cjs/core/NotificationMarker/NotificationMarker.js +8 -29
  94. package/cjs/core/Overlay/Overlay.d.ts +20 -24
  95. package/cjs/core/Overlay/Overlay.js +50 -64
  96. package/cjs/core/Popover/Popover.js +87 -157
  97. package/cjs/core/ProgressIndicators/ProgressLinear.js +11 -49
  98. package/cjs/core/ProgressIndicators/ProgressRadial.js +19 -51
  99. package/cjs/core/Radio/Radio.js +12 -54
  100. package/cjs/core/RadioTiles/RadioTile.js +14 -80
  101. package/cjs/core/RadioTiles/RadioTileGroup.js +9 -16
  102. package/cjs/core/SearchBox/SearchBox.js +104 -221
  103. package/cjs/core/Select/Select.js +141 -276
  104. package/cjs/core/Select/SelectTag.js +9 -21
  105. package/cjs/core/Select/SelectTagContainer.js +14 -30
  106. package/cjs/core/SideNavigation/SideNavigation.js +29 -138
  107. package/cjs/core/SideNavigation/SidenavButton.js +8 -30
  108. package/cjs/core/SideNavigation/SidenavSubmenu.js +9 -23
  109. package/cjs/core/SideNavigation/SidenavSubmenuHeader.js +10 -29
  110. package/cjs/core/SkipToContentLink/SkipToContentLink.js +8 -20
  111. package/cjs/core/Slider/Slider.js +195 -376
  112. package/cjs/core/Slider/Thumb.js +57 -108
  113. package/cjs/core/Slider/Track.js +55 -83
  114. package/cjs/core/StatusMessage/StatusMessage.js +12 -34
  115. package/cjs/core/Stepper/Stepper.js +21 -80
  116. package/cjs/core/Stepper/StepperStep.js +36 -109
  117. package/cjs/core/Stepper/WorkflowDiagram.js +15 -38
  118. package/cjs/core/Stepper/WorkflowDiagramStep.js +11 -39
  119. package/cjs/core/Surface/Surface.js +54 -94
  120. package/cjs/core/Table/SubRowExpander.js +15 -37
  121. package/cjs/core/Table/Table.js +419 -763
  122. package/cjs/core/Table/TableCell.js +63 -113
  123. package/cjs/core/Table/TablePaginator.js +136 -312
  124. package/cjs/core/Table/TableRowMemoized.js +64 -137
  125. package/cjs/core/Table/actionHandlers/expandHandler.js +12 -12
  126. package/cjs/core/Table/actionHandlers/filterHandler.js +17 -25
  127. package/cjs/core/Table/actionHandlers/index.js +14 -56
  128. package/cjs/core/Table/actionHandlers/resizeHandler.js +13 -13
  129. package/cjs/core/Table/actionHandlers/selectHandler.js +98 -128
  130. package/cjs/core/Table/cells/DefaultCell.js +13 -48
  131. package/cjs/core/Table/cells/EditableCell.js +46 -75
  132. package/cjs/core/Table/cells/index.js +6 -16
  133. package/cjs/core/Table/columns/actionColumn.js +67 -97
  134. package/cjs/core/Table/columns/expanderColumn.js +32 -46
  135. package/cjs/core/Table/columns/index.js +11 -41
  136. package/cjs/core/Table/columns/selectionColumn.js +29 -57
  137. package/cjs/core/Table/filters/BaseFilter.js +13 -24
  138. package/cjs/core/Table/filters/DateRangeFilter/DatePickerInput.js +52 -120
  139. package/cjs/core/Table/filters/DateRangeFilter/DateRangeFilter.js +60 -120
  140. package/cjs/core/Table/filters/FilterButtonBar.js +16 -39
  141. package/cjs/core/Table/filters/FilterToggle.js +26 -62
  142. package/cjs/core/Table/filters/NumberRangeFilter/NumberRangeFilter.js +36 -58
  143. package/cjs/core/Table/filters/TextFilter/TextFilter.js +28 -40
  144. package/cjs/core/Table/filters/customFilterFunctions.js +14 -16
  145. package/cjs/core/Table/filters/defaultFilterFunctions.js +81 -86
  146. package/cjs/core/Table/filters/index.js +11 -35
  147. package/cjs/core/Table/filters/tableFilters.js +32 -44
  148. package/cjs/core/Table/filters/types.js +2 -2
  149. package/cjs/core/Table/hooks/index.js +19 -67
  150. package/cjs/core/Table/hooks/useColumnDragAndDrop.js +86 -101
  151. package/cjs/core/Table/hooks/useExpanderCell.js +25 -33
  152. package/cjs/core/Table/hooks/useResizeColumns.js +290 -362
  153. package/cjs/core/Table/hooks/useScrollToRow.js +38 -46
  154. package/cjs/core/Table/hooks/useSelectionCell.js +10 -17
  155. package/cjs/core/Table/hooks/useStickyColumns.js +62 -64
  156. package/cjs/core/Table/hooks/useSubRowFiltering.js +88 -95
  157. package/cjs/core/Table/hooks/useSubRowSelection.js +31 -32
  158. package/cjs/core/Table/index.js +18 -78
  159. package/cjs/core/Table/utils.js +40 -42
  160. package/cjs/core/Tabs/Tabs.js +232 -417
  161. package/cjs/core/Tag/Tag.js +15 -42
  162. package/cjs/core/Tag/TagContainer.js +11 -23
  163. package/cjs/core/Textarea/Textarea.js +6 -11
  164. package/cjs/core/ThemeProvider/ThemeContext.js +4 -4
  165. package/cjs/core/ThemeProvider/ThemeProvider.js +52 -105
  166. package/cjs/core/Tile/Tile.js +230 -410
  167. package/cjs/core/TimePicker/TimePicker.js +234 -458
  168. package/cjs/core/Toast/Toast.js +107 -204
  169. package/cjs/core/Toast/Toaster.js +77 -102
  170. package/cjs/core/ToggleSwitch/ToggleSwitch.js +23 -66
  171. package/cjs/core/Tooltip/Tooltip.js +91 -137
  172. package/cjs/core/TransferList/TransferList.js +103 -177
  173. package/cjs/core/Tree/Tree.js +129 -204
  174. package/cjs/core/Tree/TreeContext.js +9 -9
  175. package/cjs/core/Tree/TreeNode.js +104 -207
  176. package/cjs/core/Tree/TreeNodeExpander.js +12 -26
  177. package/cjs/core/Typography/Anchor.js +3 -3
  178. package/cjs/core/Typography/Blockquote.js +10 -18
  179. package/cjs/core/Typography/Code.js +3 -3
  180. package/cjs/core/Typography/Kbd.js +21 -30
  181. package/cjs/core/Typography/Text.js +13 -26
  182. package/cjs/core/VisuallyHidden/VisuallyHidden.js +8 -14
  183. package/cjs/core/utils/color/ColorValue.js +453 -535
  184. package/cjs/core/utils/color/index.js +4 -4
  185. package/cjs/core/utils/components/AutoclearingHiddenLiveRegion.js +13 -20
  186. package/cjs/core/utils/components/Box.js +3 -3
  187. package/cjs/core/utils/components/ButtonBase.js +20 -38
  188. package/cjs/core/utils/components/FocusTrap.js +38 -47
  189. package/cjs/core/utils/components/InputContainer.js +19 -58
  190. package/cjs/core/utils/components/InputFlexContainer.js +8 -24
  191. package/cjs/core/utils/components/MiddleTextTruncation.js +22 -32
  192. package/cjs/core/utils/components/Portal.js +20 -22
  193. package/cjs/core/utils/components/Resizer.js +196 -253
  194. package/cjs/core/utils/components/VirtualScroll.js +223 -304
  195. package/cjs/core/utils/components/WithCSSTransition.js +32 -49
  196. package/cjs/core/utils/components/index.js +14 -14
  197. package/cjs/core/utils/functions/colors.js +22 -25
  198. package/cjs/core/utils/functions/date.js +10 -10
  199. package/cjs/core/utils/functions/dev.js +14 -13
  200. package/cjs/core/utils/functions/dom.d.ts +2 -1
  201. package/cjs/core/utils/functions/dom.js +22 -25
  202. package/cjs/core/utils/functions/focusable.js +17 -26
  203. package/cjs/core/utils/functions/import.js +23 -46
  204. package/cjs/core/utils/functions/index.js +13 -13
  205. package/cjs/core/utils/functions/numbers.d.ts +7 -0
  206. package/cjs/core/utils/functions/numbers.js +21 -10
  207. package/cjs/core/utils/functions/polymorphic.js +30 -43
  208. package/cjs/core/utils/functions/react.js +24 -26
  209. package/cjs/core/utils/functions/supports.js +4 -5
  210. package/cjs/core/utils/hooks/index.js +17 -17
  211. package/cjs/core/utils/hooks/useContainerWidth.js +19 -26
  212. package/cjs/core/utils/hooks/useControlledState.js +12 -21
  213. package/cjs/core/utils/hooks/useDragAndDrop.js +87 -110
  214. package/cjs/core/utils/hooks/useEventListener.js +22 -22
  215. package/cjs/core/utils/hooks/useGlobals.js +27 -33
  216. package/cjs/core/utils/hooks/useId.js +8 -10
  217. package/cjs/core/utils/hooks/useIntersection.js +24 -30
  218. package/cjs/core/utils/hooks/useIsClient.js +9 -9
  219. package/cjs/core/utils/hooks/useIsomorphicLayoutEffect.js +5 -6
  220. package/cjs/core/utils/hooks/useLatestRef.js +9 -9
  221. package/cjs/core/utils/hooks/useMediaQuery.js +31 -31
  222. package/cjs/core/utils/hooks/useMergedRefs.js +16 -15
  223. package/cjs/core/utils/hooks/useOverflow.js +57 -70
  224. package/cjs/core/utils/hooks/useResizeObserver.js +17 -22
  225. package/cjs/core/utils/hooks/useSafeContext.js +9 -9
  226. package/cjs/core/utils/icons/StatusIconMap.js +12 -28
  227. package/cjs/core/utils/icons/Svg.js +3 -3
  228. package/cjs/core/utils/icons/SvgCalendar.js +7 -12
  229. package/cjs/core/utils/icons/SvgCaretDownSmall.js +7 -12
  230. package/cjs/core/utils/icons/SvgCaretRightSmall.js +7 -12
  231. package/cjs/core/utils/icons/SvgCaretUpSmall.js +7 -12
  232. package/cjs/core/utils/icons/SvgCheckmark.js +7 -10
  233. package/cjs/core/utils/icons/SvgCheckmarkSmall.js +7 -12
  234. package/cjs/core/utils/icons/SvgChevronLeft.js +7 -12
  235. package/cjs/core/utils/icons/SvgChevronLeftDouble.js +7 -12
  236. package/cjs/core/utils/icons/SvgChevronRight.js +7 -12
  237. package/cjs/core/utils/icons/SvgChevronRightDouble.js +7 -12
  238. package/cjs/core/utils/icons/SvgClose.js +7 -12
  239. package/cjs/core/utils/icons/SvgCloseSmall.js +7 -12
  240. package/cjs/core/utils/icons/SvgColumnManager.js +7 -12
  241. package/cjs/core/utils/icons/SvgDocument.js +7 -10
  242. package/cjs/core/utils/icons/SvgFilter.js +7 -10
  243. package/cjs/core/utils/icons/SvgFilterHollow.js +7 -12
  244. package/cjs/core/utils/icons/SvgImportantSmall.js +7 -12
  245. package/cjs/core/utils/icons/SvgInfoCircular.js +7 -12
  246. package/cjs/core/utils/icons/SvgMore.js +7 -12
  247. package/cjs/core/utils/icons/SvgMoreVertical.js +7 -12
  248. package/cjs/core/utils/icons/SvgNew.js +7 -12
  249. package/cjs/core/utils/icons/SvgSearch.js +7 -12
  250. package/cjs/core/utils/icons/SvgSmileyHappy.js +7 -12
  251. package/cjs/core/utils/icons/SvgSortDown.js +7 -12
  252. package/cjs/core/utils/icons/SvgSortUp.js +7 -12
  253. package/cjs/core/utils/icons/SvgStatusError.js +7 -12
  254. package/cjs/core/utils/icons/SvgStatusSuccess.js +7 -12
  255. package/cjs/core/utils/icons/SvgStatusWarning.js +7 -12
  256. package/cjs/core/utils/icons/SvgSwap.js +7 -12
  257. package/cjs/core/utils/icons/SvgUpload.js +7 -12
  258. package/cjs/core/utils/icons/index.js +34 -34
  259. package/cjs/core/utils/index.js +10 -10
  260. package/cjs/core/utils/props.js +2 -2
  261. package/cjs/core/utils/types.js +2 -2
  262. package/cjs/index.js +229 -949
  263. package/cjs/react-table/react-table.js +2 -2
  264. package/cjs/styles.js +412 -425
  265. package/esm/core/Alert/Alert.js +39 -106
  266. package/esm/core/Avatar/Avatar.js +14 -42
  267. package/esm/core/AvatarGroup/AvatarGroup.js +20 -58
  268. package/esm/core/Backdrop/Backdrop.js +2 -10
  269. package/esm/core/Badge/Badge.js +16 -31
  270. package/esm/core/Breadcrumbs/Breadcrumbs.js +55 -135
  271. package/esm/core/ButtonGroup/ButtonGroup.js +25 -61
  272. package/esm/core/Buttons/Button.js +5 -45
  273. package/esm/core/Buttons/DropdownButton.js +7 -37
  274. package/esm/core/Buttons/IconButton.js +5 -40
  275. package/esm/core/Buttons/IdeasButton.js +2 -12
  276. package/esm/core/Buttons/SplitButton.js +34 -101
  277. package/esm/core/Carousel/Carousel.js +43 -72
  278. package/esm/core/Carousel/CarouselDot.js +6 -17
  279. package/esm/core/Carousel/CarouselDotsList.js +85 -147
  280. package/esm/core/Carousel/CarouselNavigation.js +32 -68
  281. package/esm/core/Carousel/CarouselSlide.js +19 -41
  282. package/esm/core/Carousel/CarouselSlider.js +41 -65
  283. package/esm/core/Checkbox/Checkbox.js +25 -78
  284. package/esm/core/ColorPicker/ColorBuilder.js +167 -280
  285. package/esm/core/ColorPicker/ColorInputPanel.js +237 -395
  286. package/esm/core/ColorPicker/ColorPalette.js +14 -35
  287. package/esm/core/ColorPicker/ColorPicker.js +46 -79
  288. package/esm/core/ColorPicker/ColorPickerContext.js +5 -7
  289. package/esm/core/ColorPicker/ColorSwatch.js +7 -24
  290. package/esm/core/ComboBox/ComboBox.js +267 -396
  291. package/esm/core/ComboBox/ComboBoxEndIcon.js +5 -18
  292. package/esm/core/ComboBox/ComboBoxInput.js +125 -197
  293. package/esm/core/ComboBox/ComboBoxInputContainer.js +5 -20
  294. package/esm/core/ComboBox/ComboBoxMenu.js +37 -77
  295. package/esm/core/ComboBox/ComboBoxMenuItem.js +14 -61
  296. package/esm/core/ComboBox/ComboBoxMultipleContainer.js +2 -6
  297. package/esm/core/ComboBox/helpers.js +38 -38
  298. package/esm/core/DatePicker/DatePicker.js +326 -555
  299. package/esm/core/Dialog/Dialog.js +24 -53
  300. package/esm/core/Dialog/DialogBackdrop.js +19 -39
  301. package/esm/core/Dialog/DialogContent.js +12 -20
  302. package/esm/core/Dialog/DialogContext.js +1 -1
  303. package/esm/core/Dialog/DialogDragContext.js +4 -4
  304. package/esm/core/Dialog/DialogMain.js +128 -177
  305. package/esm/core/Dialog/DialogTitleBar.js +10 -45
  306. package/esm/core/Divider/Divider.js +2 -8
  307. package/esm/core/DropdownMenu/DropdownMenu.js +40 -75
  308. package/esm/core/ExpandableBlock/ExpandableBlock.js +92 -193
  309. package/esm/core/Fieldset/Fieldset.js +8 -19
  310. package/esm/core/FileUpload/FileEmptyCard.js +8 -19
  311. package/esm/core/FileUpload/FileUpload.js +36 -72
  312. package/esm/core/FileUpload/FileUploadCard.js +76 -153
  313. package/esm/core/FileUpload/FileUploadTemplate.js +9 -37
  314. package/esm/core/Flex/Flex.js +71 -87
  315. package/esm/core/Footer/Footer.js +55 -86
  316. package/esm/core/Footer/FooterSeparator.js +1 -1
  317. package/esm/core/Header/Header.js +14 -55
  318. package/esm/core/Header/HeaderBasicButton.js +7 -15
  319. package/esm/core/Header/HeaderBreadcrumbs.js +8 -32
  320. package/esm/core/Header/HeaderButton.js +14 -62
  321. package/esm/core/Header/HeaderDropdownButton.js +13 -42
  322. package/esm/core/Header/HeaderLogo.js +5 -36
  323. package/esm/core/Header/HeaderSplitButton.js +14 -61
  324. package/esm/core/Icon/Icon.js +12 -26
  325. package/esm/core/InformationPanel/InformationPanel.js +36 -71
  326. package/esm/core/InformationPanel/InformationPanelContent.js +3 -17
  327. package/esm/core/InformationPanel/InformationPanelHeader.js +8 -32
  328. package/esm/core/InformationPanel/InformationPanelWrapper.js +1 -3
  329. package/esm/core/Input/Input.js +4 -12
  330. package/esm/core/InputGrid/InputGrid.js +2 -11
  331. package/esm/core/InputGroup/InputGroup.js +16 -57
  332. package/esm/core/InputWithDecorations/InputWithDecorations.js +11 -42
  333. package/esm/core/Label/Label.js +5 -26
  334. package/esm/core/LabeledInput/LabeledInput.js +10 -63
  335. package/esm/core/LabeledSelect/LabeledSelect.js +18 -67
  336. package/esm/core/LabeledTextarea/LabeledTextarea.js +2 -8
  337. package/esm/core/List/ListItem.js +28 -46
  338. package/esm/core/Menu/Menu.js +48 -64
  339. package/esm/core/Menu/MenuDivider.js +1 -1
  340. package/esm/core/Menu/MenuExtraContent.js +1 -1
  341. package/esm/core/Menu/MenuItem.js +84 -164
  342. package/esm/core/Menu/MenuItemSkeleton.js +12 -43
  343. package/esm/core/Modal/Modal.js +6 -33
  344. package/esm/core/NonIdealState/ErrorPage.js +123 -173
  345. package/esm/core/NonIdealState/NonIdealState.js +6 -65
  346. package/esm/core/NotificationMarker/NotificationMarker.js +2 -20
  347. package/esm/core/Overlay/Overlay.d.ts +20 -24
  348. package/esm/core/Overlay/Overlay.js +45 -55
  349. package/esm/core/Popover/Popover.js +80 -172
  350. package/esm/core/ProgressIndicators/ProgressLinear.js +5 -40
  351. package/esm/core/ProgressIndicators/ProgressRadial.js +14 -40
  352. package/esm/core/Radio/Radio.js +6 -45
  353. package/esm/core/RadioTiles/RadioTile.js +8 -62
  354. package/esm/core/RadioTiles/RadioTileGroup.js +3 -10
  355. package/esm/core/SearchBox/SearchBox.js +97 -214
  356. package/esm/core/Select/Select.js +130 -265
  357. package/esm/core/Select/SelectTag.js +3 -15
  358. package/esm/core/Select/SelectTagContainer.js +7 -20
  359. package/esm/core/SideNavigation/SideNavigation.js +21 -118
  360. package/esm/core/SideNavigation/SidenavButton.js +2 -24
  361. package/esm/core/SideNavigation/SidenavSubmenu.js +3 -14
  362. package/esm/core/SideNavigation/SidenavSubmenuHeader.js +4 -20
  363. package/esm/core/SkipToContentLink/SkipToContentLink.js +2 -11
  364. package/esm/core/Slider/Slider.js +187 -340
  365. package/esm/core/Slider/Thumb.js +50 -97
  366. package/esm/core/Slider/Track.js +49 -74
  367. package/esm/core/StatusMessage/StatusMessage.js +5 -23
  368. package/esm/core/Stepper/Stepper.js +14 -70
  369. package/esm/core/Stepper/StepperStep.js +29 -92
  370. package/esm/core/Stepper/WorkflowDiagram.js +8 -21
  371. package/esm/core/Stepper/WorkflowDiagramStep.js +4 -22
  372. package/esm/core/Surface/Surface.js +48 -84
  373. package/esm/core/Table/SubRowExpander.js +9 -31
  374. package/esm/core/Table/Table.js +408 -763
  375. package/esm/core/Table/TableCell.js +53 -87
  376. package/esm/core/Table/TablePaginator.js +125 -306
  377. package/esm/core/Table/TableRowMemoized.js +58 -129
  378. package/esm/core/Table/actionHandlers/expandHandler.js +10 -10
  379. package/esm/core/Table/actionHandlers/filterHandler.js +15 -23
  380. package/esm/core/Table/actionHandlers/index.js +1 -5
  381. package/esm/core/Table/actionHandlers/resizeHandler.js +11 -11
  382. package/esm/core/Table/actionHandlers/selectHandler.js +95 -122
  383. package/esm/core/Table/cells/DefaultCell.js +7 -42
  384. package/esm/core/Table/cells/EditableCell.js +41 -70
  385. package/esm/core/Table/columns/actionColumn.js +55 -85
  386. package/esm/core/Table/columns/expanderColumn.js +25 -39
  387. package/esm/core/Table/columns/selectionColumn.js +23 -51
  388. package/esm/core/Table/filters/BaseFilter.js +7 -15
  389. package/esm/core/Table/filters/DateRangeFilter/DatePickerInput.js +42 -107
  390. package/esm/core/Table/filters/DateRangeFilter/DateRangeFilter.js +52 -110
  391. package/esm/core/Table/filters/FilterButtonBar.js +9 -28
  392. package/esm/core/Table/filters/FilterToggle.js +18 -51
  393. package/esm/core/Table/filters/NumberRangeFilter/NumberRangeFilter.js +28 -50
  394. package/esm/core/Table/filters/TextFilter/TextFilter.js +20 -32
  395. package/esm/core/Table/filters/customFilterFunctions.js +12 -14
  396. package/esm/core/Table/filters/defaultFilterFunctions.js +79 -84
  397. package/esm/core/Table/filters/tableFilters.js +25 -34
  398. package/esm/core/Table/hooks/useColumnDragAndDrop.js +81 -88
  399. package/esm/core/Table/hooks/useExpanderCell.js +20 -26
  400. package/esm/core/Table/hooks/useResizeColumns.js +287 -353
  401. package/esm/core/Table/hooks/useScrollToRow.js +34 -42
  402. package/esm/core/Table/hooks/useSelectionCell.js +6 -10
  403. package/esm/core/Table/hooks/useStickyColumns.js +59 -61
  404. package/esm/core/Table/hooks/useSubRowFiltering.js +83 -90
  405. package/esm/core/Table/hooks/useSubRowSelection.js +27 -28
  406. package/esm/core/Table/index.js +1 -5
  407. package/esm/core/Table/utils.js +38 -40
  408. package/esm/core/Tabs/Tabs.js +226 -401
  409. package/esm/core/Tag/Tag.js +8 -35
  410. package/esm/core/Tag/TagContainer.js +5 -17
  411. package/esm/core/Textarea/Textarea.js +1 -6
  412. package/esm/core/ThemeProvider/ThemeProvider.js +44 -101
  413. package/esm/core/Tile/Tile.js +218 -386
  414. package/esm/core/TimePicker/TimePicker.js +228 -448
  415. package/esm/core/Toast/Toast.js +99 -193
  416. package/esm/core/Toast/Toaster.js +69 -82
  417. package/esm/core/ToggleSwitch/ToggleSwitch.js +17 -60
  418. package/esm/core/Tooltip/Tooltip.js +86 -151
  419. package/esm/core/TransferList/TransferList.js +93 -157
  420. package/esm/core/Tree/Tree.js +122 -196
  421. package/esm/core/Tree/TreeContext.js +5 -5
  422. package/esm/core/Tree/TreeNode.js +96 -195
  423. package/esm/core/Tree/TreeNodeExpander.js +5 -16
  424. package/esm/core/Typography/Blockquote.js +4 -12
  425. package/esm/core/Typography/Kbd.js +15 -24
  426. package/esm/core/Typography/Text.js +7 -20
  427. package/esm/core/VisuallyHidden/VisuallyHidden.js +2 -8
  428. package/esm/core/utils/color/ColorValue.js +449 -524
  429. package/esm/core/utils/components/AutoclearingHiddenLiveRegion.js +7 -11
  430. package/esm/core/utils/components/ButtonBase.js +13 -31
  431. package/esm/core/utils/components/FocusTrap.js +32 -41
  432. package/esm/core/utils/components/InputContainer.js +11 -50
  433. package/esm/core/utils/components/InputFlexContainer.js +2 -15
  434. package/esm/core/utils/components/MiddleTextTruncation.js +17 -27
  435. package/esm/core/utils/components/Portal.js +12 -12
  436. package/esm/core/utils/components/Resizer.js +192 -250
  437. package/esm/core/utils/components/VirtualScroll.js +218 -297
  438. package/esm/core/utils/components/WithCSSTransition.js +26 -43
  439. package/esm/core/utils/functions/colors.js +19 -19
  440. package/esm/core/utils/functions/date.js +8 -8
  441. package/esm/core/utils/functions/dev.js +12 -11
  442. package/esm/core/utils/functions/dom.d.ts +2 -1
  443. package/esm/core/utils/functions/dom.js +18 -18
  444. package/esm/core/utils/functions/focusable.js +15 -24
  445. package/esm/core/utils/functions/import.js +2 -4
  446. package/esm/core/utils/functions/numbers.d.ts +7 -0
  447. package/esm/core/utils/functions/numbers.js +17 -7
  448. package/esm/core/utils/functions/polymorphic.js +23 -32
  449. package/esm/core/utils/functions/react.js +19 -21
  450. package/esm/core/utils/functions/supports.js +1 -2
  451. package/esm/core/utils/hooks/useContainerWidth.js +13 -16
  452. package/esm/core/utils/hooks/useControlledState.js +8 -17
  453. package/esm/core/utils/hooks/useDragAndDrop.js +81 -100
  454. package/esm/core/utils/hooks/useEventListener.js +18 -18
  455. package/esm/core/utils/hooks/useGlobals.js +21 -27
  456. package/esm/core/utils/hooks/useId.js +3 -4
  457. package/esm/core/utils/hooks/useIntersection.js +19 -25
  458. package/esm/core/utils/hooks/useIsClient.js +5 -5
  459. package/esm/core/utils/hooks/useIsomorphicLayoutEffect.js +1 -2
  460. package/esm/core/utils/hooks/useLatestRef.js +5 -5
  461. package/esm/core/utils/hooks/useMediaQuery.js +25 -23
  462. package/esm/core/utils/hooks/useMergedRefs.js +12 -11
  463. package/esm/core/utils/hooks/useOverflow.js +51 -63
  464. package/esm/core/utils/hooks/useResizeObserver.js +12 -17
  465. package/esm/core/utils/hooks/useSafeContext.js +5 -5
  466. package/esm/core/utils/icons/StatusIconMap.js +4 -8
  467. package/esm/core/utils/icons/SvgCalendar.js +2 -7
  468. package/esm/core/utils/icons/SvgCaretDownSmall.js +2 -7
  469. package/esm/core/utils/icons/SvgCaretRightSmall.js +2 -7
  470. package/esm/core/utils/icons/SvgCaretUpSmall.js +2 -7
  471. package/esm/core/utils/icons/SvgCheckmark.js +2 -5
  472. package/esm/core/utils/icons/SvgCheckmarkSmall.js +2 -7
  473. package/esm/core/utils/icons/SvgChevronLeft.js +2 -7
  474. package/esm/core/utils/icons/SvgChevronLeftDouble.js +2 -7
  475. package/esm/core/utils/icons/SvgChevronRight.js +2 -7
  476. package/esm/core/utils/icons/SvgChevronRightDouble.js +2 -7
  477. package/esm/core/utils/icons/SvgClose.js +2 -7
  478. package/esm/core/utils/icons/SvgCloseSmall.js +2 -7
  479. package/esm/core/utils/icons/SvgColumnManager.js +2 -7
  480. package/esm/core/utils/icons/SvgDocument.js +2 -5
  481. package/esm/core/utils/icons/SvgFilter.js +2 -5
  482. package/esm/core/utils/icons/SvgFilterHollow.js +2 -7
  483. package/esm/core/utils/icons/SvgImportantSmall.js +2 -7
  484. package/esm/core/utils/icons/SvgInfoCircular.js +2 -7
  485. package/esm/core/utils/icons/SvgMore.js +2 -7
  486. package/esm/core/utils/icons/SvgMoreVertical.js +2 -7
  487. package/esm/core/utils/icons/SvgNew.js +2 -7
  488. package/esm/core/utils/icons/SvgSearch.js +2 -7
  489. package/esm/core/utils/icons/SvgSmileyHappy.js +2 -7
  490. package/esm/core/utils/icons/SvgSortDown.js +2 -7
  491. package/esm/core/utils/icons/SvgSortUp.js +2 -7
  492. package/esm/core/utils/icons/SvgStatusError.js +2 -7
  493. package/esm/core/utils/icons/SvgStatusSuccess.js +2 -7
  494. package/esm/core/utils/icons/SvgStatusWarning.js +2 -7
  495. package/esm/core/utils/icons/SvgSwap.js +2 -7
  496. package/esm/core/utils/icons/SvgUpload.js +2 -7
  497. package/esm/index.js +3 -21
  498. package/esm/styles.js +414 -425
  499. package/package.json +2 -2
  500. package/styles.css +6 -6
@@ -4,64 +4,48 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import * as React from 'react';
6
6
  import * as ReactDOM from 'react-dom';
7
- import {
8
- mergeRefs,
9
- useResizeObserver,
10
- useIsomorphicLayoutEffect,
11
- } from '../hooks/index.js';
12
- const unstable_batchedUpdates =
13
- ReactDOM.unstable_batchedUpdates ?? ((cb) => void cb());
7
+ import { mergeRefs, useResizeObserver, useIsomorphicLayoutEffect, } from '../hooks/index.js';
8
+ const unstable_batchedUpdates = ReactDOM.unstable_batchedUpdates ?? ((cb) => void cb());
14
9
  const getScrollableParent = (element, ownerDocument = document) => {
15
- if (!element || element === ownerDocument.body) {
16
- return ownerDocument.body;
17
- }
18
- return isElementScrollable(element)
19
- ? element
20
- : getScrollableParent(element.parentElement, ownerDocument);
10
+ if (!element || element === ownerDocument.body) {
11
+ return ownerDocument.body;
12
+ }
13
+ return isElementScrollable(element)
14
+ ? element
15
+ : getScrollableParent(element.parentElement, ownerDocument);
21
16
  };
22
17
  const isElementScrollable = (element) => {
23
- return /(auto|scroll|overlay)/.test(
24
- getElementStyle(element, 'overflow') +
25
- getElementStyle(element, 'overflow-y'),
26
- );
18
+ return /(auto|scroll|overlay)/.test(getElementStyle(element, 'overflow') +
19
+ getElementStyle(element, 'overflow-y'));
27
20
  };
28
21
  const getElementStyle = (element, prop) => {
29
- return getComputedStyle(element, null).getPropertyValue(prop);
22
+ return getComputedStyle(element, null).getPropertyValue(prop);
30
23
  };
31
24
  const getElementHeight = (element) => {
32
- return element?.getBoundingClientRect().height ?? 0;
25
+ return element?.getBoundingClientRect().height ?? 0;
33
26
  };
34
27
  const getElementHeightWithMargins = (element) => {
35
- if (!element) {
36
- return undefined;
37
- }
38
- const margin =
39
- parseFloat(getElementStyle(element, 'margin-block-start')) +
40
- parseFloat(getElementStyle(element, 'margin-block-end'));
41
- return getElementHeight(element) + (isNaN(margin) ? 0 : margin);
28
+ if (!element) {
29
+ return undefined;
30
+ }
31
+ const margin = parseFloat(getElementStyle(element, 'margin-block-start')) +
32
+ parseFloat(getElementStyle(element, 'margin-block-end'));
33
+ return getElementHeight(element) + (isNaN(margin) ? 0 : margin);
42
34
  };
43
35
  const getNumberOfNodesInHeight = (childHeight, totalHeight) => {
44
- if (!childHeight) {
45
- return 0;
46
- }
47
- return Math.floor(totalHeight / childHeight);
36
+ if (!childHeight) {
37
+ return 0;
38
+ }
39
+ return Math.floor(totalHeight / childHeight);
48
40
  };
49
41
  const getTranslateValue = (childHeight, startIndex) => {
50
- if (startIndex > 0) {
51
- return childHeight * startIndex;
52
- }
53
- return 0;
42
+ if (startIndex > 0) {
43
+ return childHeight * startIndex;
44
+ }
45
+ return 0;
54
46
  };
55
- const getVisibleNodeCount = (
56
- childHeight,
57
- startIndex,
58
- childrenLength,
59
- scrollContainer,
60
- ) => {
61
- return Math.min(
62
- childrenLength - startIndex,
63
- getNumberOfNodesInHeight(childHeight, getElementHeight(scrollContainer)),
64
- );
47
+ const getVisibleNodeCount = (childHeight, startIndex, childrenLength, scrollContainer) => {
48
+ return Math.min(childrenLength - startIndex, getNumberOfNodesInHeight(childHeight, getElementHeight(scrollContainer)));
65
49
  };
66
50
  /**
67
51
  * `VirtualScroll` component is used to render a huge amount of items in the DOM. It renders only the ones which are visible
@@ -85,12 +69,9 @@ const getVisibleNodeCount = (
85
69
  * @private
86
70
  */
87
71
  export const VirtualScroll = React.forwardRef((props, ref) => {
88
- const { innerProps, outerProps, visibleChildren } = useVirtualization(props);
89
- return React.createElement(
90
- 'div',
91
- { ...outerProps, ref: ref },
92
- React.createElement('div', { ...innerProps }, visibleChildren),
93
- );
72
+ const { innerProps, outerProps, visibleChildren } = useVirtualization(props);
73
+ return (React.createElement("div", { ...outerProps, ref: ref },
74
+ React.createElement("div", { ...innerProps }, visibleChildren)));
94
75
  });
95
76
  /**
96
77
  * `useVirtualization` is used for efficiently rendering only the visible rows from a large list.
@@ -113,253 +94,193 @@ export const VirtualScroll = React.forwardRef((props, ref) => {
113
94
  * @private
114
95
  */
115
96
  export const useVirtualization = (props) => {
116
- const {
117
- itemsLength,
118
- itemRenderer,
119
- bufferSize = 10,
120
- scrollToIndex,
121
- style,
122
- ...rest
123
- } = props;
124
- const [startNode, setStartNode] = React.useState(0);
125
- const [visibleNodeCount, setVisibleNodeCount] = React.useState(0);
126
- const scrollContainer = React.useRef();
127
- const parentRef = React.useRef(null);
128
- const childHeight = React.useRef({ first: 0, middle: 0, last: 0 });
129
- const onScrollRef = React.useRef();
130
- // Used only to recalculate on resize
131
- const [scrollContainerHeight, setScrollContainerHeight] = React.useState(0);
132
- const visibleIndex = React.useRef({ start: 0, end: 0 });
133
- // Used to mark when scroll container has height (updated by resize observer)
134
- // because before that calculations are not right
135
- const [isMounted, setIsMounted] = React.useState(false);
136
- const getScrollableContainer = () =>
137
- scrollContainer.current ??
138
- parentRef.current?.ownerDocument.scrollingElement;
139
- const visibleChildren = React.useMemo(() => {
140
- const arr = [];
141
- const endIndex = Math.min(
142
- itemsLength,
143
- startNode + visibleNodeCount + bufferSize * 2,
144
- );
145
- for (let i = startNode; i < endIndex; i++) {
146
- arr.push(itemRenderer(i));
147
- }
148
- return arr;
149
- }, [itemsLength, itemRenderer, bufferSize, startNode, visibleNodeCount]);
150
- const updateChildHeight = React.useCallback(() => {
151
- if (!parentRef.current || !visibleChildren.length) {
152
- return;
153
- }
154
- const firstChild = parentRef.current.children.item(0);
155
- const secondChild = parentRef.current.children.item(1);
156
- const lastChild = parentRef.current.children.item(
157
- parentRef.current.children.length - 1,
158
- );
159
- const firstChildHeight = Number(
160
- getElementHeightWithMargins(firstChild)?.toFixed(2) ?? 0,
161
- );
162
- childHeight.current = {
163
- first: firstChildHeight,
164
- middle: Number(
165
- getElementHeightWithMargins(secondChild)?.toFixed(2) ??
166
- firstChildHeight,
167
- ),
168
- last: Number(
169
- getElementHeightWithMargins(lastChild)?.toFixed(2) ?? firstChildHeight,
170
- ),
171
- };
172
- }, [visibleChildren.length]);
173
- const onResize = React.useCallback(
174
- ({ height }) => {
175
- // Initial value returned by resize observer is 0
176
- // So wait for the next one
177
- if (height > 0) {
178
- setIsMounted(true);
179
- }
180
- unstable_batchedUpdates(() => {
181
- setScrollContainerHeight(height);
182
- updateChildHeight();
183
- });
184
- },
185
- [updateChildHeight],
186
- );
187
- const [resizeRef, resizeObserver] = useResizeObserver(onResize);
188
- // Find scrollable parent
189
- // Needed only on init
190
- useIsomorphicLayoutEffect(() => {
191
- const scrollableParent = getScrollableParent(
192
- parentRef.current,
193
- parentRef.current?.ownerDocument,
194
- );
195
- scrollContainer.current = scrollableParent;
196
- resizeRef(scrollableParent);
197
- }, [resizeRef]);
198
- // Stop watching resize, when virtual scroll is unmounted
199
- useIsomorphicLayoutEffect(() => {
200
- return () => resizeObserver?.disconnect();
201
- }, [resizeObserver]);
202
- // Get child height when children available
203
- useIsomorphicLayoutEffect(() => updateChildHeight(), [updateChildHeight]);
204
- const updateVirtualScroll = React.useCallback(() => {
205
- const scrollableContainer = getScrollableContainer();
206
- if (!scrollableContainer) {
207
- return;
208
- }
209
- const start = getNumberOfNodesInHeight(
210
- childHeight.current.middle,
211
- Math.round(scrollableContainer.scrollTop),
212
- );
213
- const visibleNodes = getVisibleNodeCount(
214
- childHeight.current.middle,
215
- start,
216
- itemsLength,
217
- scrollableContainer,
218
- );
219
- // If there are less items at the end than buffer size
220
- // show more items at the start.
221
- // Have boundaries for edge cases, e.g. 1 item length
222
- const startIndex = Math.min(
223
- Math.max(0, start - bufferSize),
224
- Math.max(0, itemsLength - bufferSize * 2 - visibleNodes),
225
- );
226
- visibleIndex.current = { start: start, end: start + visibleNodes };
227
- setStartNode(startIndex);
228
- setVisibleNodeCount(visibleNodes);
229
- if (!parentRef.current) {
230
- return;
231
- }
232
- parentRef.current.style.transform = `translateY(${getTranslateValue(
233
- childHeight.current.middle,
234
- startIndex,
235
- )}px)`;
236
- }, [bufferSize, itemsLength]);
237
- const onScroll = React.useCallback(() => {
238
- updateVirtualScroll();
239
- }, [updateVirtualScroll]);
240
- const removeScrollListener = React.useCallback(() => {
241
- if (!onScrollRef.current) {
242
- return;
243
- }
244
- !scrollContainer.current ||
245
- scrollContainer.current === parentRef.current?.ownerDocument.body
246
- ? parentRef.current?.ownerDocument.removeEventListener(
247
- 'scroll',
248
- onScrollRef.current,
249
- )
250
- : scrollContainer.current.removeEventListener(
251
- 'scroll',
252
- onScrollRef.current,
253
- );
254
- }, []);
255
- // Add event listener to the scrollable container.
256
- useIsomorphicLayoutEffect(() => {
257
- removeScrollListener();
258
- onScrollRef.current = onScroll;
259
- if (
260
- !scrollContainer.current ||
261
- scrollContainer.current === parentRef.current?.ownerDocument.body
262
- ) {
263
- parentRef.current?.ownerDocument.addEventListener('scroll', onScroll);
264
- } else {
265
- scrollContainer.current.addEventListener('scroll', onScroll);
266
- }
267
- return removeScrollListener;
268
- }, [onScroll, removeScrollListener]);
269
- useIsomorphicLayoutEffect(() => {
270
- if (!isMounted) {
271
- return;
272
- }
273
- const scrollableContainer = getScrollableContainer();
274
- if (!scrollableContainer || scrollToIndex == null) {
275
- return;
276
- }
277
- // if `scrollToIndex` is not visible, scroll to it
278
- if (
279
- scrollToIndex > visibleIndex.current.end ||
280
- scrollToIndex < visibleIndex.current.start
281
- ) {
282
- const indexDiff =
283
- scrollToIndex > visibleIndex.current.end
284
- ? scrollToIndex - visibleIndex.current.end
285
- : scrollToIndex - visibleIndex.current.start;
286
- if (scrollToIndex === 0) {
287
- scrollableContainer.scrollTo({ top: 0 });
288
- return;
289
- }
290
- // If go down: add to the existing scrollTop needed height
291
- // If go up: calculate the exact scroll top
292
- scrollableContainer.scrollTo({
293
- top:
294
- indexDiff > 0
295
- ? Math.ceil(scrollableContainer.scrollTop) +
296
- indexDiff * childHeight.current.middle
297
- : scrollToIndex * childHeight.current.middle,
298
- });
299
- // update visible index
300
- const start = getNumberOfNodesInHeight(
301
- childHeight.current.middle,
302
- Math.round(scrollableContainer.scrollTop),
303
- );
304
- const visibleNodes = getVisibleNodeCount(
305
- childHeight.current.middle,
306
- start,
307
- itemsLength,
308
- scrollableContainer,
309
- );
310
- visibleIndex.current = { start: start, end: start + visibleNodes };
311
- }
312
- // if `scrollToIndex` is the first visible node
313
- // ensure it is fully visible
314
- if (scrollToIndex === visibleIndex.current.start) {
315
- const roundedScrollTop = Math.round(scrollableContainer.scrollTop);
316
- const diff = roundedScrollTop % childHeight.current.middle;
317
- diff > 0 &&
318
- scrollableContainer.scrollTo({
319
- top: roundedScrollTop - diff,
97
+ const { itemsLength, itemRenderer, bufferSize = 10, scrollToIndex, style, ...rest } = props;
98
+ const [startNode, setStartNode] = React.useState(0);
99
+ const [visibleNodeCount, setVisibleNodeCount] = React.useState(0);
100
+ const scrollContainer = React.useRef();
101
+ const parentRef = React.useRef(null);
102
+ const childHeight = React.useRef({ first: 0, middle: 0, last: 0 });
103
+ const onScrollRef = React.useRef();
104
+ // Used only to recalculate on resize
105
+ const [scrollContainerHeight, setScrollContainerHeight] = React.useState(0);
106
+ const visibleIndex = React.useRef({ start: 0, end: 0 });
107
+ // Used to mark when scroll container has height (updated by resize observer)
108
+ // because before that calculations are not right
109
+ const [isMounted, setIsMounted] = React.useState(false);
110
+ const getScrollableContainer = () => scrollContainer.current ??
111
+ parentRef.current?.ownerDocument.scrollingElement;
112
+ const visibleChildren = React.useMemo(() => {
113
+ const arr = [];
114
+ const endIndex = Math.min(itemsLength, startNode + visibleNodeCount + bufferSize * 2);
115
+ for (let i = startNode; i < endIndex; i++) {
116
+ arr.push(itemRenderer(i));
117
+ }
118
+ return arr;
119
+ }, [itemsLength, itemRenderer, bufferSize, startNode, visibleNodeCount]);
120
+ const updateChildHeight = React.useCallback(() => {
121
+ if (!parentRef.current || !visibleChildren.length) {
122
+ return;
123
+ }
124
+ const firstChild = parentRef.current.children.item(0);
125
+ const secondChild = parentRef.current.children.item(1);
126
+ const lastChild = parentRef.current.children.item(parentRef.current.children.length - 1);
127
+ const firstChildHeight = Number(getElementHeightWithMargins(firstChild)?.toFixed(2) ?? 0);
128
+ childHeight.current = {
129
+ first: firstChildHeight,
130
+ middle: Number(getElementHeightWithMargins(secondChild)?.toFixed(2) ??
131
+ firstChildHeight),
132
+ last: Number(getElementHeightWithMargins(lastChild)?.toFixed(2) ?? firstChildHeight),
133
+ };
134
+ }, [visibleChildren.length]);
135
+ const onResize = React.useCallback(({ height }) => {
136
+ // Initial value returned by resize observer is 0
137
+ // So wait for the next one
138
+ if (height > 0) {
139
+ setIsMounted(true);
140
+ }
141
+ unstable_batchedUpdates(() => {
142
+ setScrollContainerHeight(height);
143
+ updateChildHeight();
320
144
  });
321
- return;
322
- }
323
- // if `scrollToIndex` is the last visible node
324
- // ensure it is fully visible
325
- if (scrollToIndex === visibleIndex.current.end) {
326
- const diff =
327
- (scrollableContainer.offsetHeight - childHeight.current.first) %
328
- childHeight.current.middle;
329
- const roundedScrollTop = Math.ceil(scrollableContainer.scrollTop);
330
- const scrollTopMod = roundedScrollTop % childHeight.current.middle;
331
- if (diff > 0 && scrollTopMod === 0) {
332
- scrollableContainer.scrollTo({
333
- top: roundedScrollTop + childHeight.current.middle - diff,
334
- });
335
- }
336
- }
337
- }, [scrollToIndex, isMounted]);
338
- useIsomorphicLayoutEffect(() => {
339
- if (!scrollContainerHeight) {
340
- return;
341
- }
342
- updateVirtualScroll();
343
- }, [scrollContainerHeight, updateVirtualScroll]);
344
- return {
345
- outerProps: {
346
- style: {
347
- minBlockSize:
348
- itemsLength > 1
349
- ? Math.max(itemsLength - 2, 0) * childHeight.current.middle +
350
- childHeight.current.first +
351
- childHeight.current.last
352
- : childHeight.current.middle,
353
- minInlineSize: '100%',
354
- ...style,
355
- },
356
- ...rest,
357
- },
358
- innerProps: {
359
- style: { willChange: 'transform' },
360
- ref: mergeRefs(parentRef), // convert object ref to callback ref for better types
361
- },
362
- visibleChildren,
363
- };
145
+ }, [updateChildHeight]);
146
+ const [resizeRef, resizeObserver] = useResizeObserver(onResize);
147
+ // Find scrollable parent
148
+ // Needed only on init
149
+ useIsomorphicLayoutEffect(() => {
150
+ const scrollableParent = getScrollableParent(parentRef.current, parentRef.current?.ownerDocument);
151
+ scrollContainer.current = scrollableParent;
152
+ resizeRef(scrollableParent);
153
+ }, [resizeRef]);
154
+ // Stop watching resize, when virtual scroll is unmounted
155
+ useIsomorphicLayoutEffect(() => {
156
+ return () => resizeObserver?.disconnect();
157
+ }, [resizeObserver]);
158
+ // Get child height when children available
159
+ useIsomorphicLayoutEffect(() => updateChildHeight(), [updateChildHeight]);
160
+ const updateVirtualScroll = React.useCallback(() => {
161
+ const scrollableContainer = getScrollableContainer();
162
+ if (!scrollableContainer) {
163
+ return;
164
+ }
165
+ const start = getNumberOfNodesInHeight(childHeight.current.middle, Math.round(scrollableContainer.scrollTop));
166
+ const visibleNodes = getVisibleNodeCount(childHeight.current.middle, start, itemsLength, scrollableContainer);
167
+ // If there are less items at the end than buffer size
168
+ // show more items at the start.
169
+ // Have boundaries for edge cases, e.g. 1 item length
170
+ const startIndex = Math.min(Math.max(0, start - bufferSize), Math.max(0, itemsLength - bufferSize * 2 - visibleNodes));
171
+ visibleIndex.current = { start: start, end: start + visibleNodes };
172
+ setStartNode(startIndex);
173
+ setVisibleNodeCount(visibleNodes);
174
+ if (!parentRef.current) {
175
+ return;
176
+ }
177
+ parentRef.current.style.transform = `translateY(${getTranslateValue(childHeight.current.middle, startIndex)}px)`;
178
+ }, [bufferSize, itemsLength]);
179
+ const onScroll = React.useCallback(() => {
180
+ updateVirtualScroll();
181
+ }, [updateVirtualScroll]);
182
+ const removeScrollListener = React.useCallback(() => {
183
+ if (!onScrollRef.current) {
184
+ return;
185
+ }
186
+ !scrollContainer.current ||
187
+ scrollContainer.current === parentRef.current?.ownerDocument.body
188
+ ? parentRef.current?.ownerDocument.removeEventListener('scroll', onScrollRef.current)
189
+ : scrollContainer.current.removeEventListener('scroll', onScrollRef.current);
190
+ }, []);
191
+ // Add event listener to the scrollable container.
192
+ useIsomorphicLayoutEffect(() => {
193
+ removeScrollListener();
194
+ onScrollRef.current = onScroll;
195
+ if (!scrollContainer.current ||
196
+ scrollContainer.current === parentRef.current?.ownerDocument.body) {
197
+ parentRef.current?.ownerDocument.addEventListener('scroll', onScroll);
198
+ }
199
+ else {
200
+ scrollContainer.current.addEventListener('scroll', onScroll);
201
+ }
202
+ return removeScrollListener;
203
+ }, [onScroll, removeScrollListener]);
204
+ useIsomorphicLayoutEffect(() => {
205
+ if (!isMounted) {
206
+ return;
207
+ }
208
+ const scrollableContainer = getScrollableContainer();
209
+ if (!scrollableContainer || scrollToIndex == null) {
210
+ return;
211
+ }
212
+ // if `scrollToIndex` is not visible, scroll to it
213
+ if (scrollToIndex > visibleIndex.current.end ||
214
+ scrollToIndex < visibleIndex.current.start) {
215
+ const indexDiff = scrollToIndex > visibleIndex.current.end
216
+ ? scrollToIndex - visibleIndex.current.end
217
+ : scrollToIndex - visibleIndex.current.start;
218
+ if (scrollToIndex === 0) {
219
+ scrollableContainer.scrollTo({ top: 0 });
220
+ return;
221
+ }
222
+ // If go down: add to the existing scrollTop needed height
223
+ // If go up: calculate the exact scroll top
224
+ scrollableContainer.scrollTo({
225
+ top: indexDiff > 0
226
+ ? Math.ceil(scrollableContainer.scrollTop) +
227
+ indexDiff * childHeight.current.middle
228
+ : scrollToIndex * childHeight.current.middle,
229
+ });
230
+ // update visible index
231
+ const start = getNumberOfNodesInHeight(childHeight.current.middle, Math.round(scrollableContainer.scrollTop));
232
+ const visibleNodes = getVisibleNodeCount(childHeight.current.middle, start, itemsLength, scrollableContainer);
233
+ visibleIndex.current = { start: start, end: start + visibleNodes };
234
+ }
235
+ // if `scrollToIndex` is the first visible node
236
+ // ensure it is fully visible
237
+ if (scrollToIndex === visibleIndex.current.start) {
238
+ const roundedScrollTop = Math.round(scrollableContainer.scrollTop);
239
+ const diff = roundedScrollTop % childHeight.current.middle;
240
+ diff > 0 &&
241
+ scrollableContainer.scrollTo({
242
+ top: roundedScrollTop - diff,
243
+ });
244
+ return;
245
+ }
246
+ // if `scrollToIndex` is the last visible node
247
+ // ensure it is fully visible
248
+ if (scrollToIndex === visibleIndex.current.end) {
249
+ const diff = (scrollableContainer.offsetHeight - childHeight.current.first) %
250
+ childHeight.current.middle;
251
+ const roundedScrollTop = Math.ceil(scrollableContainer.scrollTop);
252
+ const scrollTopMod = roundedScrollTop % childHeight.current.middle;
253
+ if (diff > 0 && scrollTopMod === 0) {
254
+ scrollableContainer.scrollTo({
255
+ top: roundedScrollTop + childHeight.current.middle - diff,
256
+ });
257
+ }
258
+ }
259
+ }, [scrollToIndex, isMounted]);
260
+ useIsomorphicLayoutEffect(() => {
261
+ if (!scrollContainerHeight) {
262
+ return;
263
+ }
264
+ updateVirtualScroll();
265
+ }, [scrollContainerHeight, updateVirtualScroll]);
266
+ return {
267
+ outerProps: {
268
+ style: {
269
+ minBlockSize: itemsLength > 1
270
+ ? Math.max(itemsLength - 2, 0) * childHeight.current.middle +
271
+ childHeight.current.first +
272
+ childHeight.current.last
273
+ : childHeight.current.middle,
274
+ minInlineSize: '100%',
275
+ ...style,
276
+ },
277
+ ...rest,
278
+ },
279
+ innerProps: {
280
+ style: { willChange: 'transform' },
281
+ ref: mergeRefs(parentRef), // convert object ref to callback ref for better types
282
+ },
283
+ visibleChildren,
284
+ };
364
285
  };
365
286
  export default VirtualScroll;
@@ -6,50 +6,33 @@ import * as React from 'react';
6
6
  import { CSSTransition } from 'react-transition-group';
7
7
  import styles from '../../../styles.js';
8
8
  export const WithCSSTransition = (props) => {
9
- const { in: visible, dimension = 'height', children, ...rest } = props;
10
- const expandedSize = React.useRef(0);
11
- const dimensionCamelCase = dimension === 'height' ? 'Height' : 'Width';
12
- return React.createElement(
13
- CSSTransition,
14
- {
15
- in: visible,
16
- timeout: 200,
17
- unmountOnExit: true,
18
- onEnter: (node) => {
19
- node.style[`min${dimensionCamelCase}`] = 'initial';
20
- node.style[dimension] = '0px';
21
- },
22
- onEntering: (node) => {
23
- node.style[dimension] = `${expandedSize.current}px`;
24
- },
25
- onEntered: (node) => {
26
- node.style[`min${dimensionCamelCase}`] = '';
27
- node.style[dimension] = '';
28
- },
29
- onExit: (node) => {
30
- node.style[dimension] = `${expandedSize.current}px`;
31
- },
32
- onExiting: (node) => {
33
- node.style[`min${dimensionCamelCase}`] = 'initial';
34
- node.style[dimension] = '0px';
35
- },
36
- classNames: {
37
- enter: styles['iui-enter'],
38
- enterActive: styles['iui-enter-active'],
39
- exit: styles['iui-exit'],
40
- exitActive: styles['iui-exit-active'],
41
- },
42
- ...rest,
43
- },
44
- React.isValidElement(children)
45
- ? React.cloneElement(children, {
46
- ref: (el) => {
9
+ const { in: visible, dimension = 'height', children, ...rest } = props;
10
+ const expandedSize = React.useRef(0);
11
+ const dimensionCamelCase = dimension === 'height' ? 'Height' : 'Width';
12
+ return (React.createElement(CSSTransition, { in: visible, timeout: 200, unmountOnExit: true, onEnter: (node) => {
13
+ node.style[`min${dimensionCamelCase}`] = 'initial';
14
+ node.style[dimension] = '0px';
15
+ }, onEntering: (node) => {
16
+ node.style[dimension] = `${expandedSize.current}px`;
17
+ }, onEntered: (node) => {
18
+ node.style[`min${dimensionCamelCase}`] = '';
19
+ node.style[dimension] = '';
20
+ }, onExit: (node) => {
21
+ node.style[dimension] = `${expandedSize.current}px`;
22
+ }, onExiting: (node) => {
23
+ node.style[`min${dimensionCamelCase}`] = 'initial';
24
+ node.style[dimension] = '0px';
25
+ }, classNames: {
26
+ enter: styles['iui-enter'],
27
+ enterActive: styles['iui-enter-active'],
28
+ exit: styles['iui-exit'],
29
+ exitActive: styles['iui-exit-active'],
30
+ }, ...rest }, React.isValidElement(children) ? (React.cloneElement(children, {
31
+ ref: (el) => {
47
32
  if (el) {
48
- expandedSize.current = el.getBoundingClientRect()[dimension];
33
+ expandedSize.current = el.getBoundingClientRect()[dimension];
49
34
  }
50
- },
51
- })
52
- : React.createElement(React.Fragment, null),
53
- );
35
+ },
36
+ })) : (React.createElement(React.Fragment, null))));
54
37
  };
55
38
  export default WithCSSTransition;