@dxc-technology/halstack-react 0.0.0-c680086 → 0.0.0-c713b1b

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 (153) hide show
  1. package/HalstackContext.d.ts +10 -0
  2. package/{ThemeContext.js → HalstackContext.js} +37 -37
  3. package/accordion/Accordion.d.ts +1 -1
  4. package/accordion/Accordion.js +7 -28
  5. package/accordion/Accordion.stories.tsx +11 -11
  6. package/accordion/Accordion.test.js +72 -0
  7. package/accordion/types.d.ts +4 -0
  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 +4 -0
  13. package/alert/Alert.test.js +92 -0
  14. package/badge/Badge.d.ts +4 -0
  15. package/badge/types.d.ts +4 -0
  16. package/badge/types.js +5 -0
  17. package/bleed/types.d.ts +24 -0
  18. package/box/Box.test.js +18 -0
  19. package/button/Button.js +14 -11
  20. package/button/Button.test.js +35 -0
  21. package/card/Card.js +27 -28
  22. package/card/Card.test.js +50 -0
  23. package/checkbox/Checkbox.d.ts +1 -1
  24. package/checkbox/Checkbox.js +40 -39
  25. package/checkbox/Checkbox.stories.tsx +124 -128
  26. package/checkbox/Checkbox.test.js +78 -0
  27. package/checkbox/types.d.ts +7 -3
  28. package/chip/Chip.test.js +56 -0
  29. package/common/variables.js +19 -254
  30. package/date-input/DateInput.js +50 -39
  31. package/date-input/DateInput.stories.tsx +7 -7
  32. package/date-input/DateInput.test.js +479 -0
  33. package/date-input/types.d.ts +16 -9
  34. package/dialog/Dialog.js +4 -32
  35. package/dialog/Dialog.test.js +40 -0
  36. package/dropdown/Dropdown.js +13 -17
  37. package/dropdown/Dropdown.test.js +189 -0
  38. package/file-input/FileInput.test.js +457 -0
  39. package/file-input/FileItem.js +7 -5
  40. package/footer/Footer.js +10 -85
  41. package/footer/Footer.test.js +109 -0
  42. package/header/Header.js +20 -44
  43. package/header/Header.stories.tsx +46 -36
  44. package/header/Header.test.js +79 -0
  45. package/heading/Heading.test.js +186 -0
  46. package/inset/types.d.ts +24 -0
  47. package/layout/ApplicationLayout.js +6 -13
  48. package/link/Link.d.ts +3 -2
  49. package/link/Link.js +65 -56
  50. package/link/Link.stories.tsx +87 -52
  51. package/link/Link.test.js +83 -0
  52. package/link/types.d.ts +8 -23
  53. package/main.d.ts +5 -7
  54. package/main.js +25 -41
  55. package/number-input/NumberInput.js +11 -18
  56. package/number-input/NumberInput.stories.tsx +5 -5
  57. package/number-input/NumberInput.test.js +506 -0
  58. package/number-input/types.d.ts +16 -9
  59. package/package.json +6 -5
  60. package/paginator/Paginator.test.js +266 -0
  61. package/password-input/PasswordInput.test.js +181 -0
  62. package/password-input/types.d.ts +13 -10
  63. package/progress-bar/ProgressBar.test.js +65 -0
  64. package/quick-nav/QuickNav.d.ts +4 -0
  65. package/quick-nav/QuickNav.js +64 -0
  66. package/quick-nav/QuickNav.stories.tsx +237 -0
  67. package/quick-nav/types.d.ts +21 -0
  68. package/quick-nav/types.js +5 -0
  69. package/radio/Radio.js +10 -11
  70. package/radio/Radio.test.js +71 -0
  71. package/radio-group/Radio.d.ts +1 -1
  72. package/radio-group/Radio.js +24 -23
  73. package/radio-group/RadioGroup.js +39 -32
  74. package/radio-group/RadioGroup.stories.tsx +60 -39
  75. package/radio-group/RadioGroup.test.js +530 -83
  76. package/radio-group/types.d.ts +80 -2
  77. package/resultsetTable/ResultsetTable.test.js +306 -0
  78. package/row/types.d.ts +18 -0
  79. package/select/Icons.d.ts +10 -0
  80. package/select/Icons.js +93 -0
  81. package/select/Listbox.d.ts +4 -0
  82. package/select/Listbox.js +148 -0
  83. package/select/Option.d.ts +4 -0
  84. package/select/Option.js +110 -0
  85. package/select/Select.js +89 -297
  86. package/select/Select.stories.tsx +91 -81
  87. package/select/Select.test.js +2057 -0
  88. package/select/types.d.ts +54 -11
  89. package/sidenav/Sidenav.test.js +56 -0
  90. package/slider/Slider.d.ts +1 -1
  91. package/slider/Slider.js +2 -1
  92. package/slider/Slider.stories.tsx +8 -8
  93. package/slider/Slider.test.js +150 -0
  94. package/slider/types.d.ts +4 -0
  95. package/spinner/Spinner.test.js +64 -0
  96. package/stack/types.d.ts +15 -0
  97. package/switch/Switch.d.ts +1 -1
  98. package/switch/Switch.js +32 -19
  99. package/switch/Switch.stories.tsx +14 -14
  100. package/switch/Switch.test.js +98 -0
  101. package/switch/types.d.ts +6 -2
  102. package/table/Table.test.js +26 -0
  103. package/tabs/Tabs.d.ts +1 -1
  104. package/tabs/Tabs.js +9 -11
  105. package/tabs/Tabs.stories.tsx +0 -8
  106. package/tabs/Tabs.test.js +140 -0
  107. package/tabs/types.d.ts +4 -0
  108. package/tag/Tag.js +14 -19
  109. package/tag/Tag.stories.tsx +12 -8
  110. package/tag/Tag.test.js +60 -0
  111. package/text-input/TextInput.js +10 -8
  112. package/text-input/TextInput.stories.tsx +30 -12
  113. package/text-input/TextInput.test.js +1712 -0
  114. package/text-input/types.d.ts +17 -10
  115. package/textarea/Textarea.js +10 -8
  116. package/textarea/Textarea.stories.jsx +33 -12
  117. package/textarea/Textarea.test.js +437 -0
  118. package/textarea/types.d.ts +17 -10
  119. package/toggle-group/ToggleGroup.d.ts +1 -1
  120. package/toggle-group/ToggleGroup.js +5 -4
  121. package/toggle-group/ToggleGroup.stories.tsx +4 -4
  122. package/toggle-group/ToggleGroup.test.js +156 -0
  123. package/toggle-group/types.d.ts +8 -0
  124. package/useTheme.js +2 -2
  125. package/wizard/Wizard.d.ts +1 -1
  126. package/wizard/Wizard.js +28 -19
  127. package/wizard/Wizard.stories.tsx +13 -23
  128. package/wizard/Wizard.test.js +141 -0
  129. package/wizard/types.d.ts +6 -2
  130. package/ThemeContext.d.ts +0 -15
  131. package/V3Select/V3Select.js +0 -455
  132. package/V3Select/index.d.ts +0 -27
  133. package/V3Textarea/V3Textarea.js +0 -260
  134. package/V3Textarea/index.d.ts +0 -27
  135. package/date/Date.js +0 -373
  136. package/date/index.d.ts +0 -27
  137. package/input-text/Icons.js +0 -22
  138. package/input-text/InputText.js +0 -611
  139. package/input-text/index.d.ts +0 -36
  140. package/toggle/Toggle.js +0 -186
  141. package/toggle/index.d.ts +0 -21
  142. package/upload/Upload.js +0 -201
  143. package/upload/buttons-upload/ButtonsUpload.js +0 -111
  144. package/upload/buttons-upload/Icons.js +0 -40
  145. package/upload/dragAndDropArea/DragAndDropArea.js +0 -225
  146. package/upload/dragAndDropArea/Icons.js +0 -39
  147. package/upload/file-upload/FileToUpload.js +0 -115
  148. package/upload/file-upload/Icons.js +0 -66
  149. package/upload/files-upload/FilesToUpload.js +0 -109
  150. package/upload/index.d.ts +0 -15
  151. package/upload/transaction/Icons.js +0 -160
  152. package/upload/transaction/Transaction.js +0 -104
  153. package/upload/transactions/Transactions.js +0 -94
@@ -0,0 +1,237 @@
1
+ import React from "react";
2
+ import styled from "styled-components";
3
+ import DxcQuickNav from "./QuickNav";
4
+ import DxcHeading from "../heading/Heading";
5
+ import DxcText from "../text/Text";
6
+ import Title from "../../.storybook/components/Title";
7
+ import ExampleContainer from "../../.storybook/components/ExampleContainer";
8
+
9
+ export default {
10
+ title: "QuickNav",
11
+ component: DxcQuickNav,
12
+ };
13
+
14
+ const links = [
15
+ {
16
+ label: "Overview",
17
+ id: "overview",
18
+ links: [
19
+ {
20
+ label: "Introduction",
21
+ id: "introduction",
22
+ },
23
+ ],
24
+ },
25
+ {
26
+ label: "Principles",
27
+ id: "principles",
28
+ links: [
29
+ { label: "Color", id: "color" },
30
+ { label: "Spacing", id: "spacing" },
31
+ { label: "Typography", id: "typography" },
32
+ ],
33
+ },
34
+ ];
35
+
36
+ export const Chromatic = () => (
37
+ <>
38
+ <ExampleContainer>
39
+ <Title title="Default" level={4} />
40
+ <QuickNavContainer>
41
+ <DxcQuickNav title="Sections" links={links}></DxcQuickNav>
42
+ </QuickNavContainer>
43
+ </ExampleContainer>
44
+ <ExampleContainer pseudoState="pseudo-hover">
45
+ <Title title="Link hovered" level={4} />
46
+ <QuickNavContainer>
47
+ <DxcQuickNav title="Sections" links={links}></DxcQuickNav>
48
+ </QuickNavContainer>
49
+ </ExampleContainer>
50
+ <ExampleContainer>
51
+ <Title title="QuickNav with content" level={4} />
52
+ <Container>
53
+ <ContentContainer>
54
+ <Content id="overview">
55
+ <DxcHeading level={1} text="Overview" margin={{ bottom: "small" }} />
56
+ <DxcText>
57
+ Halstack is the DXC Technology's open source design system for insurance products and digital experiences.
58
+ Our system provides all the tools and resources needed to create superior, beautiful but above all,
59
+ functional user experiences. Halstack is the DXC Technology's open source design system for insurance
60
+ products and digital experiences. Our system provides all the tools and resources needed to create
61
+ superior, beautiful but above all, functional user experiences.Halstack is the DXC Technology's open
62
+ source design system for insurance products and digital experiences. Our system provides all the tools and
63
+ resources needed to create superior, beautiful but above all, functional user experiences.Halstack is the
64
+ DXC Technology's open source design system for insurance products and digital experiences. Our system
65
+ provides all the tools and resources needed to create superior, beautiful but above all, functional user
66
+ experiences.Halstack is the DXC Technology's open source design system for insurance products and digital
67
+ experiences. Our system provides all the tools and resources needed to create superior, beautiful but
68
+ above all, functional user experiences.Halstack is the DXC Technology's open source design system for
69
+ insurance products and digital experiences. Our system provides all the tools and resources needed to
70
+ create superior, beautiful but above all, functional user experiences.Halstack is the DXC Technology's
71
+ open source design system for insurance products and digital experiences. Our system provides all the
72
+ tools and resources needed to create superior, beautiful but above all, functional user experiences.
73
+ </DxcText>
74
+ <Content id="introduction">
75
+ <DxcHeading level={2} text="Introduction" margin={{ top: "xsmall", bottom: "xsmall" }} />
76
+ <DxcText>
77
+ Design principles Halstack design principles are the fundamental part of DXC Technology's approach to
78
+ provide guidance for development teams in order to deliver delightful and consistent user experiences to
79
+ our customers: Balance Consistency Visual hierarchy All our components, design tokens, accessibility
80
+ guidelines, responsive design techniques, and layout proposals have been carefully curated by DXC design
81
+ and engineering teams with the objective of creating a unique visual language and ecosystem for our
82
+ applications. This is the DXC way of creating User Experiences. Open Source Halstack is an open source
83
+ design system, this means that we work towards DXC Technology bussines needs, but it is open for anyone
84
+ to use and contribute back to. We are charmed to receive external contributions to help us find bugs,
85
+ design new features, or help us improve the project documentation. If you're interested, definitely
86
+ check out our contribution guidelines.Design principles Halstack design principles are the fundamental
87
+ part of DXC Technology's approach to provide guidance for development teams in order to deliver
88
+ delightful and consistent user experiences to our customers: Balance Consistency Visual hierarchy All
89
+ our components, design tokens, accessibility guidelines, responsive design techniques, and layout
90
+ proposals have been carefully curated by DXC design and engineering teams with the objective of creating
91
+ a unique visual language and ecosystem for our applications. This is the DXC way of creating User
92
+ Experiences. Open Source Halstack is an open source design system, this means that we work towards DXC
93
+ Technology bussines needs, but it is open for anyone to use and contribute back to. We are charmed to
94
+ receive external contributions to help us find bugs, design new features, or help us improve the project
95
+ documentation. If you're interested, definitely check out our contribution guidelines.Design principles
96
+ Halstack design principles are the fundamental part of DXC Technology's approach to provide guidance for
97
+ development teams in order to deliver delightful and consistent user experiences to our customers:
98
+ Balance Consistency Visual hierarchy All our components, design tokens, accessibility guidelines,
99
+ responsive design techniques, and layout proposals have been carefully curated by DXC design and
100
+ engineering teams with the objective of creating a unique visual language and ecosystem for our
101
+ applications. This is the DXC way of creating User Experiences. Open Source Halstack is an open source
102
+ design system, this means that we work towards DXC Technology bussines needs, but it is open for anyone
103
+ to use and contribute back to. We are charmed to receive external contributions to help us find bugs,
104
+ design new features, or help us improve the project documentation. If you're interested, definitely
105
+ check out our contribution guidelines.
106
+ </DxcText>
107
+ </Content>
108
+ </Content>
109
+ <Content id="principles">
110
+ <DxcHeading level={1} text="Principles" margin={{ top: "small", bottom: "xsmall" }} />
111
+ <Content id="color">
112
+ <DxcHeading level={2} text="Color" margin={{ top: "xsmall", bottom: "xsmall" }} />
113
+ <DxcText>
114
+ The color palette is an essential asset as a communication resource of our design system. Halstack color
115
+ palette brings a unified consistency and helps in guiding the user's perception order. Our color palette
116
+ is based in the HSL model . All our color families are calculated using the lightness value of the
117
+ standard DXC palette colors. Color Tokens Halstack uses tokens to manage color. Appart from a
118
+ multi-purpose greyscale family, purple and blue are the core color families used in our set of
119
+ components. Additional families as red, green and yellow help as feedback role-based color palettes and
120
+ must not be used outside this context.The color palette is an essential asset as a communication
121
+ resource of our design system. Halstack color palette brings a unified consistency and helps in guiding
122
+ the user's perception order. Our color palette is based in the HSL model . All our color families are
123
+ calculated using the lightness value of the standard DXC palette colors. Color Tokens Halstack uses
124
+ tokens to manage color. Appart from a multi-purpose greyscale family, purple and blue are the core color
125
+ families used in our set of components. Additional families as red, green and yellow help as feedback
126
+ role-based color palettes and must not be used outside this context.The color palette is an essential
127
+ asset as a communication resource of our design system. Halstack color palette brings a unified
128
+ consistency and helps in guiding the user's perception order. Our color palette is based in the HSL
129
+ model . All our color families are calculated using the lightness value of the standard DXC palette
130
+ colors. Color Tokens Halstack uses tokens to manage color. Appart from a multi-purpose greyscale family,
131
+ purple and blue are the core color families used in our set of components. Additional families as red,
132
+ green and yellow help as feedback role-based color palettes and must not be used outside this
133
+ context.The color palette is an essential asset as a communication resource of our design system.
134
+ Halstack color palette brings a unified consistency and helps in guiding the user's perception order.
135
+ Our color palette is based in the HSL model . All our color families are calculated using the lightness
136
+ value of the standard DXC palette colors. Color Tokens Halstack uses tokens to manage color. Appart from
137
+ a multi-purpose greyscale family, purple and blue are the core color families used in our set of
138
+ components. Additional families as red, green and yellow help as feedback role-based color palettes and
139
+ must not be used outside this context.The color palette is an essential asset as a communication
140
+ resource of our design system. Halstack color palette brings a unified consistency and helps in guiding
141
+ the user's perception order. Our color palette is based in the HSL model . All our color families are
142
+ calculated using the lightness value of the standard DXC palette colors. Color Tokens Halstack uses
143
+ tokens to manage color. Appart from a multi-purpose greyscale family, purple and blue are the core color
144
+ families used in our set of components. Additional families as red, green and yellow help as feedback
145
+ role-based color palettes and must not be used outside this context.
146
+ </DxcText>
147
+ </Content>
148
+ <Content id="spacing">
149
+ <DxcHeading level={2} text="Spacing" margin={{ top: "xsmall", bottom: "xsmall" }} />
150
+ <DxcText>
151
+ In the search of consistent alignment between the elements we provide a spacing scale based on a root
152
+ values of 8px and 4px. The numbers 4 and 8 are easily multiplied, they provide flexible and consistent,
153
+ yet distinct enough, steps between them.In the search of consistent alignment between the elements we
154
+ provide a spacing scale based on a root values of 8px and 4px. The numbers 4 and 8 are easily
155
+ multiplied, they provide flexible and consistent, yet distinct enough, steps between them.In the search
156
+ of consistent alignment between the elements we provide a spacing scale based on a root values of 8px
157
+ and 4px. The numbers 4 and 8 are easily multiplied, they provide flexible and consistent, yet distinct
158
+ enough, steps between them.In the search of consistent alignment between the elements we provide a
159
+ spacing scale based on a root values of 8px and 4px. The numbers 4 and 8 are easily multiplied, they
160
+ provide flexible and consistent, yet distinct enough, steps between them.In the search of consistent
161
+ alignment between the elements we provide a spacing scale based on a root values of 8px and 4px. The
162
+ numbers 4 and 8 are easily multiplied, they provide flexible and consistent, yet distinct enough, steps
163
+ between them.In the search of consistent alignment between the elements we provide a spacing scale based
164
+ on a root values of 8px and 4px. The numbers 4 and 8 are easily multiplied, they provide flexible and
165
+ consistent, yet distinct enough, steps between them.In the search of consistent alignment between the
166
+ elements we provide a spacing scale based on a root values of 8px and 4px. The numbers 4 and 8 are
167
+ easily multiplied, they provide flexible and consistent, yet distinct enough, steps between them.
168
+ </DxcText>
169
+ </Content>
170
+ <Content id="typography">
171
+ <DxcHeading level={2} text="Typography" margin={{ top: "xsmall", bottom: "xsmall" }} />
172
+ <DxcText>
173
+ Our selected typography helps in structuring our user's experience based on the visual impact that it
174
+ has on the user interface content. It defines what is the first noticeable piece of information or data
175
+ based on the font shape, size, color, or type and it highlights some pieces of text over the rest. Some
176
+ typographic elements used in Halstack Design System include headers, body, taglines, captions, and
177
+ labels. Make sure you include all the different typographic variants in order to enhance the
178
+ application's content structure, including the Heading component which defines different levels of page
179
+ and section titles.Our selected typography helps in structuring our user's experience based on the
180
+ visual impact that it has on the user interface content. It defines what is the first noticeable piece
181
+ of information or data based on the font shape, size, color, or type and it highlights some pieces of
182
+ text over the rest. Some typographic elements used in Halstack Design System include headers, body,
183
+ taglines, captions, and labels. Make sure you include all the different typographic variants in order to
184
+ enhance the application's content structure, including the Heading component which defines different
185
+ levels of page and section titles.Our selected typography helps in structuring our user's experience
186
+ based on the visual impact that it has on the user interface content. It defines what is the first
187
+ noticeable piece of information or data based on the font shape, size, color, or type and it highlights
188
+ some pieces of text over the rest. Some typographic elements used in Halstack Design System include
189
+ headers, body, taglines, captions, and labels. Make sure you include all the different typographic
190
+ variants in order to enhance the application's content structure, including the Heading component which
191
+ defines different levels of page and section titles.Our selected typography helps in structuring our
192
+ user's experience based on the visual impact that it has on the user interface content. It defines what
193
+ is the first noticeable piece of information or data based on the font shape, size, color, or type and
194
+ it highlights some pieces of text over the rest. Some typographic elements used in Halstack Design
195
+ System include headers, body, taglines, captions, and labels. Make sure you include all the different
196
+ typographic variants in order to enhance the application's content structure, including the Heading
197
+ component which defines different levels of page and section titles.Our selected typography helps in
198
+ structuring our user's experience based on the visual impact that it has on the user interface content.
199
+ It defines what is the first noticeable piece of information or data based on the font shape, size,
200
+ color, or type and it highlights some pieces of text over the rest. Some typographic elements used in
201
+ Halstack Design System include headers, body, taglines, captions, and labels. Make sure you include all
202
+ the different typographic variants in order to enhance the application's content structure, including
203
+ the Heading component which defines different levels of page and section titles.
204
+ </DxcText>
205
+ </Content>
206
+ </Content>
207
+ </ContentContainer>
208
+ <QuickNavContainer>
209
+ <DxcQuickNav title="Sections" links={links}></DxcQuickNav>
210
+ </QuickNavContainer>
211
+ </Container>
212
+ </ExampleContainer>
213
+ </>
214
+ );
215
+
216
+ const Container = styled.div`
217
+ display: flex;
218
+ flex-direction: row;
219
+ width: 100%;
220
+ `;
221
+
222
+ const ContentContainer = styled.div`
223
+ display: flex;
224
+ flex-direction: column;
225
+ padding: 60px;
226
+ margin: 0 auto;
227
+ width: 800px;
228
+ `;
229
+
230
+ const Content = styled.div``;
231
+
232
+ const QuickNavContainer = styled.div`
233
+ max-height: calc(100vh - 100px);
234
+ position: sticky;
235
+ top: 100px;
236
+ width: 300px;
237
+ `;
@@ -0,0 +1,21 @@
1
+ declare type Props = {
2
+ /**
3
+ * Title of the quick nav component.
4
+ */
5
+ title: string;
6
+ /**
7
+ * Links to be shown inside the quick nav component.
8
+ */
9
+ links: LinkType[];
10
+ };
11
+ declare type LinkType = {
12
+ /**
13
+ * Label to be shown in the link.
14
+ */
15
+ label: string;
16
+ /**
17
+ * Sublinks of the link.
18
+ */
19
+ links?: LinkType[];
20
+ };
21
+ export default Props;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
package/radio/Radio.js CHANGED
@@ -73,6 +73,13 @@ var DxcRadio = function DxcRadio(_ref) {
73
73
  }
74
74
  };
75
75
 
76
+ var labelComponent = /*#__PURE__*/_react["default"].createElement(LabelContainer, {
77
+ checked: checked || innerChecked,
78
+ disabled: disabled,
79
+ onClick: !disabled && handlerRadioChange || null,
80
+ backgroundType: backgroundType
81
+ }, required && /*#__PURE__*/_react["default"].createElement(_RequiredComponent["default"], null), label);
82
+
76
83
  return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
77
84
  theme: colorsTheme.radio
78
85
  }, /*#__PURE__*/_react["default"].createElement(RadioContainer, {
@@ -82,20 +89,14 @@ var DxcRadio = function DxcRadio(_ref) {
82
89
  margin: margin,
83
90
  size: size,
84
91
  backgroundType: backgroundType
85
- }, /*#__PURE__*/_react["default"].createElement(_Radio["default"], {
92
+ }, labelPosition === "before" && labelComponent, /*#__PURE__*/_react["default"].createElement(_Radio["default"], {
86
93
  checked: checked != null && checked || innerChecked,
87
94
  name: name,
88
95
  onClick: handlerRadioChange,
89
96
  value: value,
90
97
  disabled: disabled,
91
98
  disableRipple: true
92
- }), /*#__PURE__*/_react["default"].createElement(LabelContainer, {
93
- checked: checked || innerChecked,
94
- labelPosition: labelPosition,
95
- disabled: disabled,
96
- onClick: !disabled && handlerRadioChange || null,
97
- backgroundType: backgroundType
98
- }, required && /*#__PURE__*/_react["default"].createElement(_RequiredComponent["default"], null), label)));
99
+ }), labelPosition === "after" && labelComponent));
99
100
  };
100
101
 
101
102
  var sizes = {
@@ -114,10 +115,8 @@ var calculateWidth = function calculateWidth(margin, size) {
114
115
  return sizes[size];
115
116
  };
116
117
 
117
- var RadioContainer = _styledComponents["default"].span(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: ", ";\n\n display: inline-flex;\n align-items: center;\n max-height: 42px;\n position: relative;\n flex-direction: ", ";\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n cursor: ", ";\n .MuiButtonBase-root {\n width: auto;\n height: auto;\n padding: 10px;\n margin: 2px;\n ", ": ", ";\n padding-left: ", ";\n padding-right: ", ";\n margin-left: ", ";\n margin-right: ", ";\n .MuiIconButton-label {\n .MuiSvgIcon-root {\n height: ", ";\n width: ", ";\n }\n color: ", ";\n\n > div > :nth-child(2) path {\n color: ", ";\n }\n }\n\n &.Mui-focusVisible {\n background-color: transparent;\n .MuiSvgIcon-root {\n outline: ", "\n auto 1px;\n }\n }\n :hover {\n background-color: transparent;\n }\n .MuiTouchRipple-ripple {\n height: 40px !important;\n width: 40px !important;\n top: 0px !important;\n left: 0px !important;\n }\n }\n .MuiRadio-colorSecondary.Mui-checked {\n color: ", ";\n :hover {\n background-color: transparent;\n }\n }\n"])), function (props) {
118
+ var RadioContainer = _styledComponents["default"].span(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: ", ";\n\n display: inline-flex;\n align-items: center;\n max-height: 42px;\n position: relative;\n vertical-align: top;\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n cursor: ", ";\n .MuiButtonBase-root {\n width: auto;\n height: auto;\n padding: 10px;\n margin: 2px;\n ", ": ", ";\n padding-left: ", ";\n padding-right: ", ";\n margin-left: ", ";\n margin-right: ", ";\n .MuiIconButton-label {\n .MuiSvgIcon-root {\n height: ", ";\n width: ", ";\n }\n color: ", ";\n\n > div > :nth-child(2) path {\n color: ", ";\n }\n }\n\n &.Mui-focusVisible {\n background-color: transparent;\n .MuiSvgIcon-root {\n outline: ", "\n auto 1px;\n }\n }\n :hover {\n background-color: transparent;\n }\n .MuiTouchRipple-ripple {\n height: 40px !important;\n width: 40px !important;\n top: 0px !important;\n left: 0px !important;\n }\n }\n .MuiRadio-colorSecondary.Mui-checked {\n color: ", ";\n :hover {\n background-color: transparent;\n }\n }\n"])), function (props) {
118
119
  return calculateWidth(props.margin, props.size);
119
- }, function (props) {
120
- return props.labelPosition === "before" ? "row-reverse" : "row";
121
120
  }, function (props) {
122
121
  return props.margin && (0, _typeof2["default"])(props.margin) !== "object" ? _variables.spaces[props.margin] : "0px";
123
122
  }, function (props) {
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _react = _interopRequireDefault(require("react"));
6
+
7
+ var _react2 = require("@testing-library/react");
8
+
9
+ var _Radio = _interopRequireDefault(require("./Radio"));
10
+
11
+ describe("Radio component tests", function () {
12
+ test("Radio renders correctly", function () {
13
+ var _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Radio["default"], {
14
+ label: "Radio button"
15
+ })),
16
+ getByText = _render.getByText;
17
+
18
+ expect(getByText("Radio button")).toBeTruthy();
19
+ });
20
+ test("Calls correct function on click", function () {
21
+ var onClick = jest.fn();
22
+
23
+ var _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Radio["default"], {
24
+ label: "Radio button",
25
+ onClick: onClick
26
+ })),
27
+ getByText = _render2.getByText;
28
+
29
+ _react2.fireEvent.click(getByText("Radio button"));
30
+
31
+ expect(onClick).toHaveBeenCalled();
32
+ expect(onClick).toHaveBeenCalledWith(true);
33
+ });
34
+ test("Controlled Radio", function () {
35
+ var onClick = jest.fn();
36
+
37
+ var _render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Radio["default"], {
38
+ label: "Radio button",
39
+ checked: false,
40
+ onClick: onClick
41
+ })),
42
+ getByText = _render3.getByText,
43
+ getByRole = _render3.getByRole;
44
+
45
+ expect(getByRole("radio").checked).toBe(false);
46
+
47
+ _react2.fireEvent.click(getByText("Radio button"));
48
+
49
+ expect(onClick).toHaveBeenCalled();
50
+ expect(onClick).toHaveBeenCalledWith(true);
51
+ expect(getByRole("radio").checked).toBe(false);
52
+ });
53
+ test("Uncontrolled Radio", function () {
54
+ var onClick = jest.fn();
55
+
56
+ var _render4 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Radio["default"], {
57
+ label: "Radio button",
58
+ onClick: onClick
59
+ })),
60
+ getByText = _render4.getByText,
61
+ getByRole = _render4.getByRole;
62
+
63
+ expect(getByRole("radio").checked).toBe(false);
64
+
65
+ _react2.fireEvent.click(getByText("Radio button"));
66
+
67
+ expect(onClick).toHaveBeenCalled();
68
+ expect(onClick).toHaveBeenCalledWith(true);
69
+ expect(getByRole("radio").checked).toBe(false);
70
+ });
71
+ });
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
2
  import { RadioProps } from "./types";
3
- declare const _default: React.MemoExoticComponent<({ option, currentValue, onClick, onFocus, error, disabled, focused, readonly, }: RadioProps) => JSX.Element>;
3
+ declare const _default: React.MemoExoticComponent<({ option, currentValue, onClick, error, disabled, focused, readonly, tabIndex, }: RadioProps) => JSX.Element>;
4
4
  export default _default;
@@ -28,14 +28,16 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
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
- _onClick = _ref.onClick,
34
- onFocus = _ref.onFocus,
35
+ onClick = _ref.onClick,
35
36
  error = _ref.error,
36
37
  disabled = _ref.disabled,
37
38
  focused = _ref.focused,
38
- readonly = _ref.readonly;
39
+ readonly = _ref.readonly,
40
+ tabIndex = _ref.tabIndex;
39
41
 
40
42
  var _useState = (0, _react.useState)("radio-".concat((0, _uuid.v4)())),
41
43
  _useState2 = (0, _slicedToArray2["default"])(_useState, 1),
@@ -43,7 +45,13 @@ var DxcRadio = function DxcRadio(_ref) {
43
45
 
44
46
  var ref = (0, _react.useRef)(null);
45
47
  var colorsTheme = (0, _useTheme["default"])();
46
- 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
+ };
47
55
 
48
56
  var _useState3 = (0, _react.useState)(true),
49
57
  _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
@@ -51,7 +59,7 @@ var DxcRadio = function DxcRadio(_ref) {
51
59
  setFirstUpdate = _useState4[1];
52
60
 
53
61
  (0, _react.useLayoutEffect)(function () {
54
- var _ref$current;
62
+ var _ref$current2;
55
63
 
56
64
  // Don't apply in the first render
57
65
  if (firstUpdate) {
@@ -59,7 +67,7 @@ var DxcRadio = function DxcRadio(_ref) {
59
67
  return;
60
68
  }
61
69
 
62
- 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());
63
71
  }, [focused]);
64
72
  return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
65
73
  theme: colorsTheme.radioGroup
@@ -68,28 +76,21 @@ var DxcRadio = function DxcRadio(_ref) {
68
76
  disabled: disabled,
69
77
  readonly: readonly,
70
78
  onMouseDown: function onMouseDown(event) {
71
- // Prevents div's onclick from stealing the radio button's focus
79
+ // Prevents div's onClick from stealing the radio input's focus
72
80
  event.preventDefault();
73
81
  },
74
- onClick: function onClick() {
75
- var _ref$current2;
76
-
77
- ref === null || ref === void 0 ? void 0 : (_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.focus();
78
-
79
- _onClick();
80
- }
82
+ onClick: handleOnClick
81
83
  }, /*#__PURE__*/_react["default"].createElement(RadioInputContainer, null, /*#__PURE__*/_react["default"].createElement(RadioInput, {
82
84
  error: error,
83
85
  disabled: disabled,
84
86
  readonly: readonly,
85
- onFocus: onFocus,
86
87
  role: "radio",
87
- "aria-checked": checked,
88
- "aria-disabled": option.disabled,
88
+ "aria-checked": option.value === currentValue,
89
+ "aria-disabled": (_option$disabled = option.disabled) !== null && _option$disabled !== void 0 ? _option$disabled : false,
89
90
  "aria-labelledby": radioLabelId,
90
- tabIndex: disabled ? -1 : focused ? 0 : -1,
91
+ tabIndex: disabled ? -1 : focused ? tabIndex : -1,
91
92
  ref: ref
92
- }, checked && /*#__PURE__*/_react["default"].createElement(Dot, {
93
+ }, option.value === currentValue && /*#__PURE__*/_react["default"].createElement(Dot, {
93
94
  disabled: disabled,
94
95
  readonly: readonly,
95
96
  error: error
@@ -101,18 +102,18 @@ var DxcRadio = function DxcRadio(_ref) {
101
102
 
102
103
  var RadioMainContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n"])));
103
104
 
104
- 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) {
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) {
105
106
  return props.disabled ? "not-allowed" : props.readonly ? "default" : "pointer";
106
107
  }, function (props) {
107
- 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 ");
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;";
108
109
  });
109
110
 
110
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"])));
111
112
 
112
- 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 box-shadow: 0 0 0 2px transparent;\n\n ", "\n"])), function (props) {
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) {
113
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;
114
115
  }, function (props) {
115
- 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 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 ";
116
117
  });
117
118
 
118
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) {
@@ -57,7 +57,9 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
57
57
  value = _ref.value,
58
58
  onChange = _ref.onChange,
59
59
  onBlur = _ref.onBlur,
60
- error = _ref.error;
60
+ error = _ref.error,
61
+ _ref$tabIndex = _ref.tabIndex,
62
+ tabIndex = _ref$tabIndex === void 0 ? 0 : _ref$tabIndex;
61
63
 
62
64
  var _useState = (0, _react.useState)("radio-group-".concat((0, _uuid.v4)())),
63
65
  _useState2 = (0, _slicedToArray2["default"])(_useState, 1),
@@ -102,42 +104,46 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
102
104
 
103
105
  var handleOnBlur = function handleOnBlur(e) {
104
106
  // If the radio group loses the focus to an element not contained inside it...
105
- !e.currentTarget.contains(e.relatedTarget) && setFirstTimeFocus(true);
106
- var currentValue = value !== null && value !== void 0 ? value : innerValue;
107
- !optional && !Boolean(currentValue) ? onBlur === null || onBlur === void 0 ? void 0 : onBlur({
108
- value: currentValue,
109
- error: "This field is required. Please, choose an option."
110
- }) : onBlur === null || onBlur === void 0 ? void 0 : onBlur({
111
- value: currentValue
112
- });
107
+ if (!e.currentTarget.contains(e.relatedTarget)) {
108
+ setFirstTimeFocus(true);
109
+ var currentValue = value !== null && value !== void 0 ? value : innerValue;
110
+ !optional && !Boolean(currentValue) ? onBlur === null || onBlur === void 0 ? void 0 : onBlur({
111
+ value: currentValue,
112
+ error: "This field is required. Please, choose an option."
113
+ }) : onBlur === null || onBlur === void 0 ? void 0 : onBlur({
114
+ value: currentValue
115
+ });
116
+ }
117
+ };
118
+
119
+ var handleOnFocus = function handleOnFocus() {
120
+ firstTimeFocus && setFirstTimeFocus(false);
113
121
  };
114
122
 
115
123
  var setPreviousRadioChecked = function setPreviousRadioChecked() {
116
- if (!disabled) {
117
- setCurrentFocusIndex(function (currentFocusIndex) {
118
- var index = currentFocusIndex === 0 ? innerOptions.length - 1 : currentFocusIndex - 1;
124
+ setCurrentFocusIndex(function (currentFocusIndex) {
125
+ var index = currentFocusIndex === 0 ? innerOptions.length - 1 : currentFocusIndex - 1;
119
126
 
120
- while (innerOptions[index].disabled) {
121
- index = index === 0 ? innerOptions.length - 1 : index - 1;
122
- }
127
+ while (innerOptions[index].disabled) {
128
+ index = index === 0 ? innerOptions.length - 1 : index - 1;
129
+ }
123
130
 
124
- return index;
125
- });
126
- }
131
+ handleOnChange(innerOptions[index].value);
132
+ return index;
133
+ });
127
134
  };
128
135
 
129
136
  var setNextRadioChecked = function setNextRadioChecked() {
130
- if (!disabled) {
131
- setCurrentFocusIndex(function (currentFocusIndex) {
132
- var index = currentFocusIndex === innerOptions.length - 1 ? 0 : currentFocusIndex + 1;
137
+ setCurrentFocusIndex(function (currentFocusIndex) {
138
+ var index = currentFocusIndex === innerOptions.length - 1 ? 0 : currentFocusIndex + 1;
133
139
 
134
- while (innerOptions[index].disabled) {
135
- index = index === innerOptions.length - 1 ? 0 : index + 1;
136
- }
140
+ while (innerOptions[index].disabled) {
141
+ index = index === innerOptions.length - 1 ? 0 : index + 1;
142
+ }
137
143
 
138
- return index;
139
- });
140
- }
144
+ handleOnChange(innerOptions[index].value);
145
+ return index;
146
+ });
141
147
  };
142
148
 
143
149
  var handleOnKeyDown = function handleOnKeyDown(event) {
@@ -180,6 +186,7 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
180
186
  disabled: disabled
181
187
  }, helperText), /*#__PURE__*/_react["default"].createElement(RadioGroup, {
182
188
  onBlur: handleOnBlur,
189
+ onFocus: handleOnFocus,
183
190
  onKeyDown: handleOnKeyDown,
184
191
  stacking: stacking,
185
192
  role: "radiogroup",
@@ -187,7 +194,9 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
187
194
  "aria-labelledby": radioGroupLabelId,
188
195
  "aria-invalid": error ? "true" : "false",
189
196
  "aria-errormessage": error ? errorId : undefined,
190
- "aria-required": !optional
197
+ "aria-required": !disabled && !readonly && !optional,
198
+ "aria-readonly": readonly,
199
+ "aria-orientation": stacking === "column" ? "vertical" : "horizontal"
191
200
  }, /*#__PURE__*/_react["default"].createElement(ValueInput, {
192
201
  name: name,
193
202
  value: value !== null && value !== void 0 ? value : innerValue,
@@ -201,13 +210,11 @@ var DxcRadioGroup = /*#__PURE__*/_react["default"].forwardRef(function (_ref, re
201
210
  handleOnChange(option.value);
202
211
  setCurrentFocusIndex(index);
203
212
  },
204
- onFocus: function onFocus() {
205
- !firstTimeFocus ? handleOnChange(option.value) : setFirstTimeFocus(false);
206
- },
207
213
  error: error,
208
214
  disabled: option.disabled || disabled,
209
215
  focused: currentFocusIndex === index,
210
- readonly: readonly
216
+ readonly: readonly,
217
+ tabIndex: tabIndex
211
218
  });
212
219
  })), !disabled && typeof error === "string" && /*#__PURE__*/_react["default"].createElement(Error, {
213
220
  id: errorId,