@itwin/itwinui-react 1.37.1 → 1.38.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 (82) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/cjs/core/Breadcrumbs/Breadcrumbs.js +3 -5
  3. package/cjs/core/ColorPicker/ColorSwatch.d.ts +1 -1
  4. package/cjs/core/ComboBox/ComboBox.d.ts +4 -2
  5. package/cjs/core/ComboBox/ComboBox.js +129 -246
  6. package/cjs/core/ComboBox/ComboBoxDropdown.d.ts +8 -0
  7. package/cjs/core/ComboBox/ComboBoxDropdown.js +55 -0
  8. package/cjs/core/ComboBox/ComboBoxEndIcon.d.ts +5 -0
  9. package/cjs/core/ComboBox/ComboBoxEndIcon.js +54 -0
  10. package/cjs/core/ComboBox/ComboBoxInput.d.ts +5 -0
  11. package/cjs/core/ComboBox/ComboBoxInput.js +134 -0
  12. package/cjs/core/ComboBox/ComboBoxInputContainer.d.ts +8 -0
  13. package/cjs/core/ComboBox/ComboBoxInputContainer.js +45 -0
  14. package/cjs/core/ComboBox/ComboBoxMenu.d.ts +3 -0
  15. package/cjs/core/ComboBox/ComboBoxMenu.js +45 -0
  16. package/cjs/core/ComboBox/ComboBoxMenuItem.d.ts +21 -0
  17. package/cjs/core/ComboBox/ComboBoxMenuItem.js +65 -0
  18. package/cjs/core/ComboBox/helpers.d.ts +27 -0
  19. package/cjs/core/ComboBox/helpers.js +50 -0
  20. package/cjs/core/Modal/Modal.d.ts +1 -1
  21. package/cjs/core/Modal/Modal.js +6 -6
  22. package/cjs/core/Modal/ModalButtonBar.d.ts +1 -1
  23. package/cjs/core/Modal/ModalButtonBar.js +2 -2
  24. package/cjs/core/Modal/ModalContent.d.ts +1 -1
  25. package/cjs/core/Modal/ModalContent.js +2 -2
  26. package/cjs/core/RadioTiles/RadioTile.d.ts +1 -1
  27. package/cjs/core/RadioTiles/RadioTile.js +7 -9
  28. package/cjs/core/Slider/Thumb.js +15 -1
  29. package/cjs/core/Slider/Track.js +23 -12
  30. package/cjs/core/Table/Table.js +19 -7
  31. package/cjs/core/Table/cells/EditableCell.js +2 -1
  32. package/cjs/core/Table/filters/FilterToggle.js +3 -2
  33. package/cjs/core/Toast/ToastWrapper.d.ts +7 -5
  34. package/cjs/core/Toast/ToastWrapper.js +8 -4
  35. package/cjs/core/Toast/Toaster.d.ts +3 -0
  36. package/cjs/core/Toast/Toaster.js +66 -5
  37. package/cjs/core/utils/components/Popover.d.ts +1 -1
  38. package/cjs/core/utils/hooks/index.d.ts +1 -0
  39. package/cjs/core/utils/hooks/index.js +1 -0
  40. package/cjs/core/utils/hooks/useSafeContext.d.ts +6 -0
  41. package/cjs/core/utils/hooks/useSafeContext.js +23 -0
  42. package/esm/core/Breadcrumbs/Breadcrumbs.js +3 -5
  43. package/esm/core/ColorPicker/ColorSwatch.d.ts +1 -1
  44. package/esm/core/ComboBox/ComboBox.d.ts +4 -2
  45. package/esm/core/ComboBox/ComboBox.js +131 -248
  46. package/esm/core/ComboBox/ComboBoxDropdown.d.ts +8 -0
  47. package/esm/core/ComboBox/ComboBoxDropdown.js +49 -0
  48. package/esm/core/ComboBox/ComboBoxEndIcon.d.ts +5 -0
  49. package/esm/core/ComboBox/ComboBoxEndIcon.js +48 -0
  50. package/esm/core/ComboBox/ComboBoxInput.d.ts +5 -0
  51. package/esm/core/ComboBox/ComboBoxInput.js +128 -0
  52. package/esm/core/ComboBox/ComboBoxInputContainer.d.ts +8 -0
  53. package/esm/core/ComboBox/ComboBoxInputContainer.js +38 -0
  54. package/esm/core/ComboBox/ComboBoxMenu.d.ts +3 -0
  55. package/esm/core/ComboBox/ComboBoxMenu.js +39 -0
  56. package/esm/core/ComboBox/ComboBoxMenuItem.d.ts +21 -0
  57. package/esm/core/ComboBox/ComboBoxMenuItem.js +59 -0
  58. package/esm/core/ComboBox/helpers.d.ts +27 -0
  59. package/esm/core/ComboBox/helpers.js +43 -0
  60. package/esm/core/Modal/Modal.d.ts +1 -1
  61. package/esm/core/Modal/Modal.js +6 -6
  62. package/esm/core/Modal/ModalButtonBar.d.ts +1 -1
  63. package/esm/core/Modal/ModalButtonBar.js +2 -2
  64. package/esm/core/Modal/ModalContent.d.ts +1 -1
  65. package/esm/core/Modal/ModalContent.js +2 -2
  66. package/esm/core/RadioTiles/RadioTile.d.ts +1 -1
  67. package/esm/core/RadioTiles/RadioTile.js +7 -9
  68. package/esm/core/Slider/Thumb.js +15 -1
  69. package/esm/core/Slider/Track.js +23 -12
  70. package/esm/core/Table/Table.js +19 -7
  71. package/esm/core/Table/cells/EditableCell.js +2 -1
  72. package/esm/core/Table/filters/FilterToggle.js +3 -2
  73. package/esm/core/Toast/ToastWrapper.d.ts +7 -5
  74. package/esm/core/Toast/ToastWrapper.js +8 -3
  75. package/esm/core/Toast/Toaster.d.ts +3 -0
  76. package/esm/core/Toast/Toaster.js +66 -5
  77. package/esm/core/utils/components/Popover.d.ts +1 -1
  78. package/esm/core/utils/hooks/index.d.ts +1 -0
  79. package/esm/core/utils/hooks/index.js +1 -0
  80. package/esm/core/utils/hooks/useSafeContext.d.ts +6 -0
  81. package/esm/core/utils/hooks/useSafeContext.js +16 -0
  82. package/package.json +6 -34
@@ -29,10 +29,18 @@ function shouldDisplaySegment(segmentIndex, mode) {
29
29
  }
30
30
  function generateSegments(values, min, max) {
31
31
  var segments = [];
32
+ var newValues = __spreadArray([], values, true);
33
+ newValues.sort(function (a, b) { return a - b; });
34
+ if (0 === newValues.length ||
35
+ newValues[0] < min ||
36
+ newValues[newValues.length - 1] > max ||
37
+ min === max) {
38
+ return [];
39
+ }
32
40
  var lastValue = min;
33
- for (var i = 0; i < values.length; i++) {
34
- segments.push({ left: lastValue, right: values[i] });
35
- lastValue = values[i];
41
+ for (var i = 0; i < newValues.length; i++) {
42
+ segments.push({ left: lastValue, right: newValues[i] });
43
+ lastValue = newValues[i];
36
44
  }
37
45
  segments.push({ left: lastValue, right: max });
38
46
  return segments;
@@ -43,18 +51,21 @@ function generateSegments(values, min, max) {
43
51
  */
44
52
  var Track = function (props) {
45
53
  var trackDisplayMode = props.trackDisplayMode, sliderMin = props.sliderMin, sliderMax = props.sliderMax, values = props.values;
46
- var _a = react_1.default.useState(__spreadArray([], values, true).sort(function (a, b) { return a - b; })), currentValues = _a[0], setCurrentValues = _a[1];
54
+ var _a = react_1.default.useState(function () {
55
+ return generateSegments(values, sliderMin, sliderMax);
56
+ }), segments = _a[0], setSegments = _a[1];
47
57
  react_1.default.useEffect(function () {
48
- var newValues = __spreadArray([], values, true);
49
- newValues.sort(function (a, b) { return a - b; });
50
- setCurrentValues(newValues);
51
- }, [values]);
52
- var segments = react_1.default.useMemo(function () { return generateSegments(currentValues, sliderMin, sliderMax); }, [currentValues, sliderMin, sliderMax]);
58
+ setSegments(generateSegments(values, sliderMin, sliderMax));
59
+ }, [values, sliderMin, sliderMax]);
53
60
  return (react_1.default.createElement(react_1.default.Fragment, null, 'none' !== trackDisplayMode &&
54
61
  segments.map(function (segment, index) {
55
- var leftPercent = (100.0 * (segment.left - sliderMin)) / (sliderMax - sliderMin);
56
- var rightPercent = (100.0 * (segment.right - sliderMin)) / (sliderMax - sliderMin);
57
- rightPercent = 100.0 - rightPercent;
62
+ var leftPercent = segment.left >= sliderMin && sliderMax !== sliderMin
63
+ ? (100.0 * (segment.left - sliderMin)) / (sliderMax - sliderMin)
64
+ : 0;
65
+ var rightPercent = segment.right >= sliderMin && sliderMax !== sliderMin
66
+ ? 100.0 -
67
+ (100.0 * (segment.right - sliderMin)) / (sliderMax - sliderMin)
68
+ : 100;
58
69
  return (react_1.default.createElement(react_1.default.Fragment, { key: index }, shouldDisplaySegment(index, trackDisplayMode) ? (react_1.default.createElement("div", { className: 'iui-slider-track', style: { left: "".concat(leftPercent, "%"), right: "".concat(rightPercent, "%") } })) : null));
59
70
  })));
60
71
  };
@@ -49,6 +49,16 @@ var columns_1 = require("./columns");
49
49
  var singleRowSelectedAction = 'singleRowSelected';
50
50
  exports.tableResizeStartAction = 'tableResizeStart';
51
51
  var tableResizeEndAction = 'tableResizeEnd';
52
+ var flattenColumns = function (columns) {
53
+ var flatColumns = [];
54
+ columns.forEach(function (column) {
55
+ flatColumns.push(column);
56
+ if (column.columns) {
57
+ flatColumns.push.apply(flatColumns, flattenColumns(column.columns));
58
+ }
59
+ });
60
+ return flatColumns;
61
+ };
52
62
  /**
53
63
  * Table based on [react-table](https://react-table.tanstack.com/docs/api/overview).
54
64
  * @example
@@ -93,10 +103,9 @@ var tableResizeEndAction = 'tableResizeEnd';
93
103
  */
94
104
  var Table = function (props) {
95
105
  var _a;
96
- var _b;
97
- var data = props.data, columns = props.columns, _c = props.isLoading, isLoading = _c === void 0 ? false : _c, emptyTableContent = props.emptyTableContent, className = props.className, style = props.style, id = props.id, _d = props.isSelectable, isSelectable = _d === void 0 ? false : _d, onSelect = props.onSelect, onRowClick = props.onRowClick, _e = props.selectionMode, selectionMode = _e === void 0 ? 'multi' : _e, _f = props.isSortable, isSortable = _f === void 0 ? false : _f, onSort = props.onSort, stateReducer = props.stateReducer, onBottomReached = props.onBottomReached, onRowInViewport = props.onRowInViewport, _g = props.intersectionMargin, intersectionMargin = _g === void 0 ? 300 : _g, subComponent = props.subComponent, onExpand = props.onExpand, onFilter = props.onFilter, emptyFilteredTableContent = props.emptyFilteredTableContent, filterFunctions = props.filterTypes, expanderCell = props.expanderCell, isRowDisabled = props.isRowDisabled, rowProps = props.rowProps, _h = props.density, density = _h === void 0 ? 'default' : _h, _j = props.selectSubRows, selectSubRows = _j === void 0 ? true : _j, getSubRows = props.getSubRows, _k = props.selectRowOnClick, selectRowOnClick = _k === void 0 ? true : _k, paginatorRenderer = props.paginatorRenderer, _l = props.pageSize, pageSize = _l === void 0 ? 25 : _l, _m = props.isResizable, isResizable = _m === void 0 ? false : _m, _o = props.styleType, styleType = _o === void 0 ? 'default' : _o, _p = props.enableVirtualization, enableVirtualization = _p === void 0 ? false : _p, _q = props.enableColumnReordering, enableColumnReordering = _q === void 0 ? false : _q, rest = __rest(props, ["data", "columns", "isLoading", "emptyTableContent", "className", "style", "id", "isSelectable", "onSelect", "onRowClick", "selectionMode", "isSortable", "onSort", "stateReducer", "onBottomReached", "onRowInViewport", "intersectionMargin", "subComponent", "onExpand", "onFilter", "emptyFilteredTableContent", "filterTypes", "expanderCell", "isRowDisabled", "rowProps", "density", "selectSubRows", "getSubRows", "selectRowOnClick", "paginatorRenderer", "pageSize", "isResizable", "styleType", "enableVirtualization", "enableColumnReordering"]);
106
+ var data = props.data, columns = props.columns, _b = props.isLoading, isLoading = _b === void 0 ? false : _b, emptyTableContent = props.emptyTableContent, className = props.className, style = props.style, id = props.id, _c = props.isSelectable, isSelectable = _c === void 0 ? false : _c, onSelect = props.onSelect, onRowClick = props.onRowClick, _d = props.selectionMode, selectionMode = _d === void 0 ? 'multi' : _d, _e = props.isSortable, isSortable = _e === void 0 ? false : _e, onSort = props.onSort, stateReducer = props.stateReducer, onBottomReached = props.onBottomReached, onRowInViewport = props.onRowInViewport, _f = props.intersectionMargin, intersectionMargin = _f === void 0 ? 300 : _f, subComponent = props.subComponent, onExpand = props.onExpand, onFilter = props.onFilter, emptyFilteredTableContent = props.emptyFilteredTableContent, filterFunctions = props.filterTypes, expanderCell = props.expanderCell, isRowDisabled = props.isRowDisabled, rowProps = props.rowProps, _g = props.density, density = _g === void 0 ? 'default' : _g, _h = props.selectSubRows, selectSubRows = _h === void 0 ? true : _h, getSubRows = props.getSubRows, _j = props.selectRowOnClick, selectRowOnClick = _j === void 0 ? true : _j, paginatorRenderer = props.paginatorRenderer, _k = props.pageSize, pageSize = _k === void 0 ? 25 : _k, _l = props.isResizable, isResizable = _l === void 0 ? false : _l, _m = props.styleType, styleType = _m === void 0 ? 'default' : _m, _o = props.enableVirtualization, enableVirtualization = _o === void 0 ? false : _o, _p = props.enableColumnReordering, enableColumnReordering = _p === void 0 ? false : _p, rest = __rest(props, ["data", "columns", "isLoading", "emptyTableContent", "className", "style", "id", "isSelectable", "onSelect", "onRowClick", "selectionMode", "isSortable", "onSort", "stateReducer", "onBottomReached", "onRowInViewport", "intersectionMargin", "subComponent", "onExpand", "onFilter", "emptyFilteredTableContent", "filterTypes", "expanderCell", "isRowDisabled", "rowProps", "density", "selectSubRows", "getSubRows", "selectRowOnClick", "paginatorRenderer", "pageSize", "isResizable", "styleType", "enableVirtualization", "enableColumnReordering"]);
98
107
  (0, utils_1.useTheme)();
99
- var _r = react_1.default.useState(), ownerDocument = _r[0], setOwnerDocument = _r[1];
108
+ var _q = react_1.default.useState(), ownerDocument = _q[0], setOwnerDocument = _q[1];
100
109
  var defaultColumn = react_1.default.useMemo(function () { return ({
101
110
  maxWidth: 0,
102
111
  minWidth: 0,
@@ -109,7 +118,10 @@ var Table = function (props) {
109
118
  onBottomReachedRef.current = onBottomReached;
110
119
  onRowInViewportRef.current = onRowInViewport;
111
120
  }, [onBottomReached, onRowInViewport]);
112
- var hasManualSelectionColumn = (_b = columns[0]) === null || _b === void 0 ? void 0 : _b.columns.some(function (column) { return column.id === columns_1.SELECTION_CELL_ID; });
121
+ var hasManualSelectionColumn = react_1.default.useMemo(function () {
122
+ var flatColumns = flattenColumns(columns);
123
+ return flatColumns.some(function (column) { return column.id === columns_1.SELECTION_CELL_ID; });
124
+ }, [columns]);
113
125
  var tableStateReducer = react_1.default.useCallback(function (newState, action, previousState, instance) {
114
126
  switch (action.type) {
115
127
  case react_table_1.actions.toggleSortBy:
@@ -174,7 +186,7 @@ var Table = function (props) {
174
186
  }
175
187
  return result;
176
188
  }, {});
177
- var areFiltersSet = allColumns.some(function (column) { return !!column.filterValue; });
189
+ var areFiltersSet = allColumns.some(function (column) { return column.filterValue != null && column.filterValue !== ''; });
178
190
  var onRowClickHandler = react_1.default.useCallback(function (event, row) {
179
191
  var isDisabled = isRowDisabled === null || isRowDisabled === void 0 ? void 0 : isRowDisabled(row.original);
180
192
  if (!isDisabled) {
@@ -290,7 +302,7 @@ var Table = function (props) {
290
302
  className: 'iui-row',
291
303
  });
292
304
  return (react_1.default.createElement("div", __assign({}, headerGroupProps, { key: headerGroupProps.key }), headerGroup.headers.map(function (column, index) {
293
- var columnProps = column.getHeaderProps(__assign(__assign({}, column.getSortByToggleProps()), { className: (0, classnames_1.default)('iui-cell', { 'iui-actionable': column.canSort }, { 'iui-sorted': column.isSorted }, column.columnClassName), style: __assign({}, (0, utils_2.getCellStyle)(column, !!state.isTableResizing)) }));
305
+ var columnProps = column.getHeaderProps(__assign(__assign({}, column.getSortByToggleProps()), { className: (0, classnames_1.default)('iui-cell', { 'iui-actionable': column.canSort }, { 'iui-sorted': column.isSorted }, column.columnClassName), style: __assign(__assign({}, (0, utils_2.getCellStyle)(column, !!state.isTableResizing)), { flexWrap: 'unset' }) }));
294
306
  return (react_1.default.createElement("div", __assign({}, columnProps, column.getDragAndDropProps(), { key: columnProps.key, title: undefined, ref: function (el) {
295
307
  if (el && isResizable) {
296
308
  columnRefs.current[column.id] = el;
@@ -299,7 +311,7 @@ var Table = function (props) {
299
311
  } }),
300
312
  column.render('Header'),
301
313
  (data.length !== 0 || areFiltersSet) && (react_1.default.createElement(filters_1.FilterToggle, { column: column, ownerDocument: ownerDocument })),
302
- data.length !== 0 && column.canSort && (react_1.default.createElement("div", { className: 'iui-cell-end-icon' }, column.isSorted && column.isSortedDesc ? (react_1.default.createElement(SortUp_1.default, { className: 'iui-icon iui-sort', "aria-hidden": true })) : (react_1.default.createElement(SortDown_1.default, { className: 'iui-icon iui-sort', "aria-hidden": true })))),
314
+ data.length !== 0 && column.canSort && (react_1.default.createElement("div", { className: 'iui-cell-end-icon' }, column.isSorted && column.isSortedDesc ? (react_1.default.createElement(SortDown_1.default, { className: 'iui-icon iui-sort', "aria-hidden": true })) : (react_1.default.createElement(SortUp_1.default, { className: 'iui-icon iui-sort', "aria-hidden": true })))),
303
315
  isResizable &&
304
316
  column.isResizerVisible &&
305
317
  index !== headerGroup.headers.length - 1 && (react_1.default.createElement("div", __assign({}, column.getResizerProps(), { className: 'iui-resizer' }),
@@ -42,7 +42,8 @@ var react_1 = __importDefault(require("react"));
42
42
  * }
43
43
  */
44
44
  var EditableCell = function (props) {
45
- var cellElementProps = props.cellElementProps, cellProps = props.cellProps, onCellEdit = props.onCellEdit, children = props.children, rest = __rest(props, ["cellElementProps", "cellProps", "onCellEdit", "children"]);
45
+ var cellElementProps = props.cellElementProps, cellProps = props.cellProps, onCellEdit = props.onCellEdit, children = props.children, isDisabled = props.isDisabled, rest = __rest(props, ["cellElementProps", "cellProps", "onCellEdit", "children", "isDisabled"]);
46
+ isDisabled; // To omit and prevent eslint error.
46
47
  var sanitizeString = function (text) {
47
48
  return text.replace(/(\r\n|\n|\r)+/gm, ' ');
48
49
  };
@@ -53,11 +53,12 @@ var FilterToggle = function (props) {
53
53
  column.setFilter(undefined);
54
54
  close();
55
55
  }, [close, column]);
56
+ var isColumnFiltered = column.filterValue != null && column.filterValue !== '';
56
57
  return (react_1.default.createElement(react_1.default.Fragment, null, column.canFilter && column.Filter && (react_1.default.createElement(utils_1.Popover, { content: column.render('Filter', { close: close, setFilter: setFilter, clearFilter: clearFilter }), placement: 'bottom-start', visible: isVisible, onClickOutside: close, appendTo: ownerDocument === null || ownerDocument === void 0 ? void 0 : ownerDocument.body },
57
- react_1.default.createElement(Buttons_1.IconButton, __assign({ styleType: 'borderless', isActive: isVisible || column.filterValue, className: (0, classnames_1.default)('iui-filter-button', className), onClick: function (e) {
58
+ react_1.default.createElement(Buttons_1.IconButton, __assign({ styleType: 'borderless', isActive: isVisible || isColumnFiltered, className: (0, classnames_1.default)('iui-filter-button', className), onClick: function (e) {
58
59
  setIsVisible(function (v) { return !v; });
59
60
  // Prevents from triggering sort
60
61
  e.stopPropagation();
61
- } }, rest), column.filterValue ? react_1.default.createElement(Filter_1.default, null) : react_1.default.createElement(FilterHollow_1.default, null))))));
62
+ } }, rest), isColumnFiltered ? react_1.default.createElement(Filter_1.default, null) : react_1.default.createElement(FilterHollow_1.default, null))))));
62
63
  };
63
64
  exports.FilterToggle = FilterToggle;
@@ -1,9 +1,11 @@
1
- /// <reference types="react" />
2
1
  import '@itwin/itwinui-css/css/toast-notification.css';
2
+ import React from 'react';
3
3
  import { ToastProps } from './Toast';
4
4
  import { ToasterSettings } from './Toaster';
5
- declare type ToastWrapperProps = {
6
- toasts: ToastProps[];
7
- } & Pick<ToasterSettings, 'placement'>;
8
- export declare const ToastWrapper: (props: ToastWrapperProps) => JSX.Element;
5
+ declare type ToastPlacement = NonNullable<ToasterSettings['placement']>;
6
+ export declare type ToastWrapperHandle = {
7
+ setToasts: (toasts: ToastProps[]) => void;
8
+ setPlacement: (placement: ToastPlacement) => void;
9
+ };
10
+ export declare const ToastWrapper: React.ForwardRefExoticComponent<React.RefAttributes<ToastWrapperHandle>>;
9
11
  export {};
@@ -23,11 +23,15 @@ require("@itwin/itwinui-css/css/toast-notification.css");
23
23
  var react_1 = __importDefault(require("react"));
24
24
  var classnames_1 = __importDefault(require("classnames"));
25
25
  var Toast_1 = __importDefault(require("./Toast"));
26
- var ToastWrapper = function (props) {
27
- var toasts = props.toasts, _a = props.placement, placement = _a === void 0 ? 'top' : _a;
26
+ exports.ToastWrapper = react_1.default.forwardRef(function (_, ref) {
27
+ var _a = react_1.default.useState([]), toasts = _a[0], setToasts = _a[1];
28
+ var _b = react_1.default.useState('top'), placement = _b[0], setPlacement = _b[1];
28
29
  var placementPosition = placement.startsWith('top') ? 'top' : 'bottom';
30
+ react_1.default.useImperativeHandle(ref, function () { return ({
31
+ setToasts: setToasts,
32
+ setPlacement: setPlacement,
33
+ }); }, []);
29
34
  return (react_1.default.createElement("span", { className: (0, classnames_1.default)("iui-toast-wrapper", "iui-placement-".concat(placement)) }, toasts.map(function (toastProps) {
30
35
  return (react_1.default.createElement(Toast_1.default, __assign({ key: toastProps.id, placementPosition: placementPosition }, toastProps)));
31
36
  })));
32
- };
33
- exports.ToastWrapper = ToastWrapper;
37
+ });
@@ -20,6 +20,8 @@ export default class Toaster {
20
20
  private toasts;
21
21
  private lastId;
22
22
  private settings;
23
+ private toastsRef;
24
+ private isInitialized;
23
25
  /**
24
26
  * Set global Toaster settings for toasts order and placement.
25
27
  * Settings will be applied to new toasts on the page.
@@ -39,6 +41,7 @@ export default class Toaster {
39
41
  };
40
42
  private createToast;
41
43
  private removeToast;
44
+ private createContainer;
42
45
  private updateView;
43
46
  private closeToast;
44
47
  closeAll(): void;
@@ -10,6 +10,42 @@ var __assign = (this && this.__assign) || function () {
10
10
  };
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
13
49
  var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
14
50
  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
15
51
  if (ar || !(i in from)) {
@@ -40,18 +76,21 @@ var Toaster = /** @class */ (function () {
40
76
  order: 'descending',
41
77
  placement: 'top',
42
78
  };
79
+ this.toastsRef = react_1.default.createRef();
80
+ this.isInitialized = false;
43
81
  }
44
82
  /**
45
83
  * Set global Toaster settings for toasts order and placement.
46
84
  * Settings will be applied to new toasts on the page.
47
85
  */
48
86
  Toaster.prototype.setSettings = function (newSettings) {
49
- var _a, _b, _c;
87
+ var _a, _b, _c, _d, _e;
50
88
  (_a = newSettings.placement) !== null && _a !== void 0 ? _a : (newSettings.placement = this.settings.placement);
51
89
  (_b = newSettings.order) !== null && _b !== void 0 ? _b : (newSettings.order = ((_c = newSettings.placement) === null || _c === void 0 ? void 0 : _c.startsWith('bottom'))
52
90
  ? 'ascending'
53
91
  : 'descending');
54
92
  this.settings = newSettings;
93
+ (_d = this.toastsRef.current) === null || _d === void 0 ? void 0 : _d.setPlacement((_e = this.settings.placement) !== null && _e !== void 0 ? _e : 'top');
55
94
  };
56
95
  Toaster.prototype.positive = function (content, options) {
57
96
  return this.createToast(content, 'positive', options);
@@ -83,12 +122,34 @@ var Toaster = /** @class */ (function () {
83
122
  this.toasts = this.toasts.filter(function (toast) { return toast.id !== id; });
84
123
  this.updateView();
85
124
  };
125
+ // Create container on demand.
126
+ // Cannot do it in constructor, because SSG/SSR apps would fail.
127
+ Toaster.prototype.createContainer = function () {
128
+ return __awaiter(this, void 0, void 0, function () {
129
+ var container;
130
+ return __generator(this, function (_a) {
131
+ container = (0, utils_1.getContainer)(TOASTS_CONTAINER_ID);
132
+ if (!container) {
133
+ return [2 /*return*/];
134
+ }
135
+ react_dom_1.default.render(react_1.default.createElement(ToastWrapper_1.ToastWrapper, { ref: this.toastsRef }), container);
136
+ return [2 /*return*/];
137
+ });
138
+ });
139
+ };
86
140
  Toaster.prototype.updateView = function () {
87
- var container = (0, utils_1.getContainer)(TOASTS_CONTAINER_ID);
88
- if (!container) {
89
- return;
141
+ var _this = this;
142
+ var _a;
143
+ if (!this.isInitialized) {
144
+ this.createContainer().then(function () {
145
+ var _a;
146
+ _this.isInitialized = true;
147
+ (_a = _this.toastsRef.current) === null || _a === void 0 ? void 0 : _a.setToasts(_this.toasts);
148
+ });
149
+ }
150
+ else {
151
+ (_a = this.toastsRef.current) === null || _a === void 0 ? void 0 : _a.setToasts(this.toasts);
90
152
  }
91
- react_dom_1.default.render(react_1.default.createElement(ToastWrapper_1.ToastWrapper, { toasts: this.toasts, placement: this.settings.placement }), container);
92
153
  };
93
154
  Toaster.prototype.closeToast = function (toastId) {
94
155
  this.toasts = this.toasts.map(function (toast) {
@@ -43,7 +43,7 @@ export declare const Popover: React.ForwardRefExoticComponent<Pick<{
43
43
  * @see [tippy.js placement prop](https://atomiks.github.io/tippyjs/v6/all-props/#placement).
44
44
  */
45
45
  placement?: import("@popperjs/core").Placement | undefined;
46
- } & Omit<TippyProps, "placement" | "trigger" | "visible">, "disabled" | "placement" | "trigger" | "visible" | "content" | "render" | "animateFill" | "appendTo" | "aria" | "delay" | "duration" | "followCursor" | "getReferenceClientRect" | "hideOnClick" | "ignoreAttributes" | "inlinePositioning" | "interactive" | "interactiveBorder" | "interactiveDebounce" | "moveTransition" | "offset" | "plugins" | "popperOptions" | "showOnCreate" | "sticky" | "touch" | "triggerTarget" | "onAfterUpdate" | "onBeforeUpdate" | "onCreate" | "onDestroy" | "onHidden" | "onHide" | "onMount" | "onShow" | "onShown" | "onTrigger" | "onUntrigger" | "onClickOutside" | "allowHTML" | "animation" | "arrow" | "inertia" | "maxWidth" | "role" | "theme" | "zIndex" | "children" | "className" | "singleton" | "reference"> & React.RefAttributes<unknown>>;
46
+ } & Omit<TippyProps, "placement" | "trigger" | "visible">, "disabled" | "children" | "placement" | "trigger" | "visible" | "content" | "render" | "animateFill" | "appendTo" | "aria" | "delay" | "duration" | "followCursor" | "getReferenceClientRect" | "hideOnClick" | "ignoreAttributes" | "inlinePositioning" | "interactive" | "interactiveBorder" | "interactiveDebounce" | "moveTransition" | "offset" | "plugins" | "popperOptions" | "showOnCreate" | "sticky" | "touch" | "triggerTarget" | "onAfterUpdate" | "onBeforeUpdate" | "onCreate" | "onDestroy" | "onHidden" | "onHide" | "onMount" | "onShow" | "onShown" | "onTrigger" | "onUntrigger" | "onClickOutside" | "allowHTML" | "animation" | "arrow" | "inertia" | "maxWidth" | "role" | "theme" | "zIndex" | "className" | "singleton" | "reference"> & React.RefAttributes<unknown>>;
47
47
  /**
48
48
  * Plugin to hide Popover when either Esc key is pressed,
49
49
  * or when the content inside is not tabbable and Tab key is pressed.
@@ -6,3 +6,4 @@ export * from './useContainerWidth';
6
6
  export * from './useTheme';
7
7
  export * from './useIntersection';
8
8
  export * from './useMediaQuery';
9
+ export * from './useSafeContext';
@@ -26,3 +26,4 @@ __exportStar(require("./useContainerWidth"), exports);
26
26
  __exportStar(require("./useTheme"), exports);
27
27
  __exportStar(require("./useIntersection"), exports);
28
28
  __exportStar(require("./useMediaQuery"), exports);
29
+ __exportStar(require("./useSafeContext"), exports);
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ /**
3
+ * Wrapper hook around `useContext` that throws an error if the context is not provided.
4
+ * @param context Context to use. Must have a `displayName` for useful errors.
5
+ */
6
+ export declare const useSafeContext: <T>(context: React.Context<T>) => NonNullable<T>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useSafeContext = void 0;
7
+ /*---------------------------------------------------------------------------------------------
8
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
9
+ * See LICENSE.md in the project root for license terms and full copyright notice.
10
+ *--------------------------------------------------------------------------------------------*/
11
+ var react_1 = __importDefault(require("react"));
12
+ /**
13
+ * Wrapper hook around `useContext` that throws an error if the context is not provided.
14
+ * @param context Context to use. Must have a `displayName` for useful errors.
15
+ */
16
+ var useSafeContext = function (context) {
17
+ var value = react_1.default.useContext(context);
18
+ if (!value) {
19
+ throw new Error("".concat(context.displayName, " is undefined"));
20
+ }
21
+ return value; // eslint-disable-line @typescript-eslint/no-non-null-assertion -- we already checked for undefined
22
+ };
23
+ exports.useSafeContext = useSafeContext;
@@ -61,9 +61,7 @@ export var Breadcrumbs = React.forwardRef(function (props, ref) {
61
61
  var _b;
62
62
  var index = _a.index;
63
63
  var item = items[index];
64
- return (React.createElement("li", { className: cx('iui-breadcrumbs-item', {
65
- 'iui-current': currentIndex === index,
66
- }) }, React.isValidElement(item)
64
+ return (React.createElement("li", { className: 'iui-breadcrumbs-item iui-breadcrumbs-item-overrides' }, React.isValidElement(item)
67
65
  ? React.cloneElement(item, {
68
66
  'aria-current': ((_b = item.props['aria-current']) !== null && _b !== void 0 ? _b : currentIndex === index)
69
67
  ? 'location'
@@ -77,8 +75,8 @@ export var Breadcrumbs = React.forwardRef(function (props, ref) {
77
75
  React.createElement(ListItem, { index: 0 }),
78
76
  React.createElement(Separator, null))),
79
77
  items.length - visibleCount > 0 && (React.createElement(React.Fragment, null,
80
- React.createElement("li", { className: 'iui-breadcrumbs-item' },
81
- React.createElement("span", null, "\u2026")),
78
+ React.createElement("li", { className: 'iui-breadcrumbs-item iui-breadcrumbs-item-overrides' },
79
+ React.createElement("span", { className: 'iui-breadcrumbs-text' }, "\u2026")),
82
80
  React.createElement(Separator, null))),
83
81
  items
84
82
  .slice(visibleCount > 1
@@ -17,5 +17,5 @@ export declare type ColorSwatchProps = {
17
17
  * <ColorSwatch color='#23450b' onClick={onClick}/>
18
18
  * <ColorSwatch color={{ r: 255, g: 255, b: 0 }} onClick={onClick}/>
19
19
  */
20
- export declare const ColorSwatch: React.ForwardRefExoticComponent<Pick<ColorSwatchProps, "dir" | "slot" | "style" | "title" | "id" | "aria-disabled" | "role" | "children" | "className" | "onClick" | "accessKey" | "draggable" | "hidden" | "lang" | "translate" | "prefix" | "contentEditable" | "inputMode" | "tabIndex" | "onFocus" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "color" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "key" | "contextMenu" | "placeholder" | "spellCheck" | "radioGroup" | "about" | "datatype" | "inlist" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "is" | "isActive"> & React.RefAttributes<HTMLDivElement>>;
20
+ export declare const ColorSwatch: React.ForwardRefExoticComponent<Pick<ColorSwatchProps, "dir" | "slot" | "style" | "title" | "id" | "aria-disabled" | "children" | "role" | "className" | "onClick" | "accessKey" | "draggable" | "hidden" | "lang" | "translate" | "prefix" | "contentEditable" | "inputMode" | "tabIndex" | "onFocus" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "color" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "key" | "contextMenu" | "placeholder" | "spellCheck" | "radioGroup" | "about" | "datatype" | "inlist" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "is" | "isActive"> & React.RefAttributes<HTMLDivElement>>;
21
21
  export default ColorSwatch;
@@ -40,8 +40,10 @@ export declare type ComboBoxProps<T> = {
40
40
  emptyStateMessage?: string;
41
41
  /**
42
42
  * A custom item renderer can be specified to control the rendering.
43
- * This function should ideally return a customized version of `MenuItem`,
44
- * otherwise you will need to make sure to provide styling for the `isFocused` state.
43
+ *
44
+ * For keyboard navigation to work, the returned element should use the `id` provided by this function.
45
+ * The `isFocused` state is calculated using this `id` and can be used for specifying the focus styling.
46
+ * If a `MenuItem` is returned, then focus styling is automatically handled.
45
47
  */
46
48
  itemRenderer?: (option: SelectOption<T>, states: {
47
49
  isSelected: boolean;