@itwin/itwinui-react 1.20.0 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/cjs/core/Alert/Alert.d.ts +1 -1
  3. package/cjs/core/Alert/Alert.js +3 -4
  4. package/cjs/core/Badge/Badge.d.ts +1 -2
  5. package/cjs/core/Badge/Badge.js +4 -5
  6. package/cjs/core/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  7. package/cjs/core/Breadcrumbs/Breadcrumbs.js +4 -6
  8. package/cjs/core/ButtonGroup/ButtonGroup.d.ts +1 -1
  9. package/cjs/core/ButtonGroup/ButtonGroup.js +3 -4
  10. package/cjs/core/Buttons/Button/Button.js +2 -2
  11. package/cjs/core/Buttons/DropdownButton/DropdownButton.js +3 -4
  12. package/cjs/core/Buttons/IconButton/IconButton.js +2 -2
  13. package/cjs/core/Buttons/IdeasButton/IdeasButton.js +2 -2
  14. package/cjs/core/Buttons/SplitButton/SplitButton.js +2 -2
  15. package/cjs/core/Checkbox/Checkbox.js +3 -4
  16. package/cjs/core/ComboBox/ComboBox.d.ts +51 -0
  17. package/cjs/core/ComboBox/ComboBox.js +268 -0
  18. package/cjs/core/ComboBox/index.d.ts +4 -0
  19. package/cjs/core/ComboBox/index.js +10 -0
  20. package/cjs/core/DatePicker/DatePicker.js +2 -2
  21. package/cjs/core/DropdownMenu/DropdownMenu.d.ts +1 -2
  22. package/cjs/core/DropdownMenu/DropdownMenu.js +4 -6
  23. package/cjs/core/ErrorPage/ErrorPage.js +2 -2
  24. package/cjs/core/ExpandableBlock/ExpandableBlock.d.ts +1 -1
  25. package/cjs/core/ExpandableBlock/ExpandableBlock.js +3 -4
  26. package/cjs/core/Fieldset/Fieldset.js +2 -2
  27. package/cjs/core/FileUpload/FileUpload.d.ts +2 -2
  28. package/cjs/core/FileUpload/FileUpload.js +3 -4
  29. package/cjs/core/FileUpload/FileUploadTemplate.js +2 -2
  30. package/cjs/core/Footer/Footer.d.ts +1 -1
  31. package/cjs/core/Footer/Footer.js +2 -2
  32. package/cjs/core/Header/Header.d.ts +1 -1
  33. package/cjs/core/Header/Header.js +2 -2
  34. package/cjs/core/Header/HeaderBreadcrumbs.js +2 -2
  35. package/cjs/core/Header/HeaderButton.js +2 -2
  36. package/cjs/core/Header/HeaderLogo.d.ts +1 -1
  37. package/cjs/core/Header/HeaderLogo.js +2 -2
  38. package/cjs/core/Input/Input.js +3 -4
  39. package/cjs/core/InputGroup/InputGroup.d.ts +1 -1
  40. package/cjs/core/InputGroup/InputGroup.js +4 -6
  41. package/cjs/core/LabeledInput/LabeledInput.js +4 -6
  42. package/cjs/core/LabeledSelect/LabeledSelect.js +4 -6
  43. package/cjs/core/LabeledTextarea/LabeledTextarea.js +4 -6
  44. package/cjs/core/Menu/Menu.d.ts +11 -1
  45. package/cjs/core/Menu/Menu.js +11 -11
  46. package/cjs/core/Menu/MenuDivider.js +2 -2
  47. package/cjs/core/Menu/MenuItem.d.ts +2 -2
  48. package/cjs/core/Menu/MenuItem.js +5 -7
  49. package/cjs/core/Modal/Modal.d.ts +1 -1
  50. package/cjs/core/Modal/Modal.js +5 -7
  51. package/cjs/core/Modal/ModalButtonBar.js +2 -2
  52. package/cjs/core/ProgressIndicators/ProgressLinear/ProgressLinear.d.ts +1 -1
  53. package/cjs/core/ProgressIndicators/ProgressLinear/ProgressLinear.js +2 -2
  54. package/cjs/core/ProgressIndicators/ProgressRadial/ProgressRadial.d.ts +1 -1
  55. package/cjs/core/ProgressIndicators/ProgressRadial/ProgressRadial.js +2 -2
  56. package/cjs/core/Radio/Radio.js +3 -4
  57. package/cjs/core/RadioTiles/RadioTile.js +3 -4
  58. package/cjs/core/RadioTiles/RadioTileGroup.js +2 -2
  59. package/cjs/core/Select/Select.d.ts +1 -2
  60. package/cjs/core/Select/Select.js +4 -4
  61. package/cjs/core/SideNavigation/SideNavigation.d.ts +1 -1
  62. package/cjs/core/SideNavigation/SideNavigation.js +2 -2
  63. package/cjs/core/SideNavigation/SidenavButton.js +2 -2
  64. package/cjs/core/Slider/Slider.d.ts +1 -1
  65. package/cjs/core/Slider/Slider.js +7 -9
  66. package/cjs/core/Table/Table.d.ts +1 -1
  67. package/cjs/core/Table/Table.js +4 -4
  68. package/cjs/core/Table/TableRowMemoized.js +3 -4
  69. package/cjs/core/Table/filters/BaseFilter.d.ts +1 -1
  70. package/cjs/core/Table/filters/BaseFilter.js +2 -2
  71. package/cjs/core/Table/filters/DateRangeFilter/DatePickerInput.js +2 -2
  72. package/cjs/core/Table/filters/DateRangeFilter/DateRangeFilter.js +2 -2
  73. package/cjs/core/Table/filters/FilterButtonBar.d.ts +1 -1
  74. package/cjs/core/Table/filters/FilterButtonBar.js +2 -2
  75. package/cjs/core/Table/filters/FilterToggle.d.ts +1 -1
  76. package/cjs/core/Table/filters/FilterToggle.js +4 -6
  77. package/cjs/core/Table/filters/NumberRangeFilter/NumberRangeFilter.js +2 -2
  78. package/cjs/core/Table/filters/TextFilter/TextFilter.js +2 -2
  79. package/cjs/core/Tabs/Tab.js +2 -2
  80. package/cjs/core/Tabs/Tabs.js +6 -9
  81. package/cjs/core/Tag/Tag.d.ts +1 -1
  82. package/cjs/core/Tag/Tag.js +2 -2
  83. package/cjs/core/Tag/TagContainer.d.ts +1 -1
  84. package/cjs/core/Tag/TagContainer.js +2 -2
  85. package/cjs/core/Textarea/Textarea.js +3 -4
  86. package/cjs/core/ThemeProvider/ThemeProvider.d.ts +1 -1
  87. package/cjs/core/ThemeProvider/ThemeProvider.js +2 -2
  88. package/cjs/core/Tile/Tile.d.ts +2 -2
  89. package/cjs/core/Tile/Tile.js +4 -4
  90. package/cjs/core/TimePicker/TimePicker.d.ts +1 -1
  91. package/cjs/core/TimePicker/TimePicker.js +2 -2
  92. package/cjs/core/Toast/Toast.d.ts +1 -1
  93. package/cjs/core/Toast/Toast.js +5 -6
  94. package/cjs/core/Toast/Toaster.js +2 -2
  95. package/cjs/core/ToggleSwitch/ToggleSwitch.d.ts +1 -1
  96. package/cjs/core/ToggleSwitch/ToggleSwitch.js +3 -4
  97. package/cjs/core/Tooltip/Tooltip.d.ts +1 -2
  98. package/cjs/core/Tooltip/Tooltip.js +3 -4
  99. package/cjs/core/Typography/Blockquote/Blockquote.js +2 -2
  100. package/cjs/core/Typography/Body/Body.js +2 -2
  101. package/cjs/core/Typography/Code/Code.d.ts +1 -1
  102. package/cjs/core/Typography/Code/Code.js +2 -2
  103. package/cjs/core/Typography/Headline/Headline.js +2 -2
  104. package/cjs/core/Typography/Kbd/Kbd.d.ts +1 -1
  105. package/cjs/core/Typography/Kbd/Kbd.js +2 -2
  106. package/cjs/core/Typography/Leading/Leading.js +2 -2
  107. package/cjs/core/Typography/Small/Small.js +2 -2
  108. package/cjs/core/Typography/Subheading/Subheading.js +2 -2
  109. package/cjs/core/Typography/Text/Text.d.ts +1 -1
  110. package/cjs/core/Typography/Text/Text.js +2 -2
  111. package/cjs/core/Typography/Title/Title.js +2 -2
  112. package/cjs/core/UserIcon/UserIcon.d.ts +1 -1
  113. package/cjs/core/UserIcon/UserIcon.js +2 -2
  114. package/cjs/core/UserIconGroup/UserIconGroup.d.ts +1 -1
  115. package/cjs/core/UserIconGroup/UserIconGroup.js +2 -2
  116. package/cjs/core/Wizard/Step.d.ts +1 -1
  117. package/cjs/core/Wizard/Wizard.js +2 -2
  118. package/cjs/core/index.d.ts +4 -3
  119. package/cjs/core/index.js +7 -6
  120. package/cjs/core/utils/{FocusTrap.d.ts → components/FocusTrap.d.ts} +0 -0
  121. package/cjs/core/utils/{FocusTrap.js → components/FocusTrap.js} +3 -3
  122. package/cjs/core/utils/{InputContainer.d.ts → components/InputContainer.d.ts} +0 -0
  123. package/cjs/core/utils/{InputContainer.js → components/InputContainer.js} +25 -3
  124. package/cjs/core/utils/{Popover.d.ts → components/Popover.d.ts} +1 -1
  125. package/cjs/core/utils/{Popover.js → components/Popover.js} +1 -1
  126. package/cjs/core/utils/components/icons.d.ts +8 -0
  127. package/cjs/core/utils/components/icons.js +32 -0
  128. package/cjs/core/utils/components/index.d.ts +4 -0
  129. package/cjs/core/utils/components/index.js +20 -0
  130. package/cjs/core/utils/functions/colors.d.ts +20 -0
  131. package/cjs/core/utils/functions/colors.js +52 -0
  132. package/cjs/core/utils/functions/dom.d.ts +18 -0
  133. package/cjs/core/utils/functions/dom.js +42 -0
  134. package/cjs/core/utils/functions/focusable.d.ts +8 -0
  135. package/cjs/core/utils/functions/focusable.js +34 -0
  136. package/cjs/core/utils/functions/index.d.ts +4 -0
  137. package/cjs/core/utils/functions/index.js +20 -0
  138. package/cjs/core/utils/functions/numbers.d.ts +8 -0
  139. package/cjs/core/utils/functions/numbers.js +27 -0
  140. package/cjs/core/utils/hooks/index.d.ts +6 -0
  141. package/cjs/core/utils/hooks/index.js +22 -0
  142. package/cjs/core/utils/hooks/useIntersection.js +2 -2
  143. package/cjs/core/utils/hooks/useResizeObserver.js +2 -2
  144. package/cjs/core/utils/hooks/useTheme.js +3 -3
  145. package/cjs/core/utils/index.d.ts +4 -0
  146. package/cjs/core/utils/index.js +20 -0
  147. package/esm/core/Alert/Alert.d.ts +1 -1
  148. package/esm/core/Alert/Alert.js +1 -2
  149. package/esm/core/Badge/Badge.d.ts +1 -2
  150. package/esm/core/Badge/Badge.js +1 -2
  151. package/esm/core/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  152. package/esm/core/Breadcrumbs/Breadcrumbs.js +1 -3
  153. package/esm/core/ButtonGroup/ButtonGroup.d.ts +1 -1
  154. package/esm/core/ButtonGroup/ButtonGroup.js +1 -2
  155. package/esm/core/Buttons/Button/Button.js +1 -1
  156. package/esm/core/Buttons/DropdownButton/DropdownButton.js +1 -2
  157. package/esm/core/Buttons/IconButton/IconButton.js +1 -1
  158. package/esm/core/Buttons/IdeasButton/IdeasButton.js +1 -1
  159. package/esm/core/Buttons/SplitButton/SplitButton.js +1 -1
  160. package/esm/core/Checkbox/Checkbox.js +1 -2
  161. package/esm/core/ComboBox/ComboBox.d.ts +51 -0
  162. package/esm/core/ComboBox/ComboBox.js +261 -0
  163. package/esm/core/ComboBox/index.d.ts +4 -0
  164. package/esm/core/ComboBox/index.js +6 -0
  165. package/esm/core/DatePicker/DatePicker.js +1 -1
  166. package/esm/core/DropdownMenu/DropdownMenu.d.ts +1 -2
  167. package/esm/core/DropdownMenu/DropdownMenu.js +1 -3
  168. package/esm/core/ErrorPage/ErrorPage.js +1 -1
  169. package/esm/core/ExpandableBlock/ExpandableBlock.d.ts +1 -1
  170. package/esm/core/ExpandableBlock/ExpandableBlock.js +1 -2
  171. package/esm/core/Fieldset/Fieldset.js +1 -1
  172. package/esm/core/FileUpload/FileUpload.d.ts +2 -2
  173. package/esm/core/FileUpload/FileUpload.js +1 -2
  174. package/esm/core/FileUpload/FileUploadTemplate.js +1 -1
  175. package/esm/core/Footer/Footer.d.ts +1 -1
  176. package/esm/core/Footer/Footer.js +1 -1
  177. package/esm/core/Header/Header.d.ts +1 -1
  178. package/esm/core/Header/Header.js +1 -1
  179. package/esm/core/Header/HeaderBreadcrumbs.js +1 -1
  180. package/esm/core/Header/HeaderButton.js +1 -1
  181. package/esm/core/Header/HeaderLogo.d.ts +1 -1
  182. package/esm/core/Header/HeaderLogo.js +1 -1
  183. package/esm/core/Input/Input.js +1 -2
  184. package/esm/core/InputGroup/InputGroup.d.ts +1 -1
  185. package/esm/core/InputGroup/InputGroup.js +1 -3
  186. package/esm/core/LabeledInput/LabeledInput.js +1 -3
  187. package/esm/core/LabeledSelect/LabeledSelect.js +1 -3
  188. package/esm/core/LabeledTextarea/LabeledTextarea.js +1 -3
  189. package/esm/core/Menu/Menu.d.ts +11 -1
  190. package/esm/core/Menu/Menu.js +7 -7
  191. package/esm/core/Menu/MenuDivider.js +1 -1
  192. package/esm/core/Menu/MenuItem.d.ts +2 -2
  193. package/esm/core/Menu/MenuItem.js +2 -4
  194. package/esm/core/Modal/Modal.d.ts +1 -1
  195. package/esm/core/Modal/Modal.js +1 -3
  196. package/esm/core/Modal/ModalButtonBar.js +1 -1
  197. package/esm/core/ProgressIndicators/ProgressLinear/ProgressLinear.d.ts +1 -1
  198. package/esm/core/ProgressIndicators/ProgressLinear/ProgressLinear.js +1 -1
  199. package/esm/core/ProgressIndicators/ProgressRadial/ProgressRadial.d.ts +1 -1
  200. package/esm/core/ProgressIndicators/ProgressRadial/ProgressRadial.js +1 -1
  201. package/esm/core/Radio/Radio.js +1 -2
  202. package/esm/core/RadioTiles/RadioTile.js +1 -2
  203. package/esm/core/RadioTiles/RadioTileGroup.js +1 -1
  204. package/esm/core/Select/Select.d.ts +1 -2
  205. package/esm/core/Select/Select.js +2 -2
  206. package/esm/core/SideNavigation/SideNavigation.d.ts +1 -1
  207. package/esm/core/SideNavigation/SideNavigation.js +1 -1
  208. package/esm/core/SideNavigation/SidenavButton.js +1 -1
  209. package/esm/core/Slider/Slider.d.ts +1 -1
  210. package/esm/core/Slider/Slider.js +1 -3
  211. package/esm/core/Table/Table.d.ts +1 -1
  212. package/esm/core/Table/Table.js +1 -1
  213. package/esm/core/Table/TableRowMemoized.js +1 -2
  214. package/esm/core/Table/filters/BaseFilter.d.ts +1 -1
  215. package/esm/core/Table/filters/BaseFilter.js +1 -1
  216. package/esm/core/Table/filters/DateRangeFilter/DatePickerInput.js +1 -1
  217. package/esm/core/Table/filters/DateRangeFilter/DateRangeFilter.js +1 -1
  218. package/esm/core/Table/filters/FilterButtonBar.d.ts +1 -1
  219. package/esm/core/Table/filters/FilterButtonBar.js +1 -1
  220. package/esm/core/Table/filters/FilterToggle.d.ts +1 -1
  221. package/esm/core/Table/filters/FilterToggle.js +1 -3
  222. package/esm/core/Table/filters/NumberRangeFilter/NumberRangeFilter.js +1 -1
  223. package/esm/core/Table/filters/TextFilter/TextFilter.js +1 -1
  224. package/esm/core/Tabs/Tab.js +1 -1
  225. package/esm/core/Tabs/Tabs.js +1 -4
  226. package/esm/core/Tag/Tag.d.ts +1 -1
  227. package/esm/core/Tag/Tag.js +1 -1
  228. package/esm/core/Tag/TagContainer.d.ts +1 -1
  229. package/esm/core/Tag/TagContainer.js +1 -1
  230. package/esm/core/Textarea/Textarea.js +1 -2
  231. package/esm/core/ThemeProvider/ThemeProvider.d.ts +1 -1
  232. package/esm/core/ThemeProvider/ThemeProvider.js +1 -1
  233. package/esm/core/Tile/Tile.d.ts +2 -2
  234. package/esm/core/Tile/Tile.js +3 -3
  235. package/esm/core/TimePicker/TimePicker.d.ts +1 -1
  236. package/esm/core/TimePicker/TimePicker.js +1 -1
  237. package/esm/core/Toast/Toast.d.ts +1 -1
  238. package/esm/core/Toast/Toast.js +1 -2
  239. package/esm/core/Toast/Toaster.js +1 -1
  240. package/esm/core/ToggleSwitch/ToggleSwitch.d.ts +1 -1
  241. package/esm/core/ToggleSwitch/ToggleSwitch.js +1 -2
  242. package/esm/core/Tooltip/Tooltip.d.ts +1 -2
  243. package/esm/core/Tooltip/Tooltip.js +1 -2
  244. package/esm/core/Typography/Blockquote/Blockquote.js +1 -1
  245. package/esm/core/Typography/Body/Body.js +1 -1
  246. package/esm/core/Typography/Code/Code.d.ts +1 -1
  247. package/esm/core/Typography/Code/Code.js +1 -1
  248. package/esm/core/Typography/Headline/Headline.js +1 -1
  249. package/esm/core/Typography/Kbd/Kbd.d.ts +1 -1
  250. package/esm/core/Typography/Kbd/Kbd.js +1 -1
  251. package/esm/core/Typography/Leading/Leading.js +1 -1
  252. package/esm/core/Typography/Small/Small.js +1 -1
  253. package/esm/core/Typography/Subheading/Subheading.js +1 -1
  254. package/esm/core/Typography/Text/Text.d.ts +1 -1
  255. package/esm/core/Typography/Text/Text.js +1 -1
  256. package/esm/core/Typography/Title/Title.js +1 -1
  257. package/esm/core/UserIcon/UserIcon.d.ts +1 -1
  258. package/esm/core/UserIcon/UserIcon.js +1 -1
  259. package/esm/core/UserIconGroup/UserIconGroup.d.ts +1 -1
  260. package/esm/core/UserIconGroup/UserIconGroup.js +1 -1
  261. package/esm/core/Wizard/Step.d.ts +1 -1
  262. package/esm/core/Wizard/Wizard.js +1 -1
  263. package/esm/core/index.d.ts +4 -3
  264. package/esm/core/index.js +2 -2
  265. package/esm/core/utils/{FocusTrap.d.ts → components/FocusTrap.d.ts} +0 -0
  266. package/esm/core/utils/{FocusTrap.js → components/FocusTrap.js} +2 -2
  267. package/esm/core/utils/{InputContainer.d.ts → components/InputContainer.d.ts} +0 -0
  268. package/esm/core/utils/{InputContainer.js → components/InputContainer.js} +25 -3
  269. package/esm/core/utils/{Popover.d.ts → components/Popover.d.ts} +1 -1
  270. package/esm/core/utils/{Popover.js → components/Popover.js} +1 -1
  271. package/esm/core/utils/components/icons.d.ts +8 -0
  272. package/esm/core/utils/components/icons.js +26 -0
  273. package/esm/core/utils/components/index.d.ts +4 -0
  274. package/esm/core/utils/components/index.js +8 -0
  275. package/esm/core/utils/functions/colors.d.ts +20 -0
  276. package/esm/core/utils/functions/colors.js +47 -0
  277. package/esm/core/utils/functions/dom.d.ts +18 -0
  278. package/esm/core/utils/functions/dom.js +36 -0
  279. package/esm/core/utils/functions/focusable.d.ts +8 -0
  280. package/esm/core/utils/functions/focusable.js +29 -0
  281. package/esm/core/utils/functions/index.d.ts +4 -0
  282. package/esm/core/utils/functions/index.js +8 -0
  283. package/esm/core/utils/functions/numbers.d.ts +8 -0
  284. package/esm/core/utils/functions/numbers.js +22 -0
  285. package/esm/core/utils/hooks/index.d.ts +6 -0
  286. package/esm/core/utils/hooks/index.js +10 -0
  287. package/esm/core/utils/hooks/useIntersection.js +1 -1
  288. package/esm/core/utils/hooks/useResizeObserver.js +1 -1
  289. package/esm/core/utils/hooks/useTheme.js +1 -1
  290. package/esm/core/utils/index.d.ts +4 -0
  291. package/esm/core/utils/index.js +8 -0
  292. package/package.json +5 -3
  293. package/cjs/core/utils/common.d.ts +0 -58
  294. package/cjs/core/utils/common.js +0 -146
  295. package/esm/core/utils/common.d.ts +0 -58
  296. package/esm/core/utils/common.js +0 -132
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.21.0](https://www.github.com/iTwin/iTwinUI-react/compare/v1.20.0...v1.21.0) (2021-10-05)
4
+
5
+ ### What's new
6
+
7
+ * **ComboBox:** Add new `ComboBox` component with list autocomplete (list is filtered when typing in input) ([#338](https://www.github.com/iTwin/iTwinUI-react/issues/338)) ([92ac59e](https://www.github.com/iTwin/iTwinUI-react/commit/92ac59e01614bb658783d8a49aa7558f6bf61938))
8
+ * **Tile:** Make `thumbnail` prop optional ([#354](https://www.github.com/iTwin/iTwinUI-react/issues/354)) ([b5a5a4e](https://www.github.com/iTwin/iTwinUI-react/commit/b5a5a4ed295ffd373180b84635ed198966f3a993))
9
+
3
10
  ## [1.20.0](https://www.github.com/iTwin/iTwinUI-react/compare/v1.19.0...v1.20.0) (2021-09-28)
4
11
 
5
12
  ### What's new
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { CommonProps } from '../utils/props';
2
+ import { CommonProps } from '../utils';
3
3
  import '@itwin/itwinui-css/css/alert.css';
4
4
  export declare type AlertProps = {
5
5
  /**
@@ -33,10 +33,9 @@ exports.Alert = void 0;
33
33
  var CloseSmall_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/CloseSmall"));
34
34
  var classnames_1 = __importDefault(require("classnames"));
35
35
  var react_1 = __importDefault(require("react"));
36
- var useTheme_1 = require("../utils/hooks/useTheme");
36
+ var utils_1 = require("../utils");
37
37
  require("@itwin/itwinui-css/css/alert.css");
38
38
  var IconButton_1 = require("../Buttons/IconButton");
39
- var common_1 = require("../utils/common");
40
39
  /**
41
40
  * A small box to quickly grab user attention and communicate a brief message
42
41
  * @example
@@ -48,8 +47,8 @@ var common_1 = require("../utils/common");
48
47
  */
49
48
  var Alert = function (props) {
50
49
  var children = props.children, className = props.className, _a = props.type, type = _a === void 0 ? 'informational' : _a, clickableText = props.clickableText, onClick = props.onClick, onClose = props.onClose, style = props.style, _b = props.isSticky, isSticky = _b === void 0 ? false : _b, rest = __rest(props, ["children", "className", "type", "clickableText", "onClick", "onClose", "style", "isSticky"]);
51
- (0, useTheme_1.useTheme)();
52
- var StatusIcon = common_1.StatusIconMap[type];
50
+ (0, utils_1.useTheme)();
51
+ var StatusIcon = utils_1.StatusIconMap[type];
53
52
  return (react_1.default.createElement("div", __assign({ className: (0, classnames_1.default)('iui-alert', "iui-" + type, { 'iui-sticky': isSticky }, className), style: style }, rest),
54
53
  react_1.default.createElement(StatusIcon, { className: 'iui-icon' }),
55
54
  react_1.default.createElement("span", { className: 'iui-message' },
@@ -1,7 +1,6 @@
1
1
  /// <reference types="react" />
2
- import { CommonProps } from '../utils/props';
2
+ import { CommonProps, SoftBackgrounds } from '../utils';
3
3
  import '@itwin/itwinui-css/css/badge.css';
4
- import { SoftBackgrounds } from '../utils/common';
5
4
  export declare type BadgeProps = {
6
5
  /**
7
6
  * Background color of the badge.
@@ -32,9 +32,8 @@ exports.Badge = void 0;
32
32
  *--------------------------------------------------------------------------------------------*/
33
33
  var react_1 = __importDefault(require("react"));
34
34
  var classnames_1 = __importDefault(require("classnames"));
35
- var useTheme_1 = require("../utils/hooks/useTheme");
35
+ var utils_1 = require("../utils");
36
36
  require("@itwin/itwinui-css/css/badge.css");
37
- var common_1 = require("../utils/common");
38
37
  /**
39
38
  * Helper function that returns one of the preset badge color values.
40
39
  */
@@ -52,7 +51,7 @@ var getBadgeColorValue = function (color) {
52
51
  case 'warning':
53
52
  return '#F9D7AB';
54
53
  default:
55
- return (0, common_1.isSoftBackground)(color) ? common_1.SoftBackgrounds[color] : color;
54
+ return (0, utils_1.isSoftBackground)(color) ? utils_1.SoftBackgrounds[color] : color;
56
55
  }
57
56
  };
58
57
  /**
@@ -65,9 +64,9 @@ var getBadgeColorValue = function (color) {
65
64
  var Badge = function (props) {
66
65
  var _a, _b, _c;
67
66
  var backgroundColor = props.backgroundColor, style = props.style, className = props.className, children = props.children, rest = __rest(props, ["backgroundColor", "style", "className", "children"]);
68
- (0, useTheme_1.useTheme)();
67
+ (0, utils_1.useTheme)();
69
68
  var _style = backgroundColor &&
70
- ((_c = (_b = (_a = (0, common_1.getWindow)()) === null || _a === void 0 ? void 0 : _a.CSS) === null || _b === void 0 ? void 0 : _b.supports) === null || _c === void 0 ? void 0 : _c.call(_b, "--badge-color: " + backgroundColor))
69
+ ((_c = (_b = (_a = (0, utils_1.getWindow)()) === null || _a === void 0 ? void 0 : _a.CSS) === null || _b === void 0 ? void 0 : _b.supports) === null || _c === void 0 ? void 0 : _c.call(_b, "--badge-color: " + backgroundColor))
71
70
  ? __assign({ '--badge-color': getBadgeColorValue(backgroundColor) }, style) : __assign({ backgroundColor: getBadgeColorValue(backgroundColor) }, style);
72
71
  return (react_1.default.createElement("span", __assign({ className: (0, classnames_1.default)('iui-badge', className), style: _style }, rest), children));
73
72
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { CommonProps } from '../utils/props';
2
+ import { CommonProps } from '../utils';
3
3
  import '@itwin/itwinui-css/css/breadcrumbs.css';
4
4
  export declare type BreadcrumbsProps = {
5
5
  /**
@@ -32,11 +32,9 @@ exports.Breadcrumbs = void 0;
32
32
  *--------------------------------------------------------------------------------------------*/
33
33
  var react_1 = __importDefault(require("react"));
34
34
  var classnames_1 = __importDefault(require("classnames"));
35
- var useTheme_1 = require("../utils/hooks/useTheme");
35
+ var utils_1 = require("../utils");
36
36
  var ChevronRight_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/ChevronRight"));
37
37
  require("@itwin/itwinui-css/css/breadcrumbs.css");
38
- var useMergedRefs_1 = require("../utils/hooks/useMergedRefs");
39
- var useOverflow_1 = require("../utils/hooks/useOverflow");
40
38
  /**
41
39
  * A breadcrumb trail is used as a navigational aid to help users keep track
42
40
  * of their place in the application. It is often placed before a page's main content.
@@ -61,9 +59,9 @@ var useOverflow_1 = require("../utils/hooks/useOverflow");
61
59
  */
62
60
  exports.Breadcrumbs = react_1.default.forwardRef(function (props, ref) {
63
61
  var items = props.children, _a = props.currentIndex, currentIndex = _a === void 0 ? items.length - 1 : _a, separator = props.separator, className = props.className, rest = __rest(props, ["children", "currentIndex", "separator", "className"]);
64
- (0, useTheme_1.useTheme)();
65
- var _b = (0, useOverflow_1.useOverflow)(items), overflowRef = _b[0], visibleCount = _b[1];
66
- var refs = (0, useMergedRefs_1.useMergedRefs)(overflowRef, ref);
62
+ (0, utils_1.useTheme)();
63
+ var _b = (0, utils_1.useOverflow)(items), overflowRef = _b[0], visibleCount = _b[1];
64
+ var refs = (0, utils_1.useMergedRefs)(overflowRef, ref);
67
65
  var Separator = function () { return (react_1.default.createElement("li", { className: 'iui-breadcrumbs-separator', "aria-hidden": true }, separator !== null && separator !== void 0 ? separator : react_1.default.createElement(ChevronRight_1.default, null))); };
68
66
  var ListItem = function (_a) {
69
67
  var _b;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { CommonProps } from '../utils/props';
2
+ import { CommonProps } from '../utils';
3
3
  import '@itwin/itwinui-css/css/button.css';
4
4
  export declare type ButtonGroupProps = {
5
5
  /**
@@ -32,8 +32,7 @@ exports.ButtonGroup = void 0;
32
32
  *--------------------------------------------------------------------------------------------*/
33
33
  var react_1 = __importDefault(require("react"));
34
34
  var classnames_1 = __importDefault(require("classnames"));
35
- var useTheme_1 = require("../utils/hooks/useTheme");
36
- var useOverflow_1 = require("../utils/hooks/useOverflow");
35
+ var utils_1 = require("../utils");
37
36
  require("@itwin/itwinui-css/css/button.css");
38
37
  /**
39
38
  * Group buttons together for common actions.
@@ -68,8 +67,8 @@ var ButtonGroup = function (props) {
68
67
  var items = react_1.default.useMemo(function () { return react_1.default.Children.toArray(children); }, [
69
68
  children,
70
69
  ]);
71
- (0, useTheme_1.useTheme)();
72
- var _a = (0, useOverflow_1.useOverflow)(items, !overflowButton), overflowRef = _a[0], visibleCount = _a[1];
70
+ (0, utils_1.useTheme)();
71
+ var _a = (0, utils_1.useOverflow)(items, !overflowButton), overflowRef = _a[0], visibleCount = _a[1];
73
72
  return (react_1.default.createElement("div", __assign({ className: (0, classnames_1.default)('iui-button-group', className), style: __assign(__assign({}, (!!overflowButton && { width: '100%' })), style), ref: overflowRef }, rest), !!overflowButton && visibleCount < items.length ? (react_1.default.createElement(react_1.default.Fragment, null,
74
73
  items.slice(0, visibleCount - 1),
75
74
  overflowButton(visibleCount))) : (children)));
@@ -32,7 +32,7 @@ exports.Button = void 0;
32
32
  *--------------------------------------------------------------------------------------------*/
33
33
  var classnames_1 = __importDefault(require("classnames"));
34
34
  var react_1 = __importDefault(require("react"));
35
- var useTheme_1 = require("../../utils/hooks/useTheme");
35
+ var utils_1 = require("../../utils");
36
36
  require("@itwin/itwinui-css/css/button.css");
37
37
  /**
38
38
  * Generic button component
@@ -46,7 +46,7 @@ require("@itwin/itwinui-css/css/button.css");
46
46
  exports.Button = react_1.default.forwardRef(function (props, ref) {
47
47
  var _a;
48
48
  var children = props.children, className = props.className, size = props.size, style = props.style, _b = props.styleType, styleType = _b === void 0 ? 'default' : _b, _c = props.type, type = _c === void 0 ? 'button' : _c, startIcon = props.startIcon, endIcon = props.endIcon, rest = __rest(props, ["children", "className", "size", "style", "styleType", "type", "startIcon", "endIcon"]);
49
- (0, useTheme_1.useTheme)();
49
+ (0, utils_1.useTheme)();
50
50
  return (react_1.default.createElement("button", __assign({ ref: ref, className: (0, classnames_1.default)('iui-button', (_a = {},
51
51
  _a["iui-" + size] = !!size,
52
52
  _a["iui-" + styleType] = styleType !== 'default',
@@ -36,8 +36,7 @@ var Button_1 = require("../Button");
36
36
  var DropdownMenu_1 = require("../../DropdownMenu");
37
37
  var CaretDownSmall_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/CaretDownSmall"));
38
38
  var CaretUpSmall_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/CaretUpSmall"));
39
- var useTheme_1 = require("../../utils/hooks/useTheme");
40
- var useMergedRefs_1 = require("../../utils/hooks/useMergedRefs");
39
+ var utils_1 = require("../../utils");
41
40
  require("@itwin/itwinui-css/css/button.css");
42
41
  /**
43
42
  * Button that opens a DropdownMenu.
@@ -50,11 +49,11 @@ require("@itwin/itwinui-css/css/button.css");
50
49
  */
51
50
  exports.DropdownButton = react_1.default.forwardRef(function (props, ref) {
52
51
  var menuItems = props.menuItems, className = props.className, size = props.size, styleType = props.styleType, children = props.children, rest = __rest(props, ["menuItems", "className", "size", "styleType", "children"]);
53
- (0, useTheme_1.useTheme)();
52
+ (0, utils_1.useTheme)();
54
53
  var _a = react_1.default.useState(false), isMenuOpen = _a[0], setIsMenuOpen = _a[1];
55
54
  var _b = react_1.default.useState(0), menuWidth = _b[0], setMenuWidth = _b[1];
56
55
  var buttonRef = react_1.default.useRef(null);
57
- var refs = (0, useMergedRefs_1.useMergedRefs)(ref, buttonRef);
56
+ var refs = (0, utils_1.useMergedRefs)(ref, buttonRef);
58
57
  react_1.default.useEffect(function () {
59
58
  if (buttonRef.current) {
60
59
  setMenuWidth(buttonRef.current.offsetWidth);
@@ -32,7 +32,7 @@ exports.IconButton = void 0;
32
32
  *--------------------------------------------------------------------------------------------*/
33
33
  var classnames_1 = __importDefault(require("classnames"));
34
34
  var react_1 = __importDefault(require("react"));
35
- var useTheme_1 = require("../../utils/hooks/useTheme");
35
+ var utils_1 = require("../../utils");
36
36
  require("@itwin/itwinui-css/css/button.css");
37
37
  /**
38
38
  * Icon button
@@ -43,7 +43,7 @@ require("@itwin/itwinui-css/css/button.css");
43
43
  exports.IconButton = react_1.default.forwardRef(function (props, ref) {
44
44
  var _a;
45
45
  var isActive = props.isActive, children = props.children, _b = props.styleType, styleType = _b === void 0 ? 'default' : _b, size = props.size, _c = props.type, type = _c === void 0 ? 'button' : _c, className = props.className, rest = __rest(props, ["isActive", "children", "styleType", "size", "type", "className"]);
46
- (0, useTheme_1.useTheme)();
46
+ (0, utils_1.useTheme)();
47
47
  return (react_1.default.createElement("button", __assign({ ref: ref, className: (0, classnames_1.default)('iui-button', (_a = {},
48
48
  _a["iui-" + size] = !!size,
49
49
  _a["iui-" + styleType] = styleType !== 'default',
@@ -32,7 +32,7 @@ exports.IdeasButton = void 0;
32
32
  *--------------------------------------------------------------------------------------------*/
33
33
  var react_1 = __importDefault(require("react"));
34
34
  var SmileyHappy_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/SmileyHappy"));
35
- var useTheme_1 = require("../../utils/hooks/useTheme");
35
+ var utils_1 = require("../../utils");
36
36
  var Button_1 = require("../Button");
37
37
  /**
38
38
  * Ideas button
@@ -41,7 +41,7 @@ var Button_1 = require("../Button");
41
41
  */
42
42
  exports.IdeasButton = react_1.default.forwardRef(function (props, ref) {
43
43
  var _a = props.feedbackLabel, feedbackLabel = _a === void 0 ? 'Feedback' : _a, onClick = props.onClick, rest = __rest(props, ["feedbackLabel", "onClick"]);
44
- (0, useTheme_1.useTheme)();
44
+ (0, utils_1.useTheme)();
45
45
  return (react_1.default.createElement(Button_1.Button, __assign({ ref: ref, className: 'iui-idea', onClick: onClick, startIcon: react_1.default.createElement(SmileyHappy_1.default, { "aria-hidden": true }) }, rest), feedbackLabel));
46
46
  });
47
47
  exports.default = exports.IdeasButton;
@@ -37,7 +37,7 @@ var IconButton_1 = require("../IconButton");
37
37
  var DropdownMenu_1 = require("../../DropdownMenu");
38
38
  var CaretDownSmall_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/CaretDownSmall"));
39
39
  var CaretUpSmall_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/CaretUpSmall"));
40
- var useTheme_1 = require("../../utils/hooks/useTheme");
40
+ var utils_1 = require("../../utils");
41
41
  require("@itwin/itwinui-css/css/button.css");
42
42
  /**
43
43
  * Split button component with a DropdownMenu.
@@ -51,7 +51,7 @@ require("@itwin/itwinui-css/css/button.css");
51
51
  */
52
52
  var SplitButton = function (props) {
53
53
  var onClick = props.onClick, menuItems = props.menuItems, className = props.className, _a = props.menuPlacement, menuPlacement = _a === void 0 ? 'bottom-end' : _a, _b = props.styleType, styleType = _b === void 0 ? 'default' : _b, size = props.size, children = props.children, style = props.style, title = props.title, rest = __rest(props, ["onClick", "menuItems", "className", "menuPlacement", "styleType", "size", "children", "style", "title"]);
54
- (0, useTheme_1.useTheme)();
54
+ (0, utils_1.useTheme)();
55
55
  var _c = react_1.default.useState(false), isMenuOpen = _c[0], setIsMenuOpen = _c[1];
56
56
  var _d = react_1.default.useState(0), menuWidth = _d[0], setMenuWidth = _d[1];
57
57
  var ref = react_1.default.useRef(null);
@@ -33,8 +33,7 @@ exports.Checkbox = void 0;
33
33
  var classnames_1 = __importDefault(require("classnames"));
34
34
  var react_1 = __importDefault(require("react"));
35
35
  var ProgressIndicators_1 = require("../ProgressIndicators");
36
- var useMergedRefs_1 = require("../utils/hooks/useMergedRefs");
37
- var useTheme_1 = require("../utils/hooks/useTheme");
36
+ var utils_1 = require("../utils");
38
37
  require("@itwin/itwinui-css/css/inputs.css");
39
38
  /**
40
39
  * Simple input checkbox
@@ -49,9 +48,9 @@ require("@itwin/itwinui-css/css/inputs.css");
49
48
  exports.Checkbox = react_1.default.forwardRef(function (props, ref) {
50
49
  var _a;
51
50
  var className = props.className, _b = props.disabled, disabled = _b === void 0 ? false : _b, _c = props.indeterminate, indeterminate = _c === void 0 ? false : _c, label = props.label, status = props.status, setFocus = props.setFocus, _d = props.isLoading, isLoading = _d === void 0 ? false : _d, style = props.style, checkmarkClassName = props.checkmarkClassName, checkmarkStyle = props.checkmarkStyle, rest = __rest(props, ["className", "disabled", "indeterminate", "label", "status", "setFocus", "isLoading", "style", "checkmarkClassName", "checkmarkStyle"]);
52
- (0, useTheme_1.useTheme)();
51
+ (0, utils_1.useTheme)();
53
52
  var inputElementRef = react_1.default.useRef(null);
54
- var refs = (0, useMergedRefs_1.useMergedRefs)(inputElementRef, ref);
53
+ var refs = (0, utils_1.useMergedRefs)(inputElementRef, ref);
55
54
  react_1.default.useEffect(function () {
56
55
  if (inputElementRef.current && setFocus) {
57
56
  inputElementRef.current.focus();
@@ -0,0 +1,51 @@
1
+ /// <reference types="react" />
2
+ import { InputProps } from '../Input';
3
+ import { SelectOption } from '../Select';
4
+ import { PopoverProps, CommonProps } from '../utils';
5
+ import 'tippy.js/animations/shift-away.css';
6
+ export declare type ComboBoxProps<T> = {
7
+ /**
8
+ * Array of options that populate the dropdown list.
9
+ */
10
+ options: SelectOption<T>[];
11
+ /**
12
+ * Controlled value of ComboBox.
13
+ */
14
+ value?: T;
15
+ /**
16
+ * Callback fired when selected value changes.
17
+ */
18
+ onChange?: (value: T) => void;
19
+ /**
20
+ * Function to customize the default filtering logic.
21
+ */
22
+ filterFunction?: (options: SelectOption<T>[], inputValue: string) => SelectOption<T>[];
23
+ /**
24
+ * Native input element props.
25
+ */
26
+ inputProps?: Omit<InputProps, 'setFocus'>;
27
+ /**
28
+ * Props to customize dropdown menu behavior.
29
+ */
30
+ dropdownMenuProps?: PopoverProps;
31
+ /**
32
+ * Message shown when no options are available.
33
+ * @default 'No options found'
34
+ */
35
+ emptyStateMessage?: string;
36
+ } & Omit<CommonProps, 'title'>;
37
+ /**
38
+ * ComboBox component that allows typing a value to filter the options in dropdown list.
39
+ * Values can be selected either using mouse clicks or using the Enter key.
40
+ * @example
41
+ * <ComboBox
42
+ * options={[
43
+ * { label: 'Item 1', value: 1 },
44
+ * { label: 'Item 2', value: 2 },
45
+ * { label: 'Item 3', value: 3 },
46
+ * ]}
47
+ * onChange={() => {}}
48
+ * />
49
+ */
50
+ export declare const ComboBox: <T>(props: ComboBoxProps<T>) => JSX.Element;
51
+ export default ComboBox;
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __rest = (this && this.__rest) || function (s, e) {
14
+ var t = {};
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
+ t[p] = s[p];
17
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
+ t[p[i]] = s[p[i]];
21
+ }
22
+ return t;
23
+ };
24
+ var __importDefault = (this && this.__importDefault) || function (mod) {
25
+ return (mod && mod.__esModule) ? mod : { "default": mod };
26
+ };
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.ComboBox = void 0;
29
+ /*---------------------------------------------------------------------------------------------
30
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
31
+ * See LICENSE.md in the project root for license terms and full copyright notice.
32
+ *--------------------------------------------------------------------------------------------*/
33
+ var react_1 = __importDefault(require("react"));
34
+ var classnames_1 = __importDefault(require("classnames"));
35
+ var Input_1 = require("../Input");
36
+ var Menu_1 = require("../Menu");
37
+ var Typography_1 = require("../Typography");
38
+ var utils_1 = require("../utils");
39
+ var CaretDownSmall_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/CaretDownSmall"));
40
+ require("tippy.js/animations/shift-away.css");
41
+ /**
42
+ * ComboBox component that allows typing a value to filter the options in dropdown list.
43
+ * Values can be selected either using mouse clicks or using the Enter key.
44
+ * @example
45
+ * <ComboBox
46
+ * options={[
47
+ * { label: 'Item 1', value: 1 },
48
+ * { label: 'Item 2', value: 2 },
49
+ * { label: 'Item 3', value: 3 },
50
+ * ]}
51
+ * onChange={() => {}}
52
+ * />
53
+ */
54
+ var ComboBox = function (props) {
55
+ var options = props.options, value = props.value, onChange = props.onChange, filterFunction = props.filterFunction, className = props.className, inputProps = props.inputProps, dropdownMenuProps = props.dropdownMenuProps, _a = props.emptyStateMessage, emptyStateMessage = _a === void 0 ? 'No options found' : _a, rest = __rest(props, ["options", "value", "onChange", "filterFunction", "className", "inputProps", "dropdownMenuProps", "emptyStateMessage"]);
56
+ // Generate a stateful random id if not specified
57
+ var id = react_1.default.useState(function () { var _a, _b; return (_b = (_a = props.id) !== null && _a !== void 0 ? _a : (inputProps === null || inputProps === void 0 ? void 0 : inputProps.id) + "-cb") !== null && _b !== void 0 ? _b : "iui-cb-" + (0, utils_1.getRandomValue)(10); })[0];
58
+ (0, utils_1.useTheme)();
59
+ /** Generates a memoized id for an option, given the index from original list */
60
+ var getOptionId = react_1.default.useCallback(function (index) {
61
+ var _a;
62
+ return (_a = options[index].id) !== null && _a !== void 0 ? _a : id + "-option" + options.findIndex(function (_a) {
63
+ var value = _a.value;
64
+ return value === options[index].value;
65
+ });
66
+ }, [options, id]);
67
+ var memoizedItems = react_1.default.useMemo(function () {
68
+ return options.map(function (_a, index) {
69
+ var label = _a.label, value = _a.value, rest = __rest(_a, ["label", "value"]);
70
+ return (react_1.default.createElement(Menu_1.MenuItem, __assign({ id: getOptionId(index), key: getOptionId(index), value: value, role: 'option', onClick: function (value) {
71
+ setSelectedValue(value);
72
+ setIsOpen(false);
73
+ } }, rest), label));
74
+ });
75
+ }, [options, getOptionId]);
76
+ var inputRef = react_1.default.useRef(null);
77
+ var menuRef = react_1.default.useRef(null);
78
+ var toggleButtonRef = react_1.default.useRef(null);
79
+ var _b = react_1.default.useState(false), isOpen = _b[0], setIsOpen = _b[1];
80
+ // Set min-width of menu to be same as input
81
+ var _c = react_1.default.useState(0), minWidth = _c[0], setMinWidth = _c[1];
82
+ react_1.default.useEffect(function () {
83
+ if (inputRef.current) {
84
+ setMinWidth(inputRef.current.offsetWidth);
85
+ }
86
+ }, [isOpen]);
87
+ var _d = react_1.default.useState(options), filteredOptions = _d[0], setFilteredOptions = _d[1];
88
+ var _e = react_1.default.useState(function () {
89
+ return options.findIndex(function (option) { return value === option.value; });
90
+ }), focusedIndex = _e[0], setFocusedIndex = _e[1];
91
+ // Maintain internal selected value state synced with `value` prop
92
+ var _f = react_1.default.useState(), selectedValue = _f[0], setSelectedValue = _f[1];
93
+ react_1.default.useEffect(function () {
94
+ setSelectedValue(value);
95
+ }, [value]);
96
+ // Controlled input value
97
+ var _g = react_1.default.useState(''), inputValue = _g[0], setInputValue = _g[1];
98
+ var onInput = react_1.default.useCallback(function (event) {
99
+ var _a;
100
+ setInputValue(event.target.value);
101
+ (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onChange) === null || _a === void 0 ? void 0 : _a.call(inputProps, event);
102
+ }, [inputProps]);
103
+ // Fire onChange callback and update inputValue every time selected value changes
104
+ react_1.default.useEffect(function () {
105
+ var _a, _b;
106
+ if (selectedValue != undefined) {
107
+ onChange === null || onChange === void 0 ? void 0 : onChange(selectedValue);
108
+ setInputValue((_b = (_a = options.find(function (_a) {
109
+ var value = _a.value;
110
+ return value === selectedValue;
111
+ })) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : '');
112
+ }
113
+ }, [selectedValue, onChange, options]);
114
+ // Filter options and update focus when input value changes
115
+ react_1.default.useEffect(function () {
116
+ var _a;
117
+ if (!isOpen) {
118
+ return;
119
+ }
120
+ // if input is empty or same as selected value, show the whole list
121
+ var selectedOption = options.find(function (_a) {
122
+ var value = _a.value;
123
+ return value === selectedValue;
124
+ });
125
+ if (!inputValue || (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) === inputValue) {
126
+ setFilteredOptions(options);
127
+ return;
128
+ }
129
+ var _filteredOptions = (_a = filterFunction === null || filterFunction === void 0 ? void 0 : filterFunction(options, inputValue)) !== null && _a !== void 0 ? _a : options.filter(function (option) {
130
+ return option.label.toLowerCase().includes(inputValue === null || inputValue === void 0 ? void 0 : inputValue.trim().toLowerCase());
131
+ });
132
+ setFilteredOptions(_filteredOptions);
133
+ setFocusedIndex(function (previouslyFocusedIndex) {
134
+ if (_filteredOptions.includes(options[previouslyFocusedIndex])) {
135
+ return previouslyFocusedIndex;
136
+ }
137
+ else if (_filteredOptions.find(function (_a) {
138
+ var value = _a.value;
139
+ return value === selectedValue;
140
+ })) {
141
+ return options.findIndex(function (_a) {
142
+ var value = _a.value;
143
+ return value === selectedValue;
144
+ });
145
+ }
146
+ else {
147
+ return -1; // reset focus if previously focused or selected value is not in filtered list
148
+ }
149
+ });
150
+ }, [inputValue, options, selectedValue, isOpen, filterFunction]);
151
+ var onKeyDown = react_1.default.useCallback(function (event) {
152
+ var focusableOptions = (0, utils_1.getFocusableElements)(menuRef.current);
153
+ var focusedIndexInFilteredList = focusableOptions.findIndex(function (_a) {
154
+ var _b;
155
+ var id = _a.id;
156
+ return id === ((_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.getAttribute('aria-activedescendant'));
157
+ });
158
+ switch (event.key) {
159
+ case 'ArrowDown':
160
+ if (isOpen) {
161
+ var nextIndex_1 = Math.min(focusedIndexInFilteredList + 1, focusableOptions.length - 1);
162
+ setFocusedIndex(options.findIndex(function (_, index) {
163
+ return getOptionId(index) === focusableOptions[nextIndex_1].id;
164
+ }));
165
+ }
166
+ else {
167
+ setIsOpen(true); // reopen menu if closed when typing
168
+ }
169
+ event.preventDefault();
170
+ event.stopPropagation();
171
+ break;
172
+ case 'ArrowUp':
173
+ if (isOpen) {
174
+ var previousIndex_1 = Math.max(focusedIndexInFilteredList - 1, 0);
175
+ setFocusedIndex(options.findIndex(function (_, index) {
176
+ return getOptionId(index) === focusableOptions[previousIndex_1].id;
177
+ }));
178
+ }
179
+ event.preventDefault();
180
+ event.stopPropagation();
181
+ break;
182
+ case 'Enter':
183
+ if (isOpen) {
184
+ setSelectedValue(options[focusedIndex].value);
185
+ }
186
+ setIsOpen(function (open) { return !open; });
187
+ event.preventDefault();
188
+ event.stopPropagation();
189
+ break;
190
+ case 'Escape':
191
+ setIsOpen(false);
192
+ event.preventDefault();
193
+ event.stopPropagation();
194
+ break;
195
+ case 'Tab':
196
+ setIsOpen(false);
197
+ break;
198
+ default:
199
+ if (!isOpen) {
200
+ setIsOpen(true); // reopen menu if closed when typing
201
+ }
202
+ break;
203
+ }
204
+ }, [focusedIndex, isOpen, options, getOptionId]);
205
+ var menuItems = react_1.default.useMemo(function () {
206
+ if (filteredOptions.length === 0) {
207
+ return (react_1.default.createElement(Menu_1.MenuItem, { className: 'iui-menu-content', role: 'presentation' },
208
+ react_1.default.createElement(Typography_1.Text, { isMuted: true }, emptyStateMessage)));
209
+ }
210
+ return filteredOptions.map(function (option) {
211
+ var index = options.findIndex(function (_a) {
212
+ var value = _a.value;
213
+ return option.value === value;
214
+ });
215
+ return focusedIndex !== index && selectedValue !== option.value
216
+ ? memoizedItems[index]
217
+ : react_1.default.cloneElement(memoizedItems[index], {
218
+ className: (0, classnames_1.default)({ 'iui-focused': focusedIndex === index }),
219
+ isSelected: selectedValue === option.value,
220
+ ref: function (el) {
221
+ return focusedIndex === index && (el === null || el === void 0 ? void 0 : el.scrollIntoView(false));
222
+ },
223
+ });
224
+ });
225
+ }, [
226
+ filteredOptions,
227
+ emptyStateMessage,
228
+ options,
229
+ focusedIndex,
230
+ selectedValue,
231
+ memoizedItems,
232
+ ]);
233
+ return (react_1.default.createElement(utils_1.InputContainer, __assign({ className: className, isIconInline: true, icon: react_1.default.createElement("span", { ref: toggleButtonRef, className: (0, classnames_1.default)('iui-actionable', { 'iui-open': isOpen }), onClick: function () {
234
+ var _a;
235
+ if (isOpen) {
236
+ setIsOpen(false);
237
+ }
238
+ else {
239
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
240
+ }
241
+ } },
242
+ react_1.default.createElement(CaretDownSmall_1.default, { "aria-hidden": true })) }, rest, { id: id }),
243
+ react_1.default.createElement(utils_1.Popover, __assign({ placement: 'bottom-start', visible: isOpen, onClickOutside: function (_, _a) {
244
+ var _b;
245
+ var target = _a.target;
246
+ if (!((_b = toggleButtonRef.current) === null || _b === void 0 ? void 0 : _b.contains(target))) {
247
+ setIsOpen(false);
248
+ }
249
+ }, animation: 'shift-away', duration: 200 }, dropdownMenuProps, { content: react_1.default.createElement(Menu_1.Menu, { id: id + "-list", className: 'iui-scroll', style: {
250
+ minWidth: minWidth,
251
+ maxWidth: "min(" + minWidth * 2 + "px, 90vw)",
252
+ maxHeight: 300,
253
+ }, setFocus: false, role: 'listbox', ref: menuRef }, menuItems), onHide: function (instance) {
254
+ var _a;
255
+ var selectedIndex = options.findIndex(function (_a) {
256
+ var value = _a.value;
257
+ return value === selectedValue;
258
+ });
259
+ setFocusedIndex(selectedIndex);
260
+ if (selectedIndex > -1) {
261
+ setInputValue(options[selectedIndex].label); // update input value to be same as selected value
262
+ }
263
+ (_a = dropdownMenuProps === null || dropdownMenuProps === void 0 ? void 0 : dropdownMenuProps.onHide) === null || _a === void 0 ? void 0 : _a.call(dropdownMenuProps, instance);
264
+ } }),
265
+ react_1.default.createElement(Input_1.Input, __assign({ ref: inputRef, onKeyDown: onKeyDown, onFocus: function () { return setIsOpen(true); }, onChange: onInput, value: inputValue, "aria-activedescendant": isOpen && focusedIndex > -1 ? getOptionId(focusedIndex) : undefined, role: 'combobox', "aria-controls": isOpen ? id + "-list" : undefined, "aria-autocomplete": 'list', spellCheck: false, autoCapitalize: 'none', autoCorrect: 'off' }, inputProps)))));
266
+ };
267
+ exports.ComboBox = ComboBox;
268
+ exports.default = exports.ComboBox;
@@ -0,0 +1,4 @@
1
+ export { ComboBox } from './ComboBox';
2
+ export type { ComboBoxProps } from './ComboBox';
3
+ declare const _default: "./ComboBox";
4
+ export default _default;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ComboBox = void 0;
4
+ /*---------------------------------------------------------------------------------------------
5
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
+ * See LICENSE.md in the project root for license terms and full copyright notice.
7
+ *--------------------------------------------------------------------------------------------*/
8
+ var ComboBox_1 = require("./ComboBox");
9
+ Object.defineProperty(exports, "ComboBox", { enumerable: true, get: function () { return ComboBox_1.ComboBox; } });
10
+ exports.default = './ComboBox';
@@ -34,7 +34,7 @@ var ChevronLeft_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icon
34
34
  var ChevronRight_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/ChevronRight"));
35
35
  var classnames_1 = __importDefault(require("classnames"));
36
36
  var react_1 = __importDefault(require("react"));
37
- var useTheme_1 = require("../utils/hooks/useTheme");
37
+ var utils_1 = require("../utils");
38
38
  require("@itwin/itwinui-css/css/date-picker.css");
39
39
  var IconButton_1 = require("../Buttons/IconButton");
40
40
  var TimePicker_1 = require("../TimePicker");
@@ -128,7 +128,7 @@ exports.generateLocalizedStrings = generateLocalizedStrings;
128
128
  var DatePicker = function (props) {
129
129
  var _a, _b, _c;
130
130
  var date = props.date, onChange = props.onChange, localizedNames = props.localizedNames, className = props.className, style = props.style, _d = props.setFocus, setFocus = _d === void 0 ? false : _d, _e = props.showTime, showTime = _e === void 0 ? false : _e, _f = props.use12Hours, use12Hours = _f === void 0 ? false : _f, precision = props.precision, hourStep = props.hourStep, minuteStep = props.minuteStep, secondStep = props.secondStep, rest = __rest(props, ["date", "onChange", "localizedNames", "className", "style", "setFocus", "showTime", "use12Hours", "precision", "hourStep", "minuteStep", "secondStep"]);
131
- (0, useTheme_1.useTheme)();
131
+ (0, utils_1.useTheme)();
132
132
  var monthNames = (_a = localizedNames === null || localizedNames === void 0 ? void 0 : localizedNames.months) !== null && _a !== void 0 ? _a : defaultMonths;
133
133
  var shortDays = (_b = localizedNames === null || localizedNames === void 0 ? void 0 : localizedNames.shortDays) !== null && _b !== void 0 ? _b : defaultShortDays;
134
134
  var longDays = (_c = localizedNames === null || localizedNames === void 0 ? void 0 : localizedNames.days) !== null && _c !== void 0 ? _c : defaultLongDays;