@dxc-technology/halstack-react 0.0.0-a0a27b4 → 0.0.0-a1db683

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 (219) hide show
  1. package/HalstackContext.d.ts +12 -0
  2. package/HalstackContext.js +295 -0
  3. package/accordion/Accordion.d.ts +1 -1
  4. package/accordion/Accordion.js +13 -45
  5. package/accordion/Accordion.stories.tsx +11 -11
  6. package/accordion/Accordion.test.js +72 -0
  7. package/accordion/types.d.ts +7 -7
  8. package/accordion-group/AccordionGroup.d.ts +1 -1
  9. package/accordion-group/AccordionGroup.js +13 -15
  10. package/accordion-group/AccordionGroup.stories.tsx +1 -1
  11. package/accordion-group/AccordionGroup.test.js +151 -0
  12. package/accordion-group/types.d.ts +7 -7
  13. package/alert/Alert.js +4 -1
  14. package/alert/Alert.test.js +92 -0
  15. package/badge/Badge.d.ts +4 -0
  16. package/badge/Badge.js +5 -3
  17. package/badge/types.d.ts +5 -0
  18. package/{radio → badge}/types.js +0 -0
  19. package/bleed/Bleed.d.ts +3 -0
  20. package/bleed/Bleed.js +51 -0
  21. package/bleed/Bleed.stories.tsx +341 -0
  22. package/bleed/types.d.ts +37 -0
  23. package/bleed/types.js +5 -0
  24. package/box/Box.js +22 -32
  25. package/box/Box.test.js +18 -0
  26. package/button/Button.d.ts +1 -1
  27. package/button/Button.js +19 -24
  28. package/button/Button.stories.tsx +6 -8
  29. package/button/Button.test.js +35 -0
  30. package/button/types.d.ts +3 -7
  31. package/card/Card.js +24 -27
  32. package/card/Card.test.js +50 -0
  33. package/checkbox/Checkbox.d.ts +1 -1
  34. package/checkbox/Checkbox.js +43 -39
  35. package/checkbox/Checkbox.stories.tsx +124 -128
  36. package/checkbox/Checkbox.test.js +78 -0
  37. package/checkbox/types.d.ts +7 -3
  38. package/chip/Chip.d.ts +1 -1
  39. package/chip/Chip.js +14 -52
  40. package/chip/Chip.stories.tsx +6 -8
  41. package/chip/Chip.test.js +56 -0
  42. package/chip/types.d.ts +5 -13
  43. package/common/variables.js +195 -330
  44. package/date-input/DateInput.js +59 -45
  45. package/date-input/DateInput.stories.tsx +7 -7
  46. package/date-input/DateInput.test.js +479 -0
  47. package/date-input/types.d.ts +16 -9
  48. package/dialog/Dialog.js +4 -32
  49. package/dialog/Dialog.test.js +40 -0
  50. package/dropdown/Dropdown.d.ts +1 -1
  51. package/dropdown/Dropdown.js +21 -47
  52. package/dropdown/Dropdown.stories.tsx +25 -23
  53. package/dropdown/Dropdown.test.js +189 -0
  54. package/dropdown/types.d.ts +5 -14
  55. package/file-input/FileInput.js +9 -6
  56. package/file-input/FileInput.test.js +457 -0
  57. package/file-input/FileItem.js +7 -5
  58. package/footer/Footer.js +24 -99
  59. package/footer/Footer.test.js +109 -0
  60. package/header/Header.js +27 -48
  61. package/header/Header.stories.tsx +46 -36
  62. package/header/Header.test.js +79 -0
  63. package/heading/Heading.test.js +186 -0
  64. package/inset/Inset.d.ts +3 -0
  65. package/inset/Inset.js +51 -0
  66. package/inset/Inset.stories.tsx +229 -0
  67. package/inset/types.d.ts +37 -0
  68. package/inset/types.js +5 -0
  69. package/layout/ApplicationLayout.d.ts +4 -3
  70. package/layout/ApplicationLayout.js +84 -110
  71. package/layout/ApplicationLayout.stories.tsx +14 -59
  72. package/layout/Icons.d.ts +5 -0
  73. package/layout/Icons.js +13 -2
  74. package/layout/SidenavContext.d.ts +5 -0
  75. package/layout/SidenavContext.js +19 -0
  76. package/layout/types.d.ts +5 -10
  77. package/link/Link.d.ts +3 -2
  78. package/link/Link.js +60 -85
  79. package/link/Link.stories.tsx +91 -51
  80. package/link/Link.test.js +83 -0
  81. package/link/types.d.ts +9 -29
  82. package/list/List.d.ts +3 -7
  83. package/list/List.js +3 -3
  84. package/list/types.d.ts +7 -0
  85. package/list/types.js +5 -0
  86. package/main.d.ts +7 -8
  87. package/main.js +39 -41
  88. package/number-input/NumberInput.js +11 -18
  89. package/number-input/NumberInput.stories.tsx +5 -5
  90. package/number-input/NumberInput.test.js +506 -0
  91. package/number-input/types.d.ts +17 -10
  92. package/package.json +6 -5
  93. package/paginator/Paginator.js +17 -38
  94. package/paginator/Paginator.test.js +266 -0
  95. package/password-input/PasswordInput.js +7 -4
  96. package/password-input/PasswordInput.test.js +180 -0
  97. package/password-input/types.d.ts +14 -11
  98. package/progress-bar/ProgressBar.js +3 -3
  99. package/progress-bar/ProgressBar.stories.jsx +11 -11
  100. package/progress-bar/ProgressBar.test.js +65 -0
  101. package/quick-nav/QuickNav.d.ts +4 -0
  102. package/quick-nav/QuickNav.js +112 -0
  103. package/quick-nav/QuickNav.stories.tsx +237 -0
  104. package/quick-nav/types.d.ts +21 -0
  105. package/quick-nav/types.js +5 -0
  106. package/radio-group/Radio.d.ts +1 -1
  107. package/radio-group/Radio.js +50 -26
  108. package/radio-group/RadioGroup.js +84 -33
  109. package/radio-group/RadioGroup.stories.tsx +63 -20
  110. package/radio-group/RadioGroup.test.js +695 -0
  111. package/radio-group/types.d.ts +85 -2
  112. package/resultsetTable/ResultsetTable.js +5 -2
  113. package/resultsetTable/ResultsetTable.stories.tsx +6 -8
  114. package/resultsetTable/ResultsetTable.test.js +306 -0
  115. package/row/Row.d.ts +3 -11
  116. package/row/Row.stories.tsx +5 -7
  117. package/row/types.d.ts +28 -0
  118. package/row/types.js +5 -0
  119. package/select/Icons.d.ts +10 -0
  120. package/select/Icons.js +93 -0
  121. package/select/Listbox.d.ts +4 -0
  122. package/select/Listbox.js +152 -0
  123. package/select/Option.d.ts +4 -0
  124. package/select/Option.js +110 -0
  125. package/select/Select.js +109 -327
  126. package/select/Select.stories.tsx +103 -81
  127. package/select/Select.test.js +2120 -0
  128. package/select/types.d.ts +54 -11
  129. package/sidenav/Sidenav.d.ts +1 -1
  130. package/sidenav/Sidenav.js +20 -9
  131. package/sidenav/Sidenav.test.js +56 -0
  132. package/slider/Slider.d.ts +1 -1
  133. package/slider/Slider.js +2 -1
  134. package/slider/Slider.stories.tsx +8 -8
  135. package/slider/Slider.test.js +150 -0
  136. package/slider/types.d.ts +4 -0
  137. package/spinner/Spinner.js +1 -1
  138. package/spinner/Spinner.test.js +64 -0
  139. package/stack/Stack.d.ts +3 -10
  140. package/stack/Stack.stories.tsx +4 -6
  141. package/stack/types.d.ts +24 -0
  142. package/stack/types.js +5 -0
  143. package/switch/Switch.d.ts +1 -1
  144. package/switch/Switch.js +35 -19
  145. package/switch/Switch.stories.tsx +14 -14
  146. package/switch/Switch.test.js +98 -0
  147. package/switch/types.d.ts +6 -2
  148. package/table/Table.test.js +26 -0
  149. package/tabs/Tabs.d.ts +1 -1
  150. package/tabs/Tabs.js +16 -18
  151. package/tabs/Tabs.stories.tsx +6 -16
  152. package/tabs/Tabs.test.js +140 -0
  153. package/tabs/types.d.ts +27 -15
  154. package/tabs-nav/NavTabs.d.ts +8 -0
  155. package/tabs-nav/NavTabs.js +125 -0
  156. package/tabs-nav/NavTabs.stories.tsx +170 -0
  157. package/tabs-nav/NavTabs.test.js +82 -0
  158. package/tabs-nav/Tab.d.ts +4 -0
  159. package/tabs-nav/Tab.js +132 -0
  160. package/tabs-nav/types.d.ts +53 -0
  161. package/tabs-nav/types.js +5 -0
  162. package/tag/Tag.d.ts +1 -1
  163. package/tag/Tag.js +17 -27
  164. package/tag/Tag.stories.tsx +25 -28
  165. package/tag/Tag.test.js +60 -0
  166. package/tag/types.d.ts +23 -14
  167. package/text/Text.js +1 -1
  168. package/text-input/Suggestion.d.ts +4 -0
  169. package/text-input/Suggestion.js +55 -0
  170. package/text-input/TextInput.js +68 -84
  171. package/text-input/TextInput.stories.tsx +30 -12
  172. package/text-input/TextInput.test.js +1712 -0
  173. package/text-input/types.d.ts +32 -13
  174. package/textarea/Textarea.js +20 -27
  175. package/textarea/Textarea.stories.jsx +33 -12
  176. package/textarea/Textarea.test.js +437 -0
  177. package/textarea/types.d.ts +18 -11
  178. package/toggle-group/ToggleGroup.d.ts +1 -1
  179. package/toggle-group/ToggleGroup.js +5 -4
  180. package/toggle-group/ToggleGroup.stories.tsx +4 -4
  181. package/toggle-group/ToggleGroup.test.js +156 -0
  182. package/toggle-group/types.d.ts +8 -0
  183. package/useTheme.js +2 -2
  184. package/useTranslatedLabels.d.ts +2 -0
  185. package/useTranslatedLabels.js +20 -0
  186. package/wizard/Wizard.d.ts +1 -1
  187. package/wizard/Wizard.js +55 -44
  188. package/wizard/Wizard.stories.tsx +13 -23
  189. package/wizard/Wizard.test.js +141 -0
  190. package/wizard/types.d.ts +6 -2
  191. package/ThemeContext.d.ts +0 -15
  192. package/ThemeContext.js +0 -243
  193. package/V3Select/V3Select.js +0 -455
  194. package/V3Select/index.d.ts +0 -27
  195. package/V3Textarea/V3Textarea.js +0 -260
  196. package/V3Textarea/index.d.ts +0 -27
  197. package/date/Date.js +0 -373
  198. package/date/index.d.ts +0 -27
  199. package/input-text/Icons.js +0 -22
  200. package/input-text/InputText.js +0 -611
  201. package/input-text/index.d.ts +0 -36
  202. package/radio/Radio.d.ts +0 -4
  203. package/radio/Radio.js +0 -174
  204. package/radio/Radio.stories.tsx +0 -192
  205. package/radio/types.d.ts +0 -54
  206. package/toggle/Toggle.js +0 -186
  207. package/toggle/index.d.ts +0 -21
  208. package/upload/Upload.js +0 -201
  209. package/upload/buttons-upload/ButtonsUpload.js +0 -111
  210. package/upload/buttons-upload/Icons.js +0 -40
  211. package/upload/dragAndDropArea/DragAndDropArea.js +0 -225
  212. package/upload/dragAndDropArea/Icons.js +0 -39
  213. package/upload/file-upload/FileToUpload.js +0 -115
  214. package/upload/file-upload/Icons.js +0 -66
  215. package/upload/files-upload/FilesToUpload.js +0 -109
  216. package/upload/index.d.ts +0 -15
  217. package/upload/transaction/Icons.js +0 -160
  218. package/upload/transaction/Transaction.js +0 -104
  219. package/upload/transactions/Transactions.js +0 -94
@@ -21,20 +21,23 @@ var _uuid = require("uuid");
21
21
 
22
22
  var _useTheme = _interopRequireDefault(require("../useTheme"));
23
23
 
24
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
24
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
25
25
 
26
26
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
27
 
28
28
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
29
 
30
30
  var DxcRadio = function DxcRadio(_ref) {
31
+ var _option$disabled;
32
+
31
33
  var option = _ref.option,
32
34
  currentValue = _ref.currentValue,
33
35
  onClick = _ref.onClick,
34
- onFocus = _ref.onFocus,
35
36
  error = _ref.error,
36
37
  disabled = _ref.disabled,
37
- focused = _ref.focused;
38
+ focused = _ref.focused,
39
+ readonly = _ref.readonly,
40
+ tabIndex = _ref.tabIndex;
38
41
 
39
42
  var _useState = (0, _react.useState)("radio-".concat((0, _uuid.v4)())),
40
43
  _useState2 = (0, _slicedToArray2["default"])(_useState, 1),
@@ -42,7 +45,13 @@ var DxcRadio = function DxcRadio(_ref) {
42
45
 
43
46
  var ref = (0, _react.useRef)(null);
44
47
  var colorsTheme = (0, _useTheme["default"])();
45
- var checked = option.value === currentValue;
48
+
49
+ var handleOnClick = function handleOnClick() {
50
+ var _ref$current;
51
+
52
+ onClick();
53
+ focused && document.activeElement !== (ref === null || ref === void 0 ? void 0 : ref.current) && (ref === null || ref === void 0 ? void 0 : (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.focus());
54
+ };
46
55
 
47
56
  var _useState3 = (0, _react.useState)(true),
48
57
  _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
@@ -50,7 +59,7 @@ var DxcRadio = function DxcRadio(_ref) {
50
59
  setFirstUpdate = _useState4[1];
51
60
 
52
61
  (0, _react.useLayoutEffect)(function () {
53
- var _ref$current;
62
+ var _ref$current2;
54
63
 
55
64
  // Don't apply in the first render
56
65
  if (firstUpdate) {
@@ -58,47 +67,62 @@ var DxcRadio = function DxcRadio(_ref) {
58
67
  return;
59
68
  }
60
69
 
61
- focused && (ref === null || ref === void 0 ? void 0 : (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.focus());
70
+ focused && (ref === null || ref === void 0 ? void 0 : (_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.focus());
62
71
  }, [focused]);
63
72
  return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
64
73
  theme: colorsTheme.radioGroup
65
- }, /*#__PURE__*/_react["default"].createElement(RadioContainer, null, /*#__PURE__*/_react["default"].createElement(RadioInputContainer, null, /*#__PURE__*/_react["default"].createElement(RadioInput, {
74
+ }, /*#__PURE__*/_react["default"].createElement(RadioMainContainer, null, /*#__PURE__*/_react["default"].createElement(RadioContainer, {
75
+ error: error,
66
76
  disabled: disabled,
77
+ readonly: readonly,
78
+ onMouseDown: function onMouseDown(event) {
79
+ // Prevents div's onClick from stealing the radio input's focus
80
+ event.preventDefault();
81
+ },
82
+ onClick: handleOnClick
83
+ }, /*#__PURE__*/_react["default"].createElement(RadioInputContainer, null, /*#__PURE__*/_react["default"].createElement(RadioInput, {
67
84
  error: error,
68
- onClick: onClick,
69
- onFocus: onFocus,
85
+ disabled: disabled,
86
+ readonly: readonly,
70
87
  role: "radio",
71
- "aria-checked": checked,
88
+ "aria-checked": option.value === currentValue,
89
+ "aria-disabled": (_option$disabled = option.disabled) !== null && _option$disabled !== void 0 ? _option$disabled : false,
72
90
  "aria-labelledby": radioLabelId,
73
- tabIndex: disabled ? -1 : focused || checked ? 0 : -1,
91
+ tabIndex: disabled ? -1 : focused ? tabIndex : -1,
74
92
  ref: ref
75
- }, checked && /*#__PURE__*/_react["default"].createElement(Dot, {
93
+ }, option.value === currentValue && /*#__PURE__*/_react["default"].createElement(Dot, {
94
+ disabled: disabled,
95
+ readonly: readonly,
76
96
  error: error
77
97
  }))), /*#__PURE__*/_react["default"].createElement(Label, {
78
98
  id: radioLabelId,
79
- onMouseDown: function onMouseDown(event) {
80
- event.preventDefault();
81
- },
82
- onClick: onClick,
83
99
  disabled: disabled
84
- }, option.label)));
100
+ }, option.label))));
85
101
  };
86
102
 
87
- var RadioContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n"])));
103
+ var RadioMainContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n"])));
88
104
 
89
- var RadioInputContainer = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 24px;\n width: 24px;\n"])));
105
+ var RadioContainer = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-flex;\n align-items: center;\n cursor: ", ";\n\n ", "\n"])), function (props) {
106
+ return props.disabled ? "not-allowed" : props.readonly ? "default" : "pointer";
107
+ }, function (props) {
108
+ return !props.disabled ? "\n &:hover {\n & > div > div { \n border-color: ".concat(props.error ? props.theme.hoverErrorRadioInputColor : props.readonly ? props.theme.hoverReadonlyRadioInputColor : props.theme.hoverRadioInputColor, ";\n & > span {\n background-color: ").concat(props.error ? props.theme.hoverErrorRadioInputColor : props.readonly ? props.theme.hoverReadonlyRadioInputColor : props.theme.hoverRadioInputColor, ";\n }\n };\n }\n &:active {\n & > div > div {\n border-color: ").concat(props.error ? props.theme.activeErrorRadioInputColor : props.readonly ? props.theme.activeReadonlyRadioInputColor : props.theme.activeRadioInputColor, ";\n & > span {\n background-color: ").concat(props.error ? props.theme.activeErrorRadioInputColor : props.readonly ? props.theme.activeReadonlyRadioInputColor : props.theme.activeRadioInputColor, ";\n }\n }\n }\n ") : "pointer-events: none;";
109
+ });
90
110
 
91
- var RadioInput = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n border: 2px solid\n ", ";\n border-radius: 50%;\n box-shadow: 0 0 0 2px transparent;\n\n ", "\n"])), function (props) {
92
- return props.disabled ? props.theme.disabledRadioInputColor : props.error ? props.theme.errorRadioInputColor : props.theme.radioInputColor;
111
+ var RadioInputContainer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 24px;\n width: 24px;\n"])));
112
+
113
+ var RadioInput = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: 18px;\n height: 18px;\n border: 2px solid\n ", ";\n border-radius: 50%;\n\n ", "\n"])), function (props) {
114
+ if (props.disabled) return props.theme.disabledRadioInputColor;else if (props.error) return props.theme.errorRadioInputColor;else if (props.readonly) return props.theme.readonlyRadioInputColor;else return props.theme.radioInputColor;
93
115
  }, function (props) {
94
- return !props.disabled ? "\n &:focus {\n outline: 2px solid ".concat(props.theme.focusBorderColor, ";\n outline-offset: 1px;\n }\n &:focus-visible {\n outline: 2px solid ").concat(props.theme.focusBorderColor, ";\n outline-offset: 1px;\n }\n &:hover {\n cursor: pointer;\n border-color: ").concat(props.error ? props.theme.hoverErrorRadioInputColor : props.theme.hoverInputColor, ";\n & > span {\n background-color: ").concat(props.error ? props.theme.hoverErrorRadioInputColor : props.theme.hoverInputColor, ";\n }\n }\n &:active {\n cursor: pointer;\n border-color: ").concat(props.error ? props.theme.activeErrorInputColor : props.theme.activeInputColor, ";\n & > span {\n background-color: ").concat(props.error ? props.theme.activeErrorInputColor : props.theme.activeInputColor, ";\n }\n }\n ") : "\n & > span {\n background-color: ".concat(props.theme.disabledRadioInputColor, ";\n }\n cursor: not-allowed;\n pointer-events: none;\n :focus-visible {\n outline: none;\n }\n ");
116
+ return !props.disabled ? "&:focus {\n outline: 2px solid ".concat(props.theme.focusBorderColor, ";\n outline-offset: 1px;\n }\n &:focus-visible {\n outline: 2px solid ").concat(props.theme.focusBorderColor, ";\n outline-offset: 1px;\n }\n ") : "\n :focus-visible {\n outline: none;\n }\n ";
95
117
  });
96
118
 
97
- var Dot = _styledComponents["default"].span(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n height: 10px;\n width: 10px;\n background-color: ", ";\n border-radius: 50%;\n"])), function (props) {
98
- return props.error ? props.theme.errorRadioInputColor : props.theme.radioInputColor;
119
+ var Dot = _styledComponents["default"].span(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n height: 10px;\n width: 10px;\n border-radius: 50%;\n background-color: ", ";\n"])), function (props) {
120
+ if (props.disabled) return props.theme.disabledRadioInputColor;else if (props.error) return props.theme.errorRadioInputColor;else if (props.readonly) return props.theme.readonlyRadioInputColor;else return props.theme.radioInputColor;
99
121
  });
100
122
 
101
- var Label = _styledComponents["default"].span(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 0.5rem;\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n line-height: ", ";\n ", "\n"])), function (props) {
123
+ var Label = _styledComponents["default"].span(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: ", ";\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n line-height: ", ";\n ", "\n"])), function (props) {
124
+ return props.theme.radioInputLabelMargin;
125
+ }, function (props) {
102
126
  return props.theme.fontFamily;
103
127
  }, function (props) {
104
128
  return props.theme.radioInputLabelFontSize;
@@ -109,7 +133,7 @@ var Label = _styledComponents["default"].span(_templateObject5 || (_templateObje
109
133
  }, function (props) {
110
134
  return props.theme.radioInputLabelLineHeight;
111
135
  }, function (props) {
112
- return props.disabled ? "color: ".concat(props.theme.disabledRadioInputLabelFontColor, "; pointer-events: none;") : "cursor: pointer;";
136
+ return props.disabled ? "color: ".concat(props.theme.disabledRadioInputLabelFontColor, "; pointer-events: none;") : "color: ".concat(props.theme.radioInputLabelFontColor);
113
137
  });
114
138
 
115
139
  var _default = /*#__PURE__*/_react["default"].memo(DxcRadio);
@@ -23,6 +23,8 @@ var _uuid = require("uuid");
23
23
 
24
24
  var _useTheme = _interopRequireDefault(require("../useTheme"));
25
25
 
26
+ var _useTranslatedLabels = _interopRequireDefault(require("../useTranslatedLabels"));
27
+
26
28
  var _Radio = _interopRequireDefault(require("./Radio"));
27
29
 
28
30
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7;
@@ -47,8 +49,7 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
47
49
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
48
50
  _ref$optional = _ref.optional,
49
51
  optional = _ref$optional === void 0 ? false : _ref$optional,
50
- _ref$optionalItemLabe = _ref.optionalItemLabel,
51
- optionalItemLabel = _ref$optionalItemLabe === void 0 ? "N/A" : _ref$optionalItemLabe,
52
+ optionalItemLabel = _ref.optionalItemLabel,
52
53
  _ref$readonly = _ref.readonly,
53
54
  readonly = _ref$readonly === void 0 ? false : _ref$readonly,
54
55
  _ref$stacking = _ref.stacking,
@@ -56,13 +57,17 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
56
57
  defaultValue = _ref.defaultValue,
57
58
  value = _ref.value,
58
59
  onChange = _ref.onChange,
59
- error = _ref.error;
60
+ onBlur = _ref.onBlur,
61
+ error = _ref.error,
62
+ _ref$tabIndex = _ref.tabIndex,
63
+ tabIndex = _ref$tabIndex === void 0 ? 0 : _ref$tabIndex;
60
64
 
61
- var _useState = (0, _react.useState)("select-".concat((0, _uuid.v4)())),
65
+ var _useState = (0, _react.useState)("radio-group-".concat((0, _uuid.v4)())),
62
66
  _useState2 = (0, _slicedToArray2["default"])(_useState, 1),
63
67
  radioGroupId = _useState2[0];
64
68
 
65
69
  var radioGroupLabelId = "label-".concat(radioGroupId);
70
+ var errorId = "error-".concat(radioGroupId);
66
71
 
67
72
  var _useState3 = (0, _react.useState)(defaultValue),
68
73
  _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
@@ -74,8 +79,10 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
74
79
  firstTimeFocus = _useState6[0],
75
80
  setFirstTimeFocus = _useState6[1];
76
81
 
82
+ var colorsTheme = (0, _useTheme["default"])();
83
+ var translatedLabels = (0, _useTranslatedLabels["default"])();
77
84
  var optionalItem = {
78
- label: optionalItemLabel,
85
+ label: optionalItemLabel || translatedLabels.radioGroup.optionalItemLabelDefault,
79
86
  value: "",
80
87
  disabled: disabled
81
88
  };
@@ -88,11 +95,10 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
88
95
  currentFocusIndex = _useState8[0],
89
96
  setCurrentFocusIndex = _useState8[1];
90
97
 
91
- var colorsTheme = (0, _useTheme["default"])();
92
98
  var handleOnChange = (0, _react.useCallback)(function (newValue) {
93
99
  var currentValue = value !== null && value !== void 0 ? value : innerValue;
94
100
 
95
- if (newValue !== currentValue) {
101
+ if (newValue !== currentValue && !readonly) {
96
102
  value !== null && value !== void 0 ? value : setInnerValue(newValue);
97
103
  onChange === null || onChange === void 0 ? void 0 : onChange(newValue);
98
104
  }
@@ -100,26 +106,49 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
100
106
 
101
107
  var handleOnBlur = function handleOnBlur(e) {
102
108
  // If the radio group loses the focus to an element not contained inside it...
103
- !e.currentTarget.contains(e.relatedTarget) && setFirstTimeFocus(true);
109
+ if (!e.currentTarget.contains(e.relatedTarget)) {
110
+ setFirstTimeFocus(true);
111
+ var currentValue = value !== null && value !== void 0 ? value : innerValue;
112
+ !optional && !Boolean(currentValue) ? onBlur === null || onBlur === void 0 ? void 0 : onBlur({
113
+ value: currentValue,
114
+ error: translatedLabels.formFields.requiredSelectionErrorMessage
115
+ }) : onBlur === null || onBlur === void 0 ? void 0 : onBlur({
116
+ value: currentValue
117
+ });
118
+ }
119
+ };
120
+
121
+ var handleOnFocus = function handleOnFocus() {
122
+ firstTimeFocus && setFirstTimeFocus(false);
104
123
  };
105
124
 
106
125
  var setPreviousRadioChecked = function setPreviousRadioChecked() {
107
- if (!disabled) {
108
- setCurrentFocusIndex(function (currentFocusIndex) {
109
- return currentFocusIndex === 0 ? innerOptions.length - 1 : currentFocusIndex - 1;
110
- });
111
- }
126
+ setCurrentFocusIndex(function (currentFocusIndex) {
127
+ var index = currentFocusIndex === 0 ? innerOptions.length - 1 : currentFocusIndex - 1;
128
+
129
+ while (innerOptions[index].disabled) {
130
+ index = index === 0 ? innerOptions.length - 1 : index - 1;
131
+ }
132
+
133
+ handleOnChange(innerOptions[index].value);
134
+ return index;
135
+ });
112
136
  };
113
137
 
114
138
  var setNextRadioChecked = function setNextRadioChecked() {
115
- if (!disabled) {
116
- setCurrentFocusIndex(function (currentFocusIndex) {
117
- return currentFocusIndex === innerOptions.length - 1 ? 0 : currentFocusIndex + 1;
118
- });
119
- }
139
+ setCurrentFocusIndex(function (currentFocusIndex) {
140
+ var index = currentFocusIndex === innerOptions.length - 1 ? 0 : currentFocusIndex + 1;
141
+
142
+ while (innerOptions[index].disabled) {
143
+ index = index === innerOptions.length - 1 ? 0 : index + 1;
144
+ }
145
+
146
+ handleOnChange(innerOptions[index].value);
147
+ return index;
148
+ });
120
149
  };
121
150
 
122
- var handleOnKeyDown = (0, _react.useCallback)(function (event) {
151
+ var handleOnKeyDown = function handleOnKeyDown(event) {
123
152
  switch (event.keyCode) {
124
153
  case 37: // arrow left
125
154
 
@@ -136,8 +165,17 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
136
165
  event.preventDefault();
137
166
  setNextRadioChecked();
138
167
  break;
168
+
169
+ case 13: // enter
170
+
171
+ case 32:
172
+ // space
173
+ event.preventDefault();
174
+ handleOnChange(innerOptions[currentFocusIndex].value);
175
+ break;
139
176
  }
140
- }, [disabled, options, setCurrentFocusIndex]);
177
+ };
178
+
141
179
  return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
142
180
  theme: colorsTheme.radioGroup
143
181
  }, /*#__PURE__*/_react["default"].createElement(RadioGroupContainer, {
@@ -146,14 +184,21 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
146
184
  id: radioGroupLabelId,
147
185
  helperText: helperText,
148
186
  disabled: disabled
149
- }, label, " ", optional && /*#__PURE__*/_react["default"].createElement(OptionalLabel, null, "(Optional)")), helperText && /*#__PURE__*/_react["default"].createElement(HelperText, {
187
+ }, label, " ", optional && /*#__PURE__*/_react["default"].createElement(OptionalLabel, null, translatedLabels.formFields.optionalLabel)), helperText && /*#__PURE__*/_react["default"].createElement(HelperText, {
150
188
  disabled: disabled
151
189
  }, helperText), /*#__PURE__*/_react["default"].createElement(RadioGroup, {
190
+ onBlur: handleOnBlur,
191
+ onFocus: handleOnFocus,
192
+ onKeyDown: handleOnKeyDown,
152
193
  stacking: stacking,
153
194
  role: "radiogroup",
195
+ "aria-disabled": disabled,
154
196
  "aria-labelledby": radioGroupLabelId,
155
- onBlur: handleOnBlur,
156
- onKeyDown: handleOnKeyDown
197
+ "aria-invalid": error ? "true" : "false",
198
+ "aria-errormessage": error ? errorId : undefined,
199
+ "aria-required": !disabled && !readonly && !optional,
200
+ "aria-readonly": readonly,
201
+ "aria-orientation": stacking === "column" ? "vertical" : "horizontal"
157
202
  }, /*#__PURE__*/_react["default"].createElement(ValueInput, {
158
203
  name: name,
159
204
  value: value !== null && value !== void 0 ? value : innerValue,
@@ -167,17 +212,19 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
167
212
  handleOnChange(option.value);
168
213
  setCurrentFocusIndex(index);
169
214
  },
170
- onFocus: function onFocus() {
171
- !firstTimeFocus ? handleOnChange(option.value) : setFirstTimeFocus(false);
172
- },
173
215
  error: error,
174
216
  disabled: option.disabled || disabled,
175
- focused: currentFocusIndex === index
217
+ focused: currentFocusIndex === index,
218
+ readonly: readonly,
219
+ tabIndex: tabIndex
176
220
  });
177
- })), !disabled && typeof error === "string" && /*#__PURE__*/_react["default"].createElement(Error, null, error)));
221
+ })), !disabled && typeof error === "string" && /*#__PURE__*/_react["default"].createElement(Error, {
222
+ id: errorId,
223
+ "aria-live": error ? "assertive" : "off"
224
+ }, error)));
178
225
  });
179
226
 
180
- var RadioGroupContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n"])));
227
+ var RadioGroupContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-flex;\n flex-direction: column;\n box-sizing: border-box;\n"])));
181
228
 
182
229
  var Label = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n line-height: ", ";\n ", "\n"])), function (props) {
183
230
  return props.disabled ? props.theme.disabledLabelFontColor : props.theme.labelFontColor;
@@ -192,14 +239,14 @@ var Label = _styledComponents["default"].span(_templateObject2 || (_templateObje
192
239
  }, function (props) {
193
240
  return props.theme.labelLineHeight;
194
241
  }, function (props) {
195
- return !props.helperText && "margin-bottom: 0.25rem;";
242
+ return !props.helperText && "margin-bottom: ".concat(props.theme.groupLabelMargin);
196
243
  });
197
244
 
198
245
  var OptionalLabel = _styledComponents["default"].span(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n font-weight: ", ";\n"])), function (props) {
199
246
  return props.theme.optionalLabelFontWeight;
200
247
  });
201
248
 
202
- var HelperText = _styledComponents["default"].span(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n line-height: ", ";\n margin-bottom: 0.5rem;\n"])), function (props) {
249
+ var HelperText = _styledComponents["default"].span(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n line-height: ", ";\n margin-bottom: ", ";\n"])), function (props) {
203
250
  return props.disabled ? props.theme.disabledHelperTextFontColor : props.theme.helperTextFontColor;
204
251
  }, function (props) {
205
252
  return props.theme.fontFamily;
@@ -211,12 +258,16 @@ var HelperText = _styledComponents["default"].span(_templateObject4 || (_templat
211
258
  return props.theme.helperTextFontWeight;
212
259
  }, function (props) {
213
260
  return props.theme.helperTextLineHeight;
261
+ }, function (props) {
262
+ return props.theme.groupLabelMargin;
214
263
  });
215
264
 
216
- var RadioGroup = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-wrap: wrap;\n flex-direction: ", ";\n\n div + div {\n ", ";\n }\n"])), function (props) {
265
+ var RadioGroup = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-wrap: wrap;\n flex-direction: ", ";\n\n row-gap: ", ";\n column-gap: ", ";\n"])), function (props) {
217
266
  return props.stacking;
218
267
  }, function (props) {
219
- return props.stacking === "column" ? "margin-top: 0.25rem;" : "margin-left: 2rem;";
268
+ return props.theme.groupVerticalGutter;
269
+ }, function (props) {
270
+ return props.theme.groupHorizontalGutter;
220
271
  });
221
272
 
222
273
  var ValueInput = _styledComponents["default"].input(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n display: none;\n"])));
@@ -7,6 +7,8 @@ export default {
7
7
  component: DxcRadioGroup,
8
8
  };
9
9
 
10
+ const single_option = [{ label: "Option A", value: "A" }];
11
+
10
12
  const options = [
11
13
  { label: "Option 1", value: "1" },
12
14
  { label: "Option 2", value: "2" },
@@ -14,44 +16,85 @@ const options = [
14
16
  { label: "Option 4", value: "4" },
15
17
  ];
16
18
 
17
- const single_disabled_options = [
18
- { label: "Option 1", value: "1" },
19
- { label: "Option 2", value: "2", disabled: true },
20
- { label: "Option 3", value: "3" },
21
- ];
19
+ const single_disabled_options = [{ label: "Option A", value: "A", disabled: true }];
22
20
 
23
21
  export const Chromatic = () => (
24
22
  <>
23
+ <Title title="Radio input states" theme="light" level={2} />
24
+ <ExampleContainer>
25
+ <Title title="Enabled" theme="light" level={4} />
26
+ <DxcRadioGroup label="Example" defaultValue="A" options={single_option} />
27
+ </ExampleContainer>
28
+ <ExampleContainer pseudoState="pseudo-hover">
29
+ <Title title="Hovered" theme="light" level={4} />
30
+ <DxcRadioGroup label="Example" defaultValue="A" options={single_option} />
31
+ </ExampleContainer>
32
+ <ExampleContainer pseudoState="pseudo-active">
33
+ <Title title="Active" theme="light" level={4} />
34
+ <DxcRadioGroup label="Example" defaultValue="A" options={single_option} />
35
+ </ExampleContainer>
36
+ <ExampleContainer pseudoState="pseudo-focus">
37
+ <Title title="Focused" theme="light" level={4} />
38
+ <DxcRadioGroup label="Example" defaultValue="A" options={single_option} />
39
+ </ExampleContainer>
40
+ <ExampleContainer>
41
+ <Title title="Disabled" theme="light" level={4} />
42
+ <DxcRadioGroup label="Example" options={single_disabled_options} defaultValue="A" />
43
+ </ExampleContainer>
44
+ <Title title="Readonly radio input sub-states" theme="light" level={3} />
25
45
  <ExampleContainer>
26
- <Title title="Default (column)" theme="light" level={4} />
27
- <DxcRadioGroup label="Example" helperText="Helper text" options={options} defaultValue="3" />
46
+ <Title title="Enabled" theme="light" level={4} />
47
+ <DxcRadioGroup label="Example" options={single_option} defaultValue="A" readonly />
48
+ </ExampleContainer>
49
+ <ExampleContainer pseudoState="pseudo-hover">
50
+ <Title title="Hovered" theme="light" level={4} />
51
+ <DxcRadioGroup label="Example" options={single_option} defaultValue="A" readonly />
52
+ </ExampleContainer>
53
+ <ExampleContainer pseudoState="pseudo-active">
54
+ <Title title="Active" theme="light" level={4} />
55
+ <DxcRadioGroup label="Example" options={single_option} defaultValue="A" readonly />
56
+ </ExampleContainer>
57
+ <Title title="Error radio input sub-states" theme="light" level={3} />
58
+ <ExampleContainer>
59
+ <Title title="Enabled" theme="light" level={4} />
60
+ <DxcRadioGroup label="Example" options={single_option} defaultValue="A" error="Error message" />
61
+ </ExampleContainer>
62
+ <ExampleContainer pseudoState="pseudo-hover">
63
+ <Title title="Hovered" theme="light" level={4} />
64
+ <DxcRadioGroup label="Example" options={single_option} defaultValue="A" readonly error="Error message" />
65
+ </ExampleContainer>
66
+ <ExampleContainer pseudoState="pseudo-active">
67
+ <Title title="Active" theme="light" level={4} />
68
+ <DxcRadioGroup label="Example" options={single_option} defaultValue="A" readonly error="Error message" />
69
+ </ExampleContainer>
70
+ <Title title="Variants" theme="light" level={2} />
71
+ <ExampleContainer>
72
+ <Title title="Column" theme="light" level={4} />
73
+ <DxcRadioGroup label="Example" helperText="Helper text" options={options} />
28
74
  </ExampleContainer>
29
75
  <ExampleContainer>
30
76
  <Title title="Row" theme="light" level={4} />
31
77
  <DxcRadioGroup label="Example" helperText="Helper text" options={options} stacking="row" />
32
78
  </ExampleContainer>
79
+ <ExampleContainer>
80
+ <Title title="Optional" theme="light" level={4} />
81
+ <DxcRadioGroup label="Example" optional helperText="Helper text" options={options} stacking="row" />
82
+ </ExampleContainer>
33
83
  <ExampleContainer>
34
84
  <Title title="Disabled" theme="light" level={4} />
35
- <DxcRadioGroup label="Disabled" error="Error message" helperText="Helper text" options={options} disabled optional defaultValue="2" />
85
+ <DxcRadioGroup label="Example" helperText="Helper text" options={options} disabled />
36
86
  </ExampleContainer>
37
87
  <ExampleContainer>
38
- <Title title="Single disabled" theme="light" level={4} />
39
- <DxcRadioGroup label="Disabled" helperText="Helper text" options={single_disabled_options} defaultValue="3" />
88
+ <Title title="Readonly" theme="light" level={4} />
89
+ <DxcRadioGroup label="Example" readonly helperText="Helper text" options={options} />
40
90
  </ExampleContainer>
41
91
  <ExampleContainer>
42
- <Title title="Optional" theme="light" level={4} />
43
- <DxcRadioGroup
44
- label="Example"
45
- optionalItemLabel="No selection"
46
- optional
47
- helperText="Helper text"
48
- options={options}
49
- stacking="row"
50
- />
92
+ <Title title="Error space reserved" theme="light" level={4} />
93
+ <DxcRadioGroup label="Example" error="" helperText="Helper text" options={options} />
51
94
  </ExampleContainer>
52
95
  <ExampleContainer>
53
96
  <Title title="Error" theme="light" level={4} />
54
- <DxcRadioGroup label="Example" error="Error message" helperText="Helper text" options={options} defaultValue="2" />
97
+ <DxcRadioGroup label="Example" error="Error message" helperText="Helper text" options={options} />
55
98
  </ExampleContainer>
56
99
  </>
57
100
  );