@itwin/itwinui-react 1.40.1 → 1.43.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 (148) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/cjs/core/Backdrop/Backdrop.d.ts +10 -0
  3. package/cjs/core/Backdrop/Backdrop.js +41 -0
  4. package/cjs/core/Backdrop/index.d.ts +2 -0
  5. package/cjs/core/Backdrop/index.js +9 -0
  6. package/cjs/core/Breadcrumbs/Breadcrumbs.js +18 -18
  7. package/cjs/core/ButtonGroup/ButtonGroup.js +11 -4
  8. package/cjs/core/ComboBox/ComboBox.js +22 -18
  9. package/cjs/core/Dialog/Dialog.d.ts +41 -0
  10. package/cjs/core/Dialog/Dialog.js +59 -0
  11. package/cjs/core/Dialog/DialogBackdrop.d.ts +12 -0
  12. package/cjs/core/Dialog/DialogBackdrop.js +61 -0
  13. package/cjs/core/Dialog/DialogButtonBar.d.ts +18 -0
  14. package/cjs/core/Dialog/DialogButtonBar.js +50 -0
  15. package/cjs/core/Dialog/DialogContent.d.ts +17 -0
  16. package/cjs/core/Dialog/DialogContent.js +49 -0
  17. package/cjs/core/Dialog/DialogContext.d.ts +39 -0
  18. package/cjs/core/Dialog/DialogContext.js +16 -0
  19. package/cjs/core/Dialog/DialogMain.d.ts +36 -0
  20. package/cjs/core/Dialog/DialogMain.js +120 -0
  21. package/cjs/core/Dialog/DialogTitleBar.d.ts +34 -0
  22. package/cjs/core/Dialog/DialogTitleBar.js +69 -0
  23. package/cjs/core/Dialog/DialogTitleBarTitle.d.ts +15 -0
  24. package/cjs/core/Dialog/DialogTitleBarTitle.js +47 -0
  25. package/cjs/core/Dialog/index.d.ts +8 -0
  26. package/cjs/core/Dialog/index.js +10 -0
  27. package/cjs/core/ErrorPage/ErrorPage.d.ts +3 -1
  28. package/cjs/core/ErrorPage/ErrorPage.js +31 -1
  29. package/cjs/core/Footer/Footer.d.ts +16 -2
  30. package/cjs/core/Footer/Footer.js +57 -45
  31. package/cjs/core/Footer/FooterItem.d.ts +8 -0
  32. package/cjs/core/Footer/FooterItem.js +46 -0
  33. package/cjs/core/Footer/FooterList.d.ts +8 -0
  34. package/cjs/core/Footer/FooterList.js +46 -0
  35. package/cjs/core/Footer/FooterSeparator.d.ts +8 -0
  36. package/cjs/core/Footer/FooterSeparator.js +46 -0
  37. package/cjs/core/Footer/index.d.ts +1 -1
  38. package/cjs/core/Footer/index.js +2 -1
  39. package/cjs/core/Modal/Modal.d.ts +4 -13
  40. package/cjs/core/Modal/Modal.js +9 -71
  41. package/cjs/core/Modal/ModalButtonBar.d.ts +1 -2
  42. package/cjs/core/Modal/ModalButtonBar.js +2 -39
  43. package/cjs/core/Modal/ModalContent.d.ts +1 -2
  44. package/cjs/core/Modal/ModalContent.js +2 -39
  45. package/cjs/core/Slider/Slider.d.ts +10 -0
  46. package/cjs/core/Slider/Slider.js +20 -14
  47. package/cjs/core/Slider/Thumb.d.ts +2 -1
  48. package/cjs/core/Slider/Thumb.js +5 -3
  49. package/cjs/core/Slider/Track.d.ts +2 -1
  50. package/cjs/core/Slider/Track.js +23 -4
  51. package/cjs/core/Table/Table.d.ts +24 -0
  52. package/cjs/core/Table/Table.js +21 -10
  53. package/cjs/core/Table/TableRowMemoized.d.ts +4 -0
  54. package/cjs/core/Table/TableRowMemoized.js +15 -3
  55. package/cjs/core/Table/cells/EditableCell.js +7 -2
  56. package/cjs/core/Table/columns/actionColumn.d.ts +8 -3
  57. package/cjs/core/Table/columns/actionColumn.js +33 -2
  58. package/cjs/core/Table/hooks/index.d.ts +1 -0
  59. package/cjs/core/Table/hooks/index.js +3 -1
  60. package/cjs/core/Table/hooks/useScrollToRow.d.ts +11 -0
  61. package/cjs/core/Table/hooks/useScrollToRow.js +49 -0
  62. package/cjs/core/Tree/Tree.d.ts +9 -0
  63. package/cjs/core/Tree/Tree.js +67 -19
  64. package/cjs/core/Tree/TreeContext.d.ts +4 -0
  65. package/cjs/core/Tree/TreeNode.js +8 -9
  66. package/cjs/core/Typography/Small/Small.js +1 -1
  67. package/cjs/core/index.d.ts +3 -1
  68. package/cjs/core/index.js +6 -3
  69. package/cjs/core/utils/components/FocusTrap.js +1 -1
  70. package/cjs/core/utils/components/MiddleTextTruncation.js +1 -1
  71. package/cjs/core/utils/hooks/index.d.ts +1 -0
  72. package/cjs/core/utils/hooks/index.js +1 -0
  73. package/cjs/core/utils/hooks/useLatestRef.d.ts +9 -0
  74. package/cjs/core/utils/hooks/useLatestRef.js +26 -0
  75. package/esm/core/Backdrop/Backdrop.d.ts +10 -0
  76. package/esm/core/Backdrop/Backdrop.js +35 -0
  77. package/esm/core/Backdrop/index.d.ts +2 -0
  78. package/esm/core/Backdrop/index.js +5 -0
  79. package/esm/core/Breadcrumbs/Breadcrumbs.js +18 -18
  80. package/esm/core/ButtonGroup/ButtonGroup.js +11 -4
  81. package/esm/core/ComboBox/ComboBox.js +23 -19
  82. package/esm/core/Dialog/Dialog.d.ts +41 -0
  83. package/esm/core/Dialog/Dialog.js +53 -0
  84. package/esm/core/Dialog/DialogBackdrop.d.ts +12 -0
  85. package/esm/core/Dialog/DialogBackdrop.js +55 -0
  86. package/esm/core/Dialog/DialogButtonBar.d.ts +18 -0
  87. package/esm/core/Dialog/DialogButtonBar.js +44 -0
  88. package/esm/core/Dialog/DialogContent.d.ts +17 -0
  89. package/esm/core/Dialog/DialogContent.js +43 -0
  90. package/esm/core/Dialog/DialogContext.d.ts +39 -0
  91. package/esm/core/Dialog/DialogContext.js +9 -0
  92. package/esm/core/Dialog/DialogMain.d.ts +36 -0
  93. package/esm/core/Dialog/DialogMain.js +114 -0
  94. package/esm/core/Dialog/DialogTitleBar.d.ts +34 -0
  95. package/esm/core/Dialog/DialogTitleBar.js +63 -0
  96. package/esm/core/Dialog/DialogTitleBarTitle.d.ts +15 -0
  97. package/esm/core/Dialog/DialogTitleBarTitle.js +41 -0
  98. package/esm/core/Dialog/index.d.ts +8 -0
  99. package/esm/core/Dialog/index.js +6 -0
  100. package/esm/core/ErrorPage/ErrorPage.d.ts +3 -1
  101. package/esm/core/ErrorPage/ErrorPage.js +31 -1
  102. package/esm/core/Footer/Footer.d.ts +16 -2
  103. package/esm/core/Footer/Footer.js +56 -43
  104. package/esm/core/Footer/FooterItem.d.ts +8 -0
  105. package/esm/core/Footer/FooterItem.js +39 -0
  106. package/esm/core/Footer/FooterList.d.ts +8 -0
  107. package/esm/core/Footer/FooterList.js +39 -0
  108. package/esm/core/Footer/FooterSeparator.d.ts +8 -0
  109. package/esm/core/Footer/FooterSeparator.js +39 -0
  110. package/esm/core/Footer/index.d.ts +1 -1
  111. package/esm/core/Footer/index.js +1 -1
  112. package/esm/core/Modal/Modal.d.ts +4 -13
  113. package/esm/core/Modal/Modal.js +10 -72
  114. package/esm/core/Modal/ModalButtonBar.d.ts +1 -2
  115. package/esm/core/Modal/ModalButtonBar.js +2 -35
  116. package/esm/core/Modal/ModalContent.d.ts +1 -2
  117. package/esm/core/Modal/ModalContent.js +2 -35
  118. package/esm/core/Slider/Slider.d.ts +10 -0
  119. package/esm/core/Slider/Slider.js +20 -14
  120. package/esm/core/Slider/Thumb.d.ts +2 -1
  121. package/esm/core/Slider/Thumb.js +5 -3
  122. package/esm/core/Slider/Track.d.ts +2 -1
  123. package/esm/core/Slider/Track.js +23 -4
  124. package/esm/core/Table/Table.d.ts +24 -0
  125. package/esm/core/Table/Table.js +23 -12
  126. package/esm/core/Table/TableRowMemoized.d.ts +4 -0
  127. package/esm/core/Table/TableRowMemoized.js +15 -3
  128. package/esm/core/Table/cells/EditableCell.js +7 -2
  129. package/esm/core/Table/columns/actionColumn.d.ts +8 -3
  130. package/esm/core/Table/columns/actionColumn.js +33 -2
  131. package/esm/core/Table/hooks/index.d.ts +1 -0
  132. package/esm/core/Table/hooks/index.js +1 -0
  133. package/esm/core/Table/hooks/useScrollToRow.d.ts +11 -0
  134. package/esm/core/Table/hooks/useScrollToRow.js +42 -0
  135. package/esm/core/Tree/Tree.d.ts +9 -0
  136. package/esm/core/Tree/Tree.js +68 -20
  137. package/esm/core/Tree/TreeContext.d.ts +4 -0
  138. package/esm/core/Tree/TreeNode.js +8 -9
  139. package/esm/core/Typography/Small/Small.js +1 -1
  140. package/esm/core/index.d.ts +3 -1
  141. package/esm/core/index.js +2 -1
  142. package/esm/core/utils/components/FocusTrap.js +1 -1
  143. package/esm/core/utils/components/MiddleTextTruncation.js +1 -1
  144. package/esm/core/utils/hooks/index.d.ts +1 -0
  145. package/esm/core/utils/hooks/index.js +1 -0
  146. package/esm/core/utils/hooks/useLatestRef.d.ts +9 -0
  147. package/esm/core/utils/hooks/useLatestRef.js +19 -0
  148. package/package.json +8 -7
@@ -0,0 +1,42 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import React from 'react';
6
+ export function useScrollToRow(_a) {
7
+ var data = _a.data, enableVirtualization = _a.enableVirtualization, page = _a.page, paginatorRenderer = _a.paginatorRenderer, scrollToRow = _a.scrollToRow;
8
+ var rowRefs = React.useRef({});
9
+ // Refs prevents from having `page` and `data` as dependencies
10
+ // therefore we avoid unnecessary scroll to row.
11
+ var pageRef = React.useRef(page);
12
+ pageRef.current = page;
13
+ var dataRef = React.useRef(data);
14
+ dataRef.current = data;
15
+ // For virtualized tables, all we need to do is pass the index of the item
16
+ // to the VirtualScroll component
17
+ var scrollToIndex = React.useMemo(function () {
18
+ if (!scrollToRow || paginatorRenderer) {
19
+ return undefined;
20
+ }
21
+ var index = scrollToRow(pageRef.current, dataRef.current);
22
+ return index < 0 ? undefined : index;
23
+ }, [paginatorRenderer, scrollToRow]);
24
+ // For non-virtualized tables, we need to add a ref to each row
25
+ // and scroll to the element
26
+ React.useEffect(function () {
27
+ var _a;
28
+ if (enableVirtualization ||
29
+ scrollToIndex === undefined ||
30
+ scrollToIndex === null ||
31
+ scrollToIndex < 0) {
32
+ return;
33
+ }
34
+ (_a = rowRefs.current[pageRef.current[scrollToIndex].id]) === null || _a === void 0 ? void 0 : _a.scrollIntoView();
35
+ }, [enableVirtualization, scrollToIndex]);
36
+ var tableRowRef = React.useCallback(function (row) {
37
+ return function (element) {
38
+ rowRefs.current[row.id] = element;
39
+ };
40
+ }, []);
41
+ return { scrollToIndex: scrollToIndex, tableRowRef: tableRowRef };
42
+ }
@@ -68,6 +68,15 @@ export declare type TreeProps<T> = {
68
68
  * }, [expandedNodes]);
69
69
  */
70
70
  getNode: (node: T) => NodeData<T>;
71
+ /**
72
+ * Virtualization is used to have a better performance with a lot of nodes.
73
+ *
74
+ * When enabled, Tree DOM structure will change - it will have a wrapper div
75
+ * to which `className` and `style` will be applied.
76
+ * @default false
77
+ * @beta
78
+ */
79
+ enableVirtualization?: boolean;
71
80
  } & Omit<CommonProps, 'title'>;
72
81
  /**
73
82
  * Tree component used to display a hierarchical structure of `TreeNodes`.
@@ -25,7 +25,7 @@ var __rest = (this && this.__rest) || function (s, e) {
25
25
  * See LICENSE.md in the project root for license terms and full copyright notice.
26
26
  *--------------------------------------------------------------------------------------------*/
27
27
  import React from 'react';
28
- import { useTheme, getFocusableElements } from '../utils';
28
+ import { useTheme, getFocusableElements, useVirtualization, mergeRefs, } from '../utils';
29
29
  import '@itwin/itwinui-css/css/tree.css';
30
30
  import cx from 'classnames';
31
31
  import { TreeContext } from './TreeContext';
@@ -80,7 +80,7 @@ import { TreeContext } from './TreeContext';
80
80
  />
81
81
  */
82
82
  export var Tree = function (props) {
83
- var data = props.data, className = props.className, nodeRenderer = props.nodeRenderer, getNode = props.getNode, rest = __rest(props, ["data", "className", "nodeRenderer", "getNode"]);
83
+ var data = props.data, className = props.className, nodeRenderer = props.nodeRenderer, getNode = props.getNode, _a = props.enableVirtualization, enableVirtualization = _a === void 0 ? false : _a, style = props.style, rest = __rest(props, ["data", "className", "nodeRenderer", "getNode", "enableVirtualization", "style"]);
84
84
  useTheme();
85
85
  var treeRef = React.useRef(null);
86
86
  var focusedIndex = React.useRef(0);
@@ -118,7 +118,7 @@ export var Tree = function (props) {
118
118
  break;
119
119
  }
120
120
  };
121
- var _a = React.useMemo(function () {
121
+ var _b = React.useMemo(function () {
122
122
  var flatList = [];
123
123
  var firstLevelNodes = [];
124
124
  var flattenNodes = function (nodes, depth, parentNode) {
@@ -147,24 +147,72 @@ export var Tree = function (props) {
147
147
  };
148
148
  flattenNodes(data);
149
149
  return [flatList, firstLevelNodes];
150
- }, [data, getNode]), flatNodesList = _a[0], firstLevelNodesList = _a[1];
151
- return (React.createElement("ul", __assign({ className: cx('iui-tree', className), role: 'tree', onKeyDown: handleKeyDown, ref: treeRef, tabIndex: 0, onFocus: function () {
152
- var _a;
153
- var items = getFocusableNodes();
154
- if (items.length > 0) {
155
- (_a = items[focusedIndex.current]) === null || _a === void 0 ? void 0 : _a.focus();
156
- }
157
- } }, rest), flatNodesList.map(function (flatNode) {
150
+ }, [data, getNode]), flatNodesList = _b[0], firstLevelNodesList = _b[1];
151
+ var itemRenderer = React.useCallback(function (index) {
158
152
  var _a, _b, _c, _d;
159
- return (React.createElement(TreeContext.Provider, { key: flatNode.nodeProps.nodeId, value: {
160
- nodeDepth: flatNode.depth,
161
- subNodeIds: flatNode.subNodeIds,
162
- groupSize: flatNode.depth === 0
153
+ var node = flatNodesList[index];
154
+ return (React.createElement(TreeContext.Provider, { key: node.nodeProps.nodeId, value: {
155
+ nodeDepth: node.depth,
156
+ subNodeIds: node.subNodeIds,
157
+ groupSize: node.depth === 0
163
158
  ? firstLevelNodesList.length
164
- : (_c = (_b = (_a = flatNode.parentNode) === null || _a === void 0 ? void 0 : _a.subNodeIds) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0,
165
- indexInGroup: flatNode.indexInGroup,
166
- parentNodeId: (_d = flatNode.parentNode) === null || _d === void 0 ? void 0 : _d.nodeProps.nodeId,
167
- } }, nodeRenderer(flatNode.nodeProps)));
168
- })));
159
+ : (_c = (_b = (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.subNodeIds) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0,
160
+ indexInGroup: node.indexInGroup,
161
+ parentNodeId: (_d = node.parentNode) === null || _d === void 0 ? void 0 : _d.nodeProps.nodeId,
162
+ scrollToParent: node.parentNode
163
+ ? function () {
164
+ var _a;
165
+ var parentNodeId = (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.nodeProps.nodeId;
166
+ var parentNodeIndex = flatNodesList.findIndex(function (n) { return n.nodeProps.nodeId === parentNodeId; });
167
+ setScrollToIndex(parentNodeIndex);
168
+ }
169
+ : undefined,
170
+ } }, nodeRenderer(node.nodeProps)));
171
+ }, [firstLevelNodesList.length, flatNodesList, nodeRenderer]);
172
+ var _c = React.useState(), scrollToIndex = _c[0], setScrollToIndex = _c[1];
173
+ var flatNodesListRef = React.useRef(flatNodesList);
174
+ React.useEffect(function () {
175
+ flatNodesListRef.current = flatNodesList;
176
+ }, [flatNodesList]);
177
+ React.useEffect(function () {
178
+ setTimeout(function () {
179
+ var _a;
180
+ if (scrollToIndex !== undefined) {
181
+ var nodeId = flatNodesListRef.current[scrollToIndex].nodeProps.nodeId;
182
+ var nodeElement = (_a = treeRef.current) === null || _a === void 0 ? void 0 : _a.ownerDocument.querySelector("#".concat(nodeId));
183
+ nodeElement === null || nodeElement === void 0 ? void 0 : nodeElement.focus();
184
+ // Need to reset that if navigating with mouse and keyboard,
185
+ // e.g. pressing arrow left to go to parent node and then with mouse
186
+ // clicking some other child node and then pressing arrow left
187
+ setScrollToIndex(undefined);
188
+ }
189
+ });
190
+ }, [scrollToIndex]);
191
+ var handleFocus = function (event) {
192
+ var _a, _b;
193
+ if ((_a = treeRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.relatedTarget)) {
194
+ return;
195
+ }
196
+ var items = getFocusableNodes();
197
+ if (items.length > 0) {
198
+ (_b = items[focusedIndex.current]) === null || _b === void 0 ? void 0 : _b.focus();
199
+ }
200
+ };
201
+ return (React.createElement(React.Fragment, null, enableVirtualization ? (React.createElement(VirtualizedTree, __assign({ flatNodesList: flatNodesList, itemRenderer: itemRenderer, scrollToIndex: scrollToIndex, onFocus: handleFocus, onKeyDown: handleKeyDown, ref: treeRef, className: className, style: style }, rest))) : (React.createElement(TreeElement, __assign({ onKeyDown: handleKeyDown, onFocus: handleFocus, className: className, style: style, ref: treeRef }, rest), flatNodesList.map(function (_, i) { return itemRenderer(i); })))));
169
202
  };
203
+ var TreeElement = React.forwardRef(function (_a, ref) {
204
+ var children = _a.children, className = _a.className, rest = __rest(_a, ["children", "className"]);
205
+ return (React.createElement("ul", __assign({ className: cx('iui-tree', className), role: 'tree', ref: ref, tabIndex: 0 }, rest), children));
206
+ });
207
+ // Having virtualized tree separately prevents from running all virtualization logic
208
+ var VirtualizedTree = React.forwardRef(function (_a, ref) {
209
+ var flatNodesList = _a.flatNodesList, itemRenderer = _a.itemRenderer, scrollToIndex = _a.scrollToIndex, className = _a.className, style = _a.style, rest = __rest(_a, ["flatNodesList", "itemRenderer", "scrollToIndex", "className", "style"]);
210
+ var _b = useVirtualization({
211
+ itemsLength: flatNodesList.length,
212
+ itemRenderer: itemRenderer,
213
+ scrollToIndex: scrollToIndex,
214
+ }), outerProps = _b.outerProps, innerProps = _b.innerProps, visibleChildren = _b.visibleChildren;
215
+ return (React.createElement("div", __assign({}, __assign(__assign({}, outerProps), { className: cx(className, outerProps.className), style: __assign(__assign({}, style), outerProps.style) })),
216
+ React.createElement(TreeElement, __assign({}, innerProps, rest, { ref: mergeRefs(ref, innerProps.ref) }), visibleChildren)));
217
+ });
170
218
  export default Tree;
@@ -20,6 +20,10 @@ export declare type TreeContextProps = {
20
20
  * Node index in the list of nodes under the same parent node or in the root. Used for an accessibility attribute.
21
21
  */
22
22
  indexInGroup: number;
23
+ /**
24
+ * Function that scrolls to the node's parent node.
25
+ */
26
+ scrollToParent?: () => void;
23
27
  };
24
28
  export declare const TreeContext: React.Context<TreeContextProps | undefined>;
25
29
  export declare const useTreeContext: () => TreeContextProps;
@@ -52,7 +52,7 @@ import { useTreeContext } from './TreeContext';
52
52
  export var TreeNode = function (props) {
53
53
  var nodeId = props.nodeId, label = props.label, sublabel = props.sublabel, children = props.children, className = props.className, icon = props.icon, _a = props.hasSubNodes, hasSubNodes = _a === void 0 ? false : _a, _b = props.isDisabled, isDisabled = _b === void 0 ? false : _b, _c = props.isExpanded, isExpanded = _c === void 0 ? false : _c, _d = props.isSelected, isSelected = _d === void 0 ? false : _d, onSelected = props.onSelected, onExpanded = props.onExpanded, checkbox = props.checkbox, expander = props.expander, rest = __rest(props, ["nodeId", "label", "sublabel", "children", "className", "icon", "hasSubNodes", "isDisabled", "isExpanded", "isSelected", "onSelected", "onExpanded", "checkbox", "expander"]);
54
54
  useTheme();
55
- var _e = useTreeContext(), nodeDepth = _e.nodeDepth, _f = _e.subNodeIds, subNodeIds = _f === void 0 ? [] : _f, parentNodeId = _e.parentNodeId, groupSize = _e.groupSize, indexInGroup = _e.indexInGroup;
55
+ var _e = useTreeContext(), nodeDepth = _e.nodeDepth, _f = _e.subNodeIds, subNodeIds = _f === void 0 ? [] : _f, parentNodeId = _e.parentNodeId, scrollToParent = _e.scrollToParent, groupSize = _e.groupSize, indexInGroup = _e.indexInGroup;
56
56
  var _g = React.useState(false), isFocused = _g[0], setIsFocused = _g[1];
57
57
  var nodeRef = React.useRef(null);
58
58
  var styleDepth = React.useMemo(function () {
@@ -62,7 +62,7 @@ export var TreeNode = function (props) {
62
62
  : { marginLeft: nodeDepth ? nodeDepth * 28 : 0 };
63
63
  }, [nodeDepth]);
64
64
  var onKeyDown = function (event) {
65
- var _a, _b, _c, _d, _e, _f, _g;
65
+ var _a, _b, _c, _d, _e, _f;
66
66
  var isNodeFocused = nodeRef.current === ((_a = nodeRef.current) === null || _a === void 0 ? void 0 : _a.ownerDocument.activeElement);
67
67
  switch (event.key) {
68
68
  case 'ArrowLeft': {
@@ -73,20 +73,19 @@ export var TreeNode = function (props) {
73
73
  break;
74
74
  }
75
75
  if (parentNodeId) {
76
- var parentNode = (_b = nodeRef.current) === null || _b === void 0 ? void 0 : _b.ownerDocument.querySelector("#".concat(parentNodeId));
77
- parentNode === null || parentNode === void 0 ? void 0 : parentNode.focus();
76
+ scrollToParent === null || scrollToParent === void 0 ? void 0 : scrollToParent();
78
77
  break;
79
78
  }
80
79
  // If it is top level node (doesn't have parent node), then do nothing.
81
80
  break;
82
81
  }
83
82
  var focusableElements = getFocusableElements(nodeRef.current);
84
- var currentIndex = focusableElements.indexOf((_c = nodeRef.current) === null || _c === void 0 ? void 0 : _c.ownerDocument.activeElement);
83
+ var currentIndex = focusableElements.indexOf((_b = nodeRef.current) === null || _b === void 0 ? void 0 : _b.ownerDocument.activeElement);
85
84
  if (currentIndex === 0) {
86
- (_d = nodeRef.current) === null || _d === void 0 ? void 0 : _d.focus();
85
+ (_c = nodeRef.current) === null || _c === void 0 ? void 0 : _c.focus();
87
86
  }
88
87
  else {
89
- (_e = focusableElements[currentIndex - 1]) === null || _e === void 0 ? void 0 : _e.focus();
88
+ (_d = focusableElements[currentIndex - 1]) === null || _d === void 0 ? void 0 : _d.focus();
90
89
  }
91
90
  break;
92
91
  }
@@ -98,10 +97,10 @@ export var TreeNode = function (props) {
98
97
  onExpanded(nodeId, true);
99
98
  break;
100
99
  }
101
- (_f = focusableElements[0]) === null || _f === void 0 ? void 0 : _f.focus();
100
+ (_e = focusableElements[0]) === null || _e === void 0 ? void 0 : _e.focus();
102
101
  break;
103
102
  }
104
- var currentIndex = focusableElements.indexOf((_g = nodeRef.current) === null || _g === void 0 ? void 0 : _g.ownerDocument.activeElement);
103
+ var currentIndex = focusableElements.indexOf((_f = nodeRef.current) === null || _f === void 0 ? void 0 : _f.ownerDocument.activeElement);
105
104
  if (currentIndex < focusableElements.length - 1) {
106
105
  focusableElements[currentIndex + 1].focus();
107
106
  break;
@@ -37,6 +37,6 @@ import '@itwin/itwinui-css/css/text.css';
37
37
  export var Small = React.forwardRef(function (props, ref) {
38
38
  var className = props.className, _a = props.isMuted, isMuted = _a === void 0 ? false : _a, rest = __rest(props, ["className", "isMuted"]);
39
39
  useTheme();
40
- return (React.createElement("p", __assign({ ref: ref, className: cx('iui-text-small', { 'iui-text-muted': isMuted }, className) }, rest)));
40
+ return (React.createElement("small", __assign({ ref: ref, className: cx('iui-text-small', { 'iui-text-muted': isMuted }, className) }, rest)));
41
41
  });
42
42
  export default Small;
@@ -1,5 +1,7 @@
1
1
  export { Alert } from './Alert';
2
2
  export type { AlertProps } from './Alert';
3
+ export { Backdrop } from './Backdrop';
4
+ export type { BackdropProps } from './Backdrop';
3
5
  export { Badge } from './Badge';
4
6
  export type { BadgeProps } from './Badge';
5
7
  export { Breadcrumbs } from './Breadcrumbs';
@@ -28,7 +30,7 @@ export { Fieldset } from './Fieldset';
28
30
  export type { FieldsetProps } from './Fieldset';
29
31
  export { FileUpload, FileUploadTemplate } from './FileUpload';
30
32
  export type { FileUploadProps, FileUploadTemplateProps } from './FileUpload';
31
- export { Footer } from './Footer';
33
+ export { Footer, defaultFooterElements } from './Footer';
32
34
  export type { FooterProps, FooterElement, TitleTranslations } from './Footer';
33
35
  export { Header, HeaderBreadcrumbs, HeaderButton, HeaderLogo } from './Header';
34
36
  export type { HeaderProps, HeaderBreadcrumbsProps, HeaderButtonProps, HeaderLogoProps, } from './Header';
package/esm/core/index.js CHANGED
@@ -3,6 +3,7 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  export { Alert } from './Alert';
6
+ export { Backdrop } from './Backdrop';
6
7
  export { Badge } from './Badge';
7
8
  export { Breadcrumbs } from './Breadcrumbs';
8
9
  export { Button, DropdownButton, IconButton, IdeasButton, SplitButton, } from './Buttons';
@@ -17,7 +18,7 @@ export { ErrorPage } from './ErrorPage';
17
18
  export { ExpandableBlock } from './ExpandableBlock';
18
19
  export { Fieldset } from './Fieldset';
19
20
  export { FileUpload, FileUploadTemplate } from './FileUpload';
20
- export { Footer } from './Footer';
21
+ export { Footer, defaultFooterElements } from './Footer';
21
22
  export { Header, HeaderBreadcrumbs, HeaderButton, HeaderLogo } from './Header';
22
23
  export { VerticalTabs, Tab, HorizontalTabs, HorizontalTab } from './Tabs';
23
24
  export { InformationPanel, InformationPanelWrapper, InformationPanelHeader, InformationPanelBody, InformationPanelContent, } from './InformationPanel';
@@ -36,7 +36,7 @@ export var FocusTrap = function (props) {
36
36
  lastElement === null || lastElement === void 0 ? void 0 : lastElement.focus();
37
37
  }
38
38
  };
39
- return (React.createElement("div", null,
39
+ return (React.createElement(React.Fragment, null,
40
40
  React.createElement("div", { tabIndex: 0, onFocus: onFirstFocus, "aria-hidden": true }),
41
41
  React.cloneElement(children, {
42
42
  ref: mergeRefs(children.ref, childRef),
@@ -38,7 +38,7 @@ export var MiddleTextTruncation = function (props) {
38
38
  var _b = useOverflow(text), ref = _b[0], visibleCount = _b[1];
39
39
  var truncatedText = React.useMemo(function () {
40
40
  if (visibleCount < text.length) {
41
- return "".concat(text.substr(0, visibleCount - endCharsCount - ELLIPSIS_CHAR.length)).concat(ELLIPSIS_CHAR).concat(text.substr(text.length - endCharsCount));
41
+ return "".concat(text.substring(0, visibleCount - endCharsCount - ELLIPSIS_CHAR.length)).concat(ELLIPSIS_CHAR).concat(text.substring(text.length - endCharsCount));
42
42
  }
43
43
  else {
44
44
  return text;
@@ -7,3 +7,4 @@ export * from './useTheme';
7
7
  export * from './useIntersection';
8
8
  export * from './useMediaQuery';
9
9
  export * from './useSafeContext';
10
+ export * from './useLatestRef';
@@ -11,3 +11,4 @@ export * from './useTheme';
11
11
  export * from './useIntersection';
12
12
  export * from './useMediaQuery';
13
13
  export * from './useSafeContext';
14
+ export * from './useLatestRef';
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ /**
3
+ * Hook that keeps track of the latest value in a ref.
4
+ * @private
5
+ * @example
6
+ * const { value } = props;
7
+ * const valueRef = useLatestRef(value);
8
+ */
9
+ export declare const useLatestRef: <T>(value: T) => React.MutableRefObject<T>;
@@ -0,0 +1,19 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import React from 'react';
6
+ /**
7
+ * Hook that keeps track of the latest value in a ref.
8
+ * @private
9
+ * @example
10
+ * const { value } = props;
11
+ * const valueRef = useLatestRef(value);
12
+ */
13
+ export var useLatestRef = function (value) {
14
+ var valueRef = React.useRef(value);
15
+ React.useEffect(function () {
16
+ valueRef.current = value;
17
+ }, [value]);
18
+ return valueRef;
19
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/itwinui-react",
3
- "version": "1.40.1",
3
+ "version": "1.43.0",
4
4
  "author": "Bentley Systems",
5
5
  "license": "MIT",
6
6
  "main": "cjs/index.js",
@@ -29,21 +29,22 @@
29
29
  "ux"
30
30
  ],
31
31
  "scripts": {
32
- "build": "yarn clean && yarn copy-files && tsc -p tsconfig.cjs.json && tsc -p tsconfig.esm.json",
33
- "build:watch": "yarn clean && yarn copy-files && concurrently \"tsc -p tsconfig.cjs.json --watch\" \"tsc -p tsconfig.esm.json --watch\"",
34
- "clean": "yarn clean:coverage && rimraf esm && rimraf cjs",
32
+ "build": "yarn clean:build && yarn copy-files && tsc -p tsconfig.cjs.json && tsc -p tsconfig.esm.json",
33
+ "build:watch": "yarn clean:build && yarn copy-files && concurrently \"tsc -p tsconfig.cjs.json --watch\" \"tsc -p tsconfig.esm.json --watch\"",
34
+ "clean:build": "yarn clean:coverage && rimraf esm && rimraf cjs",
35
35
  "clean:coverage": "rimraf coverage",
36
+ "clean": "rimraf .turbo && yarn clean:coverage && yarn clean:build && rimraf node_modules",
36
37
  "test": "jest",
37
38
  "test:watch": "jest --watch",
38
- "createComponent": "node scripts/createComponent.js",
39
39
  "format": "prettier --config .prettierrc **/*.{tsx,ts,js} --ignore-path .gitignore --write",
40
40
  "lint": "eslint \"**/*.{js,ts,tsx}\" --max-warnings=0",
41
41
  "lint:fix": "yarn lint --fix && node ../configs/copyrightLinter.js --fix \"*/**/*.{js,ts,tsx}\"",
42
42
  "copy-files": "cpy \"../../{README,LICENSE}.md\" .",
43
- "dev": "yarn build:watch"
43
+ "dev": "yarn build:watch",
44
+ "createComponent": "node ../../scripts/createComponent.js"
44
45
  },
45
46
  "dependencies": {
46
- "@itwin/itwinui-css": "^0.59.2",
47
+ "@itwin/itwinui-css": "^0.63.0",
47
48
  "@itwin/itwinui-icons-react": "^1.10.1",
48
49
  "@itwin/itwinui-illustrations-react": "^1.3.1",
49
50
  "@tippyjs/react": "^4.2.5",