@dxc-technology/halstack-react 0.0.0-4448bdb → 0.0.0-453c87a

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 (278) hide show
  1. package/HalstackContext.d.ts +12 -0
  2. package/HalstackContext.js +294 -0
  3. package/accordion/Accordion.d.ts +1 -1
  4. package/accordion/Accordion.js +117 -136
  5. package/accordion/Accordion.stories.tsx +65 -26
  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/{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 +23 -33
  25. package/box/Box.test.js +18 -0
  26. package/box/types.d.ts +1 -0
  27. package/bulleted-list/BulletedList.d.ts +7 -0
  28. package/bulleted-list/BulletedList.js +123 -0
  29. package/bulleted-list/BulletedList.stories.tsx +200 -0
  30. package/bulleted-list/types.d.ts +11 -0
  31. package/bulleted-list/types.js +5 -0
  32. package/button/Button.d.ts +1 -1
  33. package/button/Button.js +54 -79
  34. package/button/Button.stories.tsx +66 -8
  35. package/button/Button.test.js +35 -0
  36. package/button/types.d.ts +8 -12
  37. package/card/Card.js +24 -27
  38. package/card/Card.test.js +50 -0
  39. package/card/types.d.ts +1 -0
  40. package/checkbox/Checkbox.d.ts +2 -2
  41. package/checkbox/Checkbox.js +106 -109
  42. package/checkbox/Checkbox.stories.tsx +146 -130
  43. package/checkbox/Checkbox.test.js +155 -0
  44. package/checkbox/types.d.ts +13 -5
  45. package/chip/Chip.d.ts +1 -1
  46. package/chip/Chip.js +17 -67
  47. package/chip/Chip.stories.tsx +44 -14
  48. package/chip/Chip.test.js +56 -0
  49. package/chip/types.d.ts +5 -13
  50. package/common/variables.js +346 -446
  51. package/date-input/Calendar.d.ts +4 -0
  52. package/date-input/Calendar.js +246 -0
  53. package/date-input/DateInput.js +171 -260
  54. package/date-input/DateInput.stories.tsx +137 -38
  55. package/date-input/DateInput.test.js +835 -0
  56. package/date-input/DatePicker.d.ts +4 -0
  57. package/date-input/DatePicker.js +132 -0
  58. package/date-input/Icons.d.ts +6 -0
  59. package/date-input/Icons.js +75 -0
  60. package/date-input/YearPicker.d.ts +4 -0
  61. package/date-input/YearPicker.js +116 -0
  62. package/date-input/types.d.ts +67 -9
  63. package/dialog/Dialog.js +46 -50
  64. package/dialog/Dialog.stories.tsx +57 -2
  65. package/dialog/Dialog.test.js +70 -0
  66. package/dialog/types.d.ts +3 -2
  67. package/dropdown/Dropdown.d.ts +1 -1
  68. package/dropdown/Dropdown.js +249 -277
  69. package/dropdown/Dropdown.stories.tsx +153 -80
  70. package/dropdown/Dropdown.test.js +585 -0
  71. package/dropdown/DropdownMenu.d.ts +4 -0
  72. package/dropdown/DropdownMenu.js +80 -0
  73. package/dropdown/DropdownMenuItem.d.ts +4 -0
  74. package/dropdown/DropdownMenuItem.js +92 -0
  75. package/dropdown/types.d.ts +29 -18
  76. package/file-input/FileInput.d.ts +2 -2
  77. package/file-input/FileInput.js +183 -222
  78. package/file-input/FileInput.stories.tsx +38 -10
  79. package/file-input/FileInput.test.js +498 -0
  80. package/file-input/FileItem.d.ts +4 -14
  81. package/file-input/FileItem.js +43 -66
  82. package/file-input/types.d.ts +17 -0
  83. package/flex/Flex.d.ts +4 -0
  84. package/flex/Flex.js +69 -0
  85. package/flex/Flex.stories.tsx +103 -0
  86. package/flex/types.d.ts +32 -0
  87. package/flex/types.js +5 -0
  88. package/footer/Footer.js +24 -99
  89. package/footer/Footer.stories.tsx +8 -1
  90. package/footer/Footer.test.js +109 -0
  91. package/footer/Icons.js +1 -1
  92. package/footer/types.d.ts +2 -1
  93. package/header/Header.js +95 -114
  94. package/header/Header.stories.tsx +46 -36
  95. package/header/Header.test.js +79 -0
  96. package/header/Icons.js +2 -2
  97. package/header/types.d.ts +3 -2
  98. package/heading/Heading.test.js +186 -0
  99. package/inset/Inset.d.ts +3 -0
  100. package/inset/Inset.js +51 -0
  101. package/inset/Inset.stories.tsx +229 -0
  102. package/inset/types.d.ts +37 -0
  103. package/inset/types.js +5 -0
  104. package/layout/ApplicationLayout.d.ts +16 -6
  105. package/layout/ApplicationLayout.js +71 -125
  106. package/layout/ApplicationLayout.stories.tsx +84 -93
  107. package/layout/Icons.d.ts +5 -0
  108. package/layout/Icons.js +13 -2
  109. package/layout/SidenavContext.d.ts +5 -0
  110. package/layout/SidenavContext.js +19 -0
  111. package/layout/types.d.ts +18 -33
  112. package/link/Link.d.ts +3 -2
  113. package/link/Link.js +61 -86
  114. package/link/Link.stories.tsx +99 -52
  115. package/link/Link.test.js +83 -0
  116. package/link/types.d.ts +9 -29
  117. package/main.d.ts +11 -15
  118. package/main.js +53 -79
  119. package/number-input/NumberInput.js +11 -18
  120. package/number-input/NumberInput.stories.tsx +5 -5
  121. package/number-input/NumberInput.test.js +542 -0
  122. package/number-input/types.d.ts +17 -10
  123. package/package.json +19 -22
  124. package/paginator/Icons.d.ts +5 -0
  125. package/paginator/Icons.js +16 -28
  126. package/paginator/Paginator.js +19 -46
  127. package/paginator/Paginator.test.js +308 -0
  128. package/paragraph/Paragraph.d.ts +6 -0
  129. package/paragraph/Paragraph.js +38 -0
  130. package/paragraph/Paragraph.stories.tsx +44 -0
  131. package/password-input/PasswordInput.js +7 -4
  132. package/password-input/PasswordInput.test.js +181 -0
  133. package/password-input/types.d.ts +14 -11
  134. package/progress-bar/ProgressBar.d.ts +2 -2
  135. package/progress-bar/ProgressBar.js +57 -51
  136. package/progress-bar/ProgressBar.stories.jsx +13 -11
  137. package/progress-bar/ProgressBar.test.js +110 -0
  138. package/progress-bar/types.d.ts +3 -4
  139. package/quick-nav/QuickNav.d.ts +4 -0
  140. package/quick-nav/QuickNav.js +117 -0
  141. package/quick-nav/QuickNav.stories.tsx +342 -0
  142. package/quick-nav/types.d.ts +21 -0
  143. package/quick-nav/types.js +5 -0
  144. package/radio-group/Radio.d.ts +1 -1
  145. package/radio-group/Radio.js +57 -31
  146. package/radio-group/RadioGroup.js +75 -60
  147. package/radio-group/RadioGroup.stories.tsx +61 -39
  148. package/radio-group/RadioGroup.test.js +722 -0
  149. package/radio-group/types.d.ts +81 -3
  150. package/resultsetTable/Icons.d.ts +7 -0
  151. package/resultsetTable/Icons.js +51 -0
  152. package/resultsetTable/ResultsetTable.js +49 -105
  153. package/resultsetTable/ResultsetTable.stories.tsx +56 -33
  154. package/resultsetTable/ResultsetTable.test.js +330 -0
  155. package/resultsetTable/types.d.ts +2 -2
  156. package/select/Icons.d.ts +10 -0
  157. package/select/Icons.js +93 -0
  158. package/select/Listbox.d.ts +4 -0
  159. package/select/Listbox.js +198 -0
  160. package/select/Option.d.ts +4 -0
  161. package/select/Option.js +108 -0
  162. package/select/Select.js +147 -365
  163. package/select/Select.stories.tsx +324 -213
  164. package/select/Select.test.js +2233 -0
  165. package/select/types.d.ts +52 -12
  166. package/sidenav/Sidenav.d.ts +6 -5
  167. package/sidenav/Sidenav.js +182 -52
  168. package/sidenav/Sidenav.stories.tsx +163 -156
  169. package/sidenav/Sidenav.test.js +44 -0
  170. package/sidenav/types.d.ts +50 -27
  171. package/slider/Slider.d.ts +2 -2
  172. package/slider/Slider.js +122 -96
  173. package/slider/Slider.stories.tsx +15 -9
  174. package/slider/Slider.test.js +250 -0
  175. package/slider/types.d.ts +10 -2
  176. package/spinner/Spinner.js +3 -3
  177. package/spinner/Spinner.test.js +64 -0
  178. package/switch/Switch.d.ts +2 -2
  179. package/switch/Switch.js +150 -67
  180. package/switch/Switch.stories.tsx +20 -42
  181. package/switch/Switch.test.js +225 -0
  182. package/switch/types.d.ts +12 -4
  183. package/table/Table.js +1 -1
  184. package/table/Table.test.js +26 -0
  185. package/tabs/Tab.d.ts +4 -0
  186. package/tabs/Tab.js +133 -0
  187. package/tabs/Tabs.d.ts +1 -1
  188. package/tabs/Tabs.js +364 -110
  189. package/tabs/Tabs.stories.tsx +84 -18
  190. package/tabs/Tabs.test.js +351 -0
  191. package/tabs/types.d.ts +39 -17
  192. package/tabs-nav/NavTabs.d.ts +8 -0
  193. package/tabs-nav/NavTabs.js +125 -0
  194. package/tabs-nav/NavTabs.stories.tsx +172 -0
  195. package/tabs-nav/NavTabs.test.js +82 -0
  196. package/tabs-nav/Tab.d.ts +4 -0
  197. package/tabs-nav/Tab.js +128 -0
  198. package/tabs-nav/types.d.ts +53 -0
  199. package/tabs-nav/types.js +5 -0
  200. package/tag/Tag.d.ts +1 -1
  201. package/tag/Tag.js +18 -28
  202. package/tag/Tag.stories.tsx +25 -28
  203. package/tag/Tag.test.js +60 -0
  204. package/tag/types.d.ts +23 -14
  205. package/text-input/Icons.d.ts +8 -0
  206. package/text-input/Icons.js +60 -0
  207. package/text-input/Suggestion.d.ts +4 -0
  208. package/text-input/Suggestion.js +84 -0
  209. package/text-input/Suggestions.d.ts +4 -0
  210. package/text-input/Suggestions.js +134 -0
  211. package/text-input/TextInput.js +219 -332
  212. package/text-input/TextInput.stories.tsx +242 -197
  213. package/text-input/TextInput.test.js +1724 -0
  214. package/text-input/types.d.ts +51 -13
  215. package/textarea/Textarea.js +20 -27
  216. package/textarea/Textarea.stories.jsx +33 -12
  217. package/textarea/Textarea.test.js +437 -0
  218. package/textarea/types.d.ts +18 -11
  219. package/toggle-group/ToggleGroup.d.ts +1 -1
  220. package/toggle-group/ToggleGroup.js +5 -4
  221. package/toggle-group/ToggleGroup.stories.tsx +4 -4
  222. package/toggle-group/ToggleGroup.test.js +156 -0
  223. package/toggle-group/types.d.ts +9 -1
  224. package/typography/Typography.d.ts +4 -0
  225. package/typography/Typography.js +131 -0
  226. package/typography/Typography.stories.tsx +198 -0
  227. package/typography/types.d.ts +18 -0
  228. package/typography/types.js +5 -0
  229. package/useTheme.js +2 -2
  230. package/useTranslatedLabels.d.ts +2 -0
  231. package/useTranslatedLabels.js +20 -0
  232. package/wizard/Wizard.d.ts +1 -1
  233. package/wizard/Wizard.js +58 -54
  234. package/wizard/Wizard.stories.tsx +33 -24
  235. package/wizard/Wizard.test.js +141 -0
  236. package/wizard/types.d.ts +10 -5
  237. package/ThemeContext.d.ts +0 -15
  238. package/ThemeContext.js +0 -243
  239. package/V3Select/V3Select.js +0 -455
  240. package/V3Select/index.d.ts +0 -27
  241. package/V3Textarea/V3Textarea.js +0 -260
  242. package/V3Textarea/index.d.ts +0 -27
  243. package/common/RequiredComponent.js +0 -32
  244. package/date/Date.js +0 -373
  245. package/date/index.d.ts +0 -27
  246. package/input-text/Icons.js +0 -22
  247. package/input-text/InputText.js +0 -611
  248. package/input-text/index.d.ts +0 -36
  249. package/list/List.d.ts +0 -8
  250. package/list/List.js +0 -47
  251. package/list/List.stories.tsx +0 -95
  252. package/radio/Radio.d.ts +0 -4
  253. package/radio/Radio.js +0 -174
  254. package/radio/Radio.stories.tsx +0 -192
  255. package/radio/types.d.ts +0 -54
  256. package/row/Row.d.ts +0 -11
  257. package/row/Row.js +0 -127
  258. package/row/Row.stories.tsx +0 -239
  259. package/stack/Stack.d.ts +0 -10
  260. package/stack/Stack.js +0 -97
  261. package/stack/Stack.stories.tsx +0 -166
  262. package/text/Text.d.ts +0 -7
  263. package/text/Text.js +0 -30
  264. package/text/Text.stories.tsx +0 -19
  265. package/toggle/Toggle.js +0 -186
  266. package/toggle/index.d.ts +0 -21
  267. package/upload/Upload.js +0 -201
  268. package/upload/buttons-upload/ButtonsUpload.js +0 -111
  269. package/upload/buttons-upload/Icons.js +0 -40
  270. package/upload/dragAndDropArea/DragAndDropArea.js +0 -225
  271. package/upload/dragAndDropArea/Icons.js +0 -39
  272. package/upload/file-upload/FileToUpload.js +0 -115
  273. package/upload/file-upload/Icons.js +0 -66
  274. package/upload/files-upload/FilesToUpload.js +0 -109
  275. package/upload/index.d.ts +0 -15
  276. package/upload/transaction/Icons.js +0 -160
  277. package/upload/transaction/Transaction.js +0 -104
  278. 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
  );