@dxc-technology/halstack-react 0.0.0-8b5e703 → 0.0.0-8b61ced

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 (193) hide show
  1. package/HalstackContext.js +7 -11
  2. package/accordion/Accordion.js +122 -103
  3. package/accordion/Accordion.stories.tsx +2 -3
  4. package/accordion/Accordion.test.js +9 -10
  5. package/accordion/types.d.ts +5 -4
  6. package/accordion-group/AccordionGroup.js +2 -21
  7. package/accordion-group/AccordionGroup.stories.tsx +27 -1
  8. package/accordion-group/AccordionGroup.test.js +20 -45
  9. package/accordion-group/types.d.ts +10 -3
  10. package/alert/Alert.js +1 -1
  11. package/bleed/Bleed.js +1 -34
  12. package/bleed/Bleed.stories.tsx +94 -95
  13. package/bleed/types.d.ts +1 -1
  14. package/box/Box.js +23 -33
  15. package/box/types.d.ts +1 -0
  16. package/bulleted-list/BulletedList.d.ts +7 -0
  17. package/bulleted-list/BulletedList.js +123 -0
  18. package/bulleted-list/BulletedList.stories.tsx +200 -0
  19. package/bulleted-list/types.d.ts +11 -0
  20. package/{list → bulleted-list}/types.js +0 -0
  21. package/button/Button.js +43 -61
  22. package/button/Button.stories.tsx +9 -0
  23. package/button/types.d.ts +7 -7
  24. package/card/Card.js +34 -36
  25. package/card/types.d.ts +1 -0
  26. package/checkbox/Checkbox.d.ts +2 -2
  27. package/checkbox/Checkbox.js +92 -99
  28. package/checkbox/Checkbox.stories.tsx +79 -59
  29. package/checkbox/Checkbox.test.js +93 -16
  30. package/checkbox/types.d.ts +6 -2
  31. package/chip/types.d.ts +1 -1
  32. package/common/variables.js +75 -48
  33. package/date-input/Calendar.d.ts +4 -0
  34. package/date-input/Calendar.js +258 -0
  35. package/date-input/DateInput.js +77 -222
  36. package/date-input/DateInput.stories.tsx +30 -17
  37. package/date-input/DateInput.test.js +411 -138
  38. package/date-input/DatePicker.d.ts +4 -0
  39. package/date-input/DatePicker.js +160 -0
  40. package/date-input/YearPicker.d.ts +4 -0
  41. package/date-input/YearPicker.js +115 -0
  42. package/date-input/types.d.ts +53 -0
  43. package/dialog/Dialog.js +52 -28
  44. package/dialog/Dialog.stories.tsx +57 -2
  45. package/dialog/Dialog.test.js +34 -4
  46. package/dialog/types.d.ts +3 -2
  47. package/dropdown/Dropdown.d.ts +1 -1
  48. package/dropdown/Dropdown.js +247 -247
  49. package/dropdown/Dropdown.stories.tsx +126 -63
  50. package/dropdown/Dropdown.test.js +504 -108
  51. package/dropdown/DropdownMenu.d.ts +4 -0
  52. package/dropdown/DropdownMenu.js +80 -0
  53. package/dropdown/DropdownMenuItem.d.ts +4 -0
  54. package/dropdown/DropdownMenuItem.js +92 -0
  55. package/dropdown/types.d.ts +25 -5
  56. package/file-input/FileInput.d.ts +2 -2
  57. package/file-input/FileInput.js +177 -219
  58. package/file-input/FileInput.stories.tsx +38 -10
  59. package/file-input/FileInput.test.js +53 -12
  60. package/file-input/FileItem.d.ts +4 -14
  61. package/file-input/FileItem.js +38 -63
  62. package/file-input/types.d.ts +17 -0
  63. package/flex/Flex.d.ts +4 -0
  64. package/flex/Flex.js +69 -0
  65. package/flex/Flex.stories.tsx +103 -0
  66. package/flex/types.d.ts +32 -0
  67. package/{radio → flex}/types.js +0 -0
  68. package/footer/Footer.stories.tsx +8 -1
  69. package/footer/Icons.js +1 -1
  70. package/footer/types.d.ts +2 -1
  71. package/header/Header.js +74 -72
  72. package/header/Header.stories.tsx +4 -4
  73. package/header/Icons.js +2 -2
  74. package/header/types.d.ts +3 -2
  75. package/inset/Inset.js +1 -34
  76. package/inset/Inset.stories.tsx +36 -36
  77. package/inset/types.d.ts +1 -1
  78. package/layout/ApplicationLayout.d.ts +16 -6
  79. package/layout/ApplicationLayout.js +70 -117
  80. package/layout/ApplicationLayout.stories.tsx +84 -93
  81. package/layout/Icons.d.ts +5 -0
  82. package/layout/Icons.js +13 -2
  83. package/layout/SidenavContext.d.ts +5 -0
  84. package/layout/SidenavContext.js +19 -0
  85. package/layout/types.d.ts +18 -33
  86. package/link/Link.js +12 -5
  87. package/link/Link.stories.tsx +13 -6
  88. package/link/types.d.ts +1 -1
  89. package/main.d.ts +5 -9
  90. package/main.js +28 -60
  91. package/number-input/NumberInput.test.js +43 -7
  92. package/package.json +16 -20
  93. package/paginator/Paginator.js +2 -2
  94. package/paginator/Paginator.test.js +43 -1
  95. package/paragraph/Paragraph.d.ts +6 -0
  96. package/paragraph/Paragraph.js +38 -0
  97. package/paragraph/Paragraph.stories.tsx +44 -0
  98. package/password-input/PasswordInput.test.js +13 -12
  99. package/progress-bar/ProgressBar.d.ts +2 -2
  100. package/progress-bar/ProgressBar.js +56 -50
  101. package/progress-bar/ProgressBar.stories.jsx +3 -1
  102. package/progress-bar/ProgressBar.test.js +67 -22
  103. package/progress-bar/types.d.ts +3 -4
  104. package/quick-nav/QuickNav.js +25 -20
  105. package/quick-nav/QuickNav.stories.tsx +131 -26
  106. package/radio-group/Radio.d.ts +1 -1
  107. package/radio-group/Radio.js +43 -28
  108. package/radio-group/RadioGroup.js +23 -22
  109. package/radio-group/RadioGroup.stories.tsx +1 -0
  110. package/radio-group/RadioGroup.test.js +123 -96
  111. package/radio-group/types.d.ts +2 -2
  112. package/resultsetTable/Icons.d.ts +7 -0
  113. package/resultsetTable/Icons.js +51 -0
  114. package/resultsetTable/ResultsetTable.js +48 -107
  115. package/resultsetTable/ResultsetTable.stories.tsx +50 -25
  116. package/resultsetTable/ResultsetTable.test.js +65 -41
  117. package/resultsetTable/types.d.ts +2 -2
  118. package/select/Listbox.d.ts +1 -1
  119. package/select/Listbox.js +53 -7
  120. package/select/Select.js +43 -43
  121. package/select/Select.stories.tsx +133 -103
  122. package/select/Select.test.js +363 -250
  123. package/select/types.d.ts +2 -5
  124. package/sidenav/Sidenav.d.ts +6 -5
  125. package/sidenav/Sidenav.js +184 -52
  126. package/sidenav/Sidenav.stories.tsx +154 -156
  127. package/sidenav/Sidenav.test.js +25 -37
  128. package/sidenav/types.d.ts +50 -27
  129. package/slider/Slider.d.ts +2 -2
  130. package/slider/Slider.js +120 -95
  131. package/slider/Slider.stories.tsx +7 -1
  132. package/slider/Slider.test.js +121 -21
  133. package/slider/types.d.ts +6 -2
  134. package/spinner/Spinner.js +2 -2
  135. package/switch/Switch.d.ts +2 -2
  136. package/switch/Switch.js +135 -68
  137. package/switch/Switch.stories.tsx +8 -30
  138. package/switch/Switch.test.js +144 -17
  139. package/switch/types.d.ts +6 -2
  140. package/table/Table.js +1 -1
  141. package/table/Table.test.js +1 -1
  142. package/tabs/Tab.d.ts +4 -0
  143. package/tabs/Tab.js +135 -0
  144. package/tabs/Tabs.js +360 -104
  145. package/tabs/Tabs.stories.tsx +74 -1
  146. package/tabs/Tabs.test.js +217 -6
  147. package/tabs/types.d.ts +15 -5
  148. package/tabs-nav/NavTabs.d.ts +2 -1
  149. package/tabs-nav/NavTabs.js +40 -21
  150. package/tabs-nav/Tab.js +29 -16
  151. package/tabs-nav/types.d.ts +7 -5
  152. package/tag/Tag.js +1 -1
  153. package/tag/types.d.ts +1 -1
  154. package/text-input/Icons.d.ts +8 -0
  155. package/text-input/Icons.js +60 -0
  156. package/text-input/Suggestion.js +38 -9
  157. package/text-input/Suggestions.d.ts +4 -0
  158. package/text-input/Suggestions.js +134 -0
  159. package/text-input/TextInput.js +189 -282
  160. package/text-input/TextInput.stories.tsx +194 -182
  161. package/text-input/TextInput.test.js +737 -725
  162. package/text-input/types.d.ts +22 -3
  163. package/toggle-group/types.d.ts +1 -1
  164. package/typography/Typography.d.ts +4 -0
  165. package/typography/Typography.js +131 -0
  166. package/typography/Typography.stories.tsx +198 -0
  167. package/typography/types.d.ts +18 -0
  168. package/{row → typography}/types.js +0 -0
  169. package/wizard/Wizard.js +9 -16
  170. package/wizard/Wizard.stories.tsx +20 -1
  171. package/wizard/types.d.ts +5 -4
  172. package/common/RequiredComponent.js +0 -32
  173. package/list/List.d.ts +0 -4
  174. package/list/List.js +0 -47
  175. package/list/List.stories.tsx +0 -95
  176. package/list/types.d.ts +0 -7
  177. package/radio/Radio.d.ts +0 -4
  178. package/radio/Radio.js +0 -173
  179. package/radio/Radio.stories.tsx +0 -192
  180. package/radio/Radio.test.js +0 -71
  181. package/radio/types.d.ts +0 -54
  182. package/row/Row.d.ts +0 -3
  183. package/row/Row.js +0 -127
  184. package/row/Row.stories.tsx +0 -237
  185. package/row/types.d.ts +0 -28
  186. package/stack/Stack.d.ts +0 -3
  187. package/stack/Stack.js +0 -97
  188. package/stack/Stack.stories.tsx +0 -164
  189. package/stack/types.d.ts +0 -24
  190. package/stack/types.js +0 -5
  191. package/text/Text.d.ts +0 -7
  192. package/text/Text.js +0 -30
  193. package/text/Text.stories.tsx +0 -19
package/tabs/Tabs.test.js CHANGED
@@ -25,6 +25,23 @@ var sampleTabsWithBadge = [{
25
25
  label: "Tab-3",
26
26
  notificationNumber: "101"
27
27
  }];
28
+ var sampleTabsMiddleDisabled = [{
29
+ label: "Tab-1"
30
+ }, {
31
+ label: "Tab-2",
32
+ isDisabled: true
33
+ }, {
34
+ label: "Tab-3"
35
+ }];
36
+ var sampleTabsLastTabNonDisabled = [{
37
+ label: "Tab-1",
38
+ isDisabled: true
39
+ }, {
40
+ label: "Tab-2",
41
+ isDisabled: true
42
+ }, {
43
+ label: "Tab-3"
44
+ }];
28
45
  describe("Tabs component tests", function () {
29
46
  test("Tabs render with correct labels", function () {
30
47
  var _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Tabs["default"], {
@@ -103,18 +120,26 @@ describe("Tabs component tests", function () {
103
120
  tabs: sampleTabs,
104
121
  onTabClick: onTabClick
105
122
  })),
106
- getByText = _render6.getByText;
123
+ getByText = _render6.getByText,
124
+ getAllByRole = _render6.getAllByRole;
107
125
 
126
+ var tabs = getAllByRole("tab");
108
127
  var tab1 = getByText("Tab-1");
109
128
  var tab2 = getByText("Tab-2");
110
129
 
111
130
  _react2.fireEvent.click(tab2);
112
131
 
113
132
  expect(onTabClick).toHaveBeenCalledWith(1);
133
+ expect(tabs[0].getAttribute("aria-selected")).toBe("false");
134
+ expect(tabs[1].getAttribute("aria-selected")).toBe("true");
135
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
114
136
 
115
137
  _react2.fireEvent.click(tab1);
116
138
 
117
139
  expect(onTabClick).toHaveBeenCalledWith(0);
140
+ expect(tabs[0].getAttribute("aria-selected")).toBe("true");
141
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
142
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
118
143
  });
119
144
  test("Controlled tabs", function () {
120
145
  var onTabClick = jest.fn();
@@ -124,17 +149,203 @@ describe("Tabs component tests", function () {
124
149
  onTabClick: onTabClick,
125
150
  activeTabIndex: 0
126
151
  })),
127
- getByText = _render7.getByText;
152
+ getByText = _render7.getByText,
153
+ getAllByRole = _render7.getAllByRole;
128
154
 
129
- var tab2 = getByText("Tab-2");
130
- var tab3 = getByText("Tab-3");
155
+ var tabs = getAllByRole("tab");
131
156
 
132
- _react2.fireEvent.click(tab2);
157
+ _react2.fireEvent.click(tabs[1]);
158
+
159
+ expect(onTabClick).toHaveBeenCalledWith(1);
160
+ expect(tabs[0].getAttribute("aria-selected")).toBe("true");
161
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
162
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
163
+
164
+ _react2.fireEvent.click(tabs[2]);
165
+
166
+ expect(onTabClick).toHaveBeenCalledWith(2);
167
+ expect(tabs[0].getAttribute("aria-selected")).toBe("true");
168
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
169
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
170
+ });
171
+ test("Uncontrolled tabs should have focus in the first non-disabled tab", function () {
172
+ var onTabClick = jest.fn();
173
+
174
+ var _render8 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Tabs["default"], {
175
+ tabs: sampleTabsLastTabNonDisabled,
176
+ onTabClick: onTabClick
177
+ })),
178
+ getAllByRole = _render8.getAllByRole;
179
+
180
+ var tabs = getAllByRole("tab");
181
+ expect(tabs[0].hasAttribute("disabled")).toBeTruthy();
182
+ expect(tabs[1].hasAttribute("disabled")).toBeTruthy();
183
+ expect(tabs[2].hasAttribute("disabled")).toBeFalsy();
184
+ expect(tabs[0].getAttribute("aria-selected")).toBe("false");
185
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
186
+ expect(tabs[2].getAttribute("aria-selected")).toBe("true");
187
+ });
188
+ test("Controlled tabs with active index in disabled tab should not change focus to the first available tab", function () {
189
+ var onTabClick = jest.fn();
190
+
191
+ var _render9 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Tabs["default"], {
192
+ tabs: sampleTabsLastTabNonDisabled,
193
+ onTabClick: onTabClick,
194
+ activeTabIndex: 0
195
+ })),
196
+ getAllByRole = _render9.getAllByRole;
197
+
198
+ var tabs = getAllByRole("tab");
199
+ expect(tabs[0].getAttribute("aria-selected")).toBe("true");
200
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
201
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
202
+ expect(tabs[0].hasAttribute("disabled")).toBeTruthy();
203
+ expect(tabs[1].hasAttribute("disabled")).toBeTruthy();
204
+ expect(tabs[2].hasAttribute("disabled")).toBeFalsy();
205
+
206
+ _react2.fireEvent.click(tabs[2]);
207
+
208
+ expect(onTabClick).toHaveBeenCalledWith(2);
209
+ expect(tabs[0].getAttribute("aria-selected")).toBe("true");
210
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
211
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
212
+ expect(tabs[0].hasAttribute("disabled")).toBeTruthy();
213
+ expect(tabs[1].hasAttribute("disabled")).toBeTruthy();
214
+ expect(tabs[2].hasAttribute("disabled")).toBeFalsy();
215
+ });
216
+ test("Select tabs with keyboard event arrows", function () {
217
+ var onTabClick = jest.fn();
218
+
219
+ var _render10 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Tabs["default"], {
220
+ tabs: sampleTabs,
221
+ onTabClick: onTabClick
222
+ })),
223
+ getByText = _render10.getByText,
224
+ getByRole = _render10.getByRole,
225
+ getAllByRole = _render10.getAllByRole;
226
+
227
+ var tabList = getByRole("tablist");
228
+ var tab1 = getByText("Tab-1");
229
+ var tabs = getAllByRole("tab");
230
+
231
+ _react2.fireEvent.click(tab1);
232
+
233
+ expect(tabs[0].getAttribute("aria-selected")).toBe("true");
234
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
235
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
236
+ expect(onTabClick).toHaveBeenCalledWith(0);
133
237
 
238
+ _react2.fireEvent.keyDown(tabList, {
239
+ key: "ArrowRight"
240
+ });
241
+
242
+ _react2.fireEvent.keyDown(tabList, {
243
+ key: "Enter"
244
+ });
245
+
246
+ expect(tabs[0].getAttribute("aria-selected")).toBe("false");
247
+ expect(tabs[1].getAttribute("aria-selected")).toBe("true");
248
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
134
249
  expect(onTabClick).toHaveBeenCalledWith(1);
135
250
 
136
- _react2.fireEvent.click(tab3);
251
+ _react2.fireEvent.keyDown(tabList, {
252
+ key: "ArrowRight"
253
+ });
254
+
255
+ _react2.fireEvent.keyDown(tabList, {
256
+ key: "Enter"
257
+ });
258
+
259
+ expect(tabs[0].getAttribute("aria-selected")).toBe("false");
260
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
261
+ expect(tabs[2].getAttribute("aria-selected")).toBe("true");
262
+ expect(onTabClick).toHaveBeenCalledWith(2);
263
+
264
+ _react2.fireEvent.keyDown(tabList, {
265
+ key: "ArrowLeft"
266
+ });
267
+
268
+ _react2.fireEvent.keyDown(tabList, {
269
+ key: "Enter"
270
+ });
271
+
272
+ expect(tabs[0].getAttribute("aria-selected")).toBe("false");
273
+ expect(tabs[1].getAttribute("aria-selected")).toBe("true");
274
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
275
+ expect(onTabClick).toHaveBeenCalledWith(1);
276
+
277
+ _react2.fireEvent.keyDown(tabList, {
278
+ key: "ArrowLeft"
279
+ });
280
+
281
+ _react2.fireEvent.keyDown(tabList, {
282
+ key: "Enter"
283
+ });
284
+
285
+ expect(tabs[0].getAttribute("aria-selected")).toBe("true");
286
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
287
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
288
+ expect(onTabClick).toHaveBeenCalledWith(0);
289
+
290
+ _react2.fireEvent.keyDown(tabList, {
291
+ key: "ArrowLeft"
292
+ });
137
293
 
294
+ _react2.fireEvent.keyDown(tabList, {
295
+ key: "Enter"
296
+ });
297
+
298
+ expect(tabs[0].getAttribute("aria-selected")).toBe("false");
299
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
300
+ expect(tabs[2].getAttribute("aria-selected")).toBe("true");
301
+ expect(onTabClick).toHaveBeenCalledWith(2);
302
+
303
+ _react2.fireEvent.keyDown(tabList, {
304
+ key: "ArrowRight"
305
+ });
306
+
307
+ _react2.fireEvent.keyDown(tabList, {
308
+ key: "Enter"
309
+ });
310
+
311
+ expect(tabs[0].getAttribute("aria-selected")).toBe("true");
312
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
313
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
314
+ expect(onTabClick).toHaveBeenCalledWith(0);
315
+ });
316
+ test("Skip disabled tab with keyboard event arrows", function () {
317
+ var onTabClick = jest.fn();
318
+
319
+ var _render11 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Tabs["default"], {
320
+ tabs: sampleTabsMiddleDisabled,
321
+ onTabClick: onTabClick
322
+ })),
323
+ getByText = _render11.getByText,
324
+ getByRole = _render11.getByRole,
325
+ getAllByRole = _render11.getAllByRole;
326
+
327
+ var tabList = getByRole("tablist");
328
+ var tab1 = getByText("Tab-1");
329
+ var tabs = getAllByRole("tab");
330
+
331
+ _react2.fireEvent.click(tab1);
332
+
333
+ expect(tabs[0].getAttribute("aria-selected")).toBe("true");
334
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
335
+ expect(tabs[2].getAttribute("aria-selected")).toBe("false");
336
+ expect(onTabClick).toHaveBeenCalledWith(0);
337
+
338
+ _react2.fireEvent.keyDown(tabList, {
339
+ key: "ArrowRight"
340
+ });
341
+
342
+ _react2.fireEvent.keyDown(tabList, {
343
+ key: " "
344
+ });
345
+
346
+ expect(tabs[0].getAttribute("aria-selected")).toBe("false");
347
+ expect(tabs[1].getAttribute("aria-selected")).toBe("false");
348
+ expect(tabs[2].getAttribute("aria-selected")).toBe("true");
138
349
  expect(onTabClick).toHaveBeenCalledWith(2);
139
350
  });
140
351
  });
package/tabs/types.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  /// <reference types="react" />
2
- declare type Space = "xxsmall" | "xsmall" | "small" | "medium" | "large" | "xlarge" | "xxlarge";
3
- declare type Margin = {
2
+ export declare type Space = "xxsmall" | "xsmall" | "small" | "medium" | "large" | "xlarge" | "xxlarge";
3
+ export declare type Margin = {
4
4
  top?: Space;
5
5
  bottom?: Space;
6
6
  left?: Space;
7
7
  right?: Space;
8
8
  };
9
- declare type SVG = React.SVGProps<SVGSVGElement>;
9
+ declare type SVG = React.ReactNode & React.SVGProps<SVGSVGElement>;
10
10
  declare type TabCommonProps = {
11
11
  /**
12
12
  * Whether the tab is disabled or not.
@@ -21,7 +21,7 @@ declare type TabCommonProps = {
21
21
  */
22
22
  notificationNumber?: boolean | number;
23
23
  };
24
- declare type TabLabelProps = TabCommonProps & {
24
+ export declare type TabLabelProps = TabCommonProps & {
25
25
  /**
26
26
  * Tab label.
27
27
  */
@@ -31,7 +31,7 @@ declare type TabLabelProps = TabCommonProps & {
31
31
  */
32
32
  icon?: string | SVG;
33
33
  };
34
- declare type TabIconProps = TabCommonProps & {
34
+ export declare type TabIconProps = TabCommonProps & {
35
35
  /**
36
36
  * Tab label.
37
37
  */
@@ -41,6 +41,16 @@ declare type TabIconProps = TabCommonProps & {
41
41
  */
42
42
  icon: string | SVG;
43
43
  };
44
+ export declare type TabProps = {
45
+ tab: TabLabelProps | TabIconProps;
46
+ active: boolean;
47
+ tabIndex: number;
48
+ hasLabelAndIcon: boolean;
49
+ iconPosition: "top" | "left";
50
+ onClick: () => void;
51
+ onMouseEnter: () => void;
52
+ onMouseLeave: () => void;
53
+ };
44
54
  declare type Props = {
45
55
  /**
46
56
  * An array of objects representing the tabs.
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
- import { NavTabsProps } from "./types";
2
+ import { NavTabsContextProps, NavTabsProps } from "./types";
3
+ export declare const NavTabsContext: React.Context<NavTabsContextProps>;
3
4
  declare const DxcNavTabs: {
4
5
  ({ iconPosition, tabIndex, children }: NavTabsProps): JSX.Element;
5
6
  Tab: React.ForwardRefExoticComponent<import("./types").TabProps & React.RefAttributes<HTMLAnchorElement>>;
@@ -7,7 +7,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
- exports["default"] = void 0;
10
+ exports["default"] = exports.NavTabsContext = void 0;
11
11
 
12
12
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
13
 
@@ -27,10 +27,25 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
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
+ var NavTabsContext = /*#__PURE__*/(0, _react.createContext)(null);
31
+ exports.NavTabsContext = NavTabsContext;
32
+
33
+ var getPropInChild = function getPropInChild(child, propName) {
34
+ return child.props ? child.props[propName] ? child.props[propName] : child.props.children ? getPropInChild(child.props.children, propName) : undefined : undefined;
35
+ };
36
+
37
+ var getLabelFromTab = function getLabelFromTab(child) {
38
+ if (typeof child === "string") {
39
+ return child.toString();
40
+ } else if (child.props.children) {
41
+ return Array.isArray(child.props.children) ? getLabelFromTab(child.props.children[0]) : getLabelFromTab(child.props.children);
42
+ }
43
+ };
44
+
30
45
  var getPreviousTabIndex = function getPreviousTabIndex(array, initialIndex) {
31
46
  var index = initialIndex === 0 ? array.length - 1 : initialIndex - 1;
32
47
 
33
- while (array[index].props.disabled) {
48
+ while (getPropInChild(array[index], "disabled")) {
34
49
  index = index === 0 ? array.length - 1 : index - 1;
35
50
  }
36
51
 
@@ -40,7 +55,7 @@ var getPreviousTabIndex = function getPreviousTabIndex(array, initialIndex) {
40
55
  var getNextTabIndex = function getNextTabIndex(array, initialIndex) {
41
56
  var index = initialIndex === array.length - 1 ? 0 : initialIndex + 1;
42
57
 
43
- while (array[index].props.disabled) {
58
+ while (getPropInChild(array[index], "disabled")) {
44
59
  index = index === array.length - 1 ? 0 : index + 1;
45
60
  }
46
61
 
@@ -60,22 +75,33 @@ var DxcNavTabs = function DxcNavTabs(_ref) {
60
75
  innerFocus = _useState2[0],
61
76
  setInnerFocus = _useState2[1];
62
77
 
78
+ var contextValue = (0, _react.useMemo)(function () {
79
+ return {
80
+ iconPosition: iconPosition,
81
+ tabIndex: tabIndex,
82
+ hasIcons: _react["default"].Children.toArray(children).some(function (child) {
83
+ return getPropInChild(child, "icon");
84
+ }),
85
+ focusedLabel: innerFocus === null ? undefined : getLabelFromTab(children[innerFocus])
86
+ };
87
+ }, [iconPosition, tabIndex, innerFocus]);
88
+
63
89
  var handleOnKeyDown = function handleOnKeyDown(event) {
64
90
  var activeTab = _react["default"].Children.toArray(children).findIndex(function (child) {
65
- return child.props.active;
91
+ return getPropInChild(child, "active");
66
92
  });
67
93
 
68
- switch (event.keyCode) {
69
- case 37:
70
- // arrow left
94
+ switch (event.key) {
95
+ case "Left":
96
+ case "ArrowLeft":
71
97
  event.preventDefault();
72
- setInnerFocus(getPreviousTabIndex(_react["default"].Children.toArray(children), innerFocus === null ? activeTab : innerFocus));
98
+ setInnerFocus(getPreviousTabIndex(children, innerFocus === null ? activeTab : innerFocus));
73
99
  break;
74
100
 
75
- case 39:
76
- // arrow right
101
+ case "Right":
102
+ case "ArrowRight":
77
103
  event.preventDefault();
78
- setInnerFocus(getNextTabIndex(_react["default"].Children.toArray(children), innerFocus === null ? activeTab : innerFocus));
104
+ setInnerFocus(getNextTabIndex(children, innerFocus === null ? activeTab : innerFocus));
79
105
  break;
80
106
  }
81
107
  };
@@ -86,16 +112,9 @@ var DxcNavTabs = function DxcNavTabs(_ref) {
86
112
  onKeyDown: handleOnKeyDown,
87
113
  role: "tablist",
88
114
  "aria-label": "Navigation tabs"
89
- }, _react["default"].Children.toArray(children).map(function (child, index) {
90
- return /*#__PURE__*/_react["default"].cloneElement(child, {
91
- iconPosition: iconPosition,
92
- tabIndex: tabIndex,
93
- hasIcons: _react["default"].Children.toArray(children).some(function (child) {
94
- return child.props.icon;
95
- }),
96
- focused: index === innerFocus
97
- });
98
- })));
115
+ }, /*#__PURE__*/_react["default"].createElement(NavTabsContext.Provider, {
116
+ value: contextValue
117
+ }, children)));
99
118
  };
100
119
 
101
120
  DxcNavTabs.Tab = _Tab["default"];
package/tabs-nav/Tab.js CHANGED
@@ -11,14 +11,22 @@ exports["default"] = void 0;
11
11
 
12
12
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
13
 
14
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
15
+
16
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
17
+
14
18
  var _react = _interopRequireWildcard(require("react"));
15
19
 
16
20
  var _styledComponents = _interopRequireDefault(require("styled-components"));
17
21
 
18
22
  var _Badge = _interopRequireDefault(require("../badge/Badge"));
19
23
 
24
+ var _NavTabs = require("./NavTabs");
25
+
20
26
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
21
27
 
28
+ var _excluded = ["href", "active", "icon", "disabled", "notificationNumber", "children"];
29
+
22
30
  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); }
23
31
 
24
32
  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; }
@@ -33,27 +41,27 @@ var DxcTab = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, _ref2) {
33
41
  _ref$notificationNumb = _ref.notificationNumber,
34
42
  notificationNumber = _ref$notificationNumb === void 0 ? false : _ref$notificationNumb,
35
43
  children = _ref.children,
36
- iconPosition = _ref.iconPosition,
37
- tabIndex = _ref.tabIndex,
38
- _ref$hasIcons = _ref.hasIcons,
39
- hasIcons = _ref$hasIcons === void 0 ? false : _ref$hasIcons,
40
- _ref$focused = _ref.focused,
41
- focused = _ref$focused === void 0 ? false : _ref$focused;
44
+ otherProps = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
42
45
  var tabRef = /*#__PURE__*/(0, _react.createRef)();
46
+
47
+ var _useContext = (0, _react.useContext)(_NavTabs.NavTabsContext),
48
+ iconPosition = _useContext.iconPosition,
49
+ tabIndex = _useContext.tabIndex,
50
+ hasIcons = _useContext.hasIcons,
51
+ focusedLabel = _useContext.focusedLabel;
52
+
43
53
  (0, _react.useLayoutEffect)(function () {
44
54
  var _tabRef$current;
45
55
 
46
- focused && (tabRef === null || tabRef === void 0 ? void 0 : (_tabRef$current = tabRef.current) === null || _tabRef$current === void 0 ? void 0 : _tabRef$current.focus());
47
- }, [focused]);
56
+ focusedLabel === children.toString() && (tabRef === null || tabRef === void 0 ? void 0 : (_tabRef$current = tabRef.current) === null || _tabRef$current === void 0 ? void 0 : _tabRef$current.focus());
57
+ }, [focusedLabel]);
48
58
 
49
59
  var handleOnKeyDown = function handleOnKeyDown(event) {
50
60
  var _tabRef$current2;
51
61
 
52
- switch (event.keyCode) {
53
- case 13: // enter
54
-
55
- case 32:
56
- // space
62
+ switch (event.key) {
63
+ case " ":
64
+ case "Enter":
57
65
  tabRef === null || tabRef === void 0 ? void 0 : (_tabRef$current2 = tabRef.current) === null || _tabRef$current2 === void 0 ? void 0 : _tabRef$current2.click();
58
66
  event.preventDefault();
59
67
  break;
@@ -64,18 +72,23 @@ var DxcTab = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, _ref2) {
64
72
  active: active,
65
73
  role: "tab",
66
74
  "aria-selected": active
67
- }, /*#__PURE__*/_react["default"].createElement(Tab, {
75
+ }, /*#__PURE__*/_react["default"].createElement(Tab, (0, _extends2["default"])({
68
76
  href: !disabled && href ? href : undefined,
69
77
  disabled: disabled,
70
78
  iconPosition: iconPosition,
71
79
  hasIcon: hasIcons,
72
80
  ref: function ref(anchorRef) {
73
81
  tabRef.current = anchorRef;
74
- return _ref2;
82
+
83
+ if (_ref2) {
84
+ if (typeof _ref2 === "function") _ref2(anchorRef);else {
85
+ _ref2.current = anchorRef;
86
+ }
87
+ }
75
88
  },
76
89
  onKeyDown: handleOnKeyDown,
77
90
  tabIndex: active ? tabIndex : -1
78
- }, icon && /*#__PURE__*/_react["default"].createElement(TabIconContainer, {
91
+ }, otherProps), icon && /*#__PURE__*/_react["default"].createElement(TabIconContainer, {
79
92
  iconPosition: iconPosition
80
93
  }, typeof icon === "string" ? /*#__PURE__*/_react["default"].createElement(TabIcon, {
81
94
  src: icon
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- declare type SVG = React.SVGProps<SVGSVGElement>;
2
+ declare type SVG = React.ReactNode & React.SVGProps<SVGSVGElement>;
3
3
  export declare type TabProps = {
4
4
  /**
5
5
  * Whether the tab is active or not.
@@ -29,10 +29,6 @@ export declare type TabProps = {
29
29
  * Content of the tab.
30
30
  */
31
31
  children: string;
32
- iconPosition?: "top" | "left";
33
- tabIndex?: number;
34
- hasIcons?: boolean;
35
- focused?: boolean;
36
32
  };
37
33
  export declare type NavTabsProps = {
38
34
  /**
@@ -48,4 +44,10 @@ export declare type NavTabsProps = {
48
44
  */
49
45
  children: React.ReactNode;
50
46
  };
47
+ export declare type NavTabsContextProps = {
48
+ iconPosition: "top" | "left";
49
+ tabIndex: number;
50
+ hasIcons: boolean;
51
+ focusedLabel: string;
52
+ };
51
53
  export {};
package/tag/Tag.js CHANGED
@@ -99,7 +99,7 @@ var sizes = {
99
99
  medium: "240px",
100
100
  large: "480px",
101
101
  fillParent: "100%",
102
- fitContent: "unset"
102
+ fitContent: "fit-content"
103
103
  };
104
104
 
105
105
  var calculateWidth = function calculateWidth(margin, size) {
package/tag/types.d.ts CHANGED
@@ -6,7 +6,7 @@ declare type Margin = {
6
6
  left?: Space;
7
7
  right?: Space;
8
8
  };
9
- declare type SVG = React.SVGProps<SVGSVGElement>;
9
+ declare type SVG = React.ReactNode & React.SVGProps<SVGSVGElement>;
10
10
  declare type TagCommonProps = {
11
11
  /**
12
12
  * If defined, the tag will be displayed as an anchor, using this prop as "href".
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ declare const icons: {
3
+ error: JSX.Element;
4
+ clear: JSX.Element;
5
+ increment: JSX.Element;
6
+ decrement: JSX.Element;
7
+ };
8
+ export default icons;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var icons = {
13
+ error: /*#__PURE__*/_react["default"].createElement("svg", {
14
+ xmlns: "http://www.w3.org/2000/svg",
15
+ height: "24px",
16
+ viewBox: "0 0 24 24",
17
+ width: "24px",
18
+ fill: "currentColor"
19
+ }, /*#__PURE__*/_react["default"].createElement("path", {
20
+ d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"
21
+ })),
22
+ clear: /*#__PURE__*/_react["default"].createElement("svg", {
23
+ xmlns: "http://www.w3.org/2000/svg",
24
+ width: "24",
25
+ height: "24",
26
+ viewBox: "0 0 24 24",
27
+ fill: "currentColor"
28
+ }, /*#__PURE__*/_react["default"].createElement("path", {
29
+ d: "M0 0h24v24H0V0z",
30
+ fill: "none"
31
+ }), /*#__PURE__*/_react["default"].createElement("path", {
32
+ d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"
33
+ })),
34
+ increment: /*#__PURE__*/_react["default"].createElement("svg", {
35
+ xmlns: "http://www.w3.org/2000/svg",
36
+ height: "24px",
37
+ viewBox: "0 0 24 24",
38
+ width: "24px",
39
+ fill: "currentColor"
40
+ }, /*#__PURE__*/_react["default"].createElement("path", {
41
+ d: "M0 0h24v24H0z",
42
+ fill: "none"
43
+ }), /*#__PURE__*/_react["default"].createElement("path", {
44
+ d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"
45
+ })),
46
+ decrement: /*#__PURE__*/_react["default"].createElement("svg", {
47
+ xmlns: "http://www.w3.org/2000/svg",
48
+ height: "24px",
49
+ viewBox: "0 0 24 24",
50
+ width: "24px",
51
+ fill: "currentColor"
52
+ }, /*#__PURE__*/_react["default"].createElement("path", {
53
+ d: "M0 0h24v24H0z",
54
+ fill: "none"
55
+ }), /*#__PURE__*/_react["default"].createElement("path", {
56
+ d: "M19 13H5v-2h14v2z"
57
+ }))
58
+ };
59
+ var _default = icons;
60
+ exports["default"] = _default;