@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,34 +1,34 @@
1
- 'use strict';
2
- Object.defineProperty(exports, '__esModule', { value: true });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ComboBox = 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 MenuExtraContent_js_1 = require('../Menu/MenuExtraContent.js');
11
- const SelectTag_js_1 = require('../Select/SelectTag.js');
12
- const Text_js_1 = require('../Typography/Text.js');
13
- const index_js_1 = require('../utils/index.js');
14
- const Popover_js_1 = require('../Popover/Popover.js');
15
- const helpers_js_1 = require('./helpers.js');
16
- const ComboBoxEndIcon_js_1 = require('./ComboBoxEndIcon.js');
17
- const ComboBoxInput_js_1 = require('./ComboBoxInput.js');
18
- const ComboBoxInputContainer_js_1 = require('./ComboBoxInputContainer.js');
19
- const ComboBoxMenu_js_1 = require('./ComboBoxMenu.js');
20
- const ComboBoxMenuItem_js_1 = require('./ComboBoxMenuItem.js');
9
+ const React = tslib_1.__importStar(require("react"));
10
+ const MenuExtraContent_js_1 = require("../Menu/MenuExtraContent.js");
11
+ const SelectTag_js_1 = require("../Select/SelectTag.js");
12
+ const Text_js_1 = require("../Typography/Text.js");
13
+ const index_js_1 = require("../utils/index.js");
14
+ const Popover_js_1 = require("../Popover/Popover.js");
15
+ const helpers_js_1 = require("./helpers.js");
16
+ const ComboBoxEndIcon_js_1 = require("./ComboBoxEndIcon.js");
17
+ const ComboBoxInput_js_1 = require("./ComboBoxInput.js");
18
+ const ComboBoxInputContainer_js_1 = require("./ComboBoxInputContainer.js");
19
+ const ComboBoxMenu_js_1 = require("./ComboBoxMenu.js");
20
+ const ComboBoxMenuItem_js_1 = require("./ComboBoxMenuItem.js");
21
21
  // Type guard for enabling multiple
22
22
  const isMultipleEnabled = (variable, multiple) => {
23
- return multiple && (Array.isArray(variable) || variable === undefined);
23
+ return multiple && (Array.isArray(variable) || variable === undefined);
24
24
  };
25
25
  // Type guard for user onChange
26
26
  const isSingleOnChange = (onChange, multiple) => {
27
- return !multiple;
27
+ return !multiple;
28
28
  };
29
29
  /** Returns either `option.id` or derives a stable id using `idPrefix` and `option.label` (without whitespace) */
30
30
  const getOptionId = (option, idPrefix) => {
31
- return option.id ?? `${idPrefix}-option-${option.label.replace(/\s/g, '-')}`;
31
+ return option.id ?? `${idPrefix}-option-${option.label.replace(/\s/g, '-')}`;
32
32
  };
33
33
  /**
34
34
  * ComboBox component that allows typing a value to filter the options in dropdown list.
@@ -44,272 +44,221 @@ const getOptionId = (option, idPrefix) => {
44
44
  * />
45
45
  */
46
46
  const ComboBox = (props) => {
47
- const {
48
- options,
49
- value: valueProp,
50
- onChange,
51
- filterFunction,
52
- inputProps,
53
- endIconProps,
54
- dropdownMenuProps,
55
- emptyStateMessage = 'No options found',
56
- itemRenderer,
57
- enableVirtualization = false,
58
- multiple = false,
59
- onShow: onShowProp,
60
- onHide: onHideProp,
61
- ...rest
62
- } = props;
63
- // Generate a stateful random id if not specified
64
- const [id] = React.useState(
65
- () =>
66
- props.id ??
67
- (inputProps?.id && `${inputProps.id}-cb`) ??
68
- `iui-cb-${(0, index_js_1.getRandomValue)(10)}`,
69
- );
70
- // Refs get set in subcomponents
71
- const inputRef = React.useRef(null);
72
- const menuRef = React.useRef(null);
73
- const onChangeProp = (0, index_js_1.useLatestRef)(onChange);
74
- const optionsRef = (0, index_js_1.useLatestRef)(options);
75
- // Record to store all extra information (e.g. original indexes), where the key is the id of the option
76
- const optionsExtraInfoRef = React.useRef({});
77
- // Clear the extra info when the options change so that it can be reinitialized below
78
- React.useEffect(() => {
79
- optionsExtraInfoRef.current = {};
80
- }, [options]);
81
- // Initialize the extra info only if it is not already initialized
82
- if (
83
- options.length > 0 &&
84
- Object.keys(optionsExtraInfoRef.current).length === 0
85
- ) {
86
- options.forEach((option, index) => {
87
- optionsExtraInfoRef.current[getOptionId(option, id)] = {
88
- __originalIndex: index,
89
- };
47
+ const { options, value: valueProp, onChange, filterFunction, inputProps, endIconProps, dropdownMenuProps, emptyStateMessage = 'No options found', itemRenderer, enableVirtualization = false, multiple = false, onShow: onShowProp, onHide: onHideProp, ...rest } = props;
48
+ // Generate a stateful random id if not specified
49
+ const [id] = React.useState(() => props.id ??
50
+ (inputProps?.id && `${inputProps.id}-cb`) ??
51
+ `iui-cb-${(0, index_js_1.getRandomValue)(10)}`);
52
+ // Refs get set in subcomponents
53
+ const inputRef = React.useRef(null);
54
+ const menuRef = React.useRef(null);
55
+ const onChangeProp = (0, index_js_1.useLatestRef)(onChange);
56
+ const optionsRef = (0, index_js_1.useLatestRef)(options);
57
+ // Record to store all extra information (e.g. original indexes), where the key is the id of the option
58
+ const optionsExtraInfoRef = React.useRef({});
59
+ // Clear the extra info when the options change so that it can be reinitialized below
60
+ React.useEffect(() => {
61
+ optionsExtraInfoRef.current = {};
62
+ }, [options]);
63
+ // Initialize the extra info only if it is not already initialized
64
+ if (options.length > 0 &&
65
+ Object.keys(optionsExtraInfoRef.current).length === 0) {
66
+ options.forEach((option, index) => {
67
+ optionsExtraInfoRef.current[getOptionId(option, id)] = {
68
+ __originalIndex: index,
69
+ };
70
+ });
71
+ }
72
+ // Get indices of selected elements in options array when we have selected values.
73
+ const getSelectedIndexes = React.useCallback(() => {
74
+ if (isMultipleEnabled(valueProp, multiple)) {
75
+ const indexArray = [];
76
+ valueProp?.forEach((value) => {
77
+ const indexToAdd = options.findIndex((option) => option.value === value);
78
+ if (indexToAdd > -1) {
79
+ indexArray.push(indexToAdd);
80
+ }
81
+ });
82
+ return indexArray;
83
+ }
84
+ else {
85
+ return options.findIndex((option) => option.value === valueProp);
86
+ }
87
+ }, [multiple, options, valueProp]);
88
+ // Reducer where all the component-wide state is stored
89
+ const [{ isOpen, selected, focusedIndex }, dispatch] = React.useReducer(helpers_js_1.comboBoxReducer, {
90
+ isOpen: false,
91
+ selected: getSelectedIndexes(),
92
+ focusedIndex: -1,
90
93
  });
91
- }
92
- // Get indices of selected elements in options array when we have selected values.
93
- const getSelectedIndexes = React.useCallback(() => {
94
- if (isMultipleEnabled(valueProp, multiple)) {
95
- const indexArray = [];
96
- valueProp?.forEach((value) => {
97
- const indexToAdd = options.findIndex(
98
- (option) => option.value === value,
99
- );
100
- if (indexToAdd > -1) {
101
- indexArray.push(indexToAdd);
94
+ const onShowRef = (0, index_js_1.useLatestRef)(onShowProp);
95
+ const onHideRef = (0, index_js_1.useLatestRef)(onHideProp);
96
+ const show = React.useCallback(() => {
97
+ dispatch({ type: 'open' });
98
+ onShowRef.current?.();
99
+ }, [onShowRef]);
100
+ const hide = React.useCallback(() => {
101
+ dispatch({ type: 'close' });
102
+ onHideRef.current?.();
103
+ }, [onHideRef]);
104
+ (0, index_js_1.useIsomorphicLayoutEffect)(() => {
105
+ // When the dropdown opens
106
+ if (isOpen) {
107
+ inputRef.current?.focus(); // Focus the input
108
+ // Reset the filtered list (does not reset when multiple enabled)
109
+ if (!multiple) {
110
+ setFilteredOptions(optionsRef.current);
111
+ dispatch({ type: 'focus', value: undefined });
112
+ }
113
+ }
114
+ // When the dropdown closes
115
+ else {
116
+ // Reset the focused index
117
+ dispatch({ type: 'focus', value: undefined });
118
+ // Reset the input value if not multiple
119
+ if (!isMultipleEnabled(selected, multiple)) {
120
+ setInputValue(selected != undefined && selected >= 0
121
+ ? optionsRef.current[selected]?.label
122
+ : '');
123
+ }
124
+ }
125
+ }, [isOpen, multiple, optionsRef, selected]);
126
+ // Update filtered options to the latest value options according to input value
127
+ const [filteredOptions, setFilteredOptions] = React.useState(options);
128
+ React.useEffect(() => {
129
+ if (inputValue) {
130
+ setFilteredOptions(filterFunction?.(options, inputValue) ??
131
+ options.filter((option) => option.label.toLowerCase().includes(inputValue.toLowerCase())));
132
+ }
133
+ else {
134
+ setFilteredOptions(options);
102
135
  }
103
- });
104
- return indexArray;
105
- } else {
106
- return options.findIndex((option) => option.value === valueProp);
107
- }
108
- }, [multiple, options, valueProp]);
109
- // Reducer where all the component-wide state is stored
110
- const [{ isOpen, selected, focusedIndex }, dispatch] = React.useReducer(
111
- helpers_js_1.comboBoxReducer,
112
- {
113
- isOpen: false,
114
- selected: getSelectedIndexes(),
115
- focusedIndex: -1,
116
- },
117
- );
118
- const onShowRef = (0, index_js_1.useLatestRef)(onShowProp);
119
- const onHideRef = (0, index_js_1.useLatestRef)(onHideProp);
120
- const show = React.useCallback(() => {
121
- dispatch({ type: 'open' });
122
- onShowRef.current?.();
123
- }, [onShowRef]);
124
- const hide = React.useCallback(() => {
125
- dispatch({ type: 'close' });
126
- onHideRef.current?.();
127
- }, [onHideRef]);
128
- (0, index_js_1.useIsomorphicLayoutEffect)(() => {
129
- // When the dropdown opens
130
- if (isOpen) {
131
- inputRef.current?.focus(); // Focus the input
132
- // Reset the filtered list (does not reset when multiple enabled)
133
- if (!multiple) {
134
- setFilteredOptions(optionsRef.current);
135
136
  dispatch({ type: 'focus', value: undefined });
136
- }
137
- }
138
- // When the dropdown closes
139
- else {
140
- // Reset the focused index
141
- dispatch({ type: 'focus', value: undefined });
142
- // Reset the input value if not multiple
143
- if (!isMultipleEnabled(selected, multiple)) {
144
- setInputValue(
145
- selected != undefined && selected >= 0
146
- ? optionsRef.current[selected]?.label
147
- : '',
148
- );
149
- }
150
- }
151
- }, [isOpen, multiple, optionsRef, selected]);
152
- // Update filtered options to the latest value options according to input value
153
- const [filteredOptions, setFilteredOptions] = React.useState(options);
154
- React.useEffect(() => {
155
- if (inputValue) {
156
- setFilteredOptions(
157
- filterFunction?.(options, inputValue) ??
158
- options.filter((option) =>
159
- option.label.toLowerCase().includes(inputValue.toLowerCase()),
160
- ),
161
- );
162
- } else {
163
- setFilteredOptions(options);
164
- }
165
- dispatch({ type: 'focus', value: undefined });
166
- // Only need to call on options update
167
- // eslint-disable-next-line react-hooks/exhaustive-deps
168
- }, [options]);
169
- // Filter options based on input value
170
- const [inputValue, setInputValue] = React.useState(
171
- inputProps?.value?.toString() ?? '',
172
- );
173
- const [liveRegionSelection, setLiveRegionSelection] = React.useState('');
174
- const handleOnInput = React.useCallback(
175
- (event) => {
176
- const { value } = event.currentTarget;
177
- setInputValue(value);
178
- show(); // reopen when typing
179
- setFilteredOptions(
180
- filterFunction?.(optionsRef.current, value) ??
181
- optionsRef.current.filter((option) =>
182
- option.label.toLowerCase().includes(value.toLowerCase()),
183
- ),
184
- );
185
- if (focusedIndex != -1) {
186
- dispatch({ type: 'focus', value: -1 });
187
- }
188
- inputProps?.onChange?.(event);
189
- },
190
- [filterFunction, focusedIndex, inputProps, optionsRef, show],
191
- );
192
- // When the value prop changes, update the selected index/indices
193
- React.useEffect(() => {
194
- if (isMultipleEnabled(valueProp, multiple)) {
195
- if (valueProp) {
196
- // If user provided array of selected values
197
- const indexes = valueProp.map((value) => {
198
- return options.findIndex((option) => option.value === value);
199
- });
200
- dispatch({
201
- type: 'multiselect',
202
- value: indexes.filter((index) => index !== -1), // Add available options
203
- });
204
- } else {
205
- // if user provided one value or undefined
206
- dispatch({
207
- type: 'multiselect',
208
- value: [], // Add empty list
209
- });
210
- }
211
- } else {
212
- dispatch({
213
- type: 'select',
214
- value: options.findIndex((option) => option.value === valueProp),
215
- });
216
- }
217
- }, [valueProp, options, multiple]);
218
- const isMenuItemSelected = React.useCallback(
219
- (index) => {
220
- if (isMultipleEnabled(selected, multiple)) {
221
- return !!selected.includes(index);
222
- } else {
223
- return selected === index;
224
- }
225
- },
226
- [multiple, selected],
227
- );
228
- // Generates new array when item is added or removed
229
- const selectedChangeHandler = React.useCallback(
230
- (__originalIndex, action) => {
231
- if (action === 'added') {
232
- return [...selected, __originalIndex];
233
- } else {
234
- return selected.filter((index) => index !== __originalIndex);
235
- }
236
- },
237
- [selected],
238
- );
239
- // Calls user defined onChange
240
- const onChangeHandler = React.useCallback(
241
- (__originalIndex, actionType, newArray) => {
242
- if (isSingleOnChange(onChangeProp.current, multiple)) {
243
- onChangeProp.current?.(optionsRef.current[__originalIndex]?.value);
244
- } else {
245
- actionType &&
246
- newArray &&
247
- onChangeProp.current?.(
248
- newArray?.map((item) => optionsRef.current[item]?.value),
249
- {
250
- value: optionsRef.current[__originalIndex]?.value,
251
- type: actionType,
252
- },
253
- );
254
- }
255
- },
256
- [multiple, onChangeProp, optionsRef],
257
- );
258
- const onClickHandler = React.useCallback(
259
- (__originalIndex) => {
260
- inputRef.current?.focus({ preventScroll: true }); // return focus to input
261
- if (optionsRef.current[__originalIndex]?.disabled) {
262
- return;
263
- }
264
- if (isMultipleEnabled(selected, multiple)) {
265
- const actionType = isMenuItemSelected(__originalIndex)
266
- ? 'removed'
267
- : 'added';
268
- const newArray = selectedChangeHandler(__originalIndex, actionType);
269
- dispatch({ type: 'multiselect', value: newArray });
270
- onChangeHandler(__originalIndex, actionType, newArray);
271
- // update live region
272
- setLiveRegionSelection(
273
- newArray
274
- .map((item) => optionsRef.current[item]?.label)
275
- .filter(Boolean)
276
- .join(', '),
277
- );
278
- } else {
279
- dispatch({ type: 'select', value: __originalIndex });
280
- hide();
281
- onChangeHandler(__originalIndex);
282
- }
283
- },
284
- [
285
- selectedChangeHandler,
286
- isMenuItemSelected,
287
- multiple,
288
- onChangeHandler,
289
- selected,
290
- optionsRef,
291
- hide,
292
- ],
293
- );
294
- const getMenuItem = React.useCallback(
295
- (option, filteredIndex) => {
296
- const optionId = getOptionId(option, id);
297
- const { __originalIndex } = optionsExtraInfoRef.current[optionId];
298
- const { icon, startIcon: startIconProp, ...restOptions } = option;
299
- const startIcon = startIconProp ?? icon;
300
- const customItem = itemRenderer
301
- ? itemRenderer(option, {
302
- isFocused: focusedIndex === __originalIndex,
303
- isSelected: selected === __originalIndex,
304
- index: __originalIndex,
305
- id: optionId,
306
- })
307
- : null;
308
- return customItem
309
- ? React.cloneElement(customItem, {
137
+ // Only need to call on options update
138
+ // eslint-disable-next-line react-hooks/exhaustive-deps
139
+ }, [options]);
140
+ // Filter options based on input value
141
+ const [inputValue, setInputValue] = React.useState(inputProps?.value?.toString() ?? '');
142
+ const [liveRegionSelection, setLiveRegionSelection] = React.useState('');
143
+ const handleOnInput = React.useCallback((event) => {
144
+ const { value } = event.currentTarget;
145
+ setInputValue(value);
146
+ show(); // reopen when typing
147
+ setFilteredOptions(filterFunction?.(optionsRef.current, value) ??
148
+ optionsRef.current.filter((option) => option.label.toLowerCase().includes(value.toLowerCase())));
149
+ if (focusedIndex != -1) {
150
+ dispatch({ type: 'focus', value: -1 });
151
+ }
152
+ inputProps?.onChange?.(event);
153
+ }, [filterFunction, focusedIndex, inputProps, optionsRef, show]);
154
+ // When the value prop changes, update the selected index/indices
155
+ React.useEffect(() => {
156
+ if (isMultipleEnabled(valueProp, multiple)) {
157
+ if (valueProp) {
158
+ // If user provided array of selected values
159
+ const indexes = valueProp.map((value) => {
160
+ return options.findIndex((option) => option.value === value);
161
+ });
162
+ dispatch({
163
+ type: 'multiselect',
164
+ value: indexes.filter((index) => index !== -1), // Add available options
165
+ });
166
+ }
167
+ else {
168
+ // if user provided one value or undefined
169
+ dispatch({
170
+ type: 'multiselect',
171
+ value: [], // Add empty list
172
+ });
173
+ }
174
+ }
175
+ else {
176
+ dispatch({
177
+ type: 'select',
178
+ value: options.findIndex((option) => option.value === valueProp),
179
+ });
180
+ }
181
+ }, [valueProp, options, multiple]);
182
+ const isMenuItemSelected = React.useCallback((index) => {
183
+ if (isMultipleEnabled(selected, multiple)) {
184
+ return !!selected.includes(index);
185
+ }
186
+ else {
187
+ return selected === index;
188
+ }
189
+ }, [multiple, selected]);
190
+ // Generates new array when item is added or removed
191
+ const selectedChangeHandler = React.useCallback((__originalIndex, action) => {
192
+ if (action === 'added') {
193
+ return [...selected, __originalIndex];
194
+ }
195
+ else {
196
+ return selected.filter((index) => index !== __originalIndex);
197
+ }
198
+ }, [selected]);
199
+ // Calls user defined onChange
200
+ const onChangeHandler = React.useCallback((__originalIndex, actionType, newArray) => {
201
+ if (isSingleOnChange(onChangeProp.current, multiple)) {
202
+ onChangeProp.current?.(optionsRef.current[__originalIndex]?.value);
203
+ }
204
+ else {
205
+ actionType &&
206
+ newArray &&
207
+ onChangeProp.current?.(newArray?.map((item) => optionsRef.current[item]?.value), {
208
+ value: optionsRef.current[__originalIndex]?.value,
209
+ type: actionType,
210
+ });
211
+ }
212
+ }, [multiple, onChangeProp, optionsRef]);
213
+ const onClickHandler = React.useCallback((__originalIndex) => {
214
+ inputRef.current?.focus({ preventScroll: true }); // return focus to input
215
+ if (optionsRef.current[__originalIndex]?.disabled) {
216
+ return;
217
+ }
218
+ if (isMultipleEnabled(selected, multiple)) {
219
+ const actionType = isMenuItemSelected(__originalIndex)
220
+ ? 'removed'
221
+ : 'added';
222
+ const newArray = selectedChangeHandler(__originalIndex, actionType);
223
+ dispatch({ type: 'multiselect', value: newArray });
224
+ onChangeHandler(__originalIndex, actionType, newArray);
225
+ // update live region
226
+ setLiveRegionSelection(newArray
227
+ .map((item) => optionsRef.current[item]?.label)
228
+ .filter(Boolean)
229
+ .join(', '));
230
+ }
231
+ else {
232
+ dispatch({ type: 'select', value: __originalIndex });
233
+ hide();
234
+ onChangeHandler(__originalIndex);
235
+ }
236
+ }, [
237
+ selectedChangeHandler,
238
+ isMenuItemSelected,
239
+ multiple,
240
+ onChangeHandler,
241
+ selected,
242
+ optionsRef,
243
+ hide,
244
+ ]);
245
+ const getMenuItem = React.useCallback((option, filteredIndex) => {
246
+ const optionId = getOptionId(option, id);
247
+ const { __originalIndex } = optionsExtraInfoRef.current[optionId];
248
+ const { icon, startIcon: startIconProp, ...restOptions } = option;
249
+ const startIcon = startIconProp ?? icon;
250
+ const customItem = itemRenderer
251
+ ? itemRenderer(option, {
252
+ isFocused: focusedIndex === __originalIndex,
253
+ isSelected: selected === __originalIndex,
254
+ index: __originalIndex,
255
+ id: optionId,
256
+ })
257
+ : null;
258
+ return customItem ? (React.cloneElement(customItem, {
310
259
  onClick: (e) => {
311
- onClickHandler(__originalIndex);
312
- customItem.props.onClick?.(e);
260
+ onClickHandler(__originalIndex);
261
+ customItem.props.onClick?.(e);
313
262
  },
314
263
  // ComboBox.MenuItem handles scrollIntoView, data-iui-index and focused through context
315
264
  // but we still need to pass them here for backwards compatibility with MenuItem
@@ -317,130 +266,59 @@ const ComboBox = (props) => {
317
266
  'data-iui-index': __originalIndex,
318
267
  'data-iui-filtered-index': filteredIndex,
319
268
  ref: (0, index_js_1.mergeRefs)(customItem.props.ref, (el) => {
320
- if (!enableVirtualization && focusedIndex === __originalIndex) {
321
- el?.scrollIntoView({ block: 'nearest' });
322
- }
269
+ if (!enableVirtualization && focusedIndex === __originalIndex) {
270
+ el?.scrollIntoView({ block: 'nearest' });
271
+ }
323
272
  }),
324
- })
325
- : React.createElement(
326
- ComboBoxMenuItem_js_1.ComboBoxMenuItem,
327
- {
328
- key: optionId,
329
- id: optionId,
330
- startIcon: startIcon,
331
- ...restOptions,
332
- isSelected: isMenuItemSelected(__originalIndex),
333
- onClick: () => {
273
+ })) : (React.createElement(ComboBoxMenuItem_js_1.ComboBoxMenuItem, { key: optionId, id: optionId, startIcon: startIcon, ...restOptions, isSelected: isMenuItemSelected(__originalIndex), onClick: () => {
334
274
  onClickHandler(__originalIndex);
335
- },
336
- index: __originalIndex,
337
- 'data-iui-filtered-index': filteredIndex,
338
- },
339
- option.label,
340
- );
341
- },
342
- [
343
- enableVirtualization,
344
- focusedIndex,
345
- id,
346
- isMenuItemSelected,
347
- itemRenderer,
348
- onClickHandler,
349
- selected,
350
- ],
351
- );
352
- const emptyContent = React.useMemo(
353
- () =>
354
- React.createElement(
355
- React.Fragment,
356
- null,
357
- React.isValidElement(emptyStateMessage)
358
- ? emptyStateMessage
359
- : React.createElement(
360
- MenuExtraContent_js_1.MenuExtraContent,
361
- null,
362
- React.createElement(
363
- Text_js_1.Text,
364
- { isMuted: true },
365
- emptyStateMessage,
366
- ),
367
- ),
368
- ),
369
- [emptyStateMessage],
370
- );
371
- const popover = (0, Popover_js_1.usePopover)({
372
- visible: isOpen,
373
- onVisibleChange: (open) => (open ? show() : hide()),
374
- matchWidth: true,
375
- closeOnOutsideClick: true,
376
- trigger: { focus: true },
377
- });
378
- return React.createElement(
379
- helpers_js_1.ComboBoxRefsContext.Provider,
380
- { value: { inputRef, menuRef, optionsExtraInfoRef } },
381
- React.createElement(
382
- helpers_js_1.ComboBoxActionContext.Provider,
383
- { value: dispatch },
384
- React.createElement(
385
- helpers_js_1.ComboBoxStateContext.Provider,
386
- {
387
- value: {
388
- id,
389
- isOpen,
390
- focusedIndex,
391
- onClickHandler,
392
- enableVirtualization,
393
- filteredOptions,
394
- getMenuItem,
395
- multiple,
396
- popover,
397
- show,
398
- hide,
399
- },
400
- },
401
- React.createElement(
402
- ComboBoxInputContainer_js_1.ComboBoxInputContainer,
403
- { disabled: inputProps?.disabled, ...rest },
404
- React.createElement(
405
- React.Fragment,
406
- null,
407
- React.createElement(ComboBoxInput_js_1.ComboBoxInput, {
408
- value: inputValue,
409
- disabled: inputProps?.disabled,
410
- ...inputProps,
411
- onChange: handleOnInput,
412
- selectTags: isMultipleEnabled(selected, multiple)
413
- ? selected.map((index) => {
414
- const item = optionsRef.current[index];
415
- return React.createElement(SelectTag_js_1.SelectTag, {
416
- key: item.label,
417
- label: item.label,
418
- });
419
- })
420
- : undefined,
421
- }),
422
- ),
423
- React.createElement(ComboBoxEndIcon_js_1.ComboBoxEndIcon, {
424
- ...endIconProps,
425
- disabled: inputProps?.disabled,
426
- isOpen: isOpen,
427
- }),
428
- multiple
429
- ? React.createElement(index_js_1.AutoclearingHiddenLiveRegion, {
430
- text: liveRegionSelection,
431
- })
432
- : null,
433
- ),
434
- React.createElement(
435
- ComboBoxMenu_js_1.ComboBoxMenu,
436
- { as: 'div', ...dropdownMenuProps },
437
- filteredOptions.length > 0 && !enableVirtualization
438
- ? filteredOptions.map(getMenuItem)
439
- : emptyContent,
440
- ),
441
- ),
442
- ),
443
- );
275
+ }, index: __originalIndex, "data-iui-filtered-index": filteredIndex }, option.label));
276
+ }, [
277
+ enableVirtualization,
278
+ focusedIndex,
279
+ id,
280
+ isMenuItemSelected,
281
+ itemRenderer,
282
+ onClickHandler,
283
+ selected,
284
+ ]);
285
+ const emptyContent = React.useMemo(() => (React.createElement(React.Fragment, null, React.isValidElement(emptyStateMessage) ? (emptyStateMessage) : (React.createElement(MenuExtraContent_js_1.MenuExtraContent, null,
286
+ React.createElement(Text_js_1.Text, { isMuted: true }, emptyStateMessage))))), [emptyStateMessage]);
287
+ const popover = (0, Popover_js_1.usePopover)({
288
+ visible: isOpen,
289
+ onVisibleChange: (open) => (open ? show() : hide()),
290
+ matchWidth: true,
291
+ closeOnOutsideClick: true,
292
+ trigger: { focus: true },
293
+ });
294
+ return (React.createElement(helpers_js_1.ComboBoxRefsContext.Provider, { value: { inputRef, menuRef, optionsExtraInfoRef } },
295
+ React.createElement(helpers_js_1.ComboBoxActionContext.Provider, { value: dispatch },
296
+ React.createElement(helpers_js_1.ComboBoxStateContext.Provider, { value: {
297
+ id,
298
+ isOpen,
299
+ focusedIndex,
300
+ onClickHandler,
301
+ enableVirtualization,
302
+ filteredOptions,
303
+ getMenuItem,
304
+ multiple,
305
+ popover,
306
+ show,
307
+ hide,
308
+ } },
309
+ React.createElement(ComboBoxInputContainer_js_1.ComboBoxInputContainer, { disabled: inputProps?.disabled, ...rest },
310
+ React.createElement(React.Fragment, null,
311
+ React.createElement(ComboBoxInput_js_1.ComboBoxInput, { value: inputValue, disabled: inputProps?.disabled, ...inputProps, onChange: handleOnInput, selectTags: isMultipleEnabled(selected, multiple)
312
+ ? selected.map((index) => {
313
+ const item = optionsRef.current[index];
314
+ return (React.createElement(SelectTag_js_1.SelectTag, { key: item.label, label: item.label }));
315
+ })
316
+ : undefined })),
317
+ React.createElement(ComboBoxEndIcon_js_1.ComboBoxEndIcon, { ...endIconProps, disabled: inputProps?.disabled, isOpen: isOpen }),
318
+ multiple ? (React.createElement(index_js_1.AutoclearingHiddenLiveRegion, { text: liveRegionSelection })) : null),
319
+ React.createElement(ComboBoxMenu_js_1.ComboBoxMenu, { as: 'div', ...dropdownMenuProps }, filteredOptions.length > 0 && !enableVirtualization
320
+ ? filteredOptions.map(getMenuItem)
321
+ : emptyContent)))));
444
322
  };
445
323
  exports.ComboBox = ComboBox;
446
324
  exports.default = exports.ComboBox;