@itwin/itwinui-react 3.0.3 → 3.0.5

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