@itwin/itwinui-react 1.32.0-dev.0 → 1.33.1

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 (84) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/cjs/core/ButtonGroup/ButtonGroup.d.ts +6 -1
  3. package/cjs/core/ButtonGroup/ButtonGroup.js +6 -3
  4. package/cjs/core/Checkbox/Checkbox.d.ts +13 -0
  5. package/cjs/core/Checkbox/Checkbox.js +15 -22
  6. package/cjs/core/ColorPicker/ColorSwatch.d.ts +1 -1
  7. package/cjs/core/ComboBox/ComboBox.d.ts +17 -1
  8. package/cjs/core/ComboBox/ComboBox.js +55 -20
  9. package/cjs/core/ExpandableBlock/ExpandableBlock.d.ts +6 -0
  10. package/cjs/core/ExpandableBlock/ExpandableBlock.js +3 -2
  11. package/cjs/core/Footer/Footer.d.ts +14 -2
  12. package/cjs/core/Footer/Footer.js +40 -17
  13. package/cjs/core/InputGroup/InputGroup.js +12 -2
  14. package/cjs/core/LabeledSelect/LabeledSelect.js +10 -4
  15. package/cjs/core/Menu/Menu.js +3 -3
  16. package/cjs/core/Radio/Radio.d.ts +13 -0
  17. package/cjs/core/Radio/Radio.js +7 -8
  18. package/cjs/core/Slider/Slider.js +10 -1
  19. package/cjs/core/StatusMessage/StatusMessage.d.ts +24 -0
  20. package/cjs/core/StatusMessage/StatusMessage.js +39 -0
  21. package/cjs/core/StatusMessage/index.d.ts +4 -0
  22. package/cjs/core/StatusMessage/index.js +10 -0
  23. package/cjs/core/Table/hooks/useSelectionCell.js +1 -2
  24. package/cjs/core/Tree/Tree.d.ts +123 -0
  25. package/cjs/core/Tree/Tree.js +177 -0
  26. package/cjs/core/Tree/TreeContext.d.ts +25 -0
  27. package/cjs/core/Tree/TreeContext.js +20 -0
  28. package/cjs/core/Tree/TreeNode.d.ts +87 -0
  29. package/cjs/core/Tree/TreeNode.js +169 -0
  30. package/cjs/core/Tree/TreeNodeExpander.d.ts +8 -0
  31. package/cjs/core/Tree/TreeNodeExpander.js +46 -0
  32. package/cjs/core/Tree/index.d.ts +6 -0
  33. package/cjs/core/Tree/index.js +13 -0
  34. package/cjs/core/index.d.ts +4 -0
  35. package/cjs/core/index.js +7 -1
  36. package/cjs/core/utils/components/InputContainer.d.ts +1 -0
  37. package/cjs/core/utils/components/InputContainer.js +8 -7
  38. package/cjs/core/utils/functions/focusable.js +6 -2
  39. package/cjs/core/utils/hooks/useIntersection.d.ts +4 -3
  40. package/cjs/core/utils/hooks/useIntersection.js +10 -5
  41. package/cjs/core/utils/hooks/useOverflow.d.ts +3 -2
  42. package/cjs/core/utils/hooks/useOverflow.js +24 -21
  43. package/esm/core/ButtonGroup/ButtonGroup.d.ts +6 -1
  44. package/esm/core/ButtonGroup/ButtonGroup.js +6 -3
  45. package/esm/core/Checkbox/Checkbox.d.ts +13 -0
  46. package/esm/core/Checkbox/Checkbox.js +15 -22
  47. package/esm/core/ColorPicker/ColorSwatch.d.ts +1 -1
  48. package/esm/core/ComboBox/ComboBox.d.ts +17 -1
  49. package/esm/core/ComboBox/ComboBox.js +56 -21
  50. package/esm/core/ExpandableBlock/ExpandableBlock.d.ts +6 -0
  51. package/esm/core/ExpandableBlock/ExpandableBlock.js +3 -2
  52. package/esm/core/Footer/Footer.d.ts +14 -2
  53. package/esm/core/Footer/Footer.js +40 -17
  54. package/esm/core/InputGroup/InputGroup.js +12 -2
  55. package/esm/core/LabeledSelect/LabeledSelect.js +10 -4
  56. package/esm/core/Menu/Menu.js +3 -3
  57. package/esm/core/Radio/Radio.d.ts +13 -0
  58. package/esm/core/Radio/Radio.js +7 -8
  59. package/esm/core/Slider/Slider.js +10 -1
  60. package/esm/core/StatusMessage/StatusMessage.d.ts +24 -0
  61. package/esm/core/StatusMessage/StatusMessage.js +32 -0
  62. package/esm/core/StatusMessage/index.d.ts +4 -0
  63. package/esm/core/StatusMessage/index.js +6 -0
  64. package/esm/core/Table/hooks/useSelectionCell.js +1 -2
  65. package/esm/core/Tree/Tree.d.ts +123 -0
  66. package/esm/core/Tree/Tree.js +170 -0
  67. package/esm/core/Tree/TreeContext.d.ts +25 -0
  68. package/esm/core/Tree/TreeContext.js +13 -0
  69. package/esm/core/Tree/TreeNode.d.ts +87 -0
  70. package/esm/core/Tree/TreeNode.js +162 -0
  71. package/esm/core/Tree/TreeNodeExpander.d.ts +8 -0
  72. package/esm/core/Tree/TreeNodeExpander.js +39 -0
  73. package/esm/core/Tree/index.d.ts +6 -0
  74. package/esm/core/Tree/index.js +7 -0
  75. package/esm/core/index.d.ts +4 -0
  76. package/esm/core/index.js +2 -0
  77. package/esm/core/utils/components/InputContainer.d.ts +1 -0
  78. package/esm/core/utils/components/InputContainer.js +8 -7
  79. package/esm/core/utils/functions/focusable.js +6 -2
  80. package/esm/core/utils/hooks/useIntersection.d.ts +4 -3
  81. package/esm/core/utils/hooks/useIntersection.js +10 -5
  82. package/esm/core/utils/hooks/useOverflow.d.ts +3 -2
  83. package/esm/core/utils/hooks/useOverflow.js +24 -21
  84. package/package.json +15 -14
@@ -0,0 +1,169 @@
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.TreeNode = 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 utils_1 = require("../utils");
35
+ require("@itwin/itwinui-css/css/tree.css");
36
+ var classnames_1 = __importDefault(require("classnames"));
37
+ var TreeNodeExpander_1 = require("./TreeNodeExpander");
38
+ var TreeContext_1 = require("./TreeContext");
39
+ /**
40
+ * `TreeNode` component to display node content within a `Tree`.
41
+ * Must be used inside `Tree` component to correctly set node `depth` and `subNodes`.
42
+ * @example
43
+ <TreeNode
44
+ nodeId={props.nodeId}
45
+ label={props.node.label}
46
+ sublabel={props.node.sublabel}
47
+ onExpanded={onExpanded}
48
+ onSelected={onSelectedNodeChange}
49
+ isDisabled={props.isDisabled}
50
+ isExpanded={props.isExpanded}
51
+ isSelected={props.isSelected}
52
+ checkbox={
53
+ <Checkbox variant='eyeball' disabled={props.isDisabled} />
54
+ }
55
+ icon={<SvgPlaceholder />}
56
+ />
57
+ */
58
+ var TreeNode = function (props) {
59
+ 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"]);
60
+ (0, utils_1.useTheme)();
61
+ var _e = (0, TreeContext_1.useTreeContext)(), nodeDepth = _e.nodeDepth, _f = _e.subNodeIds, subNodeIds = _f === void 0 ? [] : _f, parentNodeId = _e.parentNodeId, groupSize = _e.groupSize, indexInGroup = _e.indexInGroup;
62
+ var _g = react_1.default.useState(false), isFocused = _g[0], setIsFocused = _g[1];
63
+ var nodeRef = react_1.default.useRef(null);
64
+ var styleDepth = react_1.default.useMemo(function () {
65
+ var _a, _b, _c;
66
+ return ((_c = (_b = (_a = (0, utils_1.getWindow)()) === null || _a === void 0 ? void 0 : _a.CSS) === null || _b === void 0 ? void 0 : _b.supports) === null || _c === void 0 ? void 0 : _c.call(_b, "--level: " + nodeDepth))
67
+ ? { '--level': nodeDepth }
68
+ : { marginLeft: nodeDepth ? nodeDepth * 28 : 0 };
69
+ }, [nodeDepth]);
70
+ var onKeyDown = function (event) {
71
+ var _a, _b, _c, _d, _e, _f, _g;
72
+ var isNodeFocused = nodeRef.current === ((_a = nodeRef.current) === null || _a === void 0 ? void 0 : _a.ownerDocument.activeElement);
73
+ switch (event.key) {
74
+ case 'ArrowLeft': {
75
+ event.preventDefault();
76
+ if (isNodeFocused) {
77
+ if (isExpanded) {
78
+ onExpanded(nodeId, false);
79
+ break;
80
+ }
81
+ if (parentNodeId) {
82
+ var parentNode = (_b = nodeRef.current) === null || _b === void 0 ? void 0 : _b.ownerDocument.querySelector("#" + parentNodeId);
83
+ parentNode === null || parentNode === void 0 ? void 0 : parentNode.focus();
84
+ break;
85
+ }
86
+ // If it is top level node (doesn't have parent node), then do nothing.
87
+ break;
88
+ }
89
+ var focusableElements = (0, utils_1.getFocusableElements)(nodeRef.current);
90
+ var currentIndex = focusableElements.indexOf((_c = nodeRef.current) === null || _c === void 0 ? void 0 : _c.ownerDocument.activeElement);
91
+ if (currentIndex === 0) {
92
+ (_d = nodeRef.current) === null || _d === void 0 ? void 0 : _d.focus();
93
+ }
94
+ else {
95
+ (_e = focusableElements[currentIndex - 1]) === null || _e === void 0 ? void 0 : _e.focus();
96
+ }
97
+ break;
98
+ }
99
+ case 'ArrowRight': {
100
+ event.preventDefault();
101
+ var focusableElements = (0, utils_1.getFocusableElements)(nodeRef.current);
102
+ if (isNodeFocused) {
103
+ if (!isExpanded && hasSubNodes) {
104
+ onExpanded(nodeId, true);
105
+ break;
106
+ }
107
+ (_f = focusableElements[0]) === null || _f === void 0 ? void 0 : _f.focus();
108
+ break;
109
+ }
110
+ var currentIndex = focusableElements.indexOf((_g = nodeRef.current) === null || _g === void 0 ? void 0 : _g.ownerDocument.activeElement);
111
+ if (currentIndex < focusableElements.length - 1) {
112
+ focusableElements[currentIndex + 1].focus();
113
+ break;
114
+ }
115
+ break;
116
+ }
117
+ case ' ':
118
+ case 'Spacebar':
119
+ case 'Enter': {
120
+ // Ignore if it is called on the element inside, e.g. checkbox or expander
121
+ if (event.target !== nodeRef.current) {
122
+ break;
123
+ }
124
+ event.preventDefault();
125
+ if (!isDisabled) {
126
+ onSelected === null || onSelected === void 0 ? void 0 : onSelected(nodeId, !isSelected);
127
+ }
128
+ break;
129
+ }
130
+ default:
131
+ break;
132
+ }
133
+ };
134
+ var onExpanderClick = react_1.default.useCallback(function (event) {
135
+ onExpanded(nodeId, !isExpanded);
136
+ event.stopPropagation();
137
+ }, [isExpanded, nodeId, onExpanded]);
138
+ return (react_1.default.createElement("li", __assign({ role: 'treeitem', className: (0, classnames_1.default)('iui-tree-item', className), id: nodeId, "aria-expanded": hasSubNodes ? isExpanded : undefined, "aria-disabled": isDisabled, "aria-selected": isSelected, "aria-level": nodeDepth + 1, "aria-setsize": groupSize, "aria-posinset": indexInGroup + 1, tabIndex: -1, onFocus: function (e) {
139
+ setIsFocused(true);
140
+ // Prevents from triggering onFocus on parent Tree
141
+ e.stopPropagation();
142
+ }, onBlur: function () {
143
+ setIsFocused(false);
144
+ }, ref: nodeRef, onKeyDown: onKeyDown }, rest),
145
+ react_1.default.createElement("div", { className: (0, classnames_1.default)('iui-tree-node', {
146
+ 'iui-active': isSelected,
147
+ 'iui-disabled': isDisabled,
148
+ }), style: styleDepth, onClick: function () { return !isDisabled && (onSelected === null || onSelected === void 0 ? void 0 : onSelected(nodeId, !isSelected)); } },
149
+ checkbox && react_1.default.isValidElement(checkbox)
150
+ ? react_1.default.cloneElement(checkbox, {
151
+ className: (0, classnames_1.default)('iui-tree-node-checkbox', checkbox.props.className),
152
+ tabIndex: isFocused ? 0 : -1,
153
+ })
154
+ : checkbox,
155
+ react_1.default.createElement("div", { className: 'iui-tree-node-content' },
156
+ hasSubNodes && expander,
157
+ hasSubNodes && !expander && (react_1.default.createElement(TreeNodeExpander_1.TreeNodeExpander, { isExpanded: isExpanded, disabled: isDisabled, onClick: onExpanderClick, tabIndex: isFocused ? 0 : -1 })),
158
+ icon &&
159
+ react_1.default.cloneElement(icon, {
160
+ className: (0, classnames_1.default)('iui-tree-node-content-icon', icon.props.className),
161
+ }),
162
+ react_1.default.createElement("span", { className: 'iui-tree-node-content-label' },
163
+ react_1.default.createElement("div", { className: 'iui-tree-node-content-title' }, label),
164
+ sublabel && (react_1.default.createElement("div", { className: 'iui-tree-node-content-caption' }, sublabel))),
165
+ children)),
166
+ hasSubNodes && (react_1.default.createElement("ul", { className: 'iui-sub-tree', role: 'group', "aria-owns": subNodeIds.join(',') }))));
167
+ };
168
+ exports.TreeNode = TreeNode;
169
+ exports.default = exports.TreeNode;
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { IconButtonProps } from '../Buttons/IconButton';
3
+ import '@itwin/itwinui-css/css/tree.css';
4
+ export declare type TreeNodeExpanderProps = {
5
+ isExpanded?: boolean;
6
+ } & IconButtonProps;
7
+ export declare const TreeNodeExpander: (props: TreeNodeExpanderProps) => JSX.Element;
8
+ export default TreeNodeExpander;
@@ -0,0 +1,46 @@
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.TreeNodeExpander = 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 ChevronRight_1 = __importDefault(require("@itwin/itwinui-icons-react/cjs/icons/ChevronRight"));
36
+ var IconButton_1 = require("../Buttons/IconButton");
37
+ require("@itwin/itwinui-css/css/tree.css");
38
+ var TreeNodeExpander = function (props) {
39
+ var isExpanded = props.isExpanded, rest = __rest(props, ["isExpanded"]);
40
+ return (react_1.default.createElement(IconButton_1.IconButton, __assign({ styleType: 'borderless', size: 'small', "aria-label": isExpanded ? 'Collapse' : 'Expand' }, rest),
41
+ react_1.default.createElement(ChevronRight_1.default, { className: (0, classnames_1.default)('iui-tree-node-content-expander-icon', {
42
+ 'iui-tree-node-content-expander-icon-expanded': isExpanded,
43
+ }) })));
44
+ };
45
+ exports.TreeNodeExpander = TreeNodeExpander;
46
+ exports.default = exports.TreeNodeExpander;
@@ -0,0 +1,6 @@
1
+ export { Tree } from './Tree';
2
+ export type { TreeProps, NodeData, NodeRenderProps } from './Tree';
3
+ export { TreeNode } from './TreeNode';
4
+ export type { TreeNodeProps } from './TreeNode';
5
+ export { TreeNodeExpander } from './TreeNodeExpander';
6
+ export type { TreeNodeExpanderProps } from './TreeNodeExpander';
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TreeNodeExpander = exports.TreeNode = exports.Tree = void 0;
4
+ /*---------------------------------------------------------------------------------------------
5
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
+ * See LICENSE.md in the project root for license terms and full copyright notice.
7
+ *--------------------------------------------------------------------------------------------*/
8
+ var Tree_1 = require("./Tree");
9
+ Object.defineProperty(exports, "Tree", { enumerable: true, get: function () { return Tree_1.Tree; } });
10
+ var TreeNode_1 = require("./TreeNode");
11
+ Object.defineProperty(exports, "TreeNode", { enumerable: true, get: function () { return TreeNode_1.TreeNode; } });
12
+ var TreeNodeExpander_1 = require("./TreeNodeExpander");
13
+ Object.defineProperty(exports, "TreeNodeExpander", { enumerable: true, get: function () { return TreeNodeExpander_1.TreeNodeExpander; } });
@@ -62,6 +62,8 @@ export { SideNavigation, SidenavButton, SidenavSubmenu, SidenavSubmenuHeader, }
62
62
  export type { SideNavigationProps, SidenavButtonProps, SidenavSubmenuProps, SidenavSubmenuHeaderProps, } from './SideNavigation';
63
63
  export { Slider } from './Slider';
64
64
  export type { SliderProps } from './Slider';
65
+ export { StatusMessage } from './StatusMessage';
66
+ export type { StatusMessageProps } from './StatusMessage';
65
67
  export { Table, tableFilters, FilterButtonBar, DefaultCell, EditableCell, TablePaginator, } from './Table';
66
68
  export type { TableProps, TableFilterProps, TableFilterValue, DateRangeFilterOptions, FilterButtonBarProps, DefaultCellProps, EditableCellProps, TablePaginatorProps, TablePaginatorRendererProps, } from './Table';
67
69
  export { Tag, TagContainer } from './Tag';
@@ -80,6 +82,8 @@ export { ToggleSwitch } from './ToggleSwitch';
80
82
  export type { ToggleSwitchProps } from './ToggleSwitch';
81
83
  export { Tooltip } from './Tooltip';
82
84
  export type { TooltipProps } from './Tooltip';
85
+ export { Tree, TreeNode, TreeNodeExpander } from './Tree';
86
+ export type { TreeProps, TreeNodeProps, TreeNodeExpanderProps, NodeData, NodeRenderProps, } from './Tree';
83
87
  export { Anchor, Body, Headline, Leading, Small, Subheading, Title, Blockquote, Code, Kbd, KbdKeys, Text, } from './Typography';
84
88
  export type { BodyProps, HeadlineProps, LeadingProps, SmallProps, SubheadingProps, TitleProps, BlockquoteProps, CodeProps, KbdProps, TextProps, } from './Typography';
85
89
  export { UserIcon } from './UserIcon';
package/cjs/core/index.js CHANGED
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ModalButtonBar = 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.ButtonGroup = exports.SplitButton = exports.IdeasButton = exports.IconButton = exports.DropdownButton = exports.Button = exports.Breadcrumbs = exports.Badge = exports.Alert = void 0;
7
- exports.MiddleTextTruncation = exports.ColorValue = exports.useTheme = exports.getUserColor = exports.Wizard = exports.UserIconGroup = 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.Tooltip = exports.ToggleSwitch = exports.ThemeProvider = exports.toaster = exports.TimePicker = exports.Tile = exports.Textarea = exports.TagContainer = exports.Tag = exports.TablePaginator = exports.EditableCell = exports.DefaultCell = exports.FilterButtonBar = exports.tableFilters = exports.Table = exports.Slider = exports.SidenavSubmenuHeader = exports.SidenavSubmenu = exports.SidenavButton = exports.SideNavigation = exports.Select = exports.RadioTileGroup = exports.RadioTile = exports.Radio = exports.ProgressRadial = exports.ProgressLinear = void 0;
7
+ exports.MiddleTextTruncation = exports.ColorValue = exports.useTheme = exports.getUserColor = exports.Wizard = exports.UserIconGroup = 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.TablePaginator = exports.EditableCell = exports.DefaultCell = exports.FilterButtonBar = exports.tableFilters = exports.Table = exports.StatusMessage = exports.Slider = exports.SidenavSubmenuHeader = exports.SidenavSubmenu = exports.SidenavButton = exports.SideNavigation = exports.Select = exports.RadioTileGroup = exports.RadioTile = exports.Radio = exports.ProgressRadial = exports.ProgressLinear = void 0;
8
8
  /*---------------------------------------------------------------------------------------------
9
9
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
10
10
  * See LICENSE.md in the project root for license terms and full copyright notice.
@@ -102,6 +102,8 @@ Object.defineProperty(exports, "SidenavSubmenu", { enumerable: true, get: functi
102
102
  Object.defineProperty(exports, "SidenavSubmenuHeader", { enumerable: true, get: function () { return SideNavigation_1.SidenavSubmenuHeader; } });
103
103
  var Slider_1 = require("./Slider");
104
104
  Object.defineProperty(exports, "Slider", { enumerable: true, get: function () { return Slider_1.Slider; } });
105
+ var StatusMessage_1 = require("./StatusMessage");
106
+ Object.defineProperty(exports, "StatusMessage", { enumerable: true, get: function () { return StatusMessage_1.StatusMessage; } });
105
107
  var Table_1 = require("./Table");
106
108
  Object.defineProperty(exports, "Table", { enumerable: true, get: function () { return Table_1.Table; } });
107
109
  Object.defineProperty(exports, "tableFilters", { enumerable: true, get: function () { return Table_1.tableFilters; } });
@@ -126,6 +128,10 @@ var ToggleSwitch_1 = require("./ToggleSwitch");
126
128
  Object.defineProperty(exports, "ToggleSwitch", { enumerable: true, get: function () { return ToggleSwitch_1.ToggleSwitch; } });
127
129
  var Tooltip_1 = require("./Tooltip");
128
130
  Object.defineProperty(exports, "Tooltip", { enumerable: true, get: function () { return Tooltip_1.Tooltip; } });
131
+ var Tree_1 = require("./Tree");
132
+ Object.defineProperty(exports, "Tree", { enumerable: true, get: function () { return Tree_1.Tree; } });
133
+ Object.defineProperty(exports, "TreeNode", { enumerable: true, get: function () { return Tree_1.TreeNode; } });
134
+ Object.defineProperty(exports, "TreeNodeExpander", { enumerable: true, get: function () { return Tree_1.TreeNodeExpander; } });
129
135
  var Typography_1 = require("./Typography");
130
136
  Object.defineProperty(exports, "Anchor", { enumerable: true, get: function () { return Typography_1.Anchor; } });
131
137
  Object.defineProperty(exports, "Body", { enumerable: true, get: function () { return Typography_1.Body; } });
@@ -9,6 +9,7 @@ export declare type InputContainerProps<T extends React.ElementType = 'div'> = {
9
9
  icon?: JSX.Element;
10
10
  isLabelInline?: boolean;
11
11
  isIconInline?: boolean;
12
+ statusMessage?: React.ReactNode;
12
13
  } & React.ComponentPropsWithoutRef<T>;
13
14
  /**
14
15
  * Input container to wrap inputs with label, and add optional message and icon.
@@ -39,23 +39,24 @@ var classnames_1 = __importDefault(require("classnames"));
39
39
  var InputContainer = function (props) {
40
40
  var _a;
41
41
  var _b;
42
- var _c = props.as, Element = _c === void 0 ? 'div' : _c, label = props.label, disabled = props.disabled, required = props.required, status = props.status, message = props.message, icon = props.icon, isLabelInline = props.isLabelInline, isIconInline = props.isIconInline, children = props.children, className = props.className, style = props.style, rest = __rest(props, ["as", "label", "disabled", "required", "status", "message", "icon", "isLabelInline", "isIconInline", "children", "className", "style"]);
42
+ var _c = props.as, Element = _c === void 0 ? 'div' : _c, label = props.label, disabled = props.disabled, required = props.required, status = props.status, message = props.message, icon = props.icon, isLabelInline = props.isLabelInline, isIconInline = props.isIconInline, children = props.children, className = props.className, style = props.style, statusMessage = props.statusMessage, rest = __rest(props, ["as", "label", "disabled", "required", "status", "message", "icon", "isLabelInline", "isIconInline", "children", "className", "style", "statusMessage"]);
43
43
  return (react_1.default.createElement(Element, __assign({ className: (0, classnames_1.default)('iui-input-container', (_a = {
44
44
  'iui-disabled': disabled
45
45
  },
46
46
  _a["iui-" + status] = !!status,
47
47
  _a['iui-inline-label'] = isLabelInline,
48
48
  _a['iui-inline-icon'] = isIconInline,
49
- _a['iui-with-message'] = !!message && !isLabelInline,
49
+ _a['iui-with-message'] = (!!message || !!icon || !!statusMessage) && !isLabelInline,
50
50
  _a), className), style: style }, rest),
51
51
  label && (react_1.default.createElement("div", { className: (0, classnames_1.default)('iui-label', {
52
52
  'iui-required': required,
53
53
  }) }, label)),
54
54
  children,
55
- icon &&
56
- react_1.default.cloneElement(icon, {
57
- className: (0, classnames_1.default)('iui-input-icon', (_b = icon.props) === null || _b === void 0 ? void 0 : _b.className),
58
- }),
59
- message && !isLabelInline && (react_1.default.createElement("div", { className: 'iui-message' }, message))));
55
+ statusMessage ? (statusMessage) : (react_1.default.createElement(react_1.default.Fragment, null,
56
+ icon &&
57
+ react_1.default.cloneElement(icon, {
58
+ className: (0, classnames_1.default)('iui-input-icon', (_b = icon.props) === null || _b === void 0 ? void 0 : _b.className),
59
+ }),
60
+ message && !isLabelInline && (react_1.default.createElement("div", { className: 'iui-message' }, message))))));
60
61
  };
61
62
  exports.InputContainer = InputContainer;
@@ -15,7 +15,9 @@ var getTabbableElements = function (container) {
15
15
  }
16
16
  var elements = container.querySelectorAll(tabbableElementsSelector);
17
17
  return Array.from(elements).filter(function (el) {
18
- return !el.hasAttribute('disabled') && !el.classList.contains('iui-disabled');
18
+ return !el.hasAttribute('disabled') &&
19
+ !el.classList.contains('iui-disabled') &&
20
+ el.getAttribute('aria-disabled') !== 'true';
19
21
  });
20
22
  };
21
23
  exports.getTabbableElements = getTabbableElements;
@@ -28,7 +30,9 @@ var getFocusableElements = function (container) {
28
30
  }
29
31
  var elements = container.querySelectorAll(tabbableElementsSelector + ", [tabindex=\"-1\"]");
30
32
  return Array.from(elements).filter(function (el) {
31
- return !el.hasAttribute('disabled') && !el.classList.contains('iui-disabled');
33
+ return !el.hasAttribute('disabled') &&
34
+ !el.classList.contains('iui-disabled') &&
35
+ el.getAttribute('aria-disabled') !== 'true';
32
36
  });
33
37
  };
34
38
  exports.getFocusableElements = getFocusableElements;
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Hook that uses `IntersectionObserver` to trigger `onIntersect` callback when element is in viewport.
3
- * Callback is called only once.
4
- * Hook returns a function that you need to use to set a reference of the element you want to observe.
3
+ * Callback is called only once by default (can be changed using the `once` parameter).
4
+ * @returns a callback ref that needs to be set on the element you want to observe.
5
+ * @private
5
6
  * @example
6
7
  * const onIntersection = React.useCallback(() => {
7
8
  * console.log('Element is in viewport!');
@@ -9,4 +10,4 @@
9
10
  * const ref = useIntersection(onIntersection);
10
11
  * return (<div ref={ref}>One of many elements</div>);
11
12
  */
12
- export declare const useIntersection: (onIntersect: () => void, options?: IntersectionObserverInit) => (node: HTMLElement | null) => void;
13
+ export declare const useIntersection: (onIntersect: () => void, options?: IntersectionObserverInit, once?: boolean) => (node: HTMLElement | null) => void;
@@ -12,8 +12,9 @@ var react_1 = __importDefault(require("react"));
12
12
  var dom_1 = require("../functions/dom");
13
13
  /**
14
14
  * Hook that uses `IntersectionObserver` to trigger `onIntersect` callback when element is in viewport.
15
- * Callback is called only once.
16
- * Hook returns a function that you need to use to set a reference of the element you want to observe.
15
+ * Callback is called only once by default (can be changed using the `once` parameter).
16
+ * @returns a callback ref that needs to be set on the element you want to observe.
17
+ * @private
17
18
  * @example
18
19
  * const onIntersection = React.useCallback(() => {
19
20
  * console.log('Element is in viewport!');
@@ -21,8 +22,9 @@ var dom_1 = require("../functions/dom");
21
22
  * const ref = useIntersection(onIntersection);
22
23
  * return (<div ref={ref}>One of many elements</div>);
23
24
  */
24
- var useIntersection = function (onIntersect, options) {
25
+ var useIntersection = function (onIntersect, options, once) {
25
26
  if (options === void 0) { options = {}; }
27
+ if (once === void 0) { once = true; }
26
28
  var root = options.root, rootMargin = options.rootMargin, threshold = options.threshold;
27
29
  var observer = react_1.default.useRef();
28
30
  var setRef = react_1.default.useCallback(function (node) {
@@ -39,12 +41,15 @@ var useIntersection = function (onIntersect, options) {
39
41
  observer.current = new IntersectionObserver(function (_a, obs) {
40
42
  var entry = _a[0];
41
43
  if (entry.isIntersecting) {
42
- obs.disconnect();
44
+ if (once) {
45
+ obs.disconnect();
46
+ }
43
47
  onIntersect();
44
48
  }
45
49
  }, { root: root, rootMargin: rootMargin, threshold: threshold });
46
50
  observer.current.observe(node);
47
- }, [onIntersect, root, rootMargin, threshold]);
51
+ }, [onIntersect, once, root, rootMargin, threshold]);
52
+ react_1.default.useEffect(function () { return function () { var _a; return (_a = observer.current) === null || _a === void 0 ? void 0 : _a.disconnect(); }; }, []);
48
53
  return setRef;
49
54
  };
50
55
  exports.useIntersection = useIntersection;
@@ -1,13 +1,14 @@
1
1
  import React from 'react';
2
2
  /**
3
3
  * Hook that observes the size of an element and returns the number of items
4
- * that should be visible based on the width of the container element.
4
+ * that should be visible based on the size of the container element.
5
5
  *
6
6
  * The returned number should be used to render the element with fewer items.
7
7
  *
8
8
  * @private
9
9
  * @param items Items that this element contains.
10
10
  * @param disabled Set to true to disconnect the observer.
11
+ * @param dimension 'horizontal' (default) or 'vertical'
11
12
  * @returns [callback ref to set on container, stateful count of visible items]
12
13
  *
13
14
  * @example
@@ -20,4 +21,4 @@ import React from 'react';
20
21
  * </div>
21
22
  * );
22
23
  */
23
- export declare const useOverflow: <T extends HTMLElement>(items: React.ReactNode[] | string, disabled?: boolean) => readonly [(instance: T | null) => void, number];
24
+ export declare const useOverflow: <T extends HTMLElement>(items: React.ReactNode[] | string, disabled?: boolean, orientation?: 'horizontal' | 'vertical') => readonly [(instance: T | null) => void, number];
@@ -14,13 +14,14 @@ var useResizeObserver_1 = require("./useResizeObserver");
14
14
  var STARTING_MAX_ITEMS_COUNT = 20;
15
15
  /**
16
16
  * Hook that observes the size of an element and returns the number of items
17
- * that should be visible based on the width of the container element.
17
+ * that should be visible based on the size of the container element.
18
18
  *
19
19
  * The returned number should be used to render the element with fewer items.
20
20
  *
21
21
  * @private
22
22
  * @param items Items that this element contains.
23
23
  * @param disabled Set to true to disconnect the observer.
24
+ * @param dimension 'horizontal' (default) or 'vertical'
24
25
  * @returns [callback ref to set on container, stateful count of visible items]
25
26
  *
26
27
  * @example
@@ -33,20 +34,21 @@ var STARTING_MAX_ITEMS_COUNT = 20;
33
34
  * </div>
34
35
  * );
35
36
  */
36
- var useOverflow = function (items, disabled) {
37
+ var useOverflow = function (items, disabled, orientation) {
37
38
  if (disabled === void 0) { disabled = false; }
39
+ if (orientation === void 0) { orientation = 'horizontal'; }
38
40
  var containerRef = react_1.default.useRef(null);
39
41
  var _a = react_1.default.useState(function () {
40
42
  return disabled ? items.length : Math.min(items.length, STARTING_MAX_ITEMS_COUNT);
41
43
  }), visibleCount = _a[0], setVisibleCount = _a[1];
42
44
  var needsFullRerender = react_1.default.useRef(true);
43
- var _b = react_1.default.useState(0), containerWidth = _b[0], setContainerWidth = _b[1];
44
- var previousContainerWidth = react_1.default.useRef(0);
45
- var updateContainerWidth = react_1.default.useCallback(function (_a) {
46
- var width = _a.width;
47
- return setContainerWidth(width);
48
- }, []);
49
- var _c = (0, useResizeObserver_1.useResizeObserver)(updateContainerWidth), resizeRef = _c[0], observer = _c[1];
45
+ var _b = react_1.default.useState(0), containerSize = _b[0], setContainerSize = _b[1];
46
+ var previousContainerSize = react_1.default.useRef(0);
47
+ var updateContainerSize = react_1.default.useCallback(function (_a) {
48
+ var width = _a.width, height = _a.height;
49
+ return setContainerSize(orientation === 'horizontal' ? width : height);
50
+ }, [orientation]);
51
+ var _c = (0, useResizeObserver_1.useResizeObserver)(updateContainerSize), resizeRef = _c[0], observer = _c[1];
50
52
  var resizeObserverRef = react_1.default.useRef(observer);
51
53
  react_1.default.useLayoutEffect(function () {
52
54
  if (disabled) {
@@ -56,7 +58,7 @@ var useOverflow = function (items, disabled) {
56
58
  setVisibleCount(Math.min(items.length, STARTING_MAX_ITEMS_COUNT));
57
59
  needsFullRerender.current = true;
58
60
  }
59
- }, [containerWidth, disabled, items]);
61
+ }, [containerSize, disabled, items]);
60
62
  var mergedRefs = (0, useMergedRefs_1.useMergedRefs)(containerRef, resizeRef);
61
63
  react_1.default.useLayoutEffect(function () {
62
64
  var _a;
@@ -64,25 +66,26 @@ var useOverflow = function (items, disabled) {
64
66
  (_a = resizeObserverRef.current) === null || _a === void 0 ? void 0 : _a.disconnect();
65
67
  return;
66
68
  }
67
- var availableWidth = containerRef.current.offsetWidth;
68
- var requiredWidth = containerRef.current.scrollWidth;
69
- if (availableWidth < requiredWidth) {
70
- var avgItemWidth = requiredWidth / visibleCount;
71
- var visibleItems = Math.floor(availableWidth / avgItemWidth);
69
+ var dimension = orientation === 'horizontal' ? 'Width' : 'Height';
70
+ var availableSize = containerRef.current["offset" + dimension];
71
+ var requiredSize = containerRef.current["scroll" + dimension];
72
+ if (availableSize < requiredSize) {
73
+ var avgItemSize = requiredSize / visibleCount;
74
+ var visibleItems = Math.floor(availableSize / avgItemSize);
72
75
  setVisibleCount(visibleItems);
73
76
  }
74
77
  else if (needsFullRerender.current) {
75
- var childrenWidth = Array.from(containerRef.current.children).reduce(function (sum, child) { return sum + child.offsetWidth; }, 0);
76
- var avgItemWidth = childrenWidth / visibleCount;
77
- var visibleItems = Math.floor(availableWidth / avgItemWidth);
78
+ var childrenSize = Array.from(containerRef.current.children).reduce(function (sum, child) { return sum + child["offset" + dimension]; }, 0);
79
+ var avgItemSize = childrenSize / visibleCount;
80
+ var visibleItems = Math.floor(availableSize / avgItemSize);
78
81
  // Doubling the visible items to overflow the container. Just to be safe.
79
82
  setVisibleCount(Math.min(items.length, visibleItems * 2));
80
83
  }
81
84
  needsFullRerender.current = false;
82
- }, [containerWidth, visibleCount, disabled, items.length]);
85
+ }, [containerSize, visibleCount, disabled, items.length, orientation]);
83
86
  react_1.default.useLayoutEffect(function () {
84
- previousContainerWidth.current = containerWidth;
85
- }, [containerWidth]);
87
+ previousContainerSize.current = containerSize;
88
+ }, [containerSize]);
86
89
  return [mergedRefs, visibleCount];
87
90
  };
88
91
  exports.useOverflow = useOverflow;
@@ -20,6 +20,11 @@ export declare type ButtonGroupProps = {
20
20
  * @default 'end'
21
21
  */
22
22
  overflowPlacement?: 'start' | 'end';
23
+ /**
24
+ * Should the buttons be placed in a horizontal or vertical layout?
25
+ * @default 'horizontal'
26
+ */
27
+ orientation?: 'horizontal' | 'vertical';
23
28
  } & React.ComponentPropsWithRef<'div'>;
24
29
  /**
25
30
  * Group buttons together for common actions.
@@ -49,5 +54,5 @@ export declare type ButtonGroupProps = {
49
54
  * {buttons}
50
55
  * </ButtonGroup>
51
56
  */
52
- export declare const ButtonGroup: React.ForwardRefExoticComponent<Pick<ButtonGroupProps, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "overflowButton" | "overflowPlacement"> & React.RefAttributes<HTMLDivElement>>;
57
+ export declare const ButtonGroup: React.ForwardRefExoticComponent<Pick<ButtonGroupProps, "orientation" | "key" | keyof React.HTMLAttributes<HTMLDivElement> | "overflowButton" | "overflowPlacement"> & React.RefAttributes<HTMLDivElement>>;
53
58
  export default ButtonGroup;
@@ -57,12 +57,15 @@ import '@itwin/itwinui-css/css/button.css';
57
57
  * </ButtonGroup>
58
58
  */
59
59
  export var ButtonGroup = React.forwardRef(function (props, ref) {
60
- var children = props.children, className = props.className, style = props.style, overflowButton = props.overflowButton, _a = props.overflowPlacement, overflowPlacement = _a === void 0 ? 'end' : _a, rest = __rest(props, ["children", "className", "style", "overflowButton", "overflowPlacement"]);
60
+ var children = props.children, className = props.className, overflowButton = props.overflowButton, _a = props.overflowPlacement, overflowPlacement = _a === void 0 ? 'end' : _a, _b = props.orientation, orientation = _b === void 0 ? 'horizontal' : _b, rest = __rest(props, ["children", "className", "overflowButton", "overflowPlacement", "orientation"]);
61
61
  var items = React.useMemo(function () { var _a; return (_a = React.Children.map(children, function (child) { return React.createElement("div", null, child); })) !== null && _a !== void 0 ? _a : []; }, [children]);
62
62
  useTheme();
63
- var _b = useOverflow(items, !overflowButton), overflowRef = _b[0], visibleCount = _b[1];
63
+ var _c = useOverflow(items, !overflowButton, orientation), overflowRef = _c[0], visibleCount = _c[1];
64
64
  var refs = useMergedRefs(overflowRef, ref);
65
- return (React.createElement("div", __assign({ className: cx('iui-button-group', className), style: __assign(__assign({}, (!!overflowButton && { width: '100%' })), style), ref: refs }, rest), !!overflowButton && visibleCount < items.length ? (React.createElement(React.Fragment, null,
65
+ return (React.createElement("div", __assign({ className: cx({
66
+ 'iui-button-group': orientation === 'horizontal',
67
+ 'iui-button-group-vertical': orientation === 'vertical',
68
+ }, className), "aria-orientation": orientation, ref: refs }, rest), !!overflowButton && visibleCount < items.length ? (React.createElement(React.Fragment, null,
66
69
  overflowButton && overflowPlacement === 'start' && (React.createElement("div", null, overflowButton(visibleCount))),
67
70
  items.slice(0, visibleCount - 1),
68
71
  overflowButton && overflowPlacement === 'end' && (React.createElement("div", null, overflowButton(visibleCount))))) : (items)));
@@ -30,16 +30,23 @@ export declare type CheckboxProps = {
30
30
  isLoading?: boolean;
31
31
  /**
32
32
  * Custom CSS class name for the checkmark element.
33
+ *
34
+ * @deprecated As of 1.32.0, this is applied on the actual checkbox `<input>` element.
35
+ * The checkmark has been moved into a pseudo-element.
33
36
  */
34
37
  checkmarkClassName?: string;
35
38
  /**
36
39
  * Custom CSS Style for the checkmark element.
40
+ *
41
+ * @deprecated As of 1.32.0, this is applied on the actual checkbox `<input>` element.
42
+ * The checkmark has been moved into a pseudo-element.
37
43
  */
38
44
  checkmarkStyle?: React.CSSProperties;
39
45
  } & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'>;
40
46
  /**
41
47
  * Simple input checkbox
42
48
  * @example
49
+ * <Checkbox />
43
50
  * <Checkbox label='Basic Checkbox' />
44
51
  * <Checkbox label='Disabled Checkbox' disabled />
45
52
  * <Checkbox label='Checked' checked />
@@ -78,10 +85,16 @@ export declare const Checkbox: React.ForwardRefExoticComponent<{
78
85
  isLoading?: boolean | undefined;
79
86
  /**
80
87
  * Custom CSS class name for the checkmark element.
88
+ *
89
+ * @deprecated As of 1.32.0, this is applied on the actual checkbox `<input>` element.
90
+ * The checkmark has been moved into a pseudo-element.
81
91
  */
82
92
  checkmarkClassName?: string | undefined;
83
93
  /**
84
94
  * Custom CSS Style for the checkmark element.
95
+ *
96
+ * @deprecated As of 1.32.0, this is applied on the actual checkbox `<input>` element.
97
+ * The checkmark has been moved into a pseudo-element.
85
98
  */
86
99
  checkmarkStyle?: React.CSSProperties | undefined;
87
100
  } & Omit<React.InputHTMLAttributes<HTMLInputElement>, "type"> & React.RefAttributes<HTMLInputElement>>;