@dxc-technology/halstack-react 11.0.0 → 12.0.0

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 (276) hide show
  1. package/BackgroundColorContext.d.ts +1 -10
  2. package/BackgroundColorContext.js +3 -8
  3. package/HalstackContext.d.ts +32 -142
  4. package/HalstackContext.js +2 -2
  5. package/accordion/Accordion.accessibility.test.js +71 -0
  6. package/accordion/Accordion.js +13 -27
  7. package/accordion/Accordion.stories.tsx +7 -49
  8. package/accordion/types.d.ts +1 -1
  9. package/accordion-group/AccordionGroup.accessibility.test.js +88 -0
  10. package/accordion-group/AccordionGroup.d.ts +2 -3
  11. package/accordion-group/AccordionGroup.js +4 -4
  12. package/accordion-group/AccordionGroup.stories.tsx +23 -23
  13. package/accordion-group/AccordionGroupAccordion.js +3 -3
  14. package/accordion-group/AccordionGroupContext.d.ts +3 -0
  15. package/accordion-group/AccordionGroupContext.js +8 -0
  16. package/accordion-group/types.d.ts +1 -1
  17. package/action-icon/ActionIcon.accessibility.test.js +63 -0
  18. package/action-icon/ActionIcon.d.ts +4 -0
  19. package/action-icon/ActionIcon.js +48 -0
  20. package/action-icon/ActionIcon.stories.tsx +41 -0
  21. package/action-icon/ActionIcon.test.js +64 -0
  22. package/action-icon/types.d.ts +26 -0
  23. package/action-icon/types.js +5 -0
  24. package/alert/Alert.accessibility.test.js +95 -0
  25. package/alert/Alert.js +21 -75
  26. package/badge/Badge.accessibility.test.js +129 -0
  27. package/badge/Badge.d.ts +1 -1
  28. package/badge/Badge.js +141 -28
  29. package/badge/Badge.stories.tsx +210 -0
  30. package/badge/Badge.test.js +30 -0
  31. package/badge/types.d.ts +52 -3
  32. package/box/Box.accessibility.test.js +33 -0
  33. package/box/Box.js +2 -5
  34. package/breadcrumbs/Breadcrumbs.accessibility.test.d.ts +1 -0
  35. package/breadcrumbs/Breadcrumbs.accessibility.test.js +96 -0
  36. package/breadcrumbs/Breadcrumbs.d.ts +4 -0
  37. package/breadcrumbs/Breadcrumbs.js +79 -0
  38. package/breadcrumbs/Breadcrumbs.stories.tsx +194 -0
  39. package/breadcrumbs/Breadcrumbs.test.d.ts +1 -0
  40. package/breadcrumbs/Breadcrumbs.test.js +169 -0
  41. package/breadcrumbs/Item.d.ts +4 -0
  42. package/breadcrumbs/Item.js +52 -0
  43. package/breadcrumbs/dropdownTheme.d.ts +53 -0
  44. package/breadcrumbs/dropdownTheme.js +62 -0
  45. package/breadcrumbs/types.d.ts +16 -0
  46. package/breadcrumbs/types.js +5 -0
  47. package/bulleted-list/BulletedList.accessibility.test.js +119 -0
  48. package/bulleted-list/BulletedList.js +16 -23
  49. package/bulleted-list/BulletedList.stories.tsx +1 -2
  50. package/button/Button.accessibility.test.js +127 -0
  51. package/button/Button.js +16 -16
  52. package/button/Button.stories.tsx +34 -53
  53. package/button/Button.test.js +3 -1
  54. package/button/types.d.ts +1 -1
  55. package/card/Card.accessibility.test.js +36 -0
  56. package/card/Card.js +3 -2
  57. package/checkbox/Checkbox.accessibility.test.js +87 -0
  58. package/checkbox/Checkbox.js +31 -36
  59. package/chip/Chip.accessibility.test.js +67 -0
  60. package/chip/Chip.js +11 -6
  61. package/chip/Chip.stories.tsx +10 -25
  62. package/chip/Chip.test.js +4 -4
  63. package/common/coreTokens.d.ts +105 -14
  64. package/common/coreTokens.js +40 -22
  65. package/common/variables.d.ts +31 -138
  66. package/common/variables.js +103 -210
  67. package/container/Container.d.ts +4 -0
  68. package/container/Container.js +194 -0
  69. package/container/Container.stories.tsx +214 -0
  70. package/container/types.d.ts +74 -0
  71. package/container/types.js +5 -0
  72. package/contextual-menu/ContextualMenu.accessibility.test.js +97 -0
  73. package/contextual-menu/ContextualMenu.d.ts +5 -0
  74. package/contextual-menu/ContextualMenu.js +88 -0
  75. package/contextual-menu/ContextualMenu.stories.tsx +232 -0
  76. package/contextual-menu/ContextualMenu.test.js +205 -0
  77. package/contextual-menu/GroupItem.d.ts +4 -0
  78. package/contextual-menu/GroupItem.js +67 -0
  79. package/contextual-menu/ItemAction.d.ts +4 -0
  80. package/contextual-menu/ItemAction.js +51 -0
  81. package/contextual-menu/MenuItem.d.ts +4 -0
  82. package/contextual-menu/MenuItem.js +29 -0
  83. package/contextual-menu/SingleItem.d.ts +4 -0
  84. package/contextual-menu/SingleItem.js +38 -0
  85. package/contextual-menu/types.d.ts +58 -0
  86. package/contextual-menu/types.js +5 -0
  87. package/date-input/Calendar.js +1 -1
  88. package/date-input/DateInput.accessibility.test.js +228 -0
  89. package/date-input/DateInput.js +4 -5
  90. package/date-input/DateInput.stories.tsx +15 -8
  91. package/date-input/DatePicker.js +13 -7
  92. package/date-input/YearPicker.js +1 -1
  93. package/date-input/types.d.ts +2 -2
  94. package/dialog/Dialog.accessibility.test.js +69 -0
  95. package/dialog/Dialog.js +11 -25
  96. package/dialog/Dialog.stories.tsx +176 -0
  97. package/dialog/Dialog.test.js +1 -1
  98. package/divider/Divider.accessibility.test.js +33 -0
  99. package/divider/Divider.d.ts +4 -0
  100. package/divider/Divider.js +36 -0
  101. package/divider/Divider.stories.tsx +223 -0
  102. package/divider/Divider.test.js +38 -0
  103. package/divider/types.d.ts +21 -0
  104. package/divider/types.js +5 -0
  105. package/dropdown/Dropdown.accessibility.test.js +180 -0
  106. package/dropdown/Dropdown.js +26 -39
  107. package/dropdown/Dropdown.stories.tsx +15 -26
  108. package/dropdown/Dropdown.test.js +18 -18
  109. package/dropdown/DropdownMenu.js +4 -4
  110. package/dropdown/DropdownMenuItem.js +8 -4
  111. package/dropdown/types.d.ts +3 -5
  112. package/file-input/FileInput.accessibility.test.js +160 -0
  113. package/file-input/FileInput.js +126 -141
  114. package/file-input/FileInput.test.js +84 -110
  115. package/file-input/FileItem.js +18 -28
  116. package/file-input/types.d.ts +1 -1
  117. package/footer/Footer.accessibility.test.js +125 -0
  118. package/footer/Footer.d.ts +1 -1
  119. package/footer/Footer.js +36 -31
  120. package/footer/Footer.stories.tsx +58 -2
  121. package/footer/Icons.d.ts +1 -0
  122. package/footer/Icons.js +52 -16
  123. package/footer/types.d.ts +8 -8
  124. package/header/Header.accessibility.test.js +93 -0
  125. package/header/Header.js +20 -41
  126. package/header/Header.stories.tsx +16 -0
  127. package/header/Icons.js +1 -6
  128. package/header/types.d.ts +4 -3
  129. package/heading/Heading.accessibility.test.js +33 -0
  130. package/heading/Heading.js +1 -1
  131. package/icon/Icon.accessibility.test.js +30 -0
  132. package/icon/Icon.d.ts +4 -0
  133. package/icon/Icon.js +33 -0
  134. package/icon/Icon.stories.tsx +28 -0
  135. package/icon/types.d.ts +4 -0
  136. package/icon/types.js +5 -0
  137. package/image/Image.accessibility.test.js +56 -0
  138. package/image/Image.js +1 -1
  139. package/image/Image.stories.tsx +3 -1
  140. package/layout/ApplicationLayout.d.ts +1 -1
  141. package/layout/ApplicationLayout.js +10 -7
  142. package/layout/Icons.d.ts +0 -1
  143. package/layout/Icons.js +1 -11
  144. package/link/Link.accessibility.test.js +108 -0
  145. package/link/Link.js +8 -6
  146. package/link/Link.stories.tsx +4 -4
  147. package/link/types.d.ts +1 -1
  148. package/main.d.ts +7 -3
  149. package/main.js +37 -9
  150. package/nav-tabs/NavTabs.accessibility.test.js +44 -0
  151. package/nav-tabs/NavTabs.d.ts +1 -2
  152. package/nav-tabs/NavTabs.js +10 -7
  153. package/nav-tabs/NavTabs.stories.tsx +29 -24
  154. package/nav-tabs/NavTabs.test.js +11 -9
  155. package/nav-tabs/NavTabsContext.d.ts +3 -0
  156. package/nav-tabs/NavTabsContext.js +8 -0
  157. package/nav-tabs/Tab.js +23 -23
  158. package/nav-tabs/types.d.ts +1 -1
  159. package/number-input/NumberInput.accessibility.test.js +228 -0
  160. package/number-input/NumberInput.d.ts +0 -7
  161. package/number-input/NumberInput.js +24 -5
  162. package/number-input/NumberInput.test.js +165 -6
  163. package/number-input/NumberInputContext.d.ts +3 -0
  164. package/number-input/NumberInputContext.js +8 -0
  165. package/number-input/types.d.ts +6 -0
  166. package/package.json +16 -14
  167. package/paginator/Paginator.accessibility.test.js +79 -0
  168. package/paginator/Paginator.js +14 -14
  169. package/paragraph/Paragraph.accessibility.test.js +28 -0
  170. package/paragraph/Paragraph.js +2 -7
  171. package/password-input/PasswordInput.accessibility.test.js +153 -0
  172. package/password-input/PasswordInput.js +7 -7
  173. package/password-input/PasswordInput.stories.tsx +0 -1
  174. package/password-input/PasswordInput.test.js +4 -4
  175. package/progress-bar/ProgressBar.accessibility.test.js +35 -0
  176. package/progress-bar/ProgressBar.js +11 -15
  177. package/quick-nav/QuickNav.accessibility.test.js +57 -0
  178. package/quick-nav/QuickNav.js +1 -1
  179. package/radio-group/Radio.js +1 -1
  180. package/radio-group/RadioGroup.accessibility.test.js +97 -0
  181. package/radio-group/RadioGroup.js +3 -2
  182. package/resultset-table/ResultsetTable.accessibility.test.js +285 -0
  183. package/resultset-table/ResultsetTable.d.ts +4 -1
  184. package/resultset-table/ResultsetTable.js +25 -13
  185. package/resultset-table/ResultsetTable.stories.tsx +118 -5
  186. package/resultset-table/ResultsetTable.test.js +76 -0
  187. package/resultset-table/types.d.ts +40 -7
  188. package/select/Listbox.js +28 -16
  189. package/select/Option.js +19 -10
  190. package/select/Select.accessibility.test.js +228 -0
  191. package/select/Select.js +57 -37
  192. package/select/Select.stories.tsx +59 -111
  193. package/select/Select.test.js +387 -456
  194. package/select/types.d.ts +3 -3
  195. package/sidenav/Sidenav.accessibility.test.js +59 -0
  196. package/sidenav/Sidenav.js +21 -19
  197. package/sidenav/Sidenav.stories.tsx +4 -9
  198. package/sidenav/types.d.ts +2 -2
  199. package/slider/Slider.accessibility.test.js +104 -0
  200. package/slider/Slider.js +40 -48
  201. package/spinner/Spinner.accessibility.test.js +96 -0
  202. package/spinner/Spinner.js +12 -16
  203. package/status-light/StatusLight.accessibility.test.js +157 -0
  204. package/status-light/StatusLight.d.ts +4 -0
  205. package/status-light/StatusLight.js +51 -0
  206. package/status-light/StatusLight.stories.tsx +74 -0
  207. package/status-light/StatusLight.test.js +25 -0
  208. package/status-light/types.d.ts +17 -0
  209. package/status-light/types.js +5 -0
  210. package/switch/Switch.accessibility.test.js +98 -0
  211. package/switch/Switch.js +24 -29
  212. package/switch/Switch.stories.tsx +12 -0
  213. package/table/DropdownTheme.js +62 -0
  214. package/table/Table.accessibility.test.js +93 -0
  215. package/table/Table.d.ts +6 -2
  216. package/table/Table.js +74 -12
  217. package/table/Table.stories.tsx +309 -2
  218. package/table/Table.test.js +92 -0
  219. package/table/types.d.ts +28 -0
  220. package/tabs/Tab.js +13 -9
  221. package/tabs/Tabs.accessibility.test.js +56 -0
  222. package/tabs/Tabs.js +12 -24
  223. package/tabs/Tabs.stories.tsx +8 -4
  224. package/tabs/Tabs.test.js +19 -37
  225. package/tabs/types.d.ts +2 -2
  226. package/tag/Tag.accessibility.test.js +69 -0
  227. package/tag/Tag.js +7 -7
  228. package/tag/Tag.stories.tsx +4 -7
  229. package/tag/Tag.test.js +4 -12
  230. package/tag/types.d.ts +2 -2
  231. package/text-input/Suggestion.js +1 -1
  232. package/text-input/Suggestions.js +19 -14
  233. package/text-input/TextInput.accessibility.test.js +321 -0
  234. package/text-input/TextInput.js +84 -105
  235. package/text-input/TextInput.stories.tsx +17 -8
  236. package/text-input/TextInput.test.js +96 -79
  237. package/textarea/Textarea.accessibility.test.js +155 -0
  238. package/textarea/Textarea.js +12 -17
  239. package/textarea/Textarea.stories.tsx +0 -1
  240. package/toggle-group/ToggleGroup.accessibility.test.js +107 -0
  241. package/toggle-group/ToggleGroup.js +6 -8
  242. package/toggle-group/ToggleGroup.stories.tsx +3 -3
  243. package/toggle-group/types.d.ts +2 -2
  244. package/typography/Typography.accessibility.test.js +339 -0
  245. package/useTheme.d.ts +31 -138
  246. package/utils/BaseTypography.js +1 -1
  247. package/utils/FocusLock.js +16 -6
  248. package/wizard/Wizard.accessibility.test.js +55 -0
  249. package/wizard/Wizard.js +14 -25
  250. package/wizard/Wizard.stories.tsx +19 -0
  251. package/wizard/types.d.ts +2 -2
  252. package/common/OpenSans.css +0 -69
  253. package/common/fonts/OpenSans-Bold.ttf +0 -0
  254. package/common/fonts/OpenSans-BoldItalic.ttf +0 -0
  255. package/common/fonts/OpenSans-ExtraBold.ttf +0 -0
  256. package/common/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  257. package/common/fonts/OpenSans-Italic.ttf +0 -0
  258. package/common/fonts/OpenSans-Light.ttf +0 -0
  259. package/common/fonts/OpenSans-LightItalic.ttf +0 -0
  260. package/common/fonts/OpenSans-Regular.ttf +0 -0
  261. package/common/fonts/OpenSans-SemiBold.ttf +0 -0
  262. package/common/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
  263. package/date-input/Icons.d.ts +0 -6
  264. package/date-input/Icons.js +0 -58
  265. package/paginator/Icons.d.ts +0 -5
  266. package/paginator/Icons.js +0 -40
  267. package/password-input/Icons.d.ts +0 -6
  268. package/password-input/Icons.js +0 -35
  269. package/select/Icons.d.ts +0 -10
  270. package/select/Icons.js +0 -89
  271. package/sidenav/Icons.d.ts +0 -7
  272. package/sidenav/Icons.js +0 -47
  273. package/text-input/Icons.d.ts +0 -8
  274. package/text-input/Icons.js +0 -56
  275. /package/{layout → sidenav}/SidenavContext.d.ts +0 -0
  276. /package/{layout → sidenav}/SidenavContext.js +0 -0
@@ -3,10 +3,23 @@ import DxcTable from "./Table";
3
3
  import Title from "../../.storybook/components/Title";
4
4
  import ExampleContainer from "../../.storybook/components/ExampleContainer";
5
5
  import { HalstackProvider } from "../HalstackContext";
6
+ import { userEvent, within } from "@storybook/testing-library";
7
+ import { disabledRules } from "../../test/accessibility/rules/specific/table/disabledRules";
8
+ import preview from "../../.storybook/preview";
6
9
 
7
10
  export default {
8
11
  title: "Table",
9
12
  component: DxcTable,
13
+ parameters: {
14
+ a11y: {
15
+ config: {
16
+ rules: [
17
+ ...disabledRules.map((ruleId) => ({ id: ruleId, reviewOnFail: true })),
18
+ ...preview?.parameters?.a11y?.config?.rules,
19
+ ],
20
+ },
21
+ },
22
+ },
10
23
  };
11
24
 
12
25
  const opinionatedTheme = {
@@ -17,11 +30,233 @@ const opinionatedTheme = {
17
30
  },
18
31
  };
19
32
 
33
+ const advancedTheme = {
34
+ table: {
35
+ actionIconColor: "#1B75BB",
36
+ hoverActionIconColor: "#1B75BB",
37
+ activeActionIconColor: "#1B75BB",
38
+ focusActionIconColor: "#1B75BB",
39
+ hoverButtonBackgroundColor: "#cccccc",
40
+ },
41
+ };
42
+
43
+ const actions = [
44
+ {
45
+ title: "icon",
46
+ onClick: (value?) => {
47
+ console.log(value);
48
+ },
49
+ options: [
50
+ {
51
+ value: "1",
52
+ label: "Amazon with a very long text",
53
+ },
54
+ {
55
+ value: "2",
56
+ label: "Ebay",
57
+ },
58
+ {
59
+ value: "3",
60
+ label: "Apple",
61
+ },
62
+ ],
63
+ },
64
+ {
65
+ title: "icon",
66
+ onClick: (value?) => {
67
+ console.log(value);
68
+ },
69
+ options: [
70
+ {
71
+ value: "1",
72
+ label: "Amazon with a very long text",
73
+ },
74
+ {
75
+ value: "2",
76
+ label: "Ebay",
77
+ },
78
+ {
79
+ value: "3",
80
+ label: "Apple",
81
+ },
82
+ ],
83
+ },
84
+ {
85
+ disabled: true,
86
+ title: "icon",
87
+ onClick: (value?) => {
88
+ console.log(value);
89
+ },
90
+ options: [
91
+ {
92
+ value: "1",
93
+ label: "Amazon with a very long text",
94
+ },
95
+ {
96
+ value: "2",
97
+ label: "Ebay",
98
+ },
99
+ {
100
+ value: "3",
101
+ label: "Apple",
102
+ },
103
+ ],
104
+ },
105
+ {
106
+ icon: "filled_edit",
107
+ title: "icon",
108
+ onClick: () => {},
109
+ },
110
+ {
111
+ icon: "filled_delete",
112
+ title: "icon",
113
+ onClick: () => {},
114
+ disabled: true,
115
+ },
116
+ ];
117
+
20
118
  export const Chromatic = () => (
21
119
  <>
22
120
  <ExampleContainer>
23
121
  <Title title="Default" theme="light" level={4} />
24
122
  <DxcTable>
123
+ <tr>
124
+ <th>header 1</th>
125
+ <th>header 2</th>
126
+ <th>actions</th>
127
+ </tr>
128
+ <tr>
129
+ <td>cell 1</td>
130
+ <td>cell 2</td>
131
+ <td>
132
+ <DxcTable.ActionsCell actions={actions} />
133
+ </td>
134
+ </tr>
135
+ <tr>
136
+ <td>cell 4</td>
137
+ <td>cell 5</td>
138
+ <td>
139
+ <DxcTable.ActionsCell actions={actions} />
140
+ </td>
141
+ </tr>
142
+ <tr>
143
+ <td>cell 7</td>
144
+ <td>cell 8</td>
145
+ <td>
146
+ <DxcTable.ActionsCell actions={actions} />
147
+ </td>
148
+ </tr>
149
+ </DxcTable>
150
+ </ExampleContainer>
151
+ <ExampleContainer>
152
+ <Title title="Custom actionsCell theme" theme="light" level={4} />
153
+ <HalstackProvider advancedTheme={advancedTheme}>
154
+ <DxcTable>
155
+ <tr>
156
+ <th>header 1</th>
157
+ <th>header 2</th>
158
+ <th>actions</th>
159
+ </tr>
160
+ <tr>
161
+ <td>cell 1</td>
162
+ <td>cell 2</td>
163
+ <td>
164
+ <DxcTable.ActionsCell actions={actions} />
165
+ </td>
166
+ </tr>
167
+ <tr>
168
+ <td>cell 4</td>
169
+ <td>cell 5</td>
170
+ <td>
171
+ <DxcTable.ActionsCell actions={actions} />
172
+ </td>
173
+ </tr>
174
+ <tr>
175
+ <td>cell 7</td>
176
+ <td>cell 8</td>
177
+ <td>
178
+ <DxcTable.ActionsCell actions={actions} />
179
+ </td>
180
+ </tr>
181
+ </DxcTable>
182
+ </HalstackProvider>
183
+ </ExampleContainer>
184
+ <ExampleContainer>
185
+ <Title title="With scrollbar" theme="light" level={4} />
186
+ <div
187
+ style={{ height: 200 + "px", display: "flex", flexDirection: "row", width: 100 + "%", marginBottom: 50 + "px" }}
188
+ >
189
+ <DxcTable>
190
+ <tr>
191
+ <th>
192
+ header<br></br>subheader
193
+ </th>
194
+ <th>
195
+ header<br></br>subheader
196
+ </th>
197
+ <th>
198
+ header<br></br>subheader
199
+ </th>
200
+ </tr>
201
+ <tr>
202
+ <td>
203
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
204
+ dolore magna aliqua.
205
+ </td>
206
+ <td>
207
+ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
208
+ consequat.
209
+ </td>
210
+ <td>
211
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
212
+ </td>
213
+ </tr>
214
+ <tr>
215
+ <td>cell data</td>
216
+ <td>cell data</td>
217
+ <td>cell data</td>
218
+ </tr>
219
+ <tr>
220
+ <td>cell data</td>
221
+ <td>cell data</td>
222
+ <td>cell data</td>
223
+ </tr>
224
+ <tr>
225
+ <td>cell data</td>
226
+ <td>cell data</td>
227
+ <td>cell data</td>
228
+ </tr>
229
+ <tr>
230
+ <td>cell data</td>
231
+ <td>cell data</td>
232
+ <td>cell data</td>
233
+ </tr>
234
+ <tr>
235
+ <td>cell data</td>
236
+ <td>cell data</td>
237
+ <td>cell data</td>
238
+ </tr>
239
+ <tr>
240
+ <td>cell data</td>
241
+ <td>cell data</td>
242
+ <td>cell data</td>
243
+ </tr>
244
+ <tr>
245
+ <td>cell data</td>
246
+ <td>cell data</td>
247
+ <td>cell data</td>
248
+ </tr>
249
+ <tr>
250
+ <td>cell data</td>
251
+ <td>cell data</td>
252
+ <td>cell data</td>
253
+ </tr>
254
+ </DxcTable>
255
+ </div>
256
+ </ExampleContainer>
257
+ <ExampleContainer>
258
+ <Title title="Default reduced" theme="light" level={4} />
259
+ <DxcTable mode="reduced">
25
260
  <tr>
26
261
  <th>header 1</th>
27
262
  <th>header 2</th>
@@ -45,11 +280,11 @@ export const Chromatic = () => (
45
280
  </DxcTable>
46
281
  </ExampleContainer>
47
282
  <ExampleContainer>
48
- <Title title="With scrollbar" theme="light" level={4} />
283
+ <Title title="Reduced with scrollbar" theme="light" level={4} />
49
284
  <div
50
285
  style={{ height: 200 + "px", display: "flex", flexDirection: "row", width: 100 + "%", marginBottom: 50 + "px" }}
51
286
  >
52
- <DxcTable>
287
+ <DxcTable mode="reduced">
53
288
  <tr>
54
289
  <th>
55
290
  header<br></br>subheader
@@ -117,6 +352,37 @@ export const Chromatic = () => (
117
352
  </DxcTable>
118
353
  </div>
119
354
  </ExampleContainer>
355
+ <ExampleContainer>
356
+ <Title title="Reduced table with actions" theme="light" level={4} />
357
+ <DxcTable mode="reduced">
358
+ <tr>
359
+ <th>header 1</th>
360
+ <th>header 2</th>
361
+ <th>header 3</th>
362
+ </tr>
363
+ <tr>
364
+ <td>cell 1</td>
365
+ <td>cell 2</td>
366
+ <td>
367
+ <DxcTable.ActionsCell actions={actions} />
368
+ </td>
369
+ </tr>
370
+ <tr>
371
+ <td>cell 4</td>
372
+ <td>cell 5</td>
373
+ <td>
374
+ <DxcTable.ActionsCell actions={actions} />
375
+ </td>
376
+ </tr>
377
+ <tr>
378
+ <td>cell 7</td>
379
+ <td>cell 8</td>
380
+ <td>
381
+ <DxcTable.ActionsCell actions={actions} />
382
+ </td>
383
+ </tr>
384
+ </DxcTable>
385
+ </ExampleContainer>
120
386
  <Title title="Margins" theme="light" level={2} />
121
387
  <ExampleContainer>
122
388
  <Title title="Xxsmall margin" theme="light" level={4} />
@@ -354,3 +620,44 @@ export const Chromatic = () => (
354
620
  </ExampleContainer>
355
621
  </>
356
622
  );
623
+
624
+ const ActionsCellDropdown = () => (
625
+ <ExampleContainer>
626
+ <Title title="Dropdown Action" theme="light" level={4} />
627
+ <DxcTable>
628
+ <tr>
629
+ <th>header 1</th>
630
+ <th>header 2</th>
631
+ <th>actions</th>
632
+ </tr>
633
+ <tr>
634
+ <td>cell 1</td>
635
+ <td>cell 2</td>
636
+ <td>
637
+ <DxcTable.ActionsCell actions={actions} />
638
+ </td>
639
+ </tr>
640
+ <tr>
641
+ <td>cell 4</td>
642
+ <td>cell 5</td>
643
+ <td>
644
+ <DxcTable.ActionsCell actions={actions} />
645
+ </td>
646
+ </tr>
647
+ <tr>
648
+ <td>cell 7</td>
649
+ <td>cell 8</td>
650
+ <td>
651
+ <DxcTable.ActionsCell actions={actions} />
652
+ </td>
653
+ </tr>
654
+ </DxcTable>
655
+ </ExampleContainer>
656
+ );
657
+
658
+ export const DropdownAction = ActionsCellDropdown.bind({});
659
+ DropdownAction.play = async ({ canvasElement }) => {
660
+ const canvas = within(canvasElement);
661
+ const nextButton = canvas.getAllByRole("button")[8];
662
+ await userEvent.click(nextButton);
663
+ };
@@ -1,9 +1,55 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
4
8
  var _react = _interopRequireDefault(require("react"));
5
9
  var _react2 = require("@testing-library/react");
6
10
  var _Table = _interopRequireDefault(require("./Table.tsx"));
11
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
12
+ global.globalThis = global;
13
+ global.DOMRect = {
14
+ fromRect: function fromRect() {
15
+ return {
16
+ top: 0,
17
+ left: 0,
18
+ bottom: 0,
19
+ right: 0,
20
+ width: 0,
21
+ height: 0
22
+ };
23
+ }
24
+ };
25
+ global.ResizeObserver = /*#__PURE__*/function () {
26
+ function ResizeObserver() {
27
+ (0, _classCallCheck2["default"])(this, ResizeObserver);
28
+ }
29
+ (0, _createClass2["default"])(ResizeObserver, [{
30
+ key: "observe",
31
+ value: function observe() {}
32
+ }, {
33
+ key: "unobserve",
34
+ value: function unobserve() {}
35
+ }, {
36
+ key: "disconnect",
37
+ value: function disconnect() {}
38
+ }]);
39
+ return ResizeObserver;
40
+ }();
41
+ var icon = /*#__PURE__*/_react["default"].createElement("svg", {
42
+ xmlns: "http://www.w3.org/2000/svg",
43
+ height: "24px",
44
+ viewBox: "0 0 24 24",
45
+ width: "24px",
46
+ fill: "currentColor"
47
+ }, /*#__PURE__*/_react["default"].createElement("path", {
48
+ d: "M0 0h24v24H0V0zm0 0h24v24H0V0z",
49
+ fill: "none"
50
+ }), /*#__PURE__*/_react["default"].createElement("path", {
51
+ d: "M1 9l2 2c4.97-4.97 13.03-4.97 18 0l2-2C16.93 2.93 7.08 2.93 1 9zm8 8l3 3 3-3c-1.65-1.66-4.34-1.66-6 0zm-4-4l2 2c2.76-2.76 7.24-2.76 10 0l2-2C15.14 9.14 8.87 9.14 5 13z"
52
+ }));
7
53
  describe("Table component tests", function () {
8
54
  test("Table renders with correct content", function () {
9
55
  var _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Table["default"], null, /*#__PURE__*/_react["default"].createElement("thead", null, /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("th", null, "header-1"), /*#__PURE__*/_react["default"].createElement("th", null, "header-2"), /*#__PURE__*/_react["default"].createElement("th", null, "header-3"))), /*#__PURE__*/_react["default"].createElement("tbody", null, /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("td", null, "cell-1"), /*#__PURE__*/_react["default"].createElement("td", null, "cell-2"), /*#__PURE__*/_react["default"].createElement("td", null, "cell-3")), /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("td", null, "cell-4"), /*#__PURE__*/_react["default"].createElement("td", null, "cell-5"), /*#__PURE__*/_react["default"].createElement("td", null, "cell-6"))))),
@@ -18,4 +64,50 @@ describe("Table component tests", function () {
18
64
  expect(getByText("cell-5")).toBeTruthy();
19
65
  expect(getByText("cell-6")).toBeTruthy();
20
66
  });
67
+ test("Table ActionsCell", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
68
+ var onSelectOption, onClick, actions, _render2, getAllByRole, getByRole, getByText, dropdown, option, action;
69
+ return _regenerator["default"].wrap(function _callee$(_context) {
70
+ while (1) switch (_context.prev = _context.next) {
71
+ case 0:
72
+ onSelectOption = jest.fn();
73
+ onClick = jest.fn();
74
+ actions = [{
75
+ icon: icon,
76
+ title: "icon1",
77
+ onClick: onSelectOption,
78
+ options: [{
79
+ value: "1",
80
+ label: "Amazon"
81
+ }, {
82
+ value: "2",
83
+ label: "Ebay"
84
+ }, {
85
+ value: "3",
86
+ label: "Aliexpress"
87
+ }]
88
+ }, {
89
+ icon: icon,
90
+ title: "icon2",
91
+ onClick: onClick
92
+ }];
93
+ _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Table["default"], null, /*#__PURE__*/_react["default"].createElement("thead", null, /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("th", null, "header-1"), /*#__PURE__*/_react["default"].createElement("th", null, "header-2"), /*#__PURE__*/_react["default"].createElement("th", null, "header-3"))), /*#__PURE__*/_react["default"].createElement("tbody", null, /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("td", null, "cell-1"), /*#__PURE__*/_react["default"].createElement("td", null, "cell-2"), /*#__PURE__*/_react["default"].createElement("td", null, "cell-3")), /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("td", null, "cell-4"), /*#__PURE__*/_react["default"].createElement("td", null, "cell-5"), /*#__PURE__*/_react["default"].createElement("td", null, /*#__PURE__*/_react["default"].createElement(_Table["default"].ActionsCell, {
94
+ actions: actions
95
+ })))))), getAllByRole = _render2.getAllByRole, getByRole = _render2.getByRole, getByText = _render2.getByText;
96
+ dropdown = getAllByRole("button")[1];
97
+ (0, _react2.act)(function () {
98
+ _userEvent["default"].click(dropdown);
99
+ });
100
+ expect(getByRole("menu")).toBeTruthy();
101
+ option = getByText("Aliexpress");
102
+ _userEvent["default"].click(option);
103
+ expect(onSelectOption).toHaveBeenCalledWith("3");
104
+ action = getAllByRole("button")[0];
105
+ _userEvent["default"].click(action);
106
+ expect(onClick).toHaveBeenCalled();
107
+ case 13:
108
+ case "end":
109
+ return _context.stop();
110
+ }
111
+ }, _callee);
112
+ })));
21
113
  });
package/table/types.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  /// <reference types="react" />
2
+ import { Option } from "../dropdown/types";
2
3
  type Space = "xxsmall" | "xsmall" | "small" | "medium" | "large" | "xlarge" | "xxlarge";
3
4
  type Margin = {
4
5
  top?: Space;
@@ -6,6 +7,27 @@ type Margin = {
6
7
  left?: Space;
7
8
  right?: Space;
8
9
  };
10
+ type SVG = React.ReactNode & React.SVGProps<SVGSVGElement>;
11
+ export type DeepPartial<T> = {
12
+ [P in keyof T]?: Partial<T[P]>;
13
+ };
14
+ export type ActionCellsPropsType = {
15
+ actions: Array<{
16
+ icon: string | SVG;
17
+ title: string;
18
+ onClick: () => void;
19
+ disabled?: boolean;
20
+ tabIndex?: number;
21
+ options?: never;
22
+ } | {
23
+ icon?: never;
24
+ title: string;
25
+ onClick: (value?: string) => void;
26
+ disabled?: boolean;
27
+ tabIndex?: number;
28
+ options: Option[];
29
+ }>;
30
+ };
9
31
  type Props = {
10
32
  /**
11
33
  * The center section of the table. Can be used to render custom
@@ -17,5 +39,11 @@ type Props = {
17
39
  * You can pass an object with 'top', 'bottom', 'left' and 'right' properties in order to specify different margin sizes.
18
40
  */
19
41
  margin?: Space | Margin;
42
+ /**
43
+ * Determines the visual style and layout
44
+ * - "default": Default table size.
45
+ * - "reduced": More compact table with less spacing for high density information.
46
+ */
47
+ mode?: "default" | "reduced";
20
48
  };
21
49
  export default Props;
package/tabs/Tab.js CHANGED
@@ -12,9 +12,10 @@ var _styledComponents = _interopRequireDefault(require("styled-components"));
12
12
  var _Badge = _interopRequireDefault(require("../badge/Badge"));
13
13
  var _BaseTypography = _interopRequireDefault(require("../utils/BaseTypography"));
14
14
  var _useTheme = _interopRequireDefault(require("../useTheme"));
15
+ var _Icon = _interopRequireDefault(require("../icon/Icon"));
15
16
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
16
17
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
17
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
18
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
18
19
  var Tab = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
19
20
  var active = _ref.active,
20
21
  tab = _ref.tab,
@@ -46,12 +47,13 @@ var Tab = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
46
47
  }, /*#__PURE__*/_react["default"].createElement(MainLabelContainer, {
47
48
  notificationNumber: tab.notificationNumber,
48
49
  hasLabelAndIcon: hasLabelAndIcon,
49
- iconPosition: iconPosition
50
+ iconPosition: iconPosition,
51
+ disabled: tab.isDisabled
50
52
  }, tab.icon && /*#__PURE__*/_react["default"].createElement(TabIconContainer, {
51
53
  hasLabelAndIcon: hasLabelAndIcon,
52
54
  iconPosition: iconPosition
53
- }, typeof tab.icon === "string" ? /*#__PURE__*/_react["default"].createElement("img", {
54
- src: tab.icon
55
+ }, typeof tab.icon === "string" ? /*#__PURE__*/_react["default"].createElement(_Icon["default"], {
56
+ icon: tab.icon
55
57
  }) : tab.icon), /*#__PURE__*/_react["default"].createElement(_BaseTypography["default"], {
56
58
  color: tab.isDisabled ? colorsTheme.tabs.disabledFontColor : active ? colorsTheme.tabs.selectedFontColor : colorsTheme.tabs.unselectedFontColor,
57
59
  fontFamily: colorsTheme.tabs.fontFamily,
@@ -61,14 +63,16 @@ var Tab = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
61
63
  textAlign: "center",
62
64
  letterSpacing: "0.025em",
63
65
  lineHeight: "1.715em"
64
- }, tab.label)), tab.notificationNumber && /*#__PURE__*/_react["default"].createElement(BadgeContainer, {
66
+ }, tab.label)), tab.notificationNumber && !tab.isDisabled && /*#__PURE__*/_react["default"].createElement(BadgeContainer, {
65
67
  hasLabelAndIcon: hasLabelAndIcon,
66
68
  iconPosition: iconPosition
67
69
  }, /*#__PURE__*/_react["default"].createElement(_Badge["default"], {
68
- notificationText: typeof tab.notificationNumber === "number" && tab.notificationNumber > 99 ? "+99" : tab.notificationNumber
70
+ mode: "notification",
71
+ size: "small",
72
+ label: typeof tab.notificationNumber === "number" && tab.notificationNumber
69
73
  })));
70
74
  });
71
- var TabContainer = _styledComponents["default"].button(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n text-transform: ", ";\n overflow: hidden;\n flex-shrink: 0;\n border: 0;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n user-select: none;\n vertical-align: middle;\n justify-content: center;\n min-width: 90px;\n max-width: 360px;\n padding: ", ";\n height: ", ";\n min-height: ", ";\n background-color: ", ";\n\n &:hover {\n background-color: ", ";\n }\n &:active {\n background-color: ", ";\n }\n &:focus {\n outline: ", " solid 1px;\n outline-offset: -1px;\n }\n svg {\n color: ", ";\n }\n\n &[aria-selected=\"true\"] {\n background-color: ", ";\n svg {\n color: ", ";\n }\n opacity: 1;\n }\n\n &:disabled {\n background-color: ", " !important;\n cursor: not-allowed !important;\n pointer-events: all;\n font-style: ", ";\n outline: none !important;\n\n svg {\n color: ", ";\n }\n > div {\n opacity: 0.5;\n }\n }\n"])), function (props) {
75
+ var TabContainer = _styledComponents["default"].button(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n text-transform: ", ";\n overflow: hidden;\n flex-shrink: 0;\n border: 0;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n user-select: none;\n vertical-align: middle;\n justify-content: center;\n min-width: 90px;\n max-width: 360px;\n padding: ", ";\n height: ", ";\n min-height: ", ";\n background-color: ", ";\n\n &:hover {\n background-color: ", ";\n }\n &:active {\n background-color: ", ";\n }\n &:focus {\n outline: ", " solid 1px;\n outline-offset: -1px;\n }\n\n svg,\n span:before {\n color: ", ";\n }\n\n &[aria-selected=\"true\"] {\n background-color: ", ";\n svg,\n span:before {\n color: ", ";\n }\n opacity: 1;\n }\n\n &:disabled {\n background-color: ", " !important;\n cursor: not-allowed !important;\n pointer-events: all;\n font-style: ", ";\n outline: none !important;\n\n svg,\n span:before {\n color: ", ";\n }\n > div {\n opacity: 0.5;\n }\n }\n"])), function (props) {
72
76
  return props.theme.fontTextTransform;
73
77
  }, function (props) {
74
78
  return (!props.hasLabelAndIcon || props.hasLabelAndIcon && props.iconPosition !== "top") && "12px 16px" || "8px 16px";
@@ -103,9 +107,9 @@ var BadgeContainer = _styledComponents["default"].div(_templateObject2 || (_temp
103
107
  var MainLabelContainer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: ", ";\n align-items: center;\n margin-left: ", ";\n"])), function (props) {
104
108
  return props.hasLabelAndIcon && props.iconPosition === "top" && "column" || "row";
105
109
  }, function (props) {
106
- return props.notificationNumber ? typeof props.notificationNumber === "number" ? "calc(".concat(props.theme.badgeWidthWithNotificationNumber, " + 12px)") : "calc(".concat(props.theme.badgeWidth, " + 12px)") : "unset";
110
+ return props.notificationNumber && !props.disabled ? typeof props.notificationNumber === "number" ? "36px" : "18px" : "unset";
107
111
  });
108
- var TabIconContainer = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n margin-bottom: ", ";\n margin-right: ", ";\n\n img,\n svg {\n height: 22px;\n width: 22px;\n }\n"])), function (props) {
112
+ var TabIconContainer = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n margin-bottom: ", ";\n margin-right: ", ";\n font-size: 22px;\n\n svg {\n height: 22px;\n width: 22px;\n }\n"])), function (props) {
109
113
  return props.hasLabelAndIcon && props.iconPosition === "top" && "8px" || "";
110
114
  }, function (props) {
111
115
  return props.hasLabelAndIcon && props.iconPosition === "left" && "12px" || "";
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
+ var _react = _interopRequireDefault(require("react"));
7
+ var _react2 = require("@testing-library/react");
8
+ var _axeHelper = require("../../test/accessibility/axe-helper.js");
9
+ var _Tabs = _interopRequireDefault(require("./Tabs.tsx"));
10
+ var iconSVG = /*#__PURE__*/_react["default"].createElement("svg", {
11
+ xmlns: "http://www.w3.org/2000/svg",
12
+ viewBox: "0 0 20 20",
13
+ height: "20",
14
+ width: "20",
15
+ fill: "currentColor"
16
+ }, /*#__PURE__*/_react["default"].createElement("path", {
17
+ d: "m10 17-1.042-.938q-2.083-1.854-3.437-3.177-1.354-1.323-2.136-2.354Q2.604 9.5 2.302 8.646 2 7.792 2 6.896q0-1.854 1.271-3.125T6.396 2.5q1.021 0 1.979.438.958.437 1.625 1.229.667-.792 1.625-1.229.958-.438 1.979-.438 1.854 0 3.125 1.271T18 6.896q0 .896-.292 1.729-.291.833-1.073 1.854-.781 1.021-2.145 2.365-1.365 1.344-3.49 3.26Zm0-2.021q1.938-1.729 3.188-2.948 1.25-1.219 1.989-2.125.74-.906 1.031-1.614.292-.709.292-1.396 0-1.229-.833-2.063Q14.833 4 13.604 4q-.729 0-1.364.302-.636.302-1.094.844L10.417 6h-.834l-.729-.854q-.458-.542-1.114-.844Q7.083 4 6.396 4q-1.229 0-2.063.833-.833.834-.833 2.063 0 .687.271 1.364.271.678.989 1.573.719.896 1.98 2.125Q8 13.188 10 14.979Zm0-5.5Z"
18
+ }));
19
+ var sampleTabs = [{
20
+ label: "Tab-1",
21
+ icon: iconSVG,
22
+ notificationNumber: 10
23
+ }, {
24
+ label: "Tab-2",
25
+ icon: iconSVG
26
+ }, {
27
+ label: "Tab-3",
28
+ notificationNumber: 20
29
+ }, {
30
+ label: "Tab-4",
31
+ isDisabled: true
32
+ }];
33
+ describe("Tabs component accessibility tests", function () {
34
+ it("Should not have basic accessibility issues", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
35
+ var _render, container, results;
36
+ return _regenerator["default"].wrap(function _callee$(_context) {
37
+ while (1) switch (_context.prev = _context.next) {
38
+ case 0:
39
+ _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Tabs["default"], {
40
+ tabs: sampleTabs,
41
+ margin: "medium",
42
+ iconPosition: "left",
43
+ defaultActiveTabIndex: 0
44
+ })), container = _render.container;
45
+ _context.next = 3;
46
+ return (0, _axeHelper.axe)(container);
47
+ case 3:
48
+ results = _context.sent;
49
+ expect(results).toHaveNoViolations();
50
+ case 5:
51
+ case "end":
52
+ return _context.stop();
53
+ }
54
+ }, _callee);
55
+ })));
56
+ });