@dxc-technology/halstack-react 0.0.0-bfeb2b0 → 0.0.0-c058988

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 (87) hide show
  1. package/HalstackContext.d.ts +12 -0
  2. package/HalstackContext.js +295 -0
  3. package/accordion/Accordion.js +5 -27
  4. package/accordion/Accordion.stories.tsx +3 -3
  5. package/alert/Alert.js +4 -1
  6. package/badge/Badge.d.ts +1 -1
  7. package/badge/Badge.js +5 -3
  8. package/badge/types.d.ts +1 -0
  9. package/box/Box.js +22 -32
  10. package/button/Button.js +14 -11
  11. package/card/Card.js +27 -28
  12. package/checkbox/Checkbox.d.ts +1 -1
  13. package/checkbox/Checkbox.js +38 -28
  14. package/checkbox/Checkbox.stories.tsx +124 -128
  15. package/checkbox/types.d.ts +3 -3
  16. package/common/variables.js +178 -84
  17. package/date-input/DateInput.js +16 -13
  18. package/dialog/Dialog.js +4 -32
  19. package/dropdown/Dropdown.js +13 -17
  20. package/file-input/FileInput.js +9 -6
  21. package/file-input/FileItem.js +7 -5
  22. package/footer/Footer.js +15 -88
  23. package/header/Header.js +27 -48
  24. package/header/Header.stories.tsx +46 -36
  25. package/header/Header.test.js +18 -2
  26. package/layout/ApplicationLayout.js +5 -18
  27. package/link/Link.d.ts +3 -2
  28. package/link/Link.js +57 -74
  29. package/link/Link.stories.tsx +87 -52
  30. package/link/Link.test.js +7 -15
  31. package/link/types.d.ts +7 -23
  32. package/main.d.ts +3 -3
  33. package/main.js +19 -13
  34. package/number-input/NumberInput.test.js +2 -4
  35. package/number-input/types.d.ts +13 -10
  36. package/package.json +5 -5
  37. package/paginator/Paginator.js +17 -38
  38. package/password-input/PasswordInput.js +7 -4
  39. package/password-input/PasswordInput.test.js +3 -6
  40. package/password-input/types.d.ts +14 -11
  41. package/progress-bar/ProgressBar.js +1 -1
  42. package/progress-bar/ProgressBar.stories.jsx +11 -11
  43. package/quick-nav/QuickNav.js +65 -19
  44. package/quick-nav/QuickNav.stories.tsx +2 -2
  45. package/quick-nav/types.d.ts +4 -4
  46. package/radio-group/Radio.js +1 -1
  47. package/radio-group/RadioGroup.js +8 -6
  48. package/select/Listbox.d.ts +4 -0
  49. package/select/Listbox.js +152 -0
  50. package/select/Option.js +1 -1
  51. package/select/Select.js +63 -150
  52. package/select/Select.stories.tsx +14 -2
  53. package/select/Select.test.js +257 -194
  54. package/select/types.d.ts +21 -2
  55. package/spinner/Spinner.js +1 -1
  56. package/switch/Switch.d.ts +1 -1
  57. package/switch/Switch.js +19 -16
  58. package/switch/Switch.stories.tsx +8 -8
  59. package/switch/types.d.ts +2 -2
  60. package/tabs/Tabs.stories.tsx +0 -6
  61. package/tabs-nav/NavTabs.d.ts +8 -0
  62. package/tabs-nav/NavTabs.js +125 -0
  63. package/tabs-nav/NavTabs.stories.tsx +170 -0
  64. package/tabs-nav/NavTabs.test.js +82 -0
  65. package/tabs-nav/Tab.d.ts +4 -0
  66. package/tabs-nav/Tab.js +132 -0
  67. package/tabs-nav/types.d.ts +53 -0
  68. package/{radio → tabs-nav}/types.js +0 -0
  69. package/tag/Tag.js +5 -8
  70. package/text-input/Suggestion.d.ts +4 -0
  71. package/text-input/Suggestion.js +55 -0
  72. package/text-input/TextInput.js +48 -76
  73. package/text-input/TextInput.test.js +22 -35
  74. package/text-input/types.d.ts +27 -12
  75. package/textarea/Textarea.js +10 -19
  76. package/textarea/types.d.ts +10 -7
  77. package/useTheme.js +2 -2
  78. package/useTranslatedLabels.d.ts +2 -0
  79. package/useTranslatedLabels.js +20 -0
  80. package/wizard/Wizard.js +35 -29
  81. package/ThemeContext.d.ts +0 -10
  82. package/ThemeContext.js +0 -243
  83. package/radio/Radio.d.ts +0 -4
  84. package/radio/Radio.js +0 -174
  85. package/radio/Radio.stories.tsx +0 -192
  86. package/radio/Radio.test.js +0 -71
  87. package/radio/types.d.ts +0 -54
package/select/types.d.ts CHANGED
@@ -183,12 +183,31 @@ export declare type OptionProps = {
183
183
  onClick: (option: Option) => void;
184
184
  multiple: boolean;
185
185
  visualFocused: boolean;
186
- isGroupedOption: boolean;
186
+ isGroupedOption?: boolean;
187
187
  isLastOption: boolean;
188
188
  isSelected: boolean;
189
189
  };
190
190
  /**
191
- * Reference to the component.
191
+ * Listbox from the select component.
192
+ */
193
+ export declare type ListboxProps = {
194
+ id: string;
195
+ currentValue: string | string[];
196
+ options: Option[] | OptionGroup[];
197
+ visualFocusIndex: number;
198
+ lastOptionIndex: number;
199
+ multiple: boolean;
200
+ optional: boolean;
201
+ optionalItem: Option;
202
+ searchable: boolean;
203
+ handleOptionOnClick: (option: Option) => void;
204
+ };
205
+ /**
206
+ * Reference to the listbox component.
207
+ */
208
+ export declare type ListboxRefType = HTMLUListElement;
209
+ /**
210
+ * Reference to the select component.
192
211
  */
193
212
  export declare type RefType = HTMLDivElement;
194
213
  export default Props;
@@ -199,7 +199,7 @@ var SVGSpinner = _styledComponents["default"].svg(_templateObject8 || (_template
199
199
  var CircleSpinner = _styledComponents["default"].circle(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n fill: transparent;\n stroke-linecap: initial;\n vector-effect: non-scaling-stroke;\n animation: ", ";\n stroke: ", ";\n transform-origin: ", ";\n stroke-dasharray: ", ";\n stroke-width: ", ";\n stroke-dashoffset: ", ";\n"])), function (props) {
200
200
  return props.isDeterminated ? "none" : props.mode !== "small" ? "1.4s ease-in-out infinite both svg-circle-large" : "1.4s ease-in-out infinite both svg-circle-small";
201
201
  }, function (props) {
202
- return props.backgroundType === "dark" ? props.theme.trackCircleColorOnDark : props.theme.trackCircleColor;
202
+ return props.backgroundType === "dark" || props.mode === "overlay" ? props.theme.trackCircleColorOverlay : props.theme.trackCircleColor;
203
203
  }, function (props) {
204
204
  return !props.isDeterminated ? "50% 50%" : "";
205
205
  }, function (props) {
@@ -1,4 +1,4 @@
1
1
  /// <reference types="react" />
2
2
  import SwitchPropsType from "./types";
3
- declare const DxcSwitch: ({ defaultChecked, checked, value, label, labelPosition, name, disabled, onChange, required, margin, size, tabIndex, }: SwitchPropsType) => JSX.Element;
3
+ declare const DxcSwitch: ({ defaultChecked, checked, value, label, labelPosition, name, disabled, optional, onChange, margin, size, tabIndex, }: SwitchPropsType) => JSX.Element;
4
4
  export default DxcSwitch;
package/switch/Switch.js CHANGED
@@ -21,8 +21,6 @@ var _styledComponents = _interopRequireWildcard(require("styled-components"));
21
21
 
22
22
  var _core = require("@material-ui/core");
23
23
 
24
- var _RequiredComponent = _interopRequireDefault(require("../common/RequiredComponent"));
25
-
26
24
  var _uuid = require("uuid");
27
25
 
28
26
  var _variables = require("../common/variables.js");
@@ -31,6 +29,8 @@ var _utils = require("../common/utils.js");
31
29
 
32
30
  var _useTheme = _interopRequireDefault(require("../useTheme"));
33
31
 
32
+ var _useTranslatedLabels = _interopRequireDefault(require("../useTranslatedLabels"));
33
+
34
34
  var _BackgroundColorContext = _interopRequireDefault(require("../BackgroundColorContext"));
35
35
 
36
36
  var _templateObject, _templateObject2;
@@ -51,9 +51,9 @@ var DxcSwitch = function DxcSwitch(_ref) {
51
51
  name = _ref$name === void 0 ? "" : _ref$name,
52
52
  _ref$disabled = _ref.disabled,
53
53
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
54
+ _ref$optional = _ref.optional,
55
+ optional = _ref$optional === void 0 ? false : _ref$optional,
54
56
  onChange = _ref.onChange,
55
- _ref$required = _ref.required,
56
- required = _ref$required === void 0 ? false : _ref$required,
57
57
  margin = _ref.margin,
58
58
  _ref$size = _ref.size,
59
59
  size = _ref$size === void 0 ? "fitContent" : _ref$size,
@@ -72,6 +72,7 @@ var DxcSwitch = function DxcSwitch(_ref) {
72
72
  setInnerChecked = _useState4[1];
73
73
 
74
74
  var colorsTheme = (0, _useTheme["default"])();
75
+ var translatedLabels = (0, _useTranslatedLabels["default"])();
75
76
  var backgroundType = (0, _react.useContext)(_BackgroundColorContext["default"]);
76
77
 
77
78
  var handlerSwitchChange = function handlerSwitchChange(event) {
@@ -84,6 +85,14 @@ var DxcSwitch = function DxcSwitch(_ref) {
84
85
  } else onChange === null || onChange === void 0 ? void 0 : onChange(!checked);
85
86
  };
86
87
 
88
+ var labelComponent = /*#__PURE__*/_react["default"].createElement(LabelContainer, {
89
+ id: labelId,
90
+ labelPosition: labelPosition,
91
+ onClick: !disabled && handlerSwitchChange,
92
+ disabled: disabled,
93
+ backgroundType: backgroundType
94
+ }, labelPosition === "before" ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, label, " ", optional && /*#__PURE__*/_react["default"].createElement("span", null, translatedLabels.formFields.optionalLabel)) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, optional && /*#__PURE__*/_react["default"].createElement("span", null, translatedLabels.formFields.optionalLabel), " ", label));
95
+
87
96
  return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
88
97
  theme: colorsTheme["switch"]
89
98
  }, /*#__PURE__*/_react["default"].createElement(SwitchContainer, {
@@ -92,7 +101,7 @@ var DxcSwitch = function DxcSwitch(_ref) {
92
101
  labelPosition: labelPosition,
93
102
  size: size,
94
103
  backgroundType: backgroundType
95
- }, /*#__PURE__*/_react["default"].createElement(_core.Switch, {
104
+ }, labelPosition === "before" && labelComponent, /*#__PURE__*/_react["default"].createElement(_core.Switch, {
96
105
  checked: checked !== null && checked !== void 0 ? checked : innerChecked,
97
106
  inputProps: {
98
107
  name: name,
@@ -105,13 +114,7 @@ var DxcSwitch = function DxcSwitch(_ref) {
105
114
  value: value,
106
115
  disabled: disabled,
107
116
  disableRipple: true
108
- }), /*#__PURE__*/_react["default"].createElement(LabelContainer, {
109
- id: labelId,
110
- labelPosition: labelPosition,
111
- onClick: !disabled && handlerSwitchChange,
112
- disabled: disabled,
113
- backgroundType: backgroundType
114
- }, required && /*#__PURE__*/_react["default"].createElement(_RequiredComponent["default"], null), label)));
117
+ }), labelPosition === "after" && labelComponent));
115
118
  };
116
119
 
117
120
  var sizes = {
@@ -126,10 +129,8 @@ var calculateWidth = function calculateWidth(margin, size) {
126
129
  return size === "fillParent" ? "calc(".concat(sizes[size], " - ").concat((0, _utils.getMargin)(margin, "left"), " - ").concat((0, _utils.getMargin)(margin, "right"), ")") : sizes[size];
127
130
  };
128
131
 
129
- var SwitchContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: ", ";\n display: inline-flex;\n align-items: center;\n flex-direction: ", ";\n\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n cursor: ", ";\n\n .MuiSwitch-root {\n align-items: center;\n width: ", ";\n height: 45px;\n margin: 3px;\n\n .Mui-focusVisible {\n outline: ", ";\n outline-offset: -3px;\n }\n\n .MuiSwitch-track {\n /*Enabled and unchecked bar*/\n background-color: ", ";\n height: ", ";\n }\n\n .MuiSwitch-switchBase + .MuiSwitch-track {\n opacity: 1;\n }\n\n .MuiIconButton-root {\n /*Enabled and unchecked*/\n top: unset;\n .MuiSwitch-thumb {\n /*Only for thumb in all states*/\n width: ", ";\n height: ", ";\n }\n color: ", ";\n &:hover {\n background-color: transparent;\n }\n &.Mui-disabled {\n /*Disabled and unchecked*/\n color: ", ";\n + .MuiSwitch-track {\n /*Disabled and unchecked bar*/\n background-color: ", ";\n }\n }\n &.Mui-disabled.Mui-checked {\n /*Disabled and checked*/\n color: ", ";\n + .MuiSwitch-track {\n /*Disabled and checked bar*/\n background-color: ", ";\n }\n }\n &.Mui-checked {\n /*Enabled and checked*/\n color: ", ";\n transform: translateX(", ");\n &:hover {\n background-color: transparent;\n }\n + .MuiSwitch-track {\n /*Enabled and checked bar*/\n background-color: ", ";\n }\n }\n }\n }\n"])), function (props) {
132
+ var SwitchContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: ", ";\n display: inline-flex;\n align-items: center;\n\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n cursor: ", ";\n\n .MuiSwitch-root {\n align-items: center;\n width: ", ";\n height: 45px;\n margin: 3px;\n\n .Mui-focusVisible {\n outline: ", ";\n outline-offset: -3px;\n }\n\n .MuiSwitch-track {\n /*Enabled and unchecked bar*/\n background-color: ", ";\n height: ", ";\n }\n\n .MuiSwitch-switchBase + .MuiSwitch-track {\n opacity: 1;\n }\n\n .MuiIconButton-root {\n /*Enabled and unchecked*/\n top: unset;\n .MuiSwitch-thumb {\n /*Only for thumb in all states*/\n width: ", ";\n height: ", ";\n }\n color: ", ";\n &:hover {\n background-color: transparent;\n }\n &.Mui-disabled {\n /*Disabled and unchecked*/\n color: ", ";\n + .MuiSwitch-track {\n /*Disabled and unchecked bar*/\n background-color: ", ";\n }\n }\n &.Mui-disabled.Mui-checked {\n /*Disabled and checked*/\n color: ", ";\n + .MuiSwitch-track {\n /*Disabled and checked bar*/\n background-color: ", ";\n }\n }\n &.Mui-checked {\n /*Enabled and checked*/\n color: ", ";\n transform: translateX(", ");\n &:hover {\n background-color: transparent;\n }\n + .MuiSwitch-track {\n /*Enabled and checked bar*/\n background-color: ", ";\n }\n }\n }\n }\n"])), function (props) {
130
133
  return calculateWidth(props.margin, props.size);
131
- }, function (props) {
132
- return props.labelPosition === "after" ? "row" : "row-reverse";
133
134
  }, function (props) {
134
135
  return props.margin && (0, _typeof2["default"])(props.margin) !== "object" ? _variables.spaces[props.margin] : "0px";
135
136
  }, function (props) {
@@ -172,7 +173,7 @@ var SwitchContainer = _styledComponents["default"].div(_templateObject || (_temp
172
173
  return props.backgroundType === "dark" ? props.theme.checkedTrackBackgroundColorOnDark : props.theme.checkedTrackBackgroundColor;
173
174
  });
174
175
 
175
- var LabelContainer = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: ", ";\n opacity: 1;\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n cursor: ", ";\n ", "\n"])), function (props) {
176
+ var LabelContainer = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: ", ";\n opacity: 1;\n font-family: ", ";\n font-size: ", ";\n font-style: ", ";\n font-weight: ", ";\n cursor: ", ";\n ", "\n\n ", "\n"])), function (props) {
176
177
  return props.disabled ? props.backgroundType === "dark" ? props.theme.disabledLabelFontColorOnDark : props.theme.disabledLabelFontColor : props.backgroundType === "dark" ? props.theme.labelFontColorOnDark : props.theme.labelFontColor;
177
178
  }, function (props) {
178
179
  return props.theme.labelFontFamily;
@@ -186,6 +187,8 @@ var LabelContainer = _styledComponents["default"].span(_templateObject2 || (_tem
186
187
  return props.disabled === true ? "not-allowed" : "pointer";
187
188
  }, function (props) {
188
189
  return props.labelPosition === "after" ? "margin-left: ".concat(props.theme.spaceBetweenLabelSwitch, ";") : "margin-right: ".concat(props.theme.spaceBetweenLabelSwitch, ";");
190
+ }, function (props) {
191
+ return props.labelPosition === "before" && "order: -1";
189
192
  });
190
193
 
191
194
  var _default = DxcSwitch;
@@ -26,16 +26,16 @@ export const Chromatic = () => (
26
26
  <DxcSwitch label="Switch" defaultChecked />
27
27
  </ExampleContainer>
28
28
  <ExampleContainer>
29
- <Title title="Required" theme="light" level={4} />
30
- <DxcSwitch label="Switch" required />
29
+ <Title title="Optional" theme="light" level={4} />
30
+ <DxcSwitch label="Switch" optional />
31
31
  </ExampleContainer>
32
32
  <ExampleContainer>
33
33
  <Title title="Disabled" theme="light" level={4} />
34
34
  <DxcSwitch label="Switch" disabled />
35
35
  </ExampleContainer>
36
36
  <ExampleContainer>
37
- <Title title="Disabled required" theme="light" level={4} />
38
- <DxcSwitch label="Switch" disabled required labelPosition="after" />
37
+ <Title title="Disabled optional" theme="light" level={4} />
38
+ <DxcSwitch label="Switch" disabled optional labelPosition="after" />
39
39
  </ExampleContainer>
40
40
  <ExampleContainer>
41
41
  <Title title="Disabled checked" theme="light" level={4} />
@@ -52,16 +52,16 @@ export const Chromatic = () => (
52
52
  <DxcSwitch label="Switch" defaultChecked />
53
53
  </ExampleContainer>
54
54
  <ExampleContainer>
55
- <Title title="Required" theme="dark" level={4} />
56
- <DxcSwitch label="Switch" required />
55
+ <Title title="Optional" theme="dark" level={4} />
56
+ <DxcSwitch label="Switch" optional />
57
57
  </ExampleContainer>
58
58
  <ExampleContainer>
59
59
  <Title title="Disabled" theme="dark" level={4} />
60
60
  <DxcSwitch label="Switch" disabled />
61
61
  </ExampleContainer>
62
62
  <ExampleContainer>
63
- <Title title="Disabled required" theme="dark" level={4} />
64
- <DxcSwitch label="Switch" disabled required labelPosition="after" />
63
+ <Title title="Disabled optional" theme="dark" level={4} />
64
+ <DxcSwitch label="Switch" disabled optional labelPosition="after" />
65
65
  </ExampleContainer>
66
66
  <ExampleContainer>
67
67
  <Title title="Disabled checked" theme="dark" level={4} />
package/switch/types.d.ts CHANGED
@@ -42,9 +42,9 @@ declare type Props = {
42
42
  */
43
43
  onChange?: (checked: boolean) => void;
44
44
  /**
45
- * If true, the switch will change its appearence, showing that the value is required.
45
+ * If true, the component will display '(Optional)' next to the label.
46
46
  */
47
- required?: boolean;
47
+ optional?: boolean;
48
48
  /**
49
49
  * Size of the margin to be applied to the component ('xxsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge').
50
50
  * You can pass an object with 'top', 'bottom', 'left' and 'right' properties in order to specify different margin sizes.
@@ -78,12 +78,6 @@ export const Chromatic = () => (
78
78
  <Title title="With icon on the left and notification number" theme="light" level={4} />
79
79
  <DxcTabs tabs={tabsNotificationIcon} iconPosition="left" />
80
80
  </ExampleContainer>
81
- <ExampleContainer>
82
- <Title title="Scrollable" theme="light" level={4} />
83
- <div style={{ width: "400px" }}>
84
- <DxcTabs tabs={tabsNotificationIcon} iconPosition="left" defaultActiveTabIndex={1} />
85
- </div>
86
- </ExampleContainer>
87
81
  <Title title="Margins" theme="light" level={2} />
88
82
  <ExampleContainer>
89
83
  <Title title="Xxsmall margin" theme="light" level={4} />
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { NavTabsContextProps, NavTabsProps } from "./types";
3
+ export declare const NavTabsContext: React.Context<NavTabsContextProps>;
4
+ declare const DxcNavTabs: {
5
+ ({ iconPosition, tabIndex, children }: NavTabsProps): JSX.Element;
6
+ Tab: React.ForwardRefExoticComponent<import("./types").TabProps & React.RefAttributes<HTMLAnchorElement>>;
7
+ };
8
+ export default DxcNavTabs;
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = exports.NavTabsContext = void 0;
11
+
12
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
17
+
18
+ var _styledComponents = _interopRequireWildcard(require("styled-components"));
19
+
20
+ var _useTheme = _interopRequireDefault(require("../useTheme"));
21
+
22
+ var _Tab = _interopRequireDefault(require("./Tab"));
23
+
24
+ var _templateObject;
25
+
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
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
+
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
+
45
+ var getPreviousTabIndex = function getPreviousTabIndex(array, initialIndex) {
46
+ var index = initialIndex === 0 ? array.length - 1 : initialIndex - 1;
47
+
48
+ while (getPropInChild(array[index], "disabled")) {
49
+ index = index === 0 ? array.length - 1 : index - 1;
50
+ }
51
+
52
+ return index;
53
+ };
54
+
55
+ var getNextTabIndex = function getNextTabIndex(array, initialIndex) {
56
+ var index = initialIndex === array.length - 1 ? 0 : initialIndex + 1;
57
+
58
+ while (getPropInChild(array[index], "disabled")) {
59
+ index = index === array.length - 1 ? 0 : index + 1;
60
+ }
61
+
62
+ return index;
63
+ };
64
+
65
+ var DxcNavTabs = function DxcNavTabs(_ref) {
66
+ var _ref$iconPosition = _ref.iconPosition,
67
+ iconPosition = _ref$iconPosition === void 0 ? "top" : _ref$iconPosition,
68
+ _ref$tabIndex = _ref.tabIndex,
69
+ tabIndex = _ref$tabIndex === void 0 ? 0 : _ref$tabIndex,
70
+ children = _ref.children;
71
+ var colorsTheme = (0, _useTheme["default"])();
72
+
73
+ var _useState = (0, _react.useState)(null),
74
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
75
+ innerFocus = _useState2[0],
76
+ setInnerFocus = _useState2[1];
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
+
89
+ var handleOnKeyDown = function handleOnKeyDown(event) {
90
+ var activeTab = _react["default"].Children.toArray(children).findIndex(function (child) {
91
+ return getPropInChild(child, "active");
92
+ });
93
+
94
+ switch (event.keyCode) {
95
+ case 37:
96
+ // arrow left
97
+ event.preventDefault();
98
+ setInnerFocus(getPreviousTabIndex(children, innerFocus === null ? activeTab : innerFocus));
99
+ break;
100
+
101
+ case 39:
102
+ // arrow right
103
+ event.preventDefault();
104
+ setInnerFocus(getNextTabIndex(children, innerFocus === null ? activeTab : innerFocus));
105
+ break;
106
+ }
107
+ };
108
+
109
+ return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
110
+ theme: colorsTheme.tabs
111
+ }, /*#__PURE__*/_react["default"].createElement(NavTabsContainer, {
112
+ onKeyDown: handleOnKeyDown,
113
+ role: "tablist",
114
+ "aria-label": "Navigation tabs"
115
+ }, /*#__PURE__*/_react["default"].createElement(NavTabsContext.Provider, {
116
+ value: contextValue
117
+ }, children)));
118
+ };
119
+
120
+ DxcNavTabs.Tab = _Tab["default"];
121
+
122
+ var NavTabsContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n"])));
123
+
124
+ var _default = DxcNavTabs;
125
+ exports["default"] = _default;
@@ -0,0 +1,170 @@
1
+ import React from "react";
2
+ import DxcNavTabs from "./NavTabs";
3
+ import Title from "../../.storybook/components/Title";
4
+ import ExampleContainer from "../../.storybook/components/ExampleContainer";
5
+
6
+ export default {
7
+ title: "NavTabs",
8
+ component: DxcNavTabs,
9
+ };
10
+
11
+ const iconSVG = (
12
+ <svg viewBox="0 0 24 24" fill="currentColor">
13
+ <path d="M0 0h24v24H0z" fill="none" />
14
+ <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" />
15
+ </svg>
16
+ );
17
+
18
+ export const Chromatic = () => (
19
+ <>
20
+ <ExampleContainer>
21
+ <Title title="Only label" theme="light" level={4} />
22
+ <DxcNavTabs>
23
+ <DxcNavTabs.Tab href="#" active>
24
+ Tab 1
25
+ </DxcNavTabs.Tab>
26
+ <DxcNavTabs.Tab href="#" disabled>
27
+ Tab 2
28
+ </DxcNavTabs.Tab>
29
+ <DxcNavTabs.Tab href="#">Tab 3</DxcNavTabs.Tab>
30
+ <DxcNavTabs.Tab href="#">Tab 4</DxcNavTabs.Tab>
31
+ </DxcNavTabs>
32
+ </ExampleContainer>
33
+ <ExampleContainer pseudoState="pseudo-hover">
34
+ <Title title="Hovered tabs" theme="light" level={4} />
35
+ <DxcNavTabs>
36
+ <DxcNavTabs.Tab href="#" active>
37
+ Tab 1
38
+ </DxcNavTabs.Tab>
39
+ <DxcNavTabs.Tab href="#" disabled>
40
+ Tab 2
41
+ </DxcNavTabs.Tab>
42
+ <DxcNavTabs.Tab href="#">Tab 3</DxcNavTabs.Tab>
43
+ <DxcNavTabs.Tab href="#">Tab 4</DxcNavTabs.Tab>
44
+ </DxcNavTabs>
45
+ </ExampleContainer>
46
+ <ExampleContainer pseudoState="pseudo-focus">
47
+ <Title title="Focused tabs" theme="light" level={4} />
48
+ <DxcNavTabs>
49
+ <DxcNavTabs.Tab href="#" active>
50
+ Tab 1
51
+ </DxcNavTabs.Tab>
52
+ <DxcNavTabs.Tab href="#" disabled>
53
+ Tab 2
54
+ </DxcNavTabs.Tab>
55
+ <DxcNavTabs.Tab href="#">Tab 3</DxcNavTabs.Tab>
56
+ <DxcNavTabs.Tab href="#">Tab 4</DxcNavTabs.Tab>
57
+ </DxcNavTabs>
58
+ </ExampleContainer>
59
+ <ExampleContainer pseudoState="pseudo-active">
60
+ <Title title="Actived tabs" theme="light" level={4} />
61
+ <DxcNavTabs>
62
+ <DxcNavTabs.Tab href="#" active>
63
+ Tab 1
64
+ </DxcNavTabs.Tab>
65
+ <DxcNavTabs.Tab href="#" disabled>
66
+ Tab 2
67
+ </DxcNavTabs.Tab>
68
+ <DxcNavTabs.Tab href="#">Tab 3</DxcNavTabs.Tab>
69
+ <DxcNavTabs.Tab href="#">Tab 4</DxcNavTabs.Tab>
70
+ </DxcNavTabs>
71
+ </ExampleContainer>
72
+ <ExampleContainer>
73
+ <Title title="With notification number" theme="light" level={4} />
74
+ <DxcNavTabs>
75
+ <DxcNavTabs.Tab href="#" active notificationNumber>
76
+ Tab 1
77
+ </DxcNavTabs.Tab>
78
+ <DxcNavTabs.Tab href="#" disabled notificationNumber={5}>
79
+ Tab 2
80
+ </DxcNavTabs.Tab>
81
+ <DxcNavTabs.Tab href="#" notificationNumber={120}>
82
+ Tab 3
83
+ </DxcNavTabs.Tab>
84
+ <DxcNavTabs.Tab href="#">Tab 4</DxcNavTabs.Tab>
85
+ </DxcNavTabs>
86
+ </ExampleContainer>
87
+ <ExampleContainer>
88
+ <Title title="With icon position top" theme="light" level={4} />
89
+ <DxcNavTabs>
90
+ <DxcNavTabs.Tab href="#" active icon={iconSVG}>
91
+ Tab 1
92
+ </DxcNavTabs.Tab>
93
+ <DxcNavTabs.Tab href="#" disabled icon={iconSVG}>
94
+ Tab 2
95
+ </DxcNavTabs.Tab>
96
+ <DxcNavTabs.Tab href="#" icon={iconSVG}>
97
+ Tab 3
98
+ </DxcNavTabs.Tab>
99
+ <DxcNavTabs.Tab href="#" icon={iconSVG}>
100
+ Tab 4
101
+ </DxcNavTabs.Tab>
102
+ </DxcNavTabs>
103
+ </ExampleContainer>
104
+ <ExampleContainer>
105
+ <Title title="With icon position left" theme="light" level={4} />
106
+ <DxcNavTabs iconPosition="left">
107
+ <DxcNavTabs.Tab href="#" active icon={iconSVG}>
108
+ Tab 1
109
+ </DxcNavTabs.Tab>
110
+ <DxcNavTabs.Tab href="#" disabled icon={iconSVG}>
111
+ Tab 2
112
+ </DxcNavTabs.Tab>
113
+ <DxcNavTabs.Tab href="#" icon={iconSVG}>
114
+ Tab 3
115
+ </DxcNavTabs.Tab>
116
+ <DxcNavTabs.Tab href="#" icon={iconSVG}>
117
+ Tab 4
118
+ </DxcNavTabs.Tab>
119
+ </DxcNavTabs>
120
+ </ExampleContainer>
121
+ <ExampleContainer>
122
+ <Title title="With icon and notification number" theme="light" level={4} />
123
+ <DxcNavTabs>
124
+ <DxcNavTabs.Tab href="#" active icon={iconSVG} notificationNumber>
125
+ Tab 1
126
+ </DxcNavTabs.Tab>
127
+ <DxcNavTabs.Tab href="#" disabled icon={iconSVG} notificationNumber={5}>
128
+ Tab 2
129
+ </DxcNavTabs.Tab>
130
+ <DxcNavTabs.Tab href="#" icon={iconSVG} notificationNumber={120}>
131
+ Tab 3
132
+ </DxcNavTabs.Tab>
133
+ <DxcNavTabs.Tab href="#" icon={iconSVG}>
134
+ Tab 4
135
+ </DxcNavTabs.Tab>
136
+ </DxcNavTabs>
137
+ </ExampleContainer>
138
+ <ExampleContainer>
139
+ <Title title="With icon on the left and notification number" theme="light" level={4} />
140
+ <DxcNavTabs iconPosition="left">
141
+ <DxcNavTabs.Tab href="#" active icon={iconSVG} notificationNumber>
142
+ Tab 1
143
+ </DxcNavTabs.Tab>
144
+ <DxcNavTabs.Tab href="#" disabled icon={iconSVG} notificationNumber={5}>
145
+ Tab 2
146
+ </DxcNavTabs.Tab>
147
+ <DxcNavTabs.Tab href="#" icon={iconSVG} notificationNumber={120}>
148
+ Tab 3
149
+ </DxcNavTabs.Tab>
150
+ <DxcNavTabs.Tab href="#" icon={iconSVG}>
151
+ Tab 4
152
+ </DxcNavTabs.Tab>
153
+ </DxcNavTabs>
154
+ </ExampleContainer>
155
+ <ExampleContainer>
156
+ <Title title="With long label" theme="light" level={4} />
157
+ <DxcNavTabs>
158
+ <DxcNavTabs.Tab href="#" active>
159
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit
160
+ </DxcNavTabs.Tab>
161
+ <DxcNavTabs.Tab href="#" icon={iconSVG} disabled notificationNumber={3}>
162
+ Tab 2
163
+ </DxcNavTabs.Tab>
164
+ <DxcNavTabs.Tab href="#" icon={iconSVG}>
165
+ Tab 3
166
+ </DxcNavTabs.Tab>
167
+ </DxcNavTabs>
168
+ </ExampleContainer>
169
+ </>
170
+ );
@@ -0,0 +1,82 @@
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 _NavTabs = _interopRequireDefault(require("./NavTabs"));
10
+
11
+ describe("Tabs component tests", function () {
12
+ test("Tabs render with correct labels and attributes", function () {
13
+ var _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_NavTabs["default"], null, /*#__PURE__*/_react["default"].createElement(_NavTabs["default"].Tab, {
14
+ href: "/test1",
15
+ active: true
16
+ }, "Tab 1"), /*#__PURE__*/_react["default"].createElement(_NavTabs["default"].Tab, {
17
+ href: "/test2",
18
+ disabled: true
19
+ }, "Tab 2"), /*#__PURE__*/_react["default"].createElement(_NavTabs["default"].Tab, {
20
+ href: "/test3"
21
+ }, "Tab 3"))),
22
+ getByText = _render.getByText,
23
+ getAllByRole = _render.getAllByRole,
24
+ getByRole = _render.getByRole;
25
+
26
+ expect(getByRole("tablist")).toBeTruthy();
27
+ expect(getByRole("tablist").getAttribute("aria-label")).toBe("Navigation tabs");
28
+ expect(getByText("Tab 1")).toBeTruthy();
29
+ expect(getByText("Tab 2")).toBeTruthy();
30
+ expect(getByText("Tab 3")).toBeTruthy();
31
+ var tabs = getAllByRole("tab");
32
+ tabs.forEach(function (tab, index) {
33
+ expect(tab.getAttribute("aria-selected")).toBe((index === 0).toString());
34
+ });
35
+ var anchors = getAllByRole("link");
36
+ expect(anchors.length).toBe(2);
37
+ expect(anchors[0].getAttribute("href")).toBe("/test1");
38
+ expect(anchors[1].getAttribute("href")).toBe("/test3");
39
+ expect(anchors[0].getAttribute("tabindex")).toBe("0");
40
+ expect(anchors[1].getAttribute("tabindex")).toBe("-1");
41
+ });
42
+ test("Tabs render with correct labels, badges and icons", function () {
43
+ var _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_NavTabs["default"], null, /*#__PURE__*/_react["default"].createElement(_NavTabs["default"].Tab, {
44
+ href: "/test1",
45
+ active: true,
46
+ notificationNumber: 10
47
+ }, "Tab 1"), /*#__PURE__*/_react["default"].createElement(_NavTabs["default"].Tab, {
48
+ href: "/test2",
49
+ disabled: true,
50
+ notificationNumber: 20
51
+ }, "Tab 2"), /*#__PURE__*/_react["default"].createElement(_NavTabs["default"].Tab, {
52
+ href: "/test3",
53
+ notificationNumber: 1000,
54
+ icon: "/testIcon.png"
55
+ }, "Tab 3"))),
56
+ getByText = _render2.getByText,
57
+ getByRole = _render2.getByRole;
58
+
59
+ expect(getByText("10")).toBeTruthy();
60
+ expect(getByText("20")).toBeTruthy();
61
+ expect(getByText("+99")).toBeTruthy();
62
+ expect(getByRole("img")).toBeTruthy();
63
+ });
64
+ test("Tabs render with correct tab index", function () {
65
+ var _render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_NavTabs["default"], {
66
+ tabIndex: 3
67
+ }, /*#__PURE__*/_react["default"].createElement(_NavTabs["default"].Tab, {
68
+ href: "/test1"
69
+ }, "Tab 1"), /*#__PURE__*/_react["default"].createElement(_NavTabs["default"].Tab, {
70
+ href: "/test2",
71
+ disabled: true
72
+ }, "Tab 2"), /*#__PURE__*/_react["default"].createElement(_NavTabs["default"].Tab, {
73
+ href: "/test3",
74
+ active: true
75
+ }, "Tab 3"))),
76
+ getAllByRole = _render3.getAllByRole;
77
+
78
+ var tabs = getAllByRole("link");
79
+ expect(tabs[0].getAttribute("tabindex")).toBe("-1");
80
+ expect(tabs[1].getAttribute("tabindex")).toBe("3");
81
+ });
82
+ });
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { TabProps } from "./types";
3
+ declare const DxcTab: React.ForwardRefExoticComponent<TabProps & React.RefAttributes<HTMLAnchorElement>>;
4
+ export default DxcTab;