@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
@@ -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
+ };
@@ -0,0 +1,80 @@
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 * as React from 'react';
6
+ import { Box, InputFlexContainer, useSafeContext } from '../utils/index.js';
7
+ import { IconButton } from '../Buttons/index.js';
8
+ const InputWithDecorationsContext = React.createContext(undefined);
9
+ const InputWithDecorationsComponent = React.forwardRef((props, ref) => {
10
+ const { children, size, isDisabled, ...rest } = props;
11
+ return React.createElement(
12
+ InputWithDecorationsContext.Provider,
13
+ { value: { size, isDisabled } },
14
+ React.createElement(
15
+ InputFlexContainer,
16
+ { isDisabled: isDisabled, size: size, ref: ref, ...rest },
17
+ children,
18
+ ),
19
+ );
20
+ });
21
+ //-------------------------------------------------------------------------------
22
+ const InputWithDecorationsInput = React.forwardRef((props, ref) => {
23
+ const { id: idProp, size, disabled: localDisabled, ...rest } = props;
24
+ const { size: contextSize, isDisabled } = useSafeContext(
25
+ InputWithDecorationsContext,
26
+ );
27
+ return React.createElement(Box, {
28
+ as: 'input',
29
+ ref: ref,
30
+ 'data-iui-size': size ?? contextSize,
31
+ disabled: localDisabled ?? isDisabled,
32
+ id: idProp,
33
+ ...rest,
34
+ });
35
+ });
36
+ //-------------------------------------------------------------------------------
37
+ const InputWithDecorationsButton = React.forwardRef((props, ref) => {
38
+ const { children, size, disabled: localDisabled, ...rest } = props;
39
+ const { size: contextSize, isDisabled } = useSafeContext(
40
+ InputWithDecorationsContext,
41
+ );
42
+ return React.createElement(
43
+ IconButton,
44
+ {
45
+ ref: ref,
46
+ size: size ?? contextSize,
47
+ styleType: 'borderless',
48
+ disabled: localDisabled ?? isDisabled,
49
+ ...rest,
50
+ },
51
+ children,
52
+ );
53
+ });
54
+ /**
55
+ * Input component with various additional decorations.
56
+ * You can add icons, buttons and other various subcomponents to it.
57
+ *
58
+ * If you are not using default InputWithDecorations.Icon and InputWithDecorations.Button, use borderless versions of other components.
59
+ *
60
+ * @usage
61
+ * <InputWithDecorations>
62
+ * <InputWithDecorations.Input />
63
+ * <InputWithDecorations.Icon>
64
+ * <SvgAdd />
65
+ * </InputWithDecorations.Icon>
66
+ * </InputWithDecorations>
67
+ */
68
+ export const InputWithDecorations = Object.assign(
69
+ InputWithDecorationsComponent,
70
+ {
71
+ /**
72
+ * Subcomponent to include input in your InputWithDecorations
73
+ */
74
+ Input: InputWithDecorationsInput,
75
+ /**
76
+ * Subcomponent to include button in your InputWithDecorations
77
+ */
78
+ Button: InputWithDecorationsButton,
79
+ },
80
+ );
@@ -0,0 +1,3 @@
1
+ export { InputWithDecorations } from './InputWithDecorations.js';
2
+ declare const _default: "./Input";
3
+ export default _default;
@@ -0,0 +1,6 @@
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
+ export { InputWithDecorations } from './InputWithDecorations.js';
6
+ export default './Input';
@@ -12,6 +12,11 @@ type LabelOwnProps = {
12
12
  * This adds an asterisk next to the label text.
13
13
  */
14
14
  required?: boolean;
15
+ /**
16
+ * Adds disabled styling to a label.
17
+ * @default false
18
+ */
19
+ disabled?: boolean;
15
20
  };
16
21
  /**
17
22
  * A standalone label to be used with input components (using `htmlFor`).
@@ -16,6 +16,7 @@ export const Label = React.forwardRef((props, forwardedRef) => {
16
16
  const {
17
17
  displayStyle = 'block',
18
18
  required,
19
+ disabled,
19
20
  className,
20
21
  children,
21
22
  ...rest
@@ -32,6 +33,7 @@ export const Label = React.forwardRef((props, forwardedRef) => {
32
33
  },
33
34
  className,
34
35
  ),
36
+ 'data-iui-disabled': disabled ? true : undefined,
35
37
  ref: forwardedRef,
36
38
  ...rest,
37
39
  },
@@ -1,6 +1,9 @@
1
1
  import * as React from 'react';
2
- import type { InputProps } from '../Input/Input.js';
2
+ import { Input } from '../Input/Input.js';
3
+ import { Icon } from '../utils/index.js';
3
4
  import type { PolymorphicForwardRefComponent } from '../utils/index.js';
5
+ import { InputGrid } from '../InputGrid/index.js';
6
+ import { InputWithDecorations } from '../InputWithDecorations/index.js';
4
7
  export type LabeledInputProps = {
5
8
  /**
6
9
  * Label of the input.
@@ -17,15 +20,11 @@ export type LabeledInputProps = {
17
20
  /**
18
21
  * Custom svg icon. Will override status icon if specified.
19
22
  */
20
- svgIcon?: JSX.Element;
23
+ svgIcon?: JSX.Element | null;
21
24
  /**
22
- * Custom CSS class name for the input element.
25
+ * Pass props to wrapper element.
23
26
  */
24
- inputClassName?: string;
25
- /**
26
- * Custom CSS Style for the input element.
27
- */
28
- inputStyle?: React.CSSProperties;
27
+ wrapperProps?: React.ComponentProps<typeof InputGrid>;
29
28
  /**
30
29
  * Set display style of label.
31
30
  * Supported values:
@@ -35,15 +34,22 @@ export type LabeledInputProps = {
35
34
  */
36
35
  displayStyle?: 'default' | 'inline';
37
36
  /**
38
- * Set display style of icon.
39
- * Supported values:
40
- * - 'block' - icon appears below input.
41
- * - 'inline' - icon appears inside input (at the end).
42
- *
43
- * Defaults to 'block' if `displayStyle` is `default`, else 'inline'.
37
+ * Passes properties for message content.
38
+ */
39
+ messageContentProps?: React.ComponentPropsWithRef<'div'>;
40
+ /**
41
+ * Passes properties for icon.
42
+ */
43
+ iconProps?: React.ComponentProps<typeof Icon>;
44
+ /**
45
+ * Passes properties for label.
46
+ */
47
+ labelProps?: React.ComponentProps<'label'>;
48
+ /**
49
+ * Passes properties for input wrapper.
44
50
  */
45
- iconDisplayStyle?: 'block' | 'inline';
46
- } & InputProps;
51
+ inputWrapperProps?: React.ComponentProps<typeof InputWithDecorations>;
52
+ } & React.ComponentProps<typeof Input>;
47
53
  /**
48
54
  * Basic labeled input component
49
55
  * @example
@@ -4,7 +4,11 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import * as React from 'react';
6
6
  import { Input } from '../Input/Input.js';
7
- import { StatusIconMap, InputContainer, useId } from '../utils/index.js';
7
+ import { StatusIconMap, useId, Icon } from '../utils/index.js';
8
+ import { InputGrid } from '../InputGrid/index.js';
9
+ import { InputWithDecorations } from '../InputWithDecorations/index.js';
10
+ import { StatusMessage } from '../StatusMessage/StatusMessage.js';
11
+ import { Label } from '../Label/Label.js';
8
12
  /**
9
13
  * Basic labeled input component
10
14
  * @example
@@ -16,46 +20,66 @@ import { StatusIconMap, InputContainer, useId } from '../utils/index.js';
16
20
  export const LabeledInput = React.forwardRef((props, ref) => {
17
21
  const uid = useId();
18
22
  const {
19
- className,
20
23
  disabled = false,
21
24
  label,
22
25
  message,
23
26
  status,
24
27
  svgIcon,
25
- style,
26
- inputClassName,
27
- inputStyle,
28
+ wrapperProps,
29
+ labelProps,
30
+ messageContentProps,
31
+ iconProps,
32
+ inputWrapperProps,
28
33
  displayStyle = 'default',
29
- iconDisplayStyle = displayStyle === 'default' ? 'block' : 'inline',
30
34
  required = false,
31
35
  id = uid,
32
36
  ...rest
33
37
  } = props;
34
38
  const icon = svgIcon ?? (status && StatusIconMap[status]());
39
+ const shouldShowIcon = svgIcon !== null && (svgIcon || (status && !message));
35
40
  return React.createElement(
36
- InputContainer,
37
- {
38
- label: label,
39
- disabled: disabled,
40
- required: required,
41
- status: status,
42
- message: message,
43
- icon: icon,
44
- isLabelInline: displayStyle === 'inline',
45
- isIconInline: iconDisplayStyle === 'inline',
46
- className: className,
47
- style: style,
48
- inputId: id,
49
- },
50
- React.createElement(Input, {
51
- disabled: disabled,
52
- className: inputClassName,
53
- style: inputStyle,
54
- required: required,
55
- ref: ref,
56
- id: id,
57
- ...rest,
58
- }),
41
+ InputGrid,
42
+ { labelPlacement: displayStyle, ...wrapperProps },
43
+ label &&
44
+ React.createElement(
45
+ Label,
46
+ {
47
+ as: 'label',
48
+ required: required,
49
+ disabled: disabled,
50
+ htmlFor: id,
51
+ ...labelProps,
52
+ },
53
+ label,
54
+ ),
55
+ React.createElement(
56
+ InputWithDecorations,
57
+ { status: status, isDisabled: disabled, ...inputWrapperProps },
58
+ React.createElement(InputWithDecorations.Input, {
59
+ disabled: disabled,
60
+ required: required,
61
+ id: id,
62
+ ref: ref,
63
+ ...rest,
64
+ }),
65
+ shouldShowIcon &&
66
+ React.createElement(
67
+ Icon,
68
+ { fill: !svgIcon ? status : undefined, padded: true, ...iconProps },
69
+ icon,
70
+ ),
71
+ ),
72
+ typeof message === 'string'
73
+ ? React.createElement(
74
+ StatusMessage,
75
+ {
76
+ status: status,
77
+ iconProps: iconProps,
78
+ contentProps: messageContentProps,
79
+ },
80
+ message,
81
+ )
82
+ : message,
59
83
  );
60
84
  });
61
85
  export default LabeledInput;
@@ -1,6 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import type { SelectProps } from '../Select/Select.js';
3
+ import { Icon } from '../utils/index.js';
3
4
  import type { LabeledInputProps } from '../LabeledInput/LabeledInput.js';
5
+ import { InputGrid } from '../InputGrid/InputGrid.js';
4
6
  export type LabeledSelectProps<T> = {
5
7
  /**
6
8
  * Label of the select.
@@ -20,18 +22,26 @@ export type LabeledSelectProps<T> = {
20
22
  */
21
23
  svgIcon?: JSX.Element;
22
24
  /**
23
- * Custom CSS class name for the select element.
25
+ * If true, shows a red asterisk but does not prevent form submission.
26
+ * @default false
24
27
  */
25
- selectClassName?: string;
28
+ required?: boolean;
26
29
  /**
27
- * Custom CSS Style for the select element.
30
+ * Pass props to wrapper element.
28
31
  */
29
- selectStyle?: React.CSSProperties;
32
+ wrapperProps?: React.ComponentProps<typeof InputGrid>;
30
33
  /**
31
- * If true, shows a red asterisk but does not prevent form submission.
32
- * @default false
34
+ * Passes properties for label.
33
35
  */
34
- required?: boolean;
36
+ labelProps?: React.ComponentProps<'div'>;
37
+ /**
38
+ * Passes properties for message content.
39
+ */
40
+ messageContentProps?: React.ComponentPropsWithRef<'div'>;
41
+ /**
42
+ * Passes properties for message icon.
43
+ */
44
+ messageIconProps?: React.ComponentProps<typeof Icon>;
35
45
  } & Pick<LabeledInputProps, 'displayStyle'> & SelectProps<T>;
36
46
  /**
37
47
  * Labeled select component to select value from options.
@@ -4,7 +4,10 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import * as React from 'react';
6
6
  import { Select } from '../Select/index.js';
7
- import { StatusIconMap, InputContainer, useId } from '../utils/index.js';
7
+ import { StatusIconMap, useId, Icon } from '../utils/index.js';
8
+ import { StatusMessage } from '../StatusMessage/StatusMessage.js';
9
+ import { InputGrid } from '../InputGrid/InputGrid.js';
10
+ import { Label } from '../Label/Label.js';
8
11
  /**
9
12
  * Labeled select component to select value from options.
10
13
  * @example
@@ -48,16 +51,18 @@ export const LabeledSelect = (props) => {
48
51
  svgIcon,
49
52
  displayStyle = 'default',
50
53
  style,
51
- selectClassName,
52
- selectStyle,
53
54
  required = false,
54
55
  triggerProps,
56
+ wrapperProps,
57
+ labelProps,
58
+ messageContentProps,
59
+ messageIconProps,
55
60
  ...rest
56
61
  } = props;
57
62
  const labelId = `${useId()}-label`;
58
63
  const icon = () => {
59
64
  if (svgIcon) {
60
- return React.cloneElement(svgIcon, { 'aria-hidden': true });
65
+ return React.createElement(Icon, null, svgIcon);
61
66
  }
62
67
  if (status && message) {
63
68
  return StatusIconMap[status]();
@@ -65,29 +70,43 @@ export const LabeledSelect = (props) => {
65
70
  return undefined;
66
71
  };
67
72
  return React.createElement(
68
- InputContainer,
69
- {
70
- label: label,
73
+ InputGrid,
74
+ { labelPlacement: displayStyle, ...wrapperProps },
75
+ label &&
76
+ React.createElement(
77
+ Label,
78
+ {
79
+ as: 'div',
80
+ required: required,
81
+ disabled: disabled,
82
+ id: labelId,
83
+ ...labelProps,
84
+ },
85
+ label,
86
+ ),
87
+ React.createElement(Select, {
71
88
  disabled: disabled,
72
- required: required,
73
- status: status,
74
- message: message,
75
- icon: displayStyle === 'default' ? icon() : undefined,
76
- isLabelInline: displayStyle === 'inline',
77
89
  className: className,
78
90
  style: style,
79
- labelId: labelId,
80
- },
81
- React.createElement(Select, {
82
- disabled: disabled,
83
- className: selectClassName,
84
- style: selectStyle,
91
+ status: status,
85
92
  ...rest,
86
93
  triggerProps: {
87
94
  'aria-labelledby': labelId,
88
95
  ...triggerProps,
89
96
  },
90
97
  }),
98
+ typeof message === 'string'
99
+ ? React.createElement(
100
+ StatusMessage,
101
+ {
102
+ status: status,
103
+ startIcon: displayStyle === 'default' ? icon() : undefined,
104
+ iconProps: messageIconProps,
105
+ contentProps: messageContentProps,
106
+ },
107
+ message,
108
+ )
109
+ : message,
91
110
  );
92
111
  };
93
112
  export default LabeledSelect;
@@ -1,6 +1,8 @@
1
1
  import * as React from 'react';
2
+ import { Icon } from '../utils/index.js';
2
3
  import type { PolymorphicForwardRefComponent } from '../utils/index.js';
3
4
  import type { LabeledInputProps } from '../LabeledInput/LabeledInput.js';
5
+ import { InputGrid } from '../InputGrid/InputGrid.js';
4
6
  type LabeledTextareaProps = {
5
7
  /**
6
8
  * Label for the textarea.
@@ -15,14 +17,22 @@ type LabeledTextareaProps = {
15
17
  */
16
18
  status?: 'positive' | 'warning' | 'negative';
17
19
  /**
18
- * Custom class name for textarea.
20
+ * Pass props to wrapper element.
19
21
  */
20
- textareaClassName?: string;
22
+ wrapperProps?: React.ComponentProps<typeof InputGrid>;
21
23
  /**
22
- * Custom style for textarea.
24
+ * Passes properties for label.
23
25
  */
24
- textareaStyle?: React.CSSProperties;
25
- } & Pick<LabeledInputProps, 'svgIcon' | 'displayStyle' | 'iconDisplayStyle'>;
26
+ labelProps?: React.ComponentProps<'label'>;
27
+ /**
28
+ * Passes properties for message content.
29
+ */
30
+ messageContentProps?: React.ComponentPropsWithRef<'div'>;
31
+ /**
32
+ * Passes properties for svgIcon.
33
+ */
34
+ iconProps?: React.ComponentProps<typeof Icon>;
35
+ } & Pick<LabeledInputProps, 'svgIcon' | 'displayStyle'>;
26
36
  /**
27
37
  * Textarea wrapper that allows for additional styling and labelling
28
38
  * @example
@@ -3,8 +3,9 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import * as React from 'react';
6
- import { StatusIconMap, InputContainer, useId } from '../utils/index.js';
7
- import { Textarea } from '../Textarea/index.js';
6
+ import { Icon } from '../utils/index.js';
7
+ import { InputGrid } from '../InputGrid/InputGrid.js';
8
+ import { LabeledInput } from '../LabeledInput/index.js';
8
9
  /**
9
10
  * Textarea wrapper that allows for additional styling and labelling
10
11
  * @example
@@ -26,49 +27,17 @@ import { Textarea } from '../Textarea/index.js';
26
27
  * status='negative'
27
28
  * />
28
29
  */
29
- export const LabeledTextarea = React.forwardRef((props, ref) => {
30
- const uid = useId();
31
- const {
32
- className,
33
- style,
34
- disabled = false,
35
- label,
36
- message,
37
- status,
38
- textareaClassName,
39
- textareaStyle,
40
- displayStyle = 'default',
41
- iconDisplayStyle = displayStyle === 'default' ? 'block' : 'inline',
42
- svgIcon,
43
- required = false,
44
- id = uid,
45
- ...textareaProps
46
- } = props;
47
- const icon = svgIcon ?? (status && StatusIconMap[status]());
48
- return React.createElement(
49
- InputContainer,
50
- {
51
- label: label,
52
- disabled: disabled,
53
- required: required,
54
- status: status,
55
- message: message,
56
- icon: icon,
57
- isLabelInline: displayStyle === 'inline',
58
- isIconInline: iconDisplayStyle === 'inline',
59
- className: className,
60
- style: style,
61
- inputId: id,
62
- },
63
- React.createElement(Textarea, {
64
- disabled: disabled,
65
- className: textareaClassName,
66
- style: textareaStyle,
67
- required: required,
68
- id: id,
69
- ...textareaProps,
70
- ref: ref,
71
- }),
30
+ export const LabeledTextarea = React.forwardRef((props, forwardedRef) => {
31
+ return (
32
+ // ref types don't match but it's internal, so ts-ignore is ok here
33
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
34
+ // @ts-ignore
35
+ React.createElement(LabeledInput, {
36
+ as: 'textarea',
37
+ rows: 3,
38
+ ref: forwardedRef,
39
+ ...props,
40
+ })
72
41
  );
73
42
  });
74
43
  export default LabeledTextarea;
@@ -17,5 +17,5 @@ type MenuProps = {
17
17
  /**
18
18
  * Basic menu component. Can be used for select or dropdown components.
19
19
  */
20
- export declare const Menu: PolymorphicForwardRefComponent<"ul", MenuProps>;
20
+ export declare const Menu: PolymorphicForwardRefComponent<"div", MenuProps>;
21
21
  export default Menu;
@@ -4,7 +4,12 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import * as React from 'react';
6
6
  import cx from 'classnames';
7
- import { useMergedRefs, getFocusableElements, Box } from '../utils/index.js';
7
+ import {
8
+ useMergedRefs,
9
+ getFocusableElements,
10
+ Box,
11
+ mergeEventHandlers,
12
+ } from '../utils/index.js';
8
13
  /**
9
14
  * Basic menu component. Can be used for select or dropdown components.
10
15
  */
@@ -60,12 +65,12 @@ export const Menu = React.forwardRef((props, ref) => {
60
65
  }
61
66
  };
62
67
  return React.createElement(Box, {
63
- as: 'ul',
68
+ as: 'div',
64
69
  className: cx('iui-menu', className),
65
70
  role: 'menu',
66
- onKeyDown: onKeyDown,
67
71
  ref: refs,
68
72
  ...rest,
73
+ onKeyDown: mergeEventHandlers(props.onKeyDown, onKeyDown),
69
74
  });
70
75
  });
71
76
  export default Menu;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  /**
2
3
  * Divider between menu items. Should be used inside `Menu`.
3
4
  * @example
@@ -13,5 +14,5 @@
13
14
  * ]}
14
15
  * </Menu>
15
16
  */
16
- export declare const MenuDivider: import("../utils/props.js").PolymorphicForwardRefComponent<"li", {}>;
17
+ export declare const MenuDivider: import("../utils/props.js").PolymorphicForwardRefComponent<NonNullable<keyof JSX.IntrinsicElements>, {}>;
17
18
  export default MenuDivider;
@@ -18,7 +18,7 @@ import { polymorphic } from '../utils/index.js';
18
18
  * ]}
19
19
  * </Menu>
20
20
  */
21
- export const MenuDivider = polymorphic.li('iui-menu-divider', {
21
+ export const MenuDivider = polymorphic('iui-menu-divider', {
22
22
  role: 'separator',
23
23
  });
24
24
  export default MenuDivider;
@@ -64,5 +64,5 @@ export type MenuItemProps = {
64
64
  /**
65
65
  * Basic menu item component. Should be used inside `Menu` component for each item.
66
66
  */
67
- export declare const MenuItem: PolymorphicForwardRefComponent<"li", MenuItemProps>;
67
+ export declare const MenuItem: PolymorphicForwardRefComponent<"div", MenuItemProps>;
68
68
  export default MenuItem;