@itwin/itwinui-react 3.0.0-dev.7 → 3.0.0-dev.9

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 (215) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/cjs/core/Alert/Alert.d.ts +20 -9
  3. package/cjs/core/Alert/Alert.js +48 -10
  4. package/cjs/core/ButtonGroup/ButtonGroup.js +41 -36
  5. package/cjs/core/Buttons/DropdownButton/DropdownButton.js +7 -19
  6. package/cjs/core/Buttons/IconButton/IconButton.js +27 -44
  7. package/cjs/core/Buttons/SplitButton/SplitButton.d.ts +4 -4
  8. package/cjs/core/Buttons/SplitButton/SplitButton.js +54 -29
  9. package/cjs/core/ColorPicker/ColorInputPanel.js +172 -231
  10. package/cjs/core/ComboBox/ComboBox.d.ts +2 -2
  11. package/cjs/core/ComboBox/ComboBox.js +33 -25
  12. package/cjs/core/ComboBox/ComboBoxEndIcon.js +3 -22
  13. package/cjs/core/ComboBox/ComboBoxInput.js +29 -21
  14. package/cjs/core/ComboBox/ComboBoxMenu.d.ts +2 -2
  15. package/cjs/core/ComboBox/ComboBoxMenu.js +73 -93
  16. package/cjs/core/ComboBox/ComboBoxMenuItem.d.ts +1 -1
  17. package/cjs/core/ComboBox/ComboBoxMenuItem.js +8 -6
  18. package/cjs/core/ComboBox/helpers.d.ts +5 -3
  19. package/cjs/core/DatePicker/DatePicker.d.ts +30 -8
  20. package/cjs/core/DatePicker/DatePicker.js +40 -5
  21. package/cjs/core/Dialog/Dialog.js +10 -16
  22. package/cjs/core/Dialog/DialogContext.d.ts +3 -4
  23. package/cjs/core/DropdownMenu/DropdownMenu.d.ts +6 -5
  24. package/cjs/core/DropdownMenu/DropdownMenu.js +59 -55
  25. package/cjs/core/ExpandableBlock/ExpandableBlock.d.ts +20 -14
  26. package/cjs/core/ExpandableBlock/ExpandableBlock.js +38 -15
  27. package/cjs/core/Header/HeaderDropdownButton.js +1 -2
  28. package/cjs/core/Header/HeaderSplitButton.js +2 -2
  29. package/cjs/core/Input/Input.d.ts +4 -0
  30. package/cjs/core/Input/Input.js +2 -1
  31. package/cjs/core/InputGrid/InputGrid.d.ts +25 -0
  32. package/cjs/core/InputGrid/InputGrid.js +39 -0
  33. package/cjs/core/InputGrid/index.d.ts +3 -0
  34. package/cjs/core/InputGrid/index.js +15 -0
  35. package/cjs/core/InputGroup/InputGroup.d.ts +13 -0
  36. package/cjs/core/InputGroup/InputGroup.js +35 -9
  37. package/cjs/core/InputWithDecorations/InputWithDecorations.d.ts +39 -0
  38. package/cjs/core/InputWithDecorations/InputWithDecorations.js +81 -0
  39. package/cjs/core/InputWithDecorations/index.d.ts +3 -0
  40. package/cjs/core/InputWithDecorations/index.js +15 -0
  41. package/cjs/core/Label/Label.d.ts +5 -0
  42. package/cjs/core/Label/Label.js +2 -0
  43. package/cjs/core/LabeledInput/LabeledInput.d.ts +22 -16
  44. package/cjs/core/LabeledInput/LabeledInput.js +52 -29
  45. package/cjs/core/LabeledSelect/LabeledSelect.d.ts +17 -7
  46. package/cjs/core/LabeledSelect/LabeledSelect.js +36 -17
  47. package/cjs/core/LabeledTextarea/LabeledTextarea.d.ts +15 -5
  48. package/cjs/core/LabeledTextarea/LabeledTextarea.js +12 -45
  49. package/cjs/core/Menu/Menu.d.ts +1 -1
  50. package/cjs/core/Menu/Menu.js +2 -2
  51. package/cjs/core/Menu/MenuDivider.d.ts +2 -1
  52. package/cjs/core/Menu/MenuDivider.js +1 -1
  53. package/cjs/core/Menu/MenuItem.d.ts +1 -1
  54. package/cjs/core/Menu/MenuItem.js +78 -55
  55. package/cjs/core/Menu/MenuItemSkeleton.d.ts +1 -1
  56. package/cjs/core/Menu/MenuItemSkeleton.js +0 -1
  57. package/cjs/core/SearchBox/SearchBox.js +1 -1
  58. package/cjs/core/Select/Select.d.ts +9 -5
  59. package/cjs/core/Select/Select.js +81 -99
  60. package/cjs/core/SideNavigation/SideNavigation.js +2 -0
  61. package/cjs/core/Slider/Thumb.js +1 -0
  62. package/cjs/core/StatusMessage/StatusMessage.d.ts +12 -2
  63. package/cjs/core/StatusMessage/StatusMessage.js +23 -9
  64. package/cjs/core/Table/SubRowExpander.js +2 -0
  65. package/cjs/core/Table/columns/actionColumn.js +3 -7
  66. package/cjs/core/Table/filters/DateRangeFilter/DatePickerInput.d.ts +6 -1
  67. package/cjs/core/Table/filters/DateRangeFilter/DatePickerInput.js +56 -33
  68. package/cjs/core/Table/filters/DateRangeFilter/DateRangeFilter.d.ts +2 -0
  69. package/cjs/core/Table/filters/DateRangeFilter/DateRangeFilter.js +2 -0
  70. package/cjs/core/Table/filters/FilterToggle.js +3 -2
  71. package/cjs/core/Textarea/Textarea.d.ts +7 -1
  72. package/cjs/core/Textarea/Textarea.js +6 -11
  73. package/cjs/core/ThemeProvider/ThemeProvider.js +1 -1
  74. package/cjs/core/Tile/Tile.d.ts +139 -15
  75. package/cjs/core/Tile/Tile.js +128 -38
  76. package/cjs/core/Toast/Toast.d.ts +12 -4
  77. package/cjs/core/Toast/Toast.js +20 -4
  78. package/cjs/core/Tooltip/Tooltip.d.ts +35 -28
  79. package/cjs/core/Tooltip/Tooltip.js +116 -117
  80. package/cjs/core/TransferList/TransferList.js +4 -12
  81. package/cjs/core/index.d.ts +3 -1
  82. package/cjs/core/index.js +28 -5
  83. package/cjs/core/utils/components/Icon.d.ts +5 -0
  84. package/cjs/core/utils/components/Icon.js +8 -1
  85. package/cjs/core/utils/components/InputContainer.d.ts +4 -5
  86. package/cjs/core/utils/components/InputContainer.js +21 -37
  87. package/cjs/core/utils/components/InputFlexContainer.d.ts +1 -0
  88. package/cjs/core/utils/components/InputFlexContainer.js +3 -1
  89. package/cjs/core/utils/components/Popover.d.ts +113 -27
  90. package/cjs/core/utils/components/Popover.js +156 -118
  91. package/cjs/core/utils/components/Portal.d.ts +27 -0
  92. package/cjs/core/utils/components/Portal.js +43 -0
  93. package/cjs/core/utils/components/index.d.ts +1 -0
  94. package/cjs/core/utils/components/index.js +1 -0
  95. package/cjs/core/utils/functions/index.d.ts +1 -0
  96. package/cjs/core/utils/functions/index.js +1 -0
  97. package/cjs/core/utils/functions/react.d.ts +8 -0
  98. package/cjs/core/utils/functions/react.js +40 -0
  99. package/cjs/core/utils/hooks/index.d.ts +1 -1
  100. package/cjs/core/utils/hooks/index.js +1 -1
  101. package/cjs/core/utils/hooks/useControlledState.d.ts +13 -0
  102. package/cjs/core/utils/hooks/useControlledState.js +39 -0
  103. package/cjs/styles.js +10 -31
  104. package/esm/core/Alert/Alert.d.ts +20 -9
  105. package/esm/core/Alert/Alert.js +49 -10
  106. package/esm/core/ButtonGroup/ButtonGroup.js +41 -36
  107. package/esm/core/Buttons/DropdownButton/DropdownButton.js +8 -24
  108. package/esm/core/Buttons/IconButton/IconButton.js +25 -40
  109. package/esm/core/Buttons/SplitButton/SplitButton.d.ts +4 -4
  110. package/esm/core/Buttons/SplitButton/SplitButton.js +61 -28
  111. package/esm/core/ColorPicker/ColorInputPanel.js +173 -232
  112. package/esm/core/ComboBox/ComboBox.d.ts +2 -2
  113. package/esm/core/ComboBox/ComboBox.js +34 -25
  114. package/esm/core/ComboBox/ComboBoxEndIcon.js +4 -25
  115. package/esm/core/ComboBox/ComboBoxInput.js +22 -21
  116. package/esm/core/ComboBox/ComboBoxMenu.d.ts +2 -2
  117. package/esm/core/ComboBox/ComboBoxMenu.js +67 -87
  118. package/esm/core/ComboBox/ComboBoxMenuItem.d.ts +1 -1
  119. package/esm/core/ComboBox/ComboBoxMenuItem.js +9 -7
  120. package/esm/core/ComboBox/helpers.d.ts +5 -3
  121. package/esm/core/DatePicker/DatePicker.d.ts +30 -8
  122. package/esm/core/DatePicker/DatePicker.js +25 -5
  123. package/esm/core/Dialog/Dialog.js +11 -23
  124. package/esm/core/Dialog/DialogContext.d.ts +3 -4
  125. package/esm/core/DropdownMenu/DropdownMenu.d.ts +6 -5
  126. package/esm/core/DropdownMenu/DropdownMenu.js +64 -56
  127. package/esm/core/ExpandableBlock/ExpandableBlock.d.ts +20 -14
  128. package/esm/core/ExpandableBlock/ExpandableBlock.js +39 -17
  129. package/esm/core/Header/HeaderDropdownButton.js +1 -2
  130. package/esm/core/Header/HeaderSplitButton.js +2 -2
  131. package/esm/core/Input/Input.d.ts +4 -0
  132. package/esm/core/Input/Input.js +2 -1
  133. package/esm/core/InputGrid/InputGrid.d.ts +25 -0
  134. package/esm/core/InputGrid/InputGrid.js +35 -0
  135. package/esm/core/InputGrid/index.d.ts +3 -0
  136. package/esm/core/InputGrid/index.js +6 -0
  137. package/esm/core/InputGroup/InputGroup.d.ts +13 -0
  138. package/esm/core/InputGroup/InputGroup.js +34 -10
  139. package/esm/core/InputWithDecorations/InputWithDecorations.d.ts +39 -0
  140. package/esm/core/InputWithDecorations/InputWithDecorations.js +80 -0
  141. package/esm/core/InputWithDecorations/index.d.ts +3 -0
  142. package/esm/core/InputWithDecorations/index.js +6 -0
  143. package/esm/core/Label/Label.d.ts +5 -0
  144. package/esm/core/Label/Label.js +2 -0
  145. package/esm/core/LabeledInput/LabeledInput.d.ts +22 -16
  146. package/esm/core/LabeledInput/LabeledInput.js +53 -29
  147. package/esm/core/LabeledSelect/LabeledSelect.d.ts +17 -7
  148. package/esm/core/LabeledSelect/LabeledSelect.js +37 -18
  149. package/esm/core/LabeledTextarea/LabeledTextarea.d.ts +15 -5
  150. package/esm/core/LabeledTextarea/LabeledTextarea.js +14 -45
  151. package/esm/core/Menu/Menu.d.ts +1 -1
  152. package/esm/core/Menu/Menu.js +8 -3
  153. package/esm/core/Menu/MenuDivider.d.ts +2 -1
  154. package/esm/core/Menu/MenuDivider.js +1 -1
  155. package/esm/core/Menu/MenuItem.d.ts +1 -1
  156. package/esm/core/Menu/MenuItem.js +85 -52
  157. package/esm/core/Menu/MenuItemSkeleton.d.ts +1 -1
  158. package/esm/core/Menu/MenuItemSkeleton.js +0 -1
  159. package/esm/core/SearchBox/SearchBox.js +1 -1
  160. package/esm/core/Select/Select.d.ts +9 -5
  161. package/esm/core/Select/Select.js +81 -96
  162. package/esm/core/SideNavigation/SideNavigation.js +2 -0
  163. package/esm/core/Slider/Thumb.js +1 -0
  164. package/esm/core/StatusMessage/StatusMessage.d.ts +12 -2
  165. package/esm/core/StatusMessage/StatusMessage.js +23 -16
  166. package/esm/core/Table/SubRowExpander.js +2 -0
  167. package/esm/core/Table/columns/actionColumn.js +3 -7
  168. package/esm/core/Table/filters/DateRangeFilter/DatePickerInput.d.ts +6 -1
  169. package/esm/core/Table/filters/DateRangeFilter/DatePickerInput.js +56 -33
  170. package/esm/core/Table/filters/DateRangeFilter/DateRangeFilter.d.ts +2 -0
  171. package/esm/core/Table/filters/DateRangeFilter/DateRangeFilter.js +2 -0
  172. package/esm/core/Table/filters/FilterToggle.js +3 -2
  173. package/esm/core/Textarea/Textarea.d.ts +7 -1
  174. package/esm/core/Textarea/Textarea.js +6 -11
  175. package/esm/core/ThemeProvider/ThemeProvider.js +4 -3
  176. package/esm/core/Tile/Tile.d.ts +139 -15
  177. package/esm/core/Tile/Tile.js +128 -38
  178. package/esm/core/Toast/Toast.d.ts +12 -4
  179. package/esm/core/Toast/Toast.js +21 -4
  180. package/esm/core/Tooltip/Tooltip.d.ts +35 -28
  181. package/esm/core/Tooltip/Tooltip.js +119 -116
  182. package/esm/core/TransferList/TransferList.js +4 -9
  183. package/esm/core/index.d.ts +3 -1
  184. package/esm/core/index.js +3 -0
  185. package/esm/core/utils/components/Icon.d.ts +5 -0
  186. package/esm/core/utils/components/Icon.js +8 -1
  187. package/esm/core/utils/components/InputContainer.d.ts +4 -5
  188. package/esm/core/utils/components/InputContainer.js +21 -32
  189. package/esm/core/utils/components/InputFlexContainer.d.ts +1 -0
  190. package/esm/core/utils/components/InputFlexContainer.js +3 -1
  191. package/esm/core/utils/components/Popover.d.ts +113 -27
  192. package/esm/core/utils/components/Popover.js +175 -118
  193. package/esm/core/utils/components/Portal.d.ts +27 -0
  194. package/esm/core/utils/components/Portal.js +36 -0
  195. package/esm/core/utils/components/index.d.ts +1 -0
  196. package/esm/core/utils/components/index.js +1 -0
  197. package/esm/core/utils/functions/index.d.ts +1 -0
  198. package/esm/core/utils/functions/index.js +1 -0
  199. package/esm/core/utils/functions/react.d.ts +8 -0
  200. package/esm/core/utils/functions/react.js +35 -0
  201. package/esm/core/utils/hooks/index.d.ts +1 -1
  202. package/esm/core/utils/hooks/index.js +1 -1
  203. package/esm/core/utils/hooks/useControlledState.d.ts +13 -0
  204. package/esm/core/utils/hooks/useControlledState.js +34 -0
  205. package/esm/styles.js +10 -31
  206. package/package.json +3 -5
  207. package/styles.css +23 -20
  208. package/cjs/core/ComboBox/ComboBoxDropdown.d.ts +0 -7
  209. package/cjs/core/ComboBox/ComboBoxDropdown.js +0 -48
  210. package/cjs/core/utils/hooks/useUncontrolledState.d.ts +0 -6
  211. package/cjs/core/utils/hooks/useUncontrolledState.js +0 -18
  212. package/esm/core/ComboBox/ComboBoxDropdown.d.ts +0 -7
  213. package/esm/core/ComboBox/ComboBoxDropdown.js +0 -42
  214. package/esm/core/utils/hooks/useUncontrolledState.d.ts +0 -6
  215. package/esm/core/utils/hooks/useUncontrolledState.js +0 -13
@@ -11,7 +11,7 @@ const index_js_1 = require('../utils/index.js');
11
11
  const index_js_2 = require('../Menu/index.js');
12
12
  /**
13
13
  * Dropdown menu component.
14
- * Uses the {@link Popover} component, which is a wrapper around [tippy.js](https://atomiks.github.io/tippyjs).
14
+ * Built on top of the {@link Popover} component.
15
15
  * @example
16
16
  * const menuItems = (close: () => void) => [
17
17
  * <MenuItem key={1} onClick={onClick(1, close)}>
@@ -28,75 +28,79 @@ const index_js_2 = require('../Menu/index.js');
28
28
  * <Button>Menu</Button>
29
29
  * </DropdownMenu>
30
30
  */
31
- const DropdownMenu = (props) => {
31
+ exports.DropdownMenu = React.forwardRef((props, forwardedRef) => {
32
32
  const {
33
33
  menuItems,
34
34
  children,
35
- className,
36
- style,
37
35
  role = 'menu',
38
- visible,
36
+ visible: visibleProp,
39
37
  placement = 'bottom-start',
40
- onShow,
41
- onHide,
42
- trigger,
43
- id,
38
+ matchWidth = false,
39
+ onVisibleChange,
40
+ portal = true,
44
41
  ...rest
45
42
  } = props;
46
- const [isVisible, setIsVisible] = React.useState(visible ?? false);
47
- React.useEffect(() => {
48
- setIsVisible(visible ?? false);
49
- }, [visible]);
50
- const open = React.useCallback(() => setIsVisible(true), []);
51
- const close = React.useCallback(() => setIsVisible(false), []);
43
+ const [visible, setVisible] = (0, index_js_1.useControlledState)(
44
+ false,
45
+ visibleProp,
46
+ onVisibleChange,
47
+ );
48
+ const triggerRef = React.useRef(null);
49
+ const close = React.useCallback(() => {
50
+ setVisible(false);
51
+ triggerRef.current?.focus({ preventScroll: true });
52
+ }, [setVisible]);
52
53
  const menuContent = React.useMemo(() => {
53
54
  if (typeof menuItems === 'function') {
54
55
  return menuItems(close);
55
56
  }
56
57
  return menuItems;
57
58
  }, [menuItems, close]);
58
- const targetRef = React.useRef(null);
59
- const onShowHandler = React.useCallback(
60
- (instance) => {
61
- setIsVisible(true);
62
- onShow?.(instance);
63
- },
64
- [onShow],
65
- );
66
- const onHideHandler = React.useCallback(
67
- (instance) => {
68
- setIsVisible(false);
69
- targetRef.current?.focus();
70
- onHide?.(instance);
71
- },
72
- [onHide],
59
+ const popover = (0, index_js_1.usePopover)({
60
+ visible,
61
+ onVisibleChange: (open) => (open ? setVisible(true) : close()),
62
+ placement,
63
+ matchWidth,
64
+ });
65
+ const popoverRef = (0, index_js_1.useMergedRefs)(
66
+ forwardedRef,
67
+ popover.refs.setFloating,
73
68
  );
74
69
  return React.createElement(
75
- index_js_1.Popover,
76
- {
77
- content: React.createElement(
78
- index_js_2.Menu,
79
- { className: className, style: style, role: role, id: id },
80
- menuContent,
81
- ),
82
- visible: trigger === undefined ? isVisible : undefined,
83
- onClickOutside: close,
84
- placement: placement,
85
- onShow: onShowHandler,
86
- onHide: onHideHandler,
87
- trigger: visible === undefined ? trigger : undefined,
88
- ...rest,
89
- },
90
- React.isValidElement(children)
91
- ? React.cloneElement(children, {
92
- ref: (0, index_js_1.mergeRefs)(targetRef, props.children.ref),
93
- onClick: (args) => {
94
- trigger === undefined && (isVisible ? close() : open());
95
- children.props.onClick?.(args);
70
+ React.Fragment,
71
+ null,
72
+ (0, index_js_1.cloneElementWithRef)(children, (children) => ({
73
+ ...popover.getReferenceProps(children.props),
74
+ 'aria-expanded': popover.open,
75
+ ref: (0, index_js_1.mergeRefs)(triggerRef, popover.refs.setReference),
76
+ })),
77
+ popover.open &&
78
+ React.createElement(
79
+ index_js_1.Portal,
80
+ { portal: portal },
81
+ React.createElement(
82
+ index_js_2.Menu,
83
+ {
84
+ ...popover.getFloatingProps({
85
+ role,
86
+ ...rest,
87
+ onKeyDown: (0, index_js_1.mergeEventHandlers)(
88
+ props.onKeyDown,
89
+ (e) => {
90
+ if (e.defaultPrevented) {
91
+ return;
92
+ }
93
+ if (e.key === 'Tab') {
94
+ close();
95
+ }
96
+ },
97
+ ),
98
+ }),
99
+ ref: popoverRef,
96
100
  },
97
- })
98
- : React.createElement(React.Fragment, null),
101
+ menuContent,
102
+ ),
103
+ ),
99
104
  );
100
- };
101
- exports.DropdownMenu = DropdownMenu;
105
+ });
102
106
  exports.default = exports.DropdownMenu;
@@ -36,9 +36,11 @@ type ExpandableBlockOwnProps = {
36
36
  */
37
37
  disabled?: boolean;
38
38
  };
39
- type ExpandableBlockHeaderOwnProps = {
39
+ type ExpandableBlockTriggerOwnProps = {
40
40
  label?: React.ReactNode;
41
+ caption?: React.ReactNode;
41
42
  expandIcon?: React.ReactNode;
43
+ endIcon?: React.ReactNode;
42
44
  };
43
45
  type ExpandableBlockContentOwnProps = {
44
46
  innerProps?: React.ComponentPropsWithoutRef<'div'>;
@@ -46,29 +48,32 @@ type ExpandableBlockContentOwnProps = {
46
48
  /**
47
49
  * Expandable block with customizable Title, Caption, Content and EndIcon subcomponents.
48
50
  * @example
49
- * <ExpandableBlock>
50
- * <ExpandableBlock.Header>
51
+ * <ExpandableBlock.Wrapper>
52
+ * <ExpandableBlock.Trigger>
51
53
  * <ExpandableBlock.ExpandIcon/>
52
54
  * <ExpandableBlock.LabelArea>
53
55
  * <ExpandableBlock.Title/>
54
56
  * <ExpandableBlock.Caption/>
55
57
  * </ExpandableBlock.LabelArea>
56
58
  * <ExpandableBlock.EndIcon/>
57
- * </ExpandableBlock.Header>
59
+ * </ExpandableBlock.Trigger>
58
60
  * <ExpandableBlock.Content/>
59
- * </ExpandableBlock>
61
+ * </ExpandableBlock.Wrapper>
60
62
  */
61
- export declare const ExpandableBlock: PolymorphicForwardRefComponent<"div", ExpandableBlockOwnProps> & {
63
+ export declare const ExpandableBlock: PolymorphicForwardRefComponent<"div", ExpandableBlockOwnProps & {
64
+ title?: React.ReactNode;
65
+ } & Pick<ExpandableBlockTriggerOwnProps, "caption" | "endIcon">> & {
66
+ Wrapper: PolymorphicForwardRefComponent<"div", ExpandableBlockOwnProps>;
62
67
  /**
63
68
  * `Header` container that contains `ExpandIcon`, `LabelArea` and `EndIcon` subcomponents
64
69
  * @example
65
- * <ExpandableBlock.Header>
70
+ * <ExpandableBlock.Trigger>
66
71
  * <ExpandableBlock.ExpandIcon/>
67
72
  * <ExpandableBlock.LabelArea/>
68
73
  * <ExpandableBlock.EndIcon/>
69
- * </ExpandableBlock.Header>
74
+ * </ExpandableBlock.Trigger>
70
75
  */
71
- Header: PolymorphicForwardRefComponent<"button", ExpandableBlockHeaderOwnProps>;
76
+ Trigger: PolymorphicForwardRefComponent<"button", ExpandableBlockTriggerOwnProps>;
72
77
  /**
73
78
  * The expanding icon on the left of header
74
79
  */
@@ -94,24 +99,25 @@ export declare const ExpandableBlock: PolymorphicForwardRefComponent<"div", Expa
94
99
  * Svg icon displayed at the end of the main text.
95
100
  * Will override status icon if specified. Used inside `Header` subcomponent.
96
101
  * @example
97
- * <ExpandableBlock.Header>
102
+ * <ExpandableBlock.Trigger>
98
103
  * <ExpandableBlock.EndIcon> <SvgIcon/> </ExpandableBlock.EndIcon>
99
- * <ExpandableBlock.Header/>
104
+ * <ExpandableBlock.Trigger/>
100
105
  */
101
106
  EndIcon: PolymorphicForwardRefComponent<"span", Omit<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & {
102
107
  ref?: ((instance: HTMLSpanElement | null) => void) | React.RefObject<HTMLSpanElement> | null | undefined;
103
- }, "fill" | "as" | "key" | "size" | keyof React.HTMLAttributes<HTMLSpanElement>> & {
108
+ }, "fill" | "as" | "key" | "size" | keyof React.HTMLAttributes<HTMLSpanElement> | "padded"> & {
104
109
  size?: "small" | "large" | "auto" | "medium" | import("../utils/types.js").AnyString | undefined;
105
110
  fill?: "default" | "informational" | "negative" | "positive" | "warning" | import("../utils/types.js").AnyString | undefined;
111
+ padded?: boolean | undefined;
106
112
  } & Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref"> & {
107
113
  as?: "span" | undefined;
108
114
  }, "ref">>;
109
115
  /**
110
116
  * Content shown in the block's body when fully expanded.
111
117
  * @example
112
- * <ExpandableBlock>
118
+ * <ExpandableBlock.Wrapper>
113
119
  * <ExpandableBlock.Content> Content </ExpandableBlock.Content>
114
- * </ExpandableBlock>
120
+ * </ExpandableBlock.Wrapper>
115
121
  */
116
122
  Content: PolymorphicForwardRefComponent<"div", ExpandableBlockContentOwnProps>;
117
123
  };
@@ -12,6 +12,21 @@ const index_js_1 = require('../utils/index.js');
12
12
  const ExpandableBlockContext = React.createContext(undefined);
13
13
  ExpandableBlockContext.displayName = 'ExpandableBlockContext';
14
14
  const ExpandableBlockComponent = React.forwardRef((props, forwardedRef) => {
15
+ const { children, title, caption, endIcon, ...rest } = props;
16
+ return React.createElement(
17
+ exports.ExpandableBlock.Wrapper,
18
+ { ...rest, ref: forwardedRef },
19
+ React.createElement(exports.ExpandableBlock.Trigger, {
20
+ label: title,
21
+ caption: caption,
22
+ endIcon: endIcon,
23
+ }),
24
+ React.createElement(exports.ExpandableBlock.Content, null, children),
25
+ );
26
+ });
27
+ ExpandableBlockComponent.displayName = 'ExpandableBlock';
28
+ // ----------------------------------------------------------------------------
29
+ const ExpandableBlockWrapper = React.forwardRef((props, forwardedRef) => {
15
30
  const {
16
31
  children,
17
32
  className,
@@ -55,17 +70,19 @@ const ExpandableBlockComponent = React.forwardRef((props, forwardedRef) => {
55
70
  ),
56
71
  );
57
72
  });
58
- ExpandableBlockComponent.displayName = 'ExpandableBlock';
59
- const ExpandableBlockHeader = React.forwardRef((props, forwardedRef) => {
73
+ ExpandableBlockWrapper.displayName = 'ExpandableBlock.Wrapper';
74
+ const ExpandableBlockTrigger = React.forwardRef((props, forwardedRef) => {
60
75
  const {
61
76
  className,
62
77
  children,
63
78
  label,
79
+ caption,
64
80
  onClick: onClickProp,
65
81
  expandIcon,
82
+ endIcon,
66
83
  ...rest
67
84
  } = props;
68
- const { isExpanded, setExpanded, disabled, onToggle } = (0,
85
+ const { isExpanded, setExpanded, disabled, onToggle, status } = (0,
69
86
  index_js_1.useSafeContext)(ExpandableBlockContext);
70
87
  return React.createElement(
71
88
  index_js_1.ButtonBase,
@@ -93,11 +110,16 @@ const ExpandableBlockHeader = React.forwardRef((props, forwardedRef) => {
93
110
  exports.ExpandableBlock.LabelArea,
94
111
  null,
95
112
  React.createElement(exports.ExpandableBlock.Title, null, label),
113
+ caption &&
114
+ React.createElement(exports.ExpandableBlock.Caption, null, caption),
96
115
  ),
116
+ endIcon || status
117
+ ? React.createElement(exports.ExpandableBlock.EndIcon, null, endIcon)
118
+ : null,
97
119
  ),
98
120
  );
99
121
  });
100
- ExpandableBlockHeader.displayName = 'ExpandableBlock.Header';
122
+ ExpandableBlockTrigger.displayName = 'ExpandableBlock.Trigger';
101
123
  // ----------------------------------------------------------------------------
102
124
  // ExpandableBlock.ExpandIcon component
103
125
  const ExpandableBlockExpandIcon = React.forwardRef((props, forwardedRef) => {
@@ -176,29 +198,30 @@ ExpandableBlockContent.displayName = 'ExpandableBlock.Content';
176
198
  /**
177
199
  * Expandable block with customizable Title, Caption, Content and EndIcon subcomponents.
178
200
  * @example
179
- * <ExpandableBlock>
180
- * <ExpandableBlock.Header>
201
+ * <ExpandableBlock.Wrapper>
202
+ * <ExpandableBlock.Trigger>
181
203
  * <ExpandableBlock.ExpandIcon/>
182
204
  * <ExpandableBlock.LabelArea>
183
205
  * <ExpandableBlock.Title/>
184
206
  * <ExpandableBlock.Caption/>
185
207
  * </ExpandableBlock.LabelArea>
186
208
  * <ExpandableBlock.EndIcon/>
187
- * </ExpandableBlock.Header>
209
+ * </ExpandableBlock.Trigger>
188
210
  * <ExpandableBlock.Content/>
189
- * </ExpandableBlock>
211
+ * </ExpandableBlock.Wrapper>
190
212
  */
191
213
  exports.ExpandableBlock = Object.assign(ExpandableBlockComponent, {
214
+ Wrapper: ExpandableBlockWrapper,
192
215
  /**
193
216
  * `Header` container that contains `ExpandIcon`, `LabelArea` and `EndIcon` subcomponents
194
217
  * @example
195
- * <ExpandableBlock.Header>
218
+ * <ExpandableBlock.Trigger>
196
219
  * <ExpandableBlock.ExpandIcon/>
197
220
  * <ExpandableBlock.LabelArea/>
198
221
  * <ExpandableBlock.EndIcon/>
199
- * </ExpandableBlock.Header>
222
+ * </ExpandableBlock.Trigger>
200
223
  */
201
- Header: ExpandableBlockHeader,
224
+ Trigger: ExpandableBlockTrigger,
202
225
  /**
203
226
  * The expanding icon on the left of header
204
227
  */
@@ -224,17 +247,17 @@ exports.ExpandableBlock = Object.assign(ExpandableBlockComponent, {
224
247
  * Svg icon displayed at the end of the main text.
225
248
  * Will override status icon if specified. Used inside `Header` subcomponent.
226
249
  * @example
227
- * <ExpandableBlock.Header>
250
+ * <ExpandableBlock.Trigger>
228
251
  * <ExpandableBlock.EndIcon> <SvgIcon/> </ExpandableBlock.EndIcon>
229
- * <ExpandableBlock.Header/>
252
+ * <ExpandableBlock.Trigger/>
230
253
  */
231
254
  EndIcon: ExpandableBlockEndIcon,
232
255
  /**
233
256
  * Content shown in the block's body when fully expanded.
234
257
  * @example
235
- * <ExpandableBlock>
258
+ * <ExpandableBlock.Wrapper>
236
259
  * <ExpandableBlock.Content> Content </ExpandableBlock.Content>
237
- * </ExpandableBlock>
260
+ * </ExpandableBlock.Wrapper>
238
261
  */
239
262
  Content: ExpandableBlockContent,
240
263
  });
@@ -27,8 +27,7 @@ exports.HeaderDropdownButton = React.forwardRef((props, ref) => {
27
27
  {
28
28
  menuItems: menuItems,
29
29
  style: { minInlineSize: menuWidth },
30
- onShow: () => setIsMenuOpen(true),
31
- onHide: () => setIsMenuOpen(false),
30
+ onVisibleChange: (open) => setIsMenuOpen(open),
32
31
  },
33
32
  React.createElement(
34
33
  HeaderBasicButton_js_1.HeaderBasicButton,
@@ -48,12 +48,12 @@ exports.HeaderSplitButton = React.forwardRef((props, forwardedRef) => {
48
48
  placement: menuPlacement,
49
49
  menuItems: menuItems,
50
50
  style: { minInlineSize: menuWidth },
51
- onShow: React.useCallback(() => setIsMenuOpen(true), []),
52
- onHide: React.useCallback(() => setIsMenuOpen(false), []),
51
+ onVisibleChange: (open) => setIsMenuOpen(open),
53
52
  },
54
53
  React.createElement(
55
54
  index_js_2.ButtonBase,
56
55
  {
56
+ 'aria-label': 'More',
57
57
  className:
58
58
  'iui-header-breadcrumb-button iui-header-breadcrumb-button-split',
59
59
  disabled: disabled,
@@ -4,6 +4,10 @@ export type InputProps = {
4
4
  * Modify size of the input.
5
5
  */
6
6
  size?: 'small' | 'large';
7
+ /**
8
+ * Status of input.
9
+ */
10
+ status?: 'positive' | 'warning' | 'negative';
7
11
  /**
8
12
  * Modify the native `size` attribute of the `<input>` element.
9
13
  * The `width` or `inline-size` property must be unset in order to use this prop.
@@ -17,13 +17,14 @@ const index_js_1 = require('../utils/index.js');
17
17
  * <Input size='small' />
18
18
  */
19
19
  exports.Input = React.forwardRef((props, ref) => {
20
- const { size, htmlSize, className, ...rest } = props;
20
+ const { size, htmlSize, status, className, ...rest } = props;
21
21
  const inputRef = React.useRef(null);
22
22
  const refs = (0, index_js_1.useMergedRefs)(inputRef, ref);
23
23
  return React.createElement(index_js_1.Box, {
24
24
  as: 'input',
25
25
  className: (0, classnames_1.default)('iui-input', className),
26
26
  'data-iui-size': size,
27
+ 'data-iui-status': status,
27
28
  size: htmlSize,
28
29
  ref: refs,
29
30
  ...rest,
@@ -0,0 +1,25 @@
1
+ import type { PolymorphicForwardRefComponent } from '../utils/index.js';
2
+ type InputGridOwnProps = {
3
+ /**
4
+ * Set display style of label.
5
+ * Supported values:
6
+ * - 'default' - label appears above input.
7
+ * - 'inline' - appears in the same line as input.
8
+ * @default 'default'
9
+ */
10
+ labelPlacement?: 'default' | 'inline';
11
+ };
12
+ /**
13
+ * InputGrid component is used to display inputs (input, textarea, select)
14
+ * with label and/or status message
15
+ *
16
+ * @usage
17
+ *
18
+ * <InputGrid>
19
+ * <Label htmlFor='input-1'>This is label</Label>
20
+ * <Input id='input-1'/>
21
+ * <StatusMessage>This is message</StatusMessage>
22
+ * </InputGrid>
23
+ */
24
+ export declare const InputGrid: PolymorphicForwardRefComponent<"div", InputGridOwnProps>;
25
+ export default InputGrid;
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, '__esModule', { value: true });
3
+ exports.InputGrid = void 0;
4
+ const tslib_1 = require('tslib');
5
+ /*---------------------------------------------------------------------------------------------
6
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
7
+ * See LICENSE.md in the project root for license terms and full copyright notice.
8
+ *--------------------------------------------------------------------------------------------*/
9
+ const React = tslib_1.__importStar(require('react'));
10
+ const index_js_1 = require('../utils/index.js');
11
+ const classnames_1 = tslib_1.__importDefault(require('classnames'));
12
+ //-------------------------------------------------------------------------------
13
+ /**
14
+ * InputGrid component is used to display inputs (input, textarea, select)
15
+ * with label and/or status message
16
+ *
17
+ * @usage
18
+ *
19
+ * <InputGrid>
20
+ * <Label htmlFor='input-1'>This is label</Label>
21
+ * <Input id='input-1'/>
22
+ * <StatusMessage>This is message</StatusMessage>
23
+ * </InputGrid>
24
+ */
25
+ exports.InputGrid = React.forwardRef((props, ref) => {
26
+ const { children, className, labelPlacement = undefined, ...rest } = props;
27
+ return React.createElement(
28
+ index_js_1.Box,
29
+ {
30
+ className: (0, classnames_1.default)('iui-input-grid', className),
31
+ 'data-iui-label-placement': labelPlacement,
32
+ ref: ref,
33
+ ...rest,
34
+ },
35
+ children,
36
+ );
37
+ });
38
+ //-------------------------------------------------------------------------------
39
+ exports.default = exports.InputGrid;
@@ -0,0 +1,3 @@
1
+ export { InputGrid } from './InputGrid.js';
2
+ declare const _default: "./InputGrid";
3
+ export default _default;
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, '__esModule', { value: true });
3
+ exports.InputGrid = 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 InputGrid_js_1 = require('./InputGrid.js');
9
+ Object.defineProperty(exports, 'InputGrid', {
10
+ enumerable: true,
11
+ get: function () {
12
+ return InputGrid_js_1.InputGrid;
13
+ },
14
+ });
15
+ exports.default = './InputGrid';
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import type { PolymorphicForwardRefComponent } from '../utils/index.js';
3
+ import { StatusMessage } from '../StatusMessage/index.js';
3
4
  type InputGroupProps = {
4
5
  /**
5
6
  * Label of the group.
@@ -36,6 +37,18 @@ type InputGroupProps = {
36
37
  * Child inputs inside group.
37
38
  */
38
39
  children: React.ReactNode;
40
+ /**
41
+ * Passes properties for label.
42
+ */
43
+ labelProps?: React.ComponentProps<'label'>;
44
+ /**
45
+ * Passes properties for message.
46
+ */
47
+ messageProps?: Pick<React.ComponentProps<typeof StatusMessage>, 'iconProps' | 'contentProps'>;
48
+ /**
49
+ * Passes properties for inner input group element.
50
+ */
51
+ innerProps?: React.ComponentProps<'div'>;
39
52
  };
40
53
  /**
41
54
  * Group Checkbox/Radio components together
@@ -7,7 +7,11 @@ const tslib_1 = require('tslib');
7
7
  * See LICENSE.md in the project root for license terms and full copyright notice.
8
8
  *--------------------------------------------------------------------------------------------*/
9
9
  const React = tslib_1.__importStar(require('react'));
10
+ const classnames_1 = tslib_1.__importDefault(require('classnames'));
10
11
  const index_js_1 = require('../utils/index.js');
12
+ const index_js_2 = require('../InputGrid/index.js');
13
+ const index_js_3 = require('../Label/index.js');
14
+ const index_js_4 = require('../StatusMessage/index.js');
11
15
  /**
12
16
  * Group Checkbox/Radio components together
13
17
  * @example
@@ -25,6 +29,7 @@ const index_js_1 = require('../utils/index.js');
25
29
  */
26
30
  exports.InputGroup = React.forwardRef((props, forwardedRef) => {
27
31
  const {
32
+ className,
28
33
  children,
29
34
  disabled = false,
30
35
  displayStyle = 'default',
@@ -33,6 +38,9 @@ exports.InputGroup = React.forwardRef((props, forwardedRef) => {
33
38
  status,
34
39
  svgIcon,
35
40
  required = false,
41
+ labelProps,
42
+ messageProps,
43
+ innerProps,
36
44
  ...rest
37
45
  } = props;
38
46
  const icon = () => {
@@ -47,23 +55,41 @@ exports.InputGroup = React.forwardRef((props, forwardedRef) => {
47
55
  return undefined;
48
56
  };
49
57
  return React.createElement(
50
- index_js_1.InputContainer,
58
+ index_js_2.InputGrid,
51
59
  {
52
- label: label,
53
- disabled: disabled,
54
- required: required,
55
- status: status,
56
- message: message,
57
- icon: icon(),
58
- isLabelInline: displayStyle === 'inline',
59
60
  ref: forwardedRef,
61
+ as: 'div',
62
+ labelPlacement: displayStyle,
63
+ className: (0, classnames_1.default)(
64
+ 'iui-input-group-wrapper',
65
+ className,
66
+ ),
60
67
  ...rest,
61
68
  },
69
+ label &&
70
+ React.createElement(
71
+ index_js_3.Label,
72
+ { as: 'label', required: required, disabled: disabled, ...labelProps },
73
+ label,
74
+ ),
62
75
  React.createElement(
63
76
  index_js_1.Box,
64
- { className: 'iui-input-group' },
77
+ {
78
+ as: 'div',
79
+ ...innerProps,
80
+ className: (0, classnames_1.default)(
81
+ 'iui-input-group',
82
+ innerProps?.className,
83
+ ),
84
+ },
65
85
  children,
66
86
  ),
87
+ (message || status || svgIcon) &&
88
+ React.createElement(
89
+ index_js_4.StatusMessage,
90
+ { startIcon: icon(), status: status, ...messageProps },
91
+ displayStyle !== 'inline' && message,
92
+ ),
67
93
  );
68
94
  });
69
95
  exports.default = exports.InputGroup;
@@ -0,0 +1,39 @@
1
+ import * as React from 'react';
2
+ import type { PolymorphicForwardRefComponent } from '../utils/index.js';
3
+ import type { InputProps } from '../Input/Input.js';
4
+ /**
5
+ * Input component with various additional decorations.
6
+ * You can add icons, buttons and other various subcomponents to it.
7
+ *
8
+ * If you are not using default InputWithDecorations.Icon and InputWithDecorations.Button, use borderless versions of other components.
9
+ *
10
+ * @usage
11
+ * <InputWithDecorations>
12
+ * <InputWithDecorations.Input />
13
+ * <InputWithDecorations.Icon>
14
+ * <SvgAdd />
15
+ * </InputWithDecorations.Icon>
16
+ * </InputWithDecorations>
17
+ */
18
+ export declare const InputWithDecorations: PolymorphicForwardRefComponent<"div", Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
19
+ ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject<HTMLDivElement> | null | undefined;
20
+ }, "as" | keyof import("../utils/index.js").InputFlexContainerProps> & import("../utils/index.js").InputFlexContainerProps & {
21
+ as?: "div" | undefined;
22
+ }> & {
23
+ /**
24
+ * Subcomponent to include input in your InputWithDecorations
25
+ */
26
+ Input: PolymorphicForwardRefComponent<"input", InputProps>;
27
+ /**
28
+ * Subcomponent to include button in your InputWithDecorations
29
+ */
30
+ Button: PolymorphicForwardRefComponent<"span", Omit<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
31
+ ref?: ((instance: HTMLButtonElement | null) => void) | React.RefObject<HTMLButtonElement> | null | undefined;
32
+ }, "label" | "as" | "size" | "htmlDisabled" | "styleType" | "isActive" | "iconProps"> & {
33
+ isActive?: boolean | undefined;
34
+ label?: React.ReactNode;
35
+ iconProps?: React.DetailedHTMLProps<React.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement> | undefined;
36
+ } & Omit<import("../Buttons/Button/Button.js").ButtonProps, "startIcon" | "endIcon" | "labelProps" | "startIconProps" | "endIconProps"> & {
37
+ as?: "button" | undefined;
38
+ }>;
39
+ };