@dxc-technology/halstack-react 0.0.0-b3e1a2f → 0.0.0-b41d935

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