@itwin/itwinui-react 1.39.0 → 1.40.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 (56) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/cjs/core/ComboBox/ComboBox.d.ts +10 -1
  3. package/cjs/core/ComboBox/ComboBox.js +31 -14
  4. package/cjs/core/ComboBox/ComboBoxInput.js +1 -0
  5. package/cjs/core/ComboBox/helpers.js +1 -1
  6. package/cjs/core/Menu/MenuItemSkeleton.d.ts +32 -0
  7. package/cjs/core/Menu/MenuItemSkeleton.js +53 -0
  8. package/cjs/core/Menu/index.d.ts +2 -0
  9. package/cjs/core/Menu/index.js +3 -1
  10. package/cjs/core/Table/Table.js +39 -6
  11. package/cjs/core/Table/TableCell.js +10 -3
  12. package/cjs/core/Table/TableRowMemoized.js +5 -1
  13. package/cjs/core/Table/actionHandlers/resizeHandler.d.ts +8 -0
  14. package/cjs/core/Table/actionHandlers/selectHandler.d.ts +4 -0
  15. package/cjs/core/Table/columns/selectionColumn.js +4 -2
  16. package/cjs/core/Table/hooks/index.d.ts +1 -0
  17. package/cjs/core/Table/hooks/index.js +3 -1
  18. package/cjs/core/Table/hooks/useStickyColumns.d.ts +2 -0
  19. package/cjs/core/Table/hooks/useStickyColumns.js +84 -0
  20. package/cjs/core/Table/utils.d.ts +1 -0
  21. package/cjs/core/Table/utils.js +36 -1
  22. package/cjs/core/index.d.ts +2 -2
  23. package/cjs/core/index.js +4 -3
  24. package/cjs/core/utils/components/VisuallyHidden.d.ts +9 -0
  25. package/cjs/core/utils/components/VisuallyHidden.js +44 -0
  26. package/cjs/core/utils/components/index.d.ts +1 -0
  27. package/cjs/core/utils/components/index.js +1 -0
  28. package/cjs/types/react-table-config.d.ts +9 -0
  29. package/esm/core/ComboBox/ComboBox.d.ts +10 -1
  30. package/esm/core/ComboBox/ComboBox.js +31 -14
  31. package/esm/core/ComboBox/ComboBoxInput.js +1 -0
  32. package/esm/core/ComboBox/helpers.js +1 -1
  33. package/esm/core/Menu/MenuItemSkeleton.d.ts +32 -0
  34. package/esm/core/Menu/MenuItemSkeleton.js +46 -0
  35. package/esm/core/Menu/index.d.ts +2 -0
  36. package/esm/core/Menu/index.js +1 -0
  37. package/esm/core/Table/Table.js +41 -8
  38. package/esm/core/Table/TableCell.js +11 -4
  39. package/esm/core/Table/TableRowMemoized.js +5 -1
  40. package/esm/core/Table/actionHandlers/resizeHandler.d.ts +8 -0
  41. package/esm/core/Table/actionHandlers/selectHandler.d.ts +4 -0
  42. package/esm/core/Table/columns/selectionColumn.js +4 -2
  43. package/esm/core/Table/hooks/index.d.ts +1 -0
  44. package/esm/core/Table/hooks/index.js +1 -0
  45. package/esm/core/Table/hooks/useStickyColumns.d.ts +2 -0
  46. package/esm/core/Table/hooks/useStickyColumns.js +80 -0
  47. package/esm/core/Table/utils.d.ts +1 -0
  48. package/esm/core/Table/utils.js +34 -0
  49. package/esm/core/index.d.ts +2 -2
  50. package/esm/core/index.js +1 -1
  51. package/esm/core/utils/components/VisuallyHidden.d.ts +9 -0
  52. package/esm/core/utils/components/VisuallyHidden.js +38 -0
  53. package/esm/core/utils/components/index.d.ts +1 -0
  54. package/esm/core/utils/components/index.js +1 -0
  55. package/esm/types/react-table-config.d.ts +9 -0
  56. package/package.json +2 -2
@@ -48,8 +48,8 @@ export { LabeledSelect } from './LabeledSelect';
48
48
  export type { LabeledSelectProps } from './LabeledSelect';
49
49
  export { LabeledTextarea } from './LabeledTextarea';
50
50
  export type { LabeledTextareaProps } from './LabeledTextarea';
51
- export { Menu, MenuItem, MenuDivider, MenuExtraContent } from './Menu';
52
- export type { MenuProps, MenuItemProps, MenuDividerProps, MenuExtraContentProps, } from './Menu';
51
+ export { Menu, MenuItem, MenuDivider, MenuExtraContent, MenuItemSkeleton, } from './Menu';
52
+ export type { MenuProps, MenuItemProps, MenuDividerProps, MenuExtraContentProps, MenuItemSkeletonProps, } from './Menu';
53
53
  export { Modal, ModalButtonBar, ModalContent } from './Modal';
54
54
  export type { ModalProps, ModalButtonBarProps, ModalContentProps, } from './Modal';
55
55
  export { ProgressLinear, ProgressRadial } from './ProgressIndicators';
package/cjs/core/index.js CHANGED
@@ -3,9 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.Modal = exports.MenuExtraContent = exports.MenuDivider = exports.MenuItem = exports.Menu = exports.LabeledTextarea = exports.LabeledSelect = exports.InputGroup = exports.LabeledInput = exports.Label = exports.Input = exports.InformationPanelContent = exports.InformationPanelBody = exports.InformationPanelHeader = exports.InformationPanelWrapper = exports.InformationPanel = exports.HorizontalTab = exports.HorizontalTabs = exports.Tab = exports.VerticalTabs = exports.HeaderLogo = exports.HeaderButton = exports.HeaderBreadcrumbs = exports.Header = exports.Footer = exports.FileUploadTemplate = exports.FileUpload = exports.Fieldset = exports.ExpandableBlock = exports.ErrorPage = exports.DropdownMenu = exports.generateLocalizedStrings = exports.DatePicker = exports.ComboBox = exports.ColorPalette = exports.ColorInputPanel = exports.ColorBuilder = exports.ColorSwatch = exports.ColorPicker = exports.Checkbox = exports.Carousel = exports.ButtonGroup = exports.SplitButton = exports.IdeasButton = exports.IconButton = exports.DropdownButton = exports.Button = exports.Breadcrumbs = exports.Badge = exports.Alert = void 0;
7
- exports.UserIcon = exports.Text = exports.KbdKeys = exports.Kbd = exports.Code = exports.Blockquote = exports.Title = exports.Subheading = exports.Small = exports.Leading = exports.Headline = exports.Body = exports.Anchor = exports.TreeNodeExpander = exports.TreeNode = exports.Tree = exports.Tooltip = exports.ToggleSwitch = exports.ThemeProvider = exports.toaster = exports.TimePicker = exports.Tile = exports.Textarea = exports.TagContainer = exports.Tag = exports.SelectionColumn = exports.ExpanderColumn = exports.ActionColumn = exports.TablePaginator = exports.EditableCell = exports.DefaultCell = exports.FilterButtonBar = exports.tableFilters = exports.Table = exports.Surface = exports.StatusMessage = exports.Slider = exports.SkipToContentLink = exports.SidenavSubmenuHeader = exports.SidenavSubmenu = exports.SidenavButton = exports.SideNavigation = exports.Select = exports.RadioTileGroup = exports.RadioTile = exports.Radio = exports.ProgressRadial = exports.ProgressLinear = exports.ModalContent = exports.ModalButtonBar = void 0;
8
- exports.MiddleTextTruncation = exports.ColorValue = exports.useTheme = exports.getUserColor = exports.Wizard = exports.UserIconGroup = void 0;
6
+ exports.MenuItemSkeleton = exports.MenuExtraContent = exports.MenuDivider = exports.MenuItem = exports.Menu = exports.LabeledTextarea = exports.LabeledSelect = exports.InputGroup = exports.LabeledInput = exports.Label = exports.Input = exports.InformationPanelContent = exports.InformationPanelBody = exports.InformationPanelHeader = exports.InformationPanelWrapper = exports.InformationPanel = exports.HorizontalTab = exports.HorizontalTabs = exports.Tab = exports.VerticalTabs = exports.HeaderLogo = exports.HeaderButton = exports.HeaderBreadcrumbs = exports.Header = exports.Footer = exports.FileUploadTemplate = exports.FileUpload = exports.Fieldset = exports.ExpandableBlock = exports.ErrorPage = exports.DropdownMenu = exports.generateLocalizedStrings = exports.DatePicker = exports.ComboBox = exports.ColorPalette = exports.ColorInputPanel = exports.ColorBuilder = exports.ColorSwatch = exports.ColorPicker = exports.Checkbox = exports.Carousel = exports.ButtonGroup = exports.SplitButton = exports.IdeasButton = exports.IconButton = exports.DropdownButton = exports.Button = exports.Breadcrumbs = exports.Badge = exports.Alert = void 0;
7
+ exports.Text = exports.KbdKeys = exports.Kbd = exports.Code = exports.Blockquote = exports.Title = exports.Subheading = exports.Small = exports.Leading = exports.Headline = exports.Body = exports.Anchor = exports.TreeNodeExpander = exports.TreeNode = exports.Tree = exports.Tooltip = exports.ToggleSwitch = exports.ThemeProvider = exports.toaster = exports.TimePicker = exports.Tile = exports.Textarea = exports.TagContainer = exports.Tag = exports.SelectionColumn = exports.ExpanderColumn = exports.ActionColumn = exports.TablePaginator = exports.EditableCell = exports.DefaultCell = exports.FilterButtonBar = exports.tableFilters = exports.Table = exports.Surface = exports.StatusMessage = exports.Slider = exports.SkipToContentLink = exports.SidenavSubmenuHeader = exports.SidenavSubmenu = exports.SidenavButton = exports.SideNavigation = exports.Select = exports.RadioTileGroup = exports.RadioTile = exports.Radio = exports.ProgressRadial = exports.ProgressLinear = exports.ModalContent = exports.ModalButtonBar = exports.Modal = void 0;
8
+ exports.MiddleTextTruncation = exports.ColorValue = exports.useTheme = exports.getUserColor = exports.Wizard = exports.UserIconGroup = exports.UserIcon = void 0;
9
9
  /*---------------------------------------------------------------------------------------------
10
10
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
11
11
  * See LICENSE.md in the project root for license terms and full copyright notice.
@@ -85,6 +85,7 @@ Object.defineProperty(exports, "Menu", { enumerable: true, get: function () { re
85
85
  Object.defineProperty(exports, "MenuItem", { enumerable: true, get: function () { return Menu_1.MenuItem; } });
86
86
  Object.defineProperty(exports, "MenuDivider", { enumerable: true, get: function () { return Menu_1.MenuDivider; } });
87
87
  Object.defineProperty(exports, "MenuExtraContent", { enumerable: true, get: function () { return Menu_1.MenuExtraContent; } });
88
+ Object.defineProperty(exports, "MenuItemSkeleton", { enumerable: true, get: function () { return Menu_1.MenuItemSkeleton; } });
88
89
  var Modal_1 = require("./Modal");
89
90
  Object.defineProperty(exports, "Modal", { enumerable: true, get: function () { return Modal_1.Modal; } });
90
91
  Object.defineProperty(exports, "ModalButtonBar", { enumerable: true, get: function () { return Modal_1.ModalButtonBar; } });
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export declare type VisuallyHiddenProps = React.ComponentPropsWithRef<'div'>;
3
+ /**
4
+ * Hides content visually but is still accessible to screen readers.
5
+ */
6
+ export declare const VisuallyHidden: React.ForwardRefExoticComponent<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
7
+ ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject<HTMLDivElement> | null | undefined;
8
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & React.RefAttributes<HTMLDivElement>>;
9
+ export default VisuallyHidden;
@@ -0,0 +1,44 @@
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.VisuallyHidden = 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 hooks_1 = require("../hooks");
36
+ /**
37
+ * Hides content visually but is still accessible to screen readers.
38
+ */
39
+ exports.VisuallyHidden = react_1.default.forwardRef(function (props, ref) {
40
+ var className = props.className, rest = __rest(props, ["className"]);
41
+ (0, hooks_1.useTheme)();
42
+ return (react_1.default.createElement("div", __assign({ className: (0, classnames_1.default)('iui-visually-hidden', className), ref: ref }, rest)));
43
+ });
44
+ exports.default = exports.VisuallyHidden;
@@ -5,3 +5,4 @@ export * from './icons';
5
5
  export * from './WithCSSTransition';
6
6
  export * from './MiddleTextTruncation';
7
7
  export * from './VirtualScroll';
8
+ export * from './VisuallyHidden';
@@ -25,3 +25,4 @@ __exportStar(require("./icons"), exports);
25
25
  __exportStar(require("./WithCSSTransition"), exports);
26
26
  __exportStar(require("./MiddleTextTruncation"), exports);
27
27
  __exportStar(require("./VirtualScroll"), exports);
28
+ __exportStar(require("./VisuallyHidden"), exports);
@@ -46,6 +46,10 @@ declare module 'react-table' {
46
46
  };
47
47
  isTableResizing?: boolean;
48
48
  columnReorderStartIndex: number;
49
+ sticky: {
50
+ isScrolledToRight?: boolean;
51
+ isScrolledToLeft?: boolean;
52
+ };
49
53
  }
50
54
  interface ColumnInterface<D extends object = {}> extends UseSortByColumnOptions<D>, UseFiltersColumnOptions<D>, UseResizeColumnsColumnOptions<D> {
51
55
  /**
@@ -91,12 +95,17 @@ declare module 'react-table' {
91
95
  * @default false
92
96
  */
93
97
  disableToggleVisibility?: boolean;
98
+ /**
99
+ * Side on which column should be sticked to.
100
+ */
101
+ sticky?: 'left' | 'right';
94
102
  }
95
103
  interface ColumnInstance<D extends object = {}> extends UseFiltersColumnProps<D>, UseGroupByColumnProps<D>, UseResizeColumnsColumnProps<D>, UseSortByColumnProps<D> {
96
104
  originalWidth: number;
97
105
  resizeWidth?: number;
98
106
  isResizerVisible?: boolean;
99
107
  getDragAndDropProps: () => TableKeyedProps;
108
+ originalSticky?: 'left' | 'right' | 'none';
100
109
  }
101
110
  interface Cell<D extends object = {}> extends UseGroupByCellProps<D>, UseRowStateCellProps<D> {
102
111
  }
@@ -35,9 +35,10 @@ export declare type ComboBoxProps<T> = {
35
35
  dropdownMenuProps?: PopoverProps;
36
36
  /**
37
37
  * Message shown when no options are available.
38
+ * If `JSX.Element` is provided, it will be rendered as is and won't be wrapped with `MenuExtraContent`.
38
39
  * @default 'No options found'
39
40
  */
40
- emptyStateMessage?: string;
41
+ emptyStateMessage?: React.ReactNode;
41
42
  /**
42
43
  * A custom item renderer can be specified to control the rendering.
43
44
  *
@@ -58,6 +59,14 @@ export declare type ComboBoxProps<T> = {
58
59
  * @beta
59
60
  */
60
61
  enableVirtualization?: boolean;
62
+ /**
63
+ * Callback fired when dropdown menu is opened.
64
+ */
65
+ onShow?: () => void;
66
+ /**
67
+ * Callback fired when dropdown menu is closed.
68
+ */
69
+ onHide?: () => void;
61
70
  } & Pick<InputContainerProps, 'status'> & Omit<CommonProps, 'title'>;
62
71
  /**
63
72
  * ComboBox component that allows typing a value to filter the options in dropdown list.
@@ -56,8 +56,8 @@ var getOptionId = function (option, idPrefix) {
56
56
  * />
57
57
  */
58
58
  export var ComboBox = function (props) {
59
- var _a;
60
- var options = props.options, valueProp = props.value, onChange = props.onChange, filterFunction = props.filterFunction, inputProps = props.inputProps, dropdownMenuProps = props.dropdownMenuProps, _b = props.emptyStateMessage, emptyStateMessage = _b === void 0 ? 'No options found' : _b, itemRenderer = props.itemRenderer, _c = props.enableVirtualization, enableVirtualization = _c === void 0 ? false : _c, rest = __rest(props, ["options", "value", "onChange", "filterFunction", "inputProps", "dropdownMenuProps", "emptyStateMessage", "itemRenderer", "enableVirtualization"]);
59
+ var _a, _b;
60
+ var options = props.options, valueProp = props.value, onChange = props.onChange, filterFunction = props.filterFunction, inputProps = props.inputProps, dropdownMenuProps = props.dropdownMenuProps, _c = props.emptyStateMessage, emptyStateMessage = _c === void 0 ? 'No options found' : _c, itemRenderer = props.itemRenderer, _d = props.enableVirtualization, enableVirtualization = _d === void 0 ? false : _d, onShow = props.onShow, onHide = props.onHide, rest = __rest(props, ["options", "value", "onChange", "filterFunction", "inputProps", "dropdownMenuProps", "emptyStateMessage", "itemRenderer", "enableVirtualization", "onShow", "onHide"]);
61
61
  // Generate a stateful random id if not specified
62
62
  var id = React.useState(function () {
63
63
  var _a, _b;
@@ -89,12 +89,12 @@ export var ComboBox = function (props) {
89
89
  });
90
90
  }
91
91
  // Reducer where all the component-wide state is stored
92
- var _d = React.useReducer(comboBoxReducer, {
92
+ var _e = React.useReducer(comboBoxReducer, {
93
93
  isOpen: false,
94
94
  selectedIndex: -1,
95
95
  focusedIndex: -1,
96
- }), _e = _d[0], isOpen = _e.isOpen, selectedIndex = _e.selectedIndex, focusedIndex = _e.focusedIndex, dispatch = _d[1];
97
- React.useEffect(function () {
96
+ }), _f = _e[0], isOpen = _f.isOpen, selectedIndex = _f.selectedIndex, focusedIndex = _f.focusedIndex, dispatch = _e[1];
97
+ React.useLayoutEffect(function () {
98
98
  var _a, _b;
99
99
  // When the dropdown opens
100
100
  if (isOpen) {
@@ -113,20 +113,30 @@ export var ComboBox = function (props) {
113
113
  }
114
114
  }, [isOpen, options, selectedIndex]);
115
115
  // Set min-width of menu to be same as input
116
- var _f = React.useState(0), minWidth = _f[0], setMinWidth = _f[1];
116
+ var _g = React.useState(0), minWidth = _g[0], setMinWidth = _g[1];
117
117
  React.useEffect(function () {
118
118
  if (inputRef.current) {
119
119
  setMinWidth(inputRef.current.offsetWidth);
120
120
  }
121
121
  }, [isOpen]);
122
- // Initialize filtered options to the latest value options
123
- var _g = React.useState(options), filteredOptions = _g[0], setFilteredOptions = _g[1];
122
+ // Update filtered options to the latest value options according to input value
123
+ var _h = React.useState(options), filteredOptions = _h[0], setFilteredOptions = _h[1];
124
124
  React.useEffect(function () {
125
- setFilteredOptions(options);
125
+ var _a;
126
+ if (inputValue) {
127
+ setFilteredOptions((_a = filterFunction === null || filterFunction === void 0 ? void 0 : filterFunction(options, inputValue)) !== null && _a !== void 0 ? _a : options.filter(function (option) {
128
+ return option.label.toLowerCase().includes(inputValue.toLowerCase());
129
+ }));
130
+ }
131
+ else {
132
+ setFilteredOptions(options);
133
+ }
126
134
  dispatch(['focus']);
135
+ // Only need to call on options update
136
+ // eslint-disable-next-line react-hooks/exhaustive-deps
127
137
  }, [options]);
128
138
  // Filter options based on input value
129
- var _h = React.useState((_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.value) !== null && _a !== void 0 ? _a : ''), inputValue = _h[0], setInputValue = _h[1];
139
+ var _j = React.useState((_b = (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.value) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : ''), inputValue = _j[0], setInputValue = _j[1];
130
140
  var handleOnInput = React.useCallback(function (event) {
131
141
  var _a, _b;
132
142
  var value = event.currentTarget.value;
@@ -173,6 +183,7 @@ export var ComboBox = function (props) {
173
183
  onClick: function (e) {
174
184
  var _a, _b;
175
185
  dispatch(['select', __originalIndex]);
186
+ dispatch(['close']);
176
187
  (_b = (_a = customItem.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a, e);
177
188
  },
178
189
  // ComboBox.MenuItem handles scrollIntoView, data-iui-index and iui-focused through context
@@ -187,8 +198,13 @@ export var ComboBox = function (props) {
187
198
  el === null || el === void 0 ? void 0 : el.scrollIntoView({ block: 'nearest' });
188
199
  }
189
200
  }),
190
- })) : (React.createElement(ComboBoxMenuItem, __assign({ key: optionId, id: optionId }, option, { isSelected: selectedIndex === __originalIndex, onClick: function () { return dispatch(['select', __originalIndex]); }, index: __originalIndex, "data-iui-filtered-index": filteredIndex }), option.label));
201
+ })) : (React.createElement(ComboBoxMenuItem, __assign({ key: optionId, id: optionId }, option, { isSelected: selectedIndex === __originalIndex, onClick: function () {
202
+ dispatch(['select', __originalIndex]);
203
+ dispatch(['close']);
204
+ }, index: __originalIndex, "data-iui-filtered-index": filteredIndex }), option.label));
191
205
  }, [enableVirtualization, focusedIndex, id, itemRenderer, selectedIndex]);
206
+ var emptyContent = React.useMemo(function () { return (React.createElement(React.Fragment, null, React.isValidElement(emptyStateMessage) ? (emptyStateMessage) : (React.createElement(MenuExtraContent, null,
207
+ React.createElement(Text, { isMuted: true }, emptyStateMessage))))); }, [emptyStateMessage]);
192
208
  return (React.createElement(ComboBoxRefsContext.Provider, { value: { inputRef: inputRef, menuRef: menuRef, toggleButtonRef: toggleButtonRef, optionsExtraInfoRef: optionsExtraInfoRef } },
193
209
  React.createElement(ComboBoxActionContext.Provider, { value: dispatch },
194
210
  React.createElement(ComboBoxStateContext.Provider, { value: {
@@ -203,8 +219,9 @@ export var ComboBox = function (props) {
203
219
  React.createElement(ComboBoxInputContainer, __assign({ disabled: inputProps === null || inputProps === void 0 ? void 0 : inputProps.disabled }, rest),
204
220
  React.createElement(ComboBoxInput, __assign({ value: inputValue }, inputProps, { onChange: handleOnInput })),
205
221
  React.createElement(ComboBoxEndIcon, { disabled: inputProps === null || inputProps === void 0 ? void 0 : inputProps.disabled, isOpen: isOpen })),
206
- React.createElement(ComboBoxDropdown, __assign({}, dropdownMenuProps),
207
- React.createElement(ComboBoxMenu, null, filteredOptions.length > 0 && !enableVirtualization ? (filteredOptions.map(getMenuItem)) : (React.createElement(MenuExtraContent, null,
208
- React.createElement(Text, { isMuted: true }, emptyStateMessage)))))))));
222
+ React.createElement(ComboBoxDropdown, __assign({}, dropdownMenuProps, { onShow: onShow, onHide: onHide }),
223
+ React.createElement(ComboBoxMenu, null, filteredOptions.length > 0 && !enableVirtualization
224
+ ? filteredOptions.map(getMenuItem)
225
+ : emptyContent))))));
209
226
  };
210
227
  export default ComboBox;
@@ -112,6 +112,7 @@ export var ComboBoxInput = React.forwardRef(function (props, forwardedRef) {
112
112
  event.preventDefault();
113
113
  if (isOpen) {
114
114
  dispatch(['select', focusedIndexRef.current]);
115
+ dispatch(['close']);
115
116
  }
116
117
  else {
117
118
  dispatch(['open']);
@@ -25,7 +25,7 @@ export var comboBoxReducer = function (state, _a) {
25
25
  return __assign(__assign({}, state), { isOpen: false });
26
26
  }
27
27
  case 'select': {
28
- return __assign(__assign({}, state), { isOpen: false, selectedIndex: value !== null && value !== void 0 ? value : state.selectedIndex, focusedIndex: value !== null && value !== void 0 ? value : state.focusedIndex });
28
+ return __assign(__assign({}, state), { selectedIndex: value !== null && value !== void 0 ? value : state.selectedIndex, focusedIndex: value !== null && value !== void 0 ? value : state.focusedIndex });
29
29
  }
30
30
  case 'focus': {
31
31
  return __assign(__assign({}, state), { focusedIndex: (_b = value !== null && value !== void 0 ? value : state.selectedIndex) !== null && _b !== void 0 ? _b : -1 });
@@ -0,0 +1,32 @@
1
+ /// <reference types="react" />
2
+ import { CommonProps } from '../utils';
3
+ import '@itwin/itwinui-css/css/menu.css';
4
+ export declare type MenuItemSkeletonProps = {
5
+ /**
6
+ * Flag whether to show skeleton for sub-label.
7
+ */
8
+ hasSublabel?: boolean;
9
+ /**
10
+ * Flag whether to show skeleton for icon.
11
+ */
12
+ hasIcon?: boolean;
13
+ /**
14
+ * Skeleton content width.
15
+ */
16
+ contentWidth?: string;
17
+ /**
18
+ * Translated strings used for accessibility.
19
+ */
20
+ translatedStrings?: {
21
+ /**
22
+ * Label for loading state. Defaults to "Loading…".
23
+ * It is only visible for the screen readers.
24
+ */
25
+ loading: string;
26
+ };
27
+ } & CommonProps;
28
+ /**
29
+ * Menu item that uses skeletons to indicate loading state.
30
+ */
31
+ export declare const MenuItemSkeleton: (props: MenuItemSkeletonProps) => JSX.Element;
32
+ export default MenuItemSkeleton;
@@ -0,0 +1,46 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ /*---------------------------------------------------------------------------------------------
24
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
25
+ * See LICENSE.md in the project root for license terms and full copyright notice.
26
+ *--------------------------------------------------------------------------------------------*/
27
+ import React from 'react';
28
+ import cx from 'classnames';
29
+ import { useTheme, VisuallyHidden } from '../utils';
30
+ import '@itwin/itwinui-css/css/menu.css';
31
+ /**
32
+ * Menu item that uses skeletons to indicate loading state.
33
+ */
34
+ export var MenuItemSkeleton = function (props) {
35
+ var hasSublabel = props.hasSublabel, hasIcon = props.hasIcon, contentWidth = props.contentWidth, _a = props.translatedStrings, translatedStrings = _a === void 0 ? { loading: 'Loading…' } : _a, className = props.className, style = props.style, rest = __rest(props, ["hasSublabel", "hasIcon", "contentWidth", "translatedStrings", "className", "style"]);
36
+ useTheme();
37
+ return (React.createElement("li", __assign({ className: cx('iui-menu-item', 'iui-menu-item-skeleton', { 'iui-large': hasSublabel }, className), style: __assign({
38
+ '--iui-menu-item-content-skeleton-max-width': contentWidth,
39
+ }, style) }, rest),
40
+ hasIcon && React.createElement("div", { className: 'iui-icon iui-skeleton', "aria-hidden": true }),
41
+ React.createElement("span", { className: 'iui-content' },
42
+ React.createElement("div", { className: 'iui-menu-label iui-skeleton', "aria-hidden": true }),
43
+ hasSublabel && (React.createElement("div", { className: 'iui-menu-description iui-skeleton', "aria-hidden": true })),
44
+ React.createElement(VisuallyHidden, null, translatedStrings.loading))));
45
+ };
46
+ export default MenuItemSkeleton;
@@ -6,3 +6,5 @@ export { MenuDivider } from './MenuDivider';
6
6
  export type { MenuDividerProps } from './MenuDivider';
7
7
  export { MenuExtraContent } from './MenuExtraContent';
8
8
  export type { MenuExtraContentProps } from './MenuExtraContent';
9
+ export { MenuItemSkeleton } from './MenuItemSkeleton';
10
+ export type { MenuItemSkeletonProps } from './MenuItemSkeleton';
@@ -6,3 +6,4 @@ export { Menu } from './Menu';
6
6
  export { MenuItem } from './MenuItem';
7
7
  export { MenuDivider } from './MenuDivider';
8
8
  export { MenuExtraContent } from './MenuExtraContent';
9
+ export { MenuItemSkeleton } from './MenuItemSkeleton';
@@ -32,11 +32,11 @@ import { useTheme, useResizeObserver } from '../utils';
32
32
  import '@itwin/itwinui-css/css/table.css';
33
33
  import SvgSortDown from '@itwin/itwinui-icons-react/cjs/icons/SortDown';
34
34
  import SvgSortUp from '@itwin/itwinui-icons-react/cjs/icons/SortUp';
35
- import { getCellStyle } from './utils';
35
+ import { getCellStyle, getStickyStyle } from './utils';
36
36
  import { TableRowMemoized } from './TableRowMemoized';
37
37
  import { FilterToggle } from './filters';
38
38
  import { customFilterFunctions } from './filters/customFilterFunctions';
39
- import { useExpanderCell, useSelectionCell, useSubRowFiltering, useSubRowSelection, useResizeColumns, useColumnDragAndDrop, } from './hooks';
39
+ import { useExpanderCell, useSelectionCell, useSubRowFiltering, useSubRowSelection, useResizeColumns, useColumnDragAndDrop, useStickyColumns, } from './hooks';
40
40
  import { onExpandHandler, onFilterHandler, onSelectHandler, onSingleSelectHandler, onTableResizeEnd, onTableResizeStart, } from './actionHandlers';
41
41
  import VirtualScroll from '../utils/components/VirtualScroll';
42
42
  import { SELECTION_CELL_ID } from './columns';
@@ -171,8 +171,8 @@ export var Table = function (props) {
171
171
  return getSubRows ? getSubRows(item, index) : item.subRows;
172
172
  });
173
173
  }, [data, getSubRows]);
174
- var instance = useTable(__assign(__assign({ manualPagination: !paginatorRenderer, paginateExpandedRows: false }, props), { columns: columns, defaultColumn: defaultColumn, disableSortBy: !isSortable, stateReducer: tableStateReducer, filterTypes: filterTypes, selectSubRows: selectSubRows, data: data, getSubRows: getSubRows, initialState: __assign({ pageSize: pageSize }, props.initialState) }), useFlexLayout, useResizeColumns(ownerDocument), useFilters, useSubRowFiltering(hasAnySubRows), useSortBy, useExpanded, usePagination, useRowSelect, useSubRowSelection, useExpanderCell(subComponent, expanderCell, isRowDisabled), useSelectionCell(isSelectable, selectionMode, isRowDisabled), useColumnOrder, useColumnDragAndDrop(enableColumnReordering));
175
- var getTableProps = instance.getTableProps, rows = instance.rows, headerGroups = instance.headerGroups, getTableBodyProps = instance.getTableBodyProps, prepareRow = instance.prepareRow, state = instance.state, allColumns = instance.allColumns, filteredFlatRows = instance.filteredFlatRows, dispatch = instance.dispatch, page = instance.page, gotoPage = instance.gotoPage, setPageSize = instance.setPageSize, flatHeaders = instance.flatHeaders;
174
+ var instance = useTable(__assign(__assign({ manualPagination: !paginatorRenderer, paginateExpandedRows: false }, props), { columns: columns, defaultColumn: defaultColumn, disableSortBy: !isSortable, stateReducer: tableStateReducer, filterTypes: filterTypes, selectSubRows: selectSubRows, data: data, getSubRows: getSubRows, initialState: __assign({ pageSize: pageSize }, props.initialState) }), useFlexLayout, useResizeColumns(ownerDocument), useFilters, useSubRowFiltering(hasAnySubRows), useSortBy, useExpanded, usePagination, useRowSelect, useSubRowSelection, useExpanderCell(subComponent, expanderCell, isRowDisabled), useSelectionCell(isSelectable, selectionMode, isRowDisabled), useColumnOrder, useColumnDragAndDrop(enableColumnReordering), useStickyColumns);
175
+ var getTableProps = instance.getTableProps, rows = instance.rows, headerGroups = instance.headerGroups, getTableBodyProps = instance.getTableBodyProps, prepareRow = instance.prepareRow, state = instance.state, allColumns = instance.allColumns, filteredFlatRows = instance.filteredFlatRows, dispatch = instance.dispatch, page = instance.page, gotoPage = instance.gotoPage, setPageSize = instance.setPageSize, flatHeaders = instance.flatHeaders, visibleColumns = instance.visibleColumns;
176
176
  var ariaDataAttributes = Object.entries(rest).reduce(function (result, _a) {
177
177
  var key = _a[0], value = _a[1];
178
178
  if (key.startsWith('data-') || key.startsWith('aria-')) {
@@ -287,6 +287,30 @@ export var Table = function (props) {
287
287
  subComponent,
288
288
  ]);
289
289
  var virtualizedItemRenderer = React.useCallback(function (index) { return getPreparedRow(index); }, [getPreparedRow]);
290
+ var updateStickyState = function () {
291
+ if (!bodyRef.current || flatHeaders.every(function (header) { return !header.sticky; })) {
292
+ return;
293
+ }
294
+ if (bodyRef.current.scrollLeft !== 0) {
295
+ dispatch({ type: TableActions.setScrolledRight, value: true });
296
+ }
297
+ else {
298
+ dispatch({ type: TableActions.setScrolledRight, value: false });
299
+ }
300
+ // If scrolled a bit to the left looking from the right side
301
+ if (bodyRef.current.scrollLeft !==
302
+ bodyRef.current.scrollWidth - bodyRef.current.clientWidth) {
303
+ dispatch({ type: TableActions.setScrolledLeft, value: true });
304
+ }
305
+ else {
306
+ dispatch({ type: TableActions.setScrolledLeft, value: false });
307
+ }
308
+ };
309
+ React.useEffect(function () {
310
+ updateStickyState();
311
+ // Call only on init
312
+ // eslint-disable-next-line react-hooks/exhaustive-deps
313
+ }, []);
290
314
  return (React.createElement(React.Fragment, null,
291
315
  React.createElement("div", __assign({ ref: function (element) {
292
316
  setOwnerDocument(element === null || element === void 0 ? void 0 : element.ownerDocument);
@@ -295,7 +319,7 @@ export var Table = function (props) {
295
319
  }
296
320
  }, id: id }, getTableProps({
297
321
  className: cx('iui-table', (_a = {}, _a["iui-".concat(density)] = density !== 'default', _a), className),
298
- style: style,
322
+ style: __assign({ minWidth: 0 }, style),
299
323
  }), ariaDataAttributes),
300
324
  React.createElement("div", { className: 'iui-table-header-wrapper', ref: headerRef },
301
325
  React.createElement("div", { className: 'iui-table-header' }, headerGroups.slice(1).map(function (headerGroup) {
@@ -303,9 +327,13 @@ export var Table = function (props) {
303
327
  className: 'iui-row',
304
328
  });
305
329
  return (React.createElement("div", __assign({}, headerGroupProps, { key: headerGroupProps.key }), headerGroup.headers.map(function (column, index) {
306
- var columnProps = column.getHeaderProps(__assign(__assign({}, column.getSortByToggleProps()), { className: cx('iui-cell', { 'iui-actionable': column.canSort }, { 'iui-sorted': column.isSorted }, column.columnClassName), style: getCellStyle(column, !!state.isTableResizing) }));
330
+ var columnProps = column.getHeaderProps(__assign(__assign({}, column.getSortByToggleProps()), { className: cx('iui-cell', {
331
+ 'iui-actionable': column.canSort,
332
+ 'iui-sorted': column.isSorted,
333
+ 'iui-cell-sticky': !!column.sticky,
334
+ }, column.columnClassName), style: __assign(__assign(__assign({}, getCellStyle(column, !!state.isTableResizing)), getStickyStyle(column, visibleColumns)), { flexWrap: 'unset' }) }));
307
335
  return (React.createElement("div", __assign({}, columnProps, column.getDragAndDropProps(), { key: columnProps.key, title: undefined, ref: function (el) {
308
- if (el && isResizable) {
336
+ if (el) {
309
337
  columnRefs.current[column.id] = el;
310
338
  column.resizeWidth = el.getBoundingClientRect().width;
311
339
  }
@@ -320,7 +348,11 @@ export var Table = function (props) {
320
348
  index !== headerGroup.headers.length - 1 && (React.createElement("div", __assign({}, column.getResizerProps(), { className: 'iui-resizer' }),
321
349
  React.createElement("div", { className: 'iui-resizer-bar' }))),
322
350
  enableColumnReordering &&
323
- !column.disableReordering && (React.createElement("div", { className: 'iui-reorder-bar' }))));
351
+ !column.disableReordering && (React.createElement("div", { className: 'iui-reorder-bar' })),
352
+ column.sticky === 'left' &&
353
+ state.sticky.isScrolledToRight && (React.createElement("div", { className: 'iui-cell-shadow-right' })),
354
+ column.sticky === 'right' &&
355
+ state.sticky.isScrolledToLeft && (React.createElement("div", { className: 'iui-cell-shadow-left' }))));
324
356
  })));
325
357
  }))),
326
358
  React.createElement("div", __assign({}, getTableBodyProps({
@@ -331,6 +363,7 @@ export var Table = function (props) {
331
363
  }), { ref: bodyRef, onScroll: function () {
332
364
  if (headerRef.current && bodyRef.current) {
333
365
  headerRef.current.scrollLeft = bodyRef.current.scrollLeft;
366
+ updateStickyState();
334
367
  }
335
368
  }, tabIndex: -1 }),
336
369
  data.length !== 0 && (React.createElement(React.Fragment, null, enableVirtualization ? (React.createElement(VirtualScroll, { itemsLength: page.length, itemRenderer: virtualizedItemRenderer })) : (page.map(function (_, index) { return getPreparedRow(index); })))),
@@ -15,7 +15,7 @@ var __assign = (this && this.__assign) || function () {
15
15
  *--------------------------------------------------------------------------------------------*/
16
16
  import React from 'react';
17
17
  import cx from 'classnames';
18
- import { getCellStyle } from './utils';
18
+ import { getCellStyle, getStickyStyle } from './utils';
19
19
  import { SubRowExpander } from './SubRowExpander';
20
20
  import { SELECTION_CELL_ID } from './columns';
21
21
  import { DefaultCell } from './cells';
@@ -34,8 +34,10 @@ export var TableCell = function (props) {
34
34
  };
35
35
  };
36
36
  var cellElementProps = cell.getCellProps({
37
- className: cx('iui-cell', cell.column.cellClassName),
38
- style: __assign(__assign({}, getCellStyle(cell.column, !!tableInstance.state.isTableResizing)), getSubRowStyle()),
37
+ className: cx('iui-cell', cell.column.cellClassName, {
38
+ 'iui-cell-sticky': !!cell.column.sticky,
39
+ }),
40
+ style: __assign(__assign(__assign({}, getCellStyle(cell.column, !!tableInstance.state.isTableResizing)), getSubRowStyle()), getStickyStyle(cell.column, tableInstance.visibleColumns)),
39
41
  });
40
42
  var cellProps = __assign(__assign({}, tableInstance), { cell: cell, row: cell.row, value: cell.value, column: cell.column });
41
43
  var cellContent = (React.createElement(React.Fragment, null,
@@ -44,7 +46,12 @@ export var TableCell = function (props) {
44
46
  var cellRendererProps = {
45
47
  cellElementProps: cellElementProps,
46
48
  cellProps: cellProps,
47
- children: cellContent,
49
+ children: (React.createElement(React.Fragment, null,
50
+ cellContent,
51
+ cell.column.sticky === 'left' &&
52
+ tableInstance.state.sticky.isScrolledToRight && (React.createElement("div", { className: 'iui-cell-shadow-right' })),
53
+ cell.column.sticky === 'right' &&
54
+ tableInstance.state.sticky.isScrolledToLeft && (React.createElement("div", { className: 'iui-cell-shadow-left' })))),
48
55
  };
49
56
  return (React.createElement(React.Fragment, null, cell.column.cellRenderer ? (cell.column.cellRenderer(__assign(__assign({}, cellRendererProps), { isDisabled: function () { return isDisabled; } }))) : (React.createElement(DefaultCell, __assign({}, cellRendererProps, { isDisabled: function () { return isDisabled; } })))));
50
57
  };
@@ -92,5 +92,9 @@ export var TableRowMemoized = React.memo(TableRow, function (prevProp, nextProp)
92
92
  prevProp.tableHasSubRows === nextProp.tableHasSubRows &&
93
93
  prevProp.state.columnOrder === nextProp.state.columnOrder &&
94
94
  !nextProp.state.columnResizing.isResizingColumn &&
95
- prevProp.state.isTableResizing === nextProp.state.isTableResizing;
95
+ prevProp.state.isTableResizing === nextProp.state.isTableResizing &&
96
+ prevProp.state.sticky.isScrolledToLeft ===
97
+ nextProp.state.sticky.isScrolledToLeft &&
98
+ prevProp.state.sticky.isScrolledToRight ===
99
+ nextProp.state.sticky.isScrolledToRight;
96
100
  });
@@ -12,6 +12,10 @@ export declare const onTableResizeStart: <T extends Record<string, unknown>>(sta
12
12
  isResizingColumn?: string | undefined;
13
13
  };
14
14
  columnReorderStartIndex: number;
15
+ sticky: {
16
+ isScrolledToRight?: boolean | undefined;
17
+ isScrolledToLeft?: boolean | undefined;
18
+ };
15
19
  columnOrder: import("react-table").IdType<T>[];
16
20
  expanded: Record<import("react-table").IdType<T>, boolean>;
17
21
  filters: import("react-table").Filters<T>;
@@ -38,6 +42,10 @@ export declare const onTableResizeEnd: <T extends Record<string, unknown>>(state
38
42
  };
39
43
  hiddenColumns?: import("react-table").IdType<T>[] | undefined;
40
44
  columnReorderStartIndex: number;
45
+ sticky: {
46
+ isScrolledToRight?: boolean | undefined;
47
+ isScrolledToLeft?: boolean | undefined;
48
+ };
41
49
  columnOrder: import("react-table").IdType<T>[];
42
50
  expanded: Record<import("react-table").IdType<T>, boolean>;
43
51
  filters: import("react-table").Filters<T>;
@@ -20,6 +20,10 @@ export declare const onSingleSelectHandler: <T extends Record<string, unknown>>(
20
20
  };
21
21
  isTableResizing?: boolean | undefined;
22
22
  columnReorderStartIndex: number;
23
+ sticky: {
24
+ isScrolledToRight?: boolean | undefined;
25
+ isScrolledToLeft?: boolean | undefined;
26
+ };
23
27
  columnOrder: import("react-table").IdType<T>[];
24
28
  expanded: Record<import("react-table").IdType<T>, boolean>;
25
29
  filters: import("react-table").Filters<T>;
@@ -49,11 +49,13 @@ export var SelectionColumn = function (props) {
49
49
  var getToggleAllRowsSelectedProps = _a.getToggleAllRowsSelectedProps, rows = _a.rows, initialRows = _a.initialRows, state = _a.state;
50
50
  var disabled = rows.every(function (row) { return isDisabled === null || isDisabled === void 0 ? void 0 : isDisabled(row.original); });
51
51
  var checked = initialRows.every(function (row) { return state.selectedRowIds[row.id] || (isDisabled === null || isDisabled === void 0 ? void 0 : isDisabled(row.original)); });
52
- return (React.createElement(Checkbox, __assign({}, getToggleAllRowsSelectedProps(), { style: {}, checked: checked && !disabled, indeterminate: !checked && Object.keys(state.selectedRowIds).length > 0, disabled: disabled })));
52
+ return (React.createElement(Checkbox, __assign({}, getToggleAllRowsSelectedProps(), { style: {}, title: '' // Removes default title that comes from react-table
53
+ , checked: checked && !disabled, indeterminate: !checked && Object.keys(state.selectedRowIds).length > 0, disabled: disabled })));
53
54
  },
54
55
  Cell: function (_a) {
55
56
  var row = _a.row;
56
- return (React.createElement(Checkbox, __assign({}, row.getToggleRowSelectedProps(), { style: {}, disabled: isDisabled === null || isDisabled === void 0 ? void 0 : isDisabled(row.original), onClick: function (e) { return e.stopPropagation(); } })));
57
+ return (React.createElement(Checkbox, __assign({}, row.getToggleRowSelectedProps(), { style: {}, title: '' // Removes default title that comes from react-table
58
+ , disabled: isDisabled === null || isDisabled === void 0 ? void 0 : isDisabled(row.original), onClick: function (e) { return e.stopPropagation(); } })));
57
59
  },
58
60
  cellRenderer: function (props) { return (React.createElement(DefaultCell, __assign({}, props, { isDisabled: function (rowData) { return !!(isDisabled === null || isDisabled === void 0 ? void 0 : isDisabled(rowData)); } }))); },
59
61
  };
@@ -4,3 +4,4 @@ export { useSubRowFiltering } from './useSubRowFiltering';
4
4
  export { useSubRowSelection } from './useSubRowSelection';
5
5
  export { useResizeColumns } from './useResizeColumns';
6
6
  export { useColumnDragAndDrop } from './useColumnDragAndDrop';
7
+ export { useStickyColumns } from './useStickyColumns';
@@ -8,3 +8,4 @@ export { useSubRowFiltering } from './useSubRowFiltering';
8
8
  export { useSubRowSelection } from './useSubRowSelection';
9
9
  export { useResizeColumns } from './useResizeColumns';
10
10
  export { useColumnDragAndDrop } from './useColumnDragAndDrop';
11
+ export { useStickyColumns } from './useStickyColumns';
@@ -0,0 +1,2 @@
1
+ import { Hooks } from 'react-table';
2
+ export declare const useStickyColumns: <T extends Record<string, unknown>>(hooks: Hooks<T>) => void;