@dxc-technology/halstack-react 0.0.0-74ba970 → 0.0.0-752ca0a

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 (234) hide show
  1. package/BackgroundColorContext.d.ts +2 -2
  2. package/BackgroundColorContext.js +1 -1
  3. package/HalstackContext.d.ts +1349 -5
  4. package/HalstackContext.js +117 -77
  5. package/README.md +47 -0
  6. package/accordion/Accordion.d.ts +1 -1
  7. package/accordion/Accordion.js +14 -37
  8. package/accordion/Accordion.stories.tsx +104 -113
  9. package/accordion/Accordion.test.js +1 -1
  10. package/accordion/types.d.ts +2 -13
  11. package/accordion-group/AccordionGroup.d.ts +4 -3
  12. package/accordion-group/AccordionGroup.js +23 -44
  13. package/accordion-group/AccordionGroup.stories.tsx +77 -76
  14. package/accordion-group/AccordionGroup.test.js +7 -17
  15. package/accordion-group/AccordionGroupAccordion.d.ts +4 -0
  16. package/accordion-group/AccordionGroupAccordion.js +43 -0
  17. package/accordion-group/types.d.ts +2 -13
  18. package/alert/Alert.js +4 -8
  19. package/alert/Alert.stories.tsx +28 -0
  20. package/alert/Alert.test.js +1 -1
  21. package/bleed/Bleed.stories.tsx +1 -0
  22. package/box/Box.d.ts +1 -1
  23. package/box/Box.js +7 -26
  24. package/box/Box.stories.tsx +38 -51
  25. package/box/Box.test.js +1 -1
  26. package/box/types.d.ts +0 -11
  27. package/bulleted-list/BulletedList.js +4 -2
  28. package/bulleted-list/BulletedList.stories.tsx +7 -1
  29. package/bulleted-list/types.d.ts +31 -4
  30. package/button/Button.d.ts +1 -1
  31. package/button/Button.js +48 -60
  32. package/button/Button.stories.tsx +151 -9
  33. package/button/Button.test.js +12 -1
  34. package/button/types.d.ts +7 -3
  35. package/card/Card.d.ts +1 -1
  36. package/card/Card.js +27 -45
  37. package/card/Card.stories.tsx +12 -42
  38. package/card/Card.test.js +1 -1
  39. package/card/types.d.ts +1 -6
  40. package/checkbox/Checkbox.d.ts +2 -2
  41. package/checkbox/Checkbox.js +71 -51
  42. package/checkbox/Checkbox.stories.tsx +146 -58
  43. package/checkbox/Checkbox.test.js +84 -11
  44. package/checkbox/types.d.ts +10 -2
  45. package/chip/Chip.js +28 -49
  46. package/chip/Chip.stories.tsx +121 -26
  47. package/chip/Chip.test.js +3 -5
  48. package/common/OpenSans.css +68 -80
  49. package/common/coreTokens.d.ts +146 -0
  50. package/common/coreTokens.js +167 -0
  51. package/common/utils.d.ts +1 -0
  52. package/common/utils.js +4 -4
  53. package/common/variables.d.ts +1499 -0
  54. package/common/variables.js +1004 -1134
  55. package/date-input/Calendar.d.ts +4 -0
  56. package/date-input/Calendar.js +258 -0
  57. package/date-input/DateInput.js +138 -239
  58. package/date-input/DateInput.stories.tsx +209 -33
  59. package/date-input/DateInput.test.js +519 -149
  60. package/date-input/DatePicker.d.ts +4 -0
  61. package/date-input/DatePicker.js +146 -0
  62. package/date-input/Icons.d.ts +6 -0
  63. package/date-input/Icons.js +75 -0
  64. package/date-input/YearPicker.d.ts +4 -0
  65. package/date-input/YearPicker.js +126 -0
  66. package/date-input/types.d.ts +55 -0
  67. package/dialog/Dialog.d.ts +1 -1
  68. package/dialog/Dialog.js +54 -85
  69. package/dialog/Dialog.stories.tsx +154 -170
  70. package/dialog/Dialog.test.js +302 -3
  71. package/dialog/types.d.ts +0 -12
  72. package/dropdown/Dropdown.js +40 -39
  73. package/dropdown/Dropdown.stories.tsx +210 -84
  74. package/dropdown/Dropdown.test.js +21 -26
  75. package/dropdown/DropdownMenu.js +12 -18
  76. package/dropdown/DropdownMenuItem.js +4 -17
  77. package/dropdown/types.d.ts +3 -3
  78. package/file-input/FileInput.d.ts +2 -2
  79. package/file-input/FileInput.js +174 -220
  80. package/file-input/FileInput.stories.tsx +122 -11
  81. package/file-input/FileInput.test.js +14 -14
  82. package/file-input/FileItem.d.ts +4 -14
  83. package/file-input/FileItem.js +39 -63
  84. package/file-input/types.d.ts +18 -1
  85. package/flex/Flex.d.ts +1 -1
  86. package/flex/Flex.js +33 -19
  87. package/flex/Flex.stories.tsx +35 -26
  88. package/flex/types.d.ts +83 -7
  89. package/footer/Footer.d.ts +1 -1
  90. package/footer/Footer.js +44 -64
  91. package/footer/Footer.stories.tsx +36 -21
  92. package/footer/Footer.test.js +16 -26
  93. package/footer/types.d.ts +10 -11
  94. package/grid/Grid.d.ts +7 -0
  95. package/grid/Grid.js +91 -0
  96. package/grid/Grid.stories.tsx +219 -0
  97. package/grid/types.d.ts +115 -0
  98. package/header/Header.d.ts +4 -3
  99. package/header/Header.js +20 -49
  100. package/header/Header.stories.tsx +115 -36
  101. package/header/Header.test.js +2 -2
  102. package/header/types.d.ts +1 -14
  103. package/heading/Heading.js +1 -1
  104. package/heading/Heading.test.js +1 -1
  105. package/image/Image.d.ts +4 -0
  106. package/image/Image.js +85 -0
  107. package/image/Image.stories.tsx +127 -0
  108. package/image/types.d.ts +72 -0
  109. package/inset/Inset.stories.tsx +2 -1
  110. package/layout/ApplicationLayout.d.ts +5 -5
  111. package/layout/ApplicationLayout.js +15 -12
  112. package/layout/ApplicationLayout.stories.tsx +1 -1
  113. package/layout/Icons.d.ts +7 -4
  114. package/layout/Icons.js +52 -56
  115. package/layout/types.d.ts +2 -3
  116. package/link/Link.js +4 -4
  117. package/link/Link.stories.tsx +60 -0
  118. package/link/Link.test.js +2 -4
  119. package/link/types.d.ts +2 -2
  120. package/main.d.ts +4 -2
  121. package/main.js +17 -1
  122. package/{tabs-nav → nav-tabs}/NavTabs.d.ts +2 -2
  123. package/{tabs-nav → nav-tabs}/NavTabs.js +8 -11
  124. package/{tabs-nav → nav-tabs}/NavTabs.stories.tsx +110 -6
  125. package/{tabs-nav → nav-tabs}/NavTabs.test.js +1 -1
  126. package/{tabs-nav → nav-tabs}/Tab.js +48 -32
  127. package/{tabs-nav → nav-tabs}/types.d.ts +8 -9
  128. package/nav-tabs/types.js +5 -0
  129. package/number-input/NumberInput.d.ts +7 -0
  130. package/number-input/NumberInput.js +6 -4
  131. package/number-input/NumberInput.test.js +317 -98
  132. package/package.json +9 -14
  133. package/paginator/Icons.d.ts +5 -0
  134. package/paginator/Icons.js +16 -28
  135. package/paginator/Paginator.js +8 -16
  136. package/paginator/Paginator.stories.tsx +24 -0
  137. package/paginator/Paginator.test.js +58 -48
  138. package/paragraph/Paragraph.d.ts +3 -4
  139. package/paragraph/Paragraph.js +5 -5
  140. package/password-input/Icons.d.ts +6 -0
  141. package/password-input/Icons.js +39 -0
  142. package/password-input/PasswordInput.js +35 -82
  143. package/password-input/PasswordInput.stories.tsx +1 -0
  144. package/password-input/PasswordInput.test.js +34 -40
  145. package/progress-bar/ProgressBar.d.ts +2 -2
  146. package/progress-bar/ProgressBar.js +5 -5
  147. package/progress-bar/ProgressBar.stories.jsx +35 -2
  148. package/progress-bar/ProgressBar.test.js +1 -1
  149. package/progress-bar/types.d.ts +4 -3
  150. package/quick-nav/QuickNav.js +11 -12
  151. package/quick-nav/QuickNav.stories.tsx +111 -19
  152. package/radio-group/Radio.js +10 -10
  153. package/radio-group/RadioGroup.js +15 -13
  154. package/radio-group/RadioGroup.stories.tsx +131 -18
  155. package/radio-group/RadioGroup.test.js +117 -60
  156. package/resultsetTable/Icons.d.ts +7 -0
  157. package/resultsetTable/Icons.js +51 -0
  158. package/resultsetTable/ResultsetTable.js +49 -108
  159. package/resultsetTable/ResultsetTable.stories.tsx +50 -25
  160. package/resultsetTable/ResultsetTable.test.js +41 -64
  161. package/resultsetTable/types.d.ts +1 -1
  162. package/select/Listbox.d.ts +1 -1
  163. package/select/Listbox.js +5 -34
  164. package/select/Option.js +11 -24
  165. package/select/Select.js +59 -36
  166. package/select/Select.stories.tsx +497 -153
  167. package/select/Select.test.js +345 -292
  168. package/select/types.d.ts +2 -2
  169. package/sidenav/Icons.d.ts +7 -0
  170. package/sidenav/Icons.js +51 -0
  171. package/sidenav/Sidenav.d.ts +2 -2
  172. package/sidenav/Sidenav.js +66 -96
  173. package/sidenav/Sidenav.stories.tsx +165 -63
  174. package/sidenav/types.d.ts +21 -18
  175. package/slider/Slider.d.ts +2 -2
  176. package/slider/Slider.js +17 -14
  177. package/slider/Slider.stories.tsx +57 -0
  178. package/slider/Slider.test.js +1 -1
  179. package/slider/types.d.ts +6 -2
  180. package/spinner/Spinner.js +17 -23
  181. package/spinner/Spinner.stories.jsx +53 -27
  182. package/spinner/Spinner.test.js +1 -1
  183. package/switch/Switch.d.ts +3 -3
  184. package/switch/Switch.js +7 -6
  185. package/switch/Switch.stories.tsx +33 -0
  186. package/switch/Switch.test.js +1 -1
  187. package/switch/types.d.ts +8 -3
  188. package/table/Table.js +3 -3
  189. package/table/Table.stories.jsx +80 -1
  190. package/table/Table.test.js +2 -2
  191. package/tabs/Tab.js +12 -15
  192. package/tabs/Tabs.js +11 -17
  193. package/tabs/Tabs.stories.tsx +45 -5
  194. package/tabs/Tabs.test.js +4 -5
  195. package/tabs/types.d.ts +2 -2
  196. package/tag/Tag.js +7 -9
  197. package/tag/Tag.stories.tsx +14 -1
  198. package/tag/Tag.test.js +1 -1
  199. package/text-input/Suggestion.js +34 -7
  200. package/text-input/TextInput.js +224 -228
  201. package/text-input/TextInput.stories.tsx +132 -5
  202. package/text-input/TextInput.test.js +757 -658
  203. package/text-input/types.d.ts +9 -0
  204. package/textarea/Textarea.js +27 -26
  205. package/textarea/Textarea.stories.jsx +68 -1
  206. package/textarea/Textarea.test.js +61 -19
  207. package/textarea/types.d.ts +4 -0
  208. package/toggle-group/ToggleGroup.d.ts +2 -2
  209. package/toggle-group/ToggleGroup.js +85 -59
  210. package/toggle-group/ToggleGroup.stories.tsx +48 -3
  211. package/toggle-group/ToggleGroup.test.js +38 -24
  212. package/toggle-group/types.d.ts +22 -13
  213. package/typography/Typography.d.ts +2 -2
  214. package/typography/Typography.js +14 -113
  215. package/typography/Typography.stories.tsx +1 -1
  216. package/useTheme.d.ts +1251 -1
  217. package/useTheme.js +1 -1
  218. package/useTranslatedLabels.d.ts +84 -1
  219. package/utils/BaseTypography.d.ts +21 -0
  220. package/utils/BaseTypography.js +108 -0
  221. package/utils/FocusLock.d.ts +13 -0
  222. package/utils/FocusLock.js +138 -0
  223. package/wizard/Wizard.js +2 -2
  224. package/wizard/Wizard.stories.tsx +20 -0
  225. package/wizard/Wizard.test.js +1 -1
  226. package/wizard/types.d.ts +5 -6
  227. package/card/ice-cream.jpg +0 -0
  228. package/common/RequiredComponent.js +0 -32
  229. package/number-input/NumberInputContext.d.ts +0 -4
  230. package/number-input/NumberInputContext.js +0 -19
  231. package/number-input/numberInputContextTypes.d.ts +0 -19
  232. /package/{tabs-nav → grid}/types.js +0 -0
  233. /package/{number-input/numberInputContextTypes.js → image/types.js} +0 -0
  234. /package/{tabs-nav → nav-tabs}/Tab.d.ts +0 -0
@@ -59,6 +59,10 @@ declare type Props = {
59
59
  * If true, the component will be disabled.
60
60
  */
61
61
  disabled?: boolean;
62
+ /**
63
+ * If true, the component will not be mutable, meaning the user can not edit the control.
64
+ */
65
+ readOnly?: boolean;
62
66
  /**
63
67
  * If true, the input will be optional, showing '(Optional)'
64
68
  * next to the label. Otherwise, the field will be considered required and an error will be
@@ -189,4 +193,9 @@ export declare type SuggestionProps = {
189
193
  visuallyFocused: boolean;
190
194
  highlighted: boolean;
191
195
  };
196
+ export declare type AutosuggestWrapperProps = {
197
+ condition: boolean;
198
+ wrapper: (children: React.ReactNode) => JSX.Element;
199
+ children: React.ReactNode;
200
+ };
192
201
  export default Props;
@@ -19,13 +19,13 @@ var _react = _interopRequireWildcard(require("react"));
19
19
 
20
20
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
21
21
 
22
- var _utils = require("../common/utils.js");
22
+ var _utils = require("../common/utils");
23
23
 
24
24
  var _useTheme = _interopRequireDefault(require("../useTheme"));
25
25
 
26
26
  var _useTranslatedLabels = _interopRequireDefault(require("../useTranslatedLabels"));
27
27
 
28
- var _variables = require("../common/variables.js");
28
+ var _variables = require("../common/variables");
29
29
 
30
30
  var _uuid = require("uuid");
31
31
 
@@ -53,6 +53,8 @@ var DxcTextarea = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref)
53
53
  placeholder = _ref$placeholder === void 0 ? "" : _ref$placeholder,
54
54
  _ref$disabled = _ref.disabled,
55
55
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
56
+ _ref$readOnly = _ref.readOnly,
57
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
56
58
  _ref$optional = _ref.optional,
57
59
  optional = _ref$optional === void 0 ? false : _ref$optional,
58
60
  _ref$verticalGrow = _ref.verticalGrow,
@@ -112,7 +114,15 @@ var DxcTextarea = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref)
112
114
  });
113
115
  };
114
116
 
115
- var handleTOnBlur = function handleTOnBlur(event) {
117
+ var autoVerticalGrow = function autoVerticalGrow() {
118
+ var textareaLineHeight = parseInt(window.getComputedStyle(textareaRef.current)["line-height"]);
119
+ var textareaPaddingTopBottom = parseInt(window.getComputedStyle(textareaRef.current)["padding-top"]) * 2;
120
+ textareaRef.current.style.height = "".concat(textareaLineHeight * rows, "px");
121
+ var newHeight = textareaRef.current.scrollHeight - textareaPaddingTopBottom;
122
+ textareaRef.current.style.height = "".concat(newHeight, "px");
123
+ };
124
+
125
+ var handleOnBlur = function handleOnBlur(event) {
116
126
  if (isNotOptional(event.target.value)) onBlur === null || onBlur === void 0 ? void 0 : onBlur({
117
127
  value: event.target.value,
118
128
  error: translatedLabels.formFields.requiredValueErrorMessage
@@ -127,19 +137,11 @@ var DxcTextarea = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref)
127
137
  });
128
138
  };
129
139
 
130
- var handleTOnChange = function handleTOnChange(event) {
140
+ var handleOnChange = function handleOnChange(event) {
131
141
  changeValue(event.target.value);
142
+ verticalGrow === "auto" && autoVerticalGrow();
132
143
  };
133
144
 
134
- (0, _react.useLayoutEffect)(function () {
135
- if (verticalGrow === "auto") {
136
- var textareaLineHeight = parseInt(window.getComputedStyle(textareaRef.current)["line-height"]);
137
- var textareaPaddingTopBottom = parseInt(window.getComputedStyle(textareaRef.current)["padding-top"]) * 2;
138
- textareaRef.current.style.height = "".concat(textareaLineHeight * rows, "px");
139
- var newHeight = textareaRef.current.scrollHeight - textareaPaddingTopBottom;
140
- textareaRef.current.style.height = "".concat(newHeight, "px");
141
- }
142
- }, [value, verticalGrow, rows, innerValue]);
143
145
  return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
144
146
  theme: colorsTheme.textarea
145
147
  }, /*#__PURE__*/_react["default"].createElement(TextareaContainer, {
@@ -161,9 +163,10 @@ var DxcTextarea = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref)
161
163
  placeholder: placeholder,
162
164
  verticalGrow: verticalGrow,
163
165
  rows: rows,
164
- onChange: handleTOnChange,
165
- onBlur: handleTOnBlur,
166
+ onChange: handleOnChange,
167
+ onBlur: handleOnBlur,
166
168
  disabled: disabled,
169
+ readOnly: readOnly,
167
170
  error: error,
168
171
  minLength: minLength,
169
172
  maxLength: maxLength,
@@ -171,10 +174,9 @@ var DxcTextarea = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref)
171
174
  backgroundType: backgroundType,
172
175
  ref: textareaRef,
173
176
  tabIndex: tabIndex,
174
- "aria-disabled": disabled,
175
- "aria-invalid": error ? "true" : "false",
177
+ "aria-invalid": error ? true : false,
176
178
  "aria-errormessage": error ? errorId : undefined,
177
- "aria-required": optional ? "false" : "true"
179
+ "aria-required": !disabled && !optional
178
180
  }), !disabled && typeof error === "string" && /*#__PURE__*/_react["default"].createElement(Error, {
179
181
  id: errorId,
180
182
  backgroundType: backgroundType,
@@ -193,7 +195,7 @@ var calculateWidth = function calculateWidth(margin, size) {
193
195
  return size === "fillParent" ? "calc(".concat(sizes[size], " - ").concat((0, _utils.getMargin)(margin, "left"), " - ").concat((0, _utils.getMargin)(margin, "right"), ")") : sizes[size];
194
196
  };
195
197
 
196
- var TextareaContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n\n width: ", ";\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n"])), function (props) {
198
+ var TextareaContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n width: ", ";\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n"])), function (props) {
197
199
  return calculateWidth(props.margin, props.size);
198
200
  }, function (props) {
199
201
  return props.margin && (0, _typeof2["default"])(props.margin) !== "object" ? _variables.spaces[props.margin] : "0px";
@@ -241,18 +243,17 @@ var HelperText = _styledComponents["default"].span(_templateObject4 || (_templat
241
243
  return props.theme.helperTextLineHeight;
242
244
  });
243
245
 
244
- var Textarea = _styledComponents["default"].textarea(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n ", "\n\n padding: 0.5rem 1rem;\n box-shadow: 0 0 0 2px transparent;\n border-radius: 0.25rem;\n border: 1px solid\n ", ";\n ", "\n\n ", ";\n ", ";\n\n color: ", ";\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n line-height: 1.5em;\n\n ::placeholder {\n color: ", ";\n }\n"])), function (props) {
245
- if (props.verticalGrow === "none") return "resize: none;";else if (props.verticalGrow === "auto") return "resize: none; overflow: hidden;";else if (props.verticalGrow === "manual") return "resize: vertical;";else return "resize: none;";
246
+ var Textarea = _styledComponents["default"].textarea(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n ", ";\n\n ", "\n\n padding: 0.5rem 1rem;\n box-shadow: 0 0 0 2px transparent;\n border-radius: 0.25rem;\n border: 1px solid\n ", ";\n\n ", "\n\n ", ";\n\n color: ", ";\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n line-height: 1.5em;\n\n ::placeholder {\n color: ", ";\n }\n"])), function (_ref2) {
247
+ var verticalGrow = _ref2.verticalGrow;
248
+ if (verticalGrow === "none") return "resize: none;";else if (verticalGrow === "auto") return "resize: none; overflow: hidden;";else if (verticalGrow === "manual") return "resize: vertical;";else return "resize: none;";
246
249
  }, function (props) {
247
250
  if (props.disabled) return props.backgroundType === "dark" ? "background-color: ".concat(props.theme.disabledContainerFillColorOnDark, ";") : "background-color: ".concat(props.theme.disabledContainerFillColor, ";");else return "background-color: transparent;";
248
251
  }, function (props) {
249
- if (props.disabled) return props.backgroundType === "dark" ? props.theme.disabledBorderColorOnDark : props.theme.disabledBorderColor;else return props.backgroundType === "dark" ? props.theme.enabledBorderColorOnDark : props.theme.enabledBorderColor;
250
- }, function (props) {
251
- return props.error && !props.disabled && "border-color: transparent;\n box-shadow: 0 0 0 2px ".concat(props.backgroundType === "dark" ? props.theme.errorBorderColorOnDark : props.theme.errorBorderColor, ";\n ");
252
+ if (props.disabled) return props.backgroundType === "dark" ? props.theme.disabledBorderColorOnDark : props.theme.disabledBorderColor;else if (props.error) return "transparent";else if (props.readOnly) return props.theme.readOnlyBorderColor;else return props.backgroundType === "dark" ? props.theme.enabledBorderColorOnDark : props.theme.enabledBorderColor;
252
253
  }, function (props) {
253
- return props.disabled && "cursor: not-allowed;";
254
+ return props.error && !props.disabled && "box-shadow: 0 0 0 2px ".concat(props.backgroundType === "dark" ? props.theme.errorBorderColorOnDark : props.theme.errorBorderColor, ";\n ");
254
255
  }, function (props) {
255
- return !props.disabled && "\n &:hover {\n border-color: ".concat(props.error ? "transparent" : props.backgroundType === "dark" ? props.theme.hoverBorderColorOnDark : props.theme.hoverBorderColor, ";\n ").concat(props.error && "box-shadow: 0 0 0 2px ".concat(props.backgroundType === "dark" ? props.theme.hoverErrorBorderColorOnDark : props.theme.hoverErrorBorderColor, ";"), "\n }\n &:focus {\n outline: none;\n border-color: transparent;\n box-shadow: 0 0 0 2px ").concat(props.backgroundType === "dark" ? props.theme.focusBorderColorOnDark : props.theme.focusBorderColor, ";\n }\n &:focus-within {\n outline: none;\n border-color: transparent;\n box-shadow: 0 0 0 2px ").concat(props.backgroundType === "dark" ? props.theme.focusBorderColorOnDark : props.theme.focusBorderColor, ";\n }\n ");
256
+ return !props.disabled ? "&:hover {\n border-color: ".concat(props.error ? "transparent" : props.readOnly ? props.theme.hoverReadOnlyBorderColor : props.backgroundType === "dark" ? props.theme.hoverBorderColorOnDark : props.theme.hoverBorderColor, ";\n ").concat(props.error && "box-shadow: 0 0 0 2px ".concat(props.backgroundType === "dark" ? props.theme.hoverErrorBorderColorOnDark : props.theme.hoverErrorBorderColor, ";"), "\n }\n &:focus, &:focus-within {\n outline: none;\n border-color: transparent;\n box-shadow: 0 0 0 2px ").concat(props.backgroundType === "dark" ? props.theme.focusBorderColorOnDark : props.theme.focusBorderColor, ";\n }") : "cursor: not-allowed;";
256
257
  }, function (props) {
257
258
  return props.disabled ? props.backgroundType === "dark" ? props.theme.disabledValueFontColorOnDark : props.theme.disabledValueFontColor : props.backgroundType === "dark" ? props.theme.valueFontColorOnDark : props.theme.valueFontColor;
258
259
  }, function (props) {
@@ -4,12 +4,20 @@ import Title from "../../.storybook/components/Title";
4
4
  import ExampleContainer from "../../.storybook/components/ExampleContainer";
5
5
  import { BackgroundColorProvider } from "../BackgroundColorContext";
6
6
  import DarkContainer from "../../.storybook/components/DarkSection";
7
+ import { HalstackProvider } from "../HalstackContext";
7
8
 
8
9
  export default {
9
10
  title: "Textarea",
10
11
  component: DxcTextarea,
11
12
  };
12
13
 
14
+ const opinionatedTheme = {
15
+ textarea: {
16
+ fontColor: "#000000",
17
+ hoverBorderColor: "#a46ede",
18
+ },
19
+ };
20
+
13
21
  export const Chromatic = () => (
14
22
  <>
15
23
  <>
@@ -35,6 +43,14 @@ export const Chromatic = () => (
35
43
  <Title title="Disabled with value" theme="light" level={4} />
36
44
  <DxcTextarea label="Disabled" defaultValue="Example text" disabled />
37
45
  </ExampleContainer>
46
+ <ExampleContainer>
47
+ <Title title="Read only" theme="light" level={4} />
48
+ <DxcTextarea label="Label" readOnly defaultValue="Example text" verticalGrow="manual" />
49
+ </ExampleContainer>
50
+ <ExampleContainer pseudoState="pseudo-hover">
51
+ <Title title="Hovered read only" theme="light" level={4} />
52
+ <DxcTextarea label="Label" readOnly defaultValue="Example text" verticalGrow="manual" />
53
+ </ExampleContainer>
38
54
  <ExampleContainer>
39
55
  <Title title="With error" theme="light" level={4} />
40
56
  <DxcTextarea
@@ -151,7 +167,58 @@ export const Chromatic = () => (
151
167
  <ExampleContainer>
152
168
  <Title title="Xxlarge margin" theme="light" level={4} />
153
169
  <DxcTextarea label="Xxlarge" margin="xxlarge" />
154
- <hr />
170
+ </ExampleContainer>
171
+ <Title title="Opinionated theme" theme="light" level={2} />
172
+ <ExampleContainer pseudoState="pseudo-hover">
173
+ <Title title="Hovered" theme="light" level={4} />
174
+ <HalstackProvider theme={opinionatedTheme}>
175
+ <DxcTextarea label="Hovered" helperText="Sample text" placeholder="Placeholder" />
176
+ </HalstackProvider>
177
+ </ExampleContainer>
178
+ <ExampleContainer pseudoState="pseudo-focus">
179
+ <Title title="Focused" theme="light" level={4} />
180
+ <HalstackProvider theme={opinionatedTheme}>
181
+ <DxcTextarea label="Focused" helperText="Sample text" />
182
+ </HalstackProvider>
183
+ </ExampleContainer>
184
+ <ExampleContainer>
185
+ <Title title="Disabled" theme="light" level={4} />
186
+ <HalstackProvider theme={opinionatedTheme}>
187
+ <DxcTextarea
188
+ label="Disabled"
189
+ optional
190
+ helperText="Sample text"
191
+ placeholder="Enter your text here..."
192
+ disabled
193
+ />
194
+ </HalstackProvider>
195
+ </ExampleContainer>
196
+ <ExampleContainer>
197
+ <Title title="Disabled with value" theme="light" level={4} />
198
+ <HalstackProvider theme={opinionatedTheme}>
199
+ <DxcTextarea label="Disabled" helperText="Sample text" defaultValue="Example text" disabled />
200
+ </HalstackProvider>
201
+ </ExampleContainer>
202
+ <ExampleContainer>
203
+ <Title title="With error" theme="light" level={4} />
204
+ <HalstackProvider theme={opinionatedTheme}>
205
+ <DxcTextarea
206
+ label="Textarea with error"
207
+ helperText="Helper text"
208
+ placeholder="Enter your text here..."
209
+ error="Error message."
210
+ />
211
+ </HalstackProvider>
212
+ </ExampleContainer>
213
+ <ExampleContainer>
214
+ <Title title="Grow manual" theme="light" level={4} />{" "}
215
+ <HalstackProvider theme={opinionatedTheme}>
216
+ <DxcTextarea
217
+ label="Manual vertical grow"
218
+ verticalGrow="manual"
219
+ defaultValue="Long textttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt"
220
+ />
221
+ </HalstackProvider>
155
222
  </ExampleContainer>
156
223
  </>
157
224
  );
@@ -8,7 +8,7 @@ var _react2 = require("@testing-library/react");
8
8
 
9
9
  var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
10
10
 
11
- var _Textarea = _interopRequireDefault(require("./Textarea"));
11
+ var _Textarea = _interopRequireDefault(require("./Textarea.tsx"));
12
12
 
13
13
  describe("Textarea component tests", function () {
14
14
  test("Renders with correct label", function () {
@@ -78,14 +78,13 @@ describe("Textarea component tests", function () {
78
78
  var textarea = getByLabelText("Example label");
79
79
  expect(textarea.rows).toBe(10);
80
80
  });
81
- test("Renders with correct accesibility attributes", function () {
81
+ test("Renders with correct accessibility attributes", function () {
82
82
  var _render7 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
83
83
  label: "Example label"
84
84
  })),
85
85
  getByLabelText = _render7.getByLabelText;
86
86
 
87
87
  var textarea = getByLabelText("Example label");
88
- expect(textarea.getAttribute("aria-disabled")).toBe("false");
89
88
  expect(textarea.getAttribute("aria-invalid")).toBe("false");
90
89
  expect(textarea.getAttribute("aria-describedBy")).toBeNull();
91
90
  expect(textarea.getAttribute("aria-required")).toBe("true");
@@ -101,7 +100,7 @@ describe("Textarea component tests", function () {
101
100
  var textarea = getByLabelText("Example label");
102
101
  expect(textarea.value).toBe("Example text");
103
102
  });
104
- test("Disabled textarea renders with correct aria and can not be modified", function () {
103
+ test("Disabled textarea can not be modified", function () {
105
104
  var onChange = jest.fn();
106
105
 
107
106
  var _render9 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
@@ -112,23 +111,66 @@ describe("Textarea component tests", function () {
112
111
  getByLabelText = _render9.getByLabelText;
113
112
 
114
113
  var textarea = getByLabelText("Example label");
115
- expect(textarea.getAttribute("aria-disabled")).toBe("true");
116
114
 
117
115
  _userEvent["default"].type(textarea, "Test");
118
116
 
119
117
  expect(onChange).not.toHaveBeenCalled();
120
118
  });
119
+ test("Read-only textarea does not trigger onChange function", function () {
120
+ var onChange = jest.fn();
121
+
122
+ var _render10 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
123
+ label: "Example label",
124
+ onChange: onChange,
125
+ readOnly: true
126
+ })),
127
+ getByLabelText = _render10.getByLabelText;
128
+
129
+ var textarea = getByLabelText("Example label");
130
+
131
+ _userEvent["default"].type(textarea, "Test");
132
+
133
+ expect(onChange).not.toHaveBeenCalled();
134
+ });
135
+ test("Read-only textarea sends its value on submit", function () {
136
+ var handlerOnSubmit = jest.fn(function (e) {
137
+ e.preventDefault();
138
+ var formData = new FormData(e.target);
139
+ var formProps = Object.fromEntries(formData);
140
+ expect(formProps).toStrictEqual({
141
+ data: "Comments"
142
+ });
143
+ });
144
+
145
+ var _render11 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement("form", {
146
+ onSubmit: handlerOnSubmit
147
+ }, /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
148
+ label: "Example label",
149
+ name: "data",
150
+ defaultValue: "Comments",
151
+ readOnly: true
152
+ }), /*#__PURE__*/_react["default"].createElement("button", {
153
+ type: "submit"
154
+ }, "Submit"))),
155
+ getByText = _render11.getByText;
156
+
157
+ var submit = getByText("Submit");
158
+
159
+ _userEvent["default"].click(submit);
160
+
161
+ expect(handlerOnSubmit).toHaveBeenCalled();
162
+ });
121
163
  test("Not optional constraint (onBlur)", function () {
122
164
  var onChange = jest.fn();
123
165
  var onBlur = jest.fn();
124
166
 
125
- var _render10 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
167
+ var _render12 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
126
168
  label: "Example label",
127
169
  placeholder: "Placeholder",
128
170
  onChange: onChange,
129
171
  onBlur: onBlur
130
172
  })),
131
- getByLabelText = _render10.getByLabelText;
173
+ getByLabelText = _render12.getByLabelText;
132
174
 
133
175
  var textarea = getByLabelText("Example label");
134
176
 
@@ -158,12 +200,12 @@ describe("Textarea component tests", function () {
158
200
  test("Not optional constraint (onChange)", function () {
159
201
  var onChange = jest.fn();
160
202
 
161
- var _render11 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
203
+ var _render13 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
162
204
  label: "Example label",
163
205
  placeholder: "Placeholder",
164
206
  onChange: onChange
165
207
  })),
166
- getByLabelText = _render11.getByLabelText;
208
+ getByLabelText = _render13.getByLabelText;
167
209
 
168
210
  var textarea = getByLabelText("Example label");
169
211
 
@@ -192,7 +234,7 @@ describe("Textarea component tests", function () {
192
234
  var onChange = jest.fn();
193
235
  var onBlur = jest.fn();
194
236
 
195
- var _render12 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
237
+ var _render14 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
196
238
  label: "Example label",
197
239
  placeholder: "Placeholder",
198
240
  onChange: onChange,
@@ -203,7 +245,7 @@ describe("Textarea component tests", function () {
203
245
  },
204
246
  pattern: "^.*(?=.*[a-zA-Z])(?=.*\\d)(?=.*[!&$%&? \"]).*$"
205
247
  })),
206
- getByLabelText = _render12.getByLabelText;
248
+ getByLabelText = _render14.getByLabelText;
207
249
 
208
250
  var textarea = getByLabelText("Example label");
209
251
 
@@ -251,7 +293,7 @@ describe("Textarea component tests", function () {
251
293
  var onChange = jest.fn();
252
294
  var onBlur = jest.fn();
253
295
 
254
- var _render13 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
296
+ var _render15 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
255
297
  label: "Example label",
256
298
  placeholder: "Placeholder",
257
299
  onChange: onChange,
@@ -263,7 +305,7 @@ describe("Textarea component tests", function () {
263
305
  minLength: 5,
264
306
  maxLength: 10
265
307
  })),
266
- getByLabelText = _render13.getByLabelText;
308
+ getByLabelText = _render15.getByLabelText;
267
309
 
268
310
  var textarea = getByLabelText("Example label");
269
311
 
@@ -311,7 +353,7 @@ describe("Textarea component tests", function () {
311
353
  var onChange = jest.fn();
312
354
  var onBlur = jest.fn();
313
355
 
314
- var _render14 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
356
+ var _render16 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
315
357
  label: "Example label",
316
358
  placeholder: "Placeholder",
317
359
  onChange: onChange,
@@ -324,7 +366,7 @@ describe("Textarea component tests", function () {
324
366
  minLength: 5,
325
367
  maxLength: 10
326
368
  })),
327
- getByLabelText = _render14.getByLabelText;
369
+ getByLabelText = _render16.getByLabelText;
328
370
 
329
371
  var textarea = getByLabelText("Example label");
330
372
 
@@ -389,11 +431,11 @@ describe("Textarea component tests", function () {
389
431
  test("onBlur function is called correctly", function () {
390
432
  var onBlur = jest.fn();
391
433
 
392
- var _render15 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
434
+ var _render17 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
393
435
  label: "Example label",
394
436
  onBlur: onBlur
395
437
  })),
396
- getByLabelText = _render15.getByLabelText;
438
+ getByLabelText = _render17.getByLabelText;
397
439
 
398
440
  var textarea = getByLabelText("Example label");
399
441
 
@@ -413,12 +455,12 @@ describe("Textarea component tests", function () {
413
455
  test("onChange function is called correctly", function () {
414
456
  var onChange = jest.fn();
415
457
 
416
- var _render16 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
458
+ var _render18 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Textarea["default"], {
417
459
  label: "Example label",
418
460
  value: "Test value",
419
461
  onChange: onChange
420
462
  })),
421
- getByLabelText = _render16.getByLabelText;
463
+ getByLabelText = _render18.getByLabelText;
422
464
 
423
465
  var textarea = getByLabelText("Example label");
424
466
 
@@ -34,6 +34,10 @@ declare type Props = {
34
34
  * If true, the component will be disabled.
35
35
  */
36
36
  disabled?: boolean;
37
+ /**
38
+ * If true, the component will not be mutable, meaning the user can not edit the control.
39
+ */
40
+ readOnly?: boolean;
37
41
  /**
38
42
  * If true, the textarea will be optional, showing '(Optional)'
39
43
  * next to the label. Otherwise, the field will be considered required
@@ -1,4 +1,4 @@
1
1
  /// <reference types="react" />
2
- import ToogleGroupPropsType from "./types";
3
- declare const DxcToggleGroup: ({ label, helperText, defaultValue, value, onChange, disabled, options, margin, multiple, tabIndex, }: ToogleGroupPropsType) => JSX.Element;
2
+ import ToggleGroupPropsType from "./types";
3
+ declare const DxcToggleGroup: ({ label, helperText, defaultValue, value, onChange, disabled, options, margin, multiple, tabIndex, }: ToggleGroupPropsType) => JSX.Element;
4
4
  export default DxcToggleGroup;