@dxc-technology/halstack-react 0.0.0-61a8ced → 0.0.0-62702b8

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 (244) hide show
  1. package/BackgroundColorContext.d.ts +2 -2
  2. package/BackgroundColorContext.js +1 -1
  3. package/HalstackContext.d.ts +1349 -5
  4. package/HalstackContext.js +117 -77
  5. package/README.md +47 -0
  6. package/accordion/Accordion.d.ts +1 -1
  7. package/accordion/Accordion.js +14 -37
  8. package/accordion/Accordion.stories.tsx +104 -113
  9. package/accordion/Accordion.test.js +1 -1
  10. package/accordion/types.d.ts +2 -13
  11. package/accordion-group/AccordionGroup.d.ts +4 -3
  12. package/accordion-group/AccordionGroup.js +23 -44
  13. package/accordion-group/AccordionGroup.stories.tsx +77 -76
  14. package/accordion-group/AccordionGroup.test.js +7 -17
  15. package/accordion-group/AccordionGroupAccordion.d.ts +4 -0
  16. package/accordion-group/AccordionGroupAccordion.js +43 -0
  17. package/accordion-group/types.d.ts +2 -13
  18. package/alert/Alert.js +4 -8
  19. package/alert/Alert.stories.tsx +28 -0
  20. package/alert/Alert.test.js +1 -1
  21. package/bleed/Bleed.stories.tsx +1 -0
  22. package/box/Box.d.ts +1 -1
  23. package/box/Box.js +7 -26
  24. package/box/Box.stories.tsx +38 -51
  25. package/box/Box.test.js +1 -1
  26. package/box/types.d.ts +0 -11
  27. package/bulleted-list/BulletedList.js +4 -2
  28. package/bulleted-list/BulletedList.stories.tsx +7 -1
  29. package/bulleted-list/types.d.ts +31 -4
  30. package/button/Button.d.ts +1 -1
  31. package/button/Button.js +48 -60
  32. package/button/Button.stories.tsx +151 -9
  33. package/button/Button.test.js +12 -1
  34. package/button/types.d.ts +7 -3
  35. package/card/Card.d.ts +1 -1
  36. package/card/Card.js +27 -45
  37. package/card/Card.stories.tsx +12 -42
  38. package/card/Card.test.js +1 -1
  39. package/card/types.d.ts +1 -6
  40. package/checkbox/Checkbox.d.ts +2 -2
  41. package/checkbox/Checkbox.js +74 -53
  42. package/checkbox/Checkbox.stories.tsx +146 -58
  43. package/checkbox/Checkbox.test.js +84 -11
  44. package/checkbox/types.d.ts +10 -2
  45. package/chip/Chip.js +28 -49
  46. package/chip/Chip.stories.tsx +121 -26
  47. package/chip/Chip.test.js +3 -5
  48. package/common/OpenSans.css +68 -80
  49. package/common/coreTokens.d.ts +146 -0
  50. package/common/coreTokens.js +167 -0
  51. package/common/utils.d.ts +1 -0
  52. package/common/utils.js +4 -4
  53. package/common/variables.d.ts +1499 -0
  54. package/common/variables.js +1004 -1134
  55. package/date-input/Calendar.d.ts +4 -0
  56. package/date-input/Calendar.js +258 -0
  57. package/date-input/DateInput.js +138 -239
  58. package/date-input/DateInput.stories.tsx +209 -33
  59. package/date-input/DateInput.test.js +519 -149
  60. package/date-input/DatePicker.d.ts +4 -0
  61. package/date-input/DatePicker.js +146 -0
  62. package/date-input/Icons.d.ts +6 -0
  63. package/date-input/Icons.js +75 -0
  64. package/date-input/YearPicker.d.ts +4 -0
  65. package/date-input/YearPicker.js +126 -0
  66. package/date-input/types.d.ts +57 -0
  67. package/dialog/Dialog.d.ts +1 -1
  68. package/dialog/Dialog.js +54 -85
  69. package/dialog/Dialog.stories.tsx +154 -170
  70. package/dialog/Dialog.test.js +302 -3
  71. package/dialog/types.d.ts +0 -12
  72. package/dropdown/Dropdown.js +42 -41
  73. package/dropdown/Dropdown.stories.tsx +210 -84
  74. package/dropdown/Dropdown.test.js +22 -27
  75. package/dropdown/DropdownMenu.js +12 -18
  76. package/dropdown/DropdownMenuItem.js +5 -18
  77. package/dropdown/types.d.ts +3 -3
  78. package/file-input/FileInput.d.ts +2 -2
  79. package/file-input/FileInput.js +174 -220
  80. package/file-input/FileInput.stories.tsx +122 -11
  81. package/file-input/FileInput.test.js +14 -14
  82. package/file-input/FileItem.d.ts +4 -14
  83. package/file-input/FileItem.js +39 -63
  84. package/file-input/types.d.ts +18 -1
  85. package/flex/Flex.d.ts +1 -1
  86. package/flex/Flex.js +33 -19
  87. package/flex/Flex.stories.tsx +35 -26
  88. package/flex/types.d.ts +83 -7
  89. package/footer/Footer.d.ts +1 -1
  90. package/footer/Footer.js +44 -64
  91. package/footer/Footer.stories.tsx +36 -21
  92. package/footer/Footer.test.js +16 -26
  93. package/footer/types.d.ts +10 -11
  94. package/grid/Grid.d.ts +7 -0
  95. package/grid/Grid.js +91 -0
  96. package/grid/Grid.stories.tsx +219 -0
  97. package/grid/types.d.ts +115 -0
  98. package/header/Header.d.ts +4 -3
  99. package/header/Header.js +20 -49
  100. package/header/Header.stories.tsx +115 -36
  101. package/header/Header.test.js +2 -2
  102. package/header/types.d.ts +1 -14
  103. package/heading/Heading.js +1 -1
  104. package/heading/Heading.test.js +1 -1
  105. package/image/Image.d.ts +4 -0
  106. package/image/Image.js +85 -0
  107. package/image/Image.stories.tsx +127 -0
  108. package/image/types.d.ts +72 -0
  109. package/inset/Inset.stories.tsx +2 -1
  110. package/layout/ApplicationLayout.d.ts +5 -5
  111. package/layout/ApplicationLayout.js +15 -12
  112. package/layout/ApplicationLayout.stories.tsx +1 -1
  113. package/layout/Icons.d.ts +7 -4
  114. package/layout/Icons.js +52 -56
  115. package/layout/types.d.ts +2 -3
  116. package/link/Link.js +4 -4
  117. package/link/Link.stories.tsx +60 -0
  118. package/link/Link.test.js +2 -4
  119. package/link/types.d.ts +2 -2
  120. package/main.d.ts +5 -3
  121. package/main.js +18 -2
  122. package/{tabs-nav → nav-tabs}/NavTabs.d.ts +2 -2
  123. package/{tabs-nav → nav-tabs}/NavTabs.js +8 -11
  124. package/{tabs-nav → nav-tabs}/NavTabs.stories.tsx +110 -6
  125. package/{tabs-nav → nav-tabs}/NavTabs.test.js +1 -1
  126. package/{tabs-nav → nav-tabs}/Tab.js +49 -33
  127. package/{tabs-nav → nav-tabs}/types.d.ts +8 -9
  128. package/number-input/NumberInput.d.ts +7 -0
  129. package/number-input/NumberInput.js +8 -4
  130. package/number-input/NumberInput.stories.tsx +47 -2
  131. package/number-input/NumberInput.test.js +354 -92
  132. package/number-input/types.d.ts +6 -0
  133. package/package.json +14 -19
  134. package/paginator/Icons.d.ts +5 -0
  135. package/paginator/Icons.js +16 -28
  136. package/paginator/Paginator.js +8 -16
  137. package/paginator/Paginator.stories.tsx +24 -0
  138. package/paginator/Paginator.test.js +58 -48
  139. package/paragraph/Paragraph.d.ts +3 -4
  140. package/paragraph/Paragraph.js +5 -5
  141. package/password-input/Icons.d.ts +6 -0
  142. package/password-input/Icons.js +39 -0
  143. package/password-input/PasswordInput.js +35 -82
  144. package/password-input/PasswordInput.stories.tsx +1 -0
  145. package/password-input/PasswordInput.test.js +34 -40
  146. package/progress-bar/ProgressBar.d.ts +2 -2
  147. package/progress-bar/ProgressBar.js +5 -5
  148. package/progress-bar/ProgressBar.stories.jsx +35 -2
  149. package/progress-bar/ProgressBar.test.js +1 -1
  150. package/progress-bar/types.d.ts +4 -3
  151. package/quick-nav/QuickNav.js +11 -12
  152. package/quick-nav/QuickNav.stories.tsx +111 -19
  153. package/radio-group/Radio.d.ts +1 -1
  154. package/radio-group/Radio.js +50 -35
  155. package/radio-group/RadioGroup.js +29 -29
  156. package/radio-group/RadioGroup.stories.tsx +132 -18
  157. package/radio-group/RadioGroup.test.js +153 -99
  158. package/radio-group/types.d.ts +5 -5
  159. package/resultset-table/Icons.d.ts +7 -0
  160. package/resultset-table/Icons.js +51 -0
  161. package/{resultsetTable → resultset-table}/ResultsetTable.js +49 -108
  162. package/{resultsetTable → resultset-table}/ResultsetTable.stories.tsx +50 -25
  163. package/{resultsetTable → resultset-table}/ResultsetTable.test.js +41 -64
  164. package/{resultsetTable → resultset-table}/types.d.ts +1 -1
  165. package/resultset-table/types.js +5 -0
  166. package/select/Listbox.d.ts +1 -1
  167. package/select/Listbox.js +5 -35
  168. package/select/Option.js +11 -24
  169. package/select/Select.js +59 -36
  170. package/select/Select.stories.tsx +497 -153
  171. package/select/Select.test.js +345 -292
  172. package/select/types.d.ts +2 -2
  173. package/sidenav/Icons.d.ts +7 -0
  174. package/sidenav/Icons.js +51 -0
  175. package/sidenav/Sidenav.d.ts +2 -2
  176. package/sidenav/Sidenav.js +66 -96
  177. package/sidenav/Sidenav.stories.tsx +165 -63
  178. package/sidenav/types.d.ts +21 -18
  179. package/slider/Slider.d.ts +2 -2
  180. package/slider/Slider.js +17 -14
  181. package/slider/Slider.stories.tsx +57 -0
  182. package/slider/Slider.test.js +1 -1
  183. package/slider/types.d.ts +6 -2
  184. package/spinner/Spinner.js +17 -23
  185. package/spinner/Spinner.stories.jsx +53 -27
  186. package/spinner/Spinner.test.js +1 -1
  187. package/switch/Switch.d.ts +3 -3
  188. package/switch/Switch.js +95 -84
  189. package/switch/Switch.stories.tsx +33 -0
  190. package/switch/Switch.test.js +27 -14
  191. package/switch/types.d.ts +8 -3
  192. package/table/Table.js +3 -3
  193. package/table/Table.stories.jsx +80 -1
  194. package/table/Table.test.js +2 -2
  195. package/tabs/Tab.js +12 -15
  196. package/tabs/Tabs.js +11 -17
  197. package/tabs/Tabs.stories.tsx +45 -5
  198. package/tabs/Tabs.test.js +4 -5
  199. package/tabs/types.d.ts +2 -2
  200. package/tag/Tag.js +7 -9
  201. package/tag/Tag.stories.tsx +14 -1
  202. package/tag/Tag.test.js +1 -1
  203. package/text-input/Icons.d.ts +8 -0
  204. package/text-input/Icons.js +60 -0
  205. package/text-input/Suggestion.js +40 -11
  206. package/text-input/Suggestions.d.ts +4 -0
  207. package/text-input/Suggestions.js +134 -0
  208. package/text-input/TextInput.js +232 -342
  209. package/text-input/TextInput.stories.tsx +319 -184
  210. package/text-input/TextInput.test.js +848 -726
  211. package/text-input/types.d.ts +27 -2
  212. package/textarea/Textarea.js +27 -26
  213. package/textarea/Textarea.stories.jsx +68 -1
  214. package/textarea/Textarea.test.js +61 -19
  215. package/textarea/types.d.ts +4 -0
  216. package/toggle-group/ToggleGroup.d.ts +2 -2
  217. package/toggle-group/ToggleGroup.js +85 -59
  218. package/toggle-group/ToggleGroup.stories.tsx +48 -3
  219. package/toggle-group/ToggleGroup.test.js +38 -24
  220. package/toggle-group/types.d.ts +22 -13
  221. package/typography/Typography.d.ts +2 -2
  222. package/typography/Typography.js +14 -113
  223. package/typography/Typography.stories.tsx +1 -1
  224. package/useTheme.d.ts +1251 -1
  225. package/useTheme.js +1 -1
  226. package/useTranslatedLabels.d.ts +84 -1
  227. package/utils/BaseTypography.d.ts +21 -0
  228. package/utils/BaseTypography.js +108 -0
  229. package/utils/FocusLock.d.ts +13 -0
  230. package/utils/FocusLock.js +138 -0
  231. package/wizard/Wizard.js +2 -2
  232. package/wizard/Wizard.stories.tsx +20 -0
  233. package/wizard/Wizard.test.js +1 -1
  234. package/wizard/types.d.ts +5 -6
  235. package/card/ice-cream.jpg +0 -0
  236. package/common/RequiredComponent.js +0 -32
  237. package/number-input/NumberInputContext.d.ts +0 -4
  238. package/number-input/NumberInputContext.js +0 -19
  239. package/number-input/numberInputContextTypes.d.ts +0 -19
  240. /package/{resultsetTable → grid}/types.js +0 -0
  241. /package/{tabs-nav → image}/types.js +0 -0
  242. /package/{tabs-nav → nav-tabs}/Tab.d.ts +0 -0
  243. /package/{number-input/numberInputContextTypes.js → nav-tabs/types.js} +0 -0
  244. /package/{resultsetTable → resultset-table}/ResultsetTable.d.ts +0 -0
@@ -8,7 +8,7 @@ var _react2 = require("@testing-library/react");
8
8
 
9
9
  var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
10
10
 
11
- var _Checkbox = _interopRequireDefault(require("./Checkbox"));
11
+ var _Checkbox = _interopRequireDefault(require("./Checkbox.tsx"));
12
12
 
13
13
  describe("Checkbox component tests", function () {
14
14
  test("Checkbox renders with correct aria-labelledby and aria-required", function () {
@@ -21,6 +21,8 @@ describe("Checkbox component tests", function () {
21
21
  var labelId = getByText("Checkbox").getAttribute("id");
22
22
  expect(getByRole("checkbox").getAttribute("aria-labelledby")).toBe(labelId);
23
23
  expect(getByRole("checkbox").getAttribute("aria-required")).toBe("true");
24
+ expect(getByRole("checkbox").getAttribute("aria-readonly")).toBe("false");
25
+ expect(getByRole("checkbox").getAttribute("aria-disabled")).toBe("false");
24
26
  });
25
27
  test("Optional checkbox renders with correct aria-required", function () {
26
28
  var _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
@@ -31,7 +33,7 @@ describe("Checkbox component tests", function () {
31
33
 
32
34
  expect(getByRole("checkbox").getAttribute("aria-required")).toBe("false");
33
35
  });
34
- test("Calls correct function on click", function () {
36
+ test("Calls correct function onChange", function () {
35
37
  var onChange = jest.fn();
36
38
 
37
39
  var _render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
@@ -44,6 +46,77 @@ describe("Checkbox component tests", function () {
44
46
 
45
47
  expect(onChange).toHaveBeenCalled();
46
48
  });
49
+ test("Read-only checkbox does not trigger onChange function", function () {
50
+ var onChange = jest.fn();
51
+
52
+ var _render4 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
53
+ label: "Checkbox",
54
+ onChange: onChange,
55
+ readOnly: true
56
+ })),
57
+ getByRole = _render4.getByRole;
58
+
59
+ var checkbox = getByRole("checkbox");
60
+ expect(checkbox.getAttribute("aria-readonly")).toBe("true");
61
+
62
+ _react2.fireEvent.click(checkbox);
63
+
64
+ expect(onChange).not.toHaveBeenCalled();
65
+ });
66
+ test("Read-only checkbox sends its value on submit", function () {
67
+ var handlerOnSubmit = jest.fn(function (e) {
68
+ e.preventDefault();
69
+ var formData = new FormData(e.target);
70
+ var formProps = Object.fromEntries(formData);
71
+ expect(formProps).toStrictEqual({
72
+ data: "checked"
73
+ });
74
+ });
75
+
76
+ var _render5 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement("form", {
77
+ onSubmit: handlerOnSubmit
78
+ }, /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
79
+ label: "Checkbox",
80
+ name: "data",
81
+ value: "checked",
82
+ readOnly: true,
83
+ defaultChecked: true
84
+ }), /*#__PURE__*/_react["default"].createElement("button", {
85
+ type: "submit"
86
+ }, "Submit"))),
87
+ getByText = _render5.getByText;
88
+
89
+ var submit = getByText("Submit");
90
+
91
+ _userEvent["default"].click(submit);
92
+
93
+ expect(handlerOnSubmit).toHaveBeenCalled();
94
+ });
95
+ test("Read-only checkbox doesn't change its value with Space key", function () {
96
+ var onChange = jest.fn();
97
+
98
+ var _render6 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
99
+ label: "Checkbox",
100
+ onChange: onChange,
101
+ readOnly: true
102
+ })),
103
+ getByRole = _render6.getByRole;
104
+
105
+ var checkbox = getByRole("checkbox");
106
+
107
+ _userEvent["default"].tab();
108
+
109
+ expect(document.activeElement === checkbox).toBeTruthy();
110
+
111
+ _react2.fireEvent.keyDown(checkbox, {
112
+ key: " ",
113
+ code: "Space",
114
+ keyCode: 32,
115
+ charCode: 32
116
+ });
117
+
118
+ expect(onChange).not.toHaveBeenCalled();
119
+ });
47
120
  test("Uncontrolled checkbox", function () {
48
121
  var onChange = jest.fn();
49
122
  var component = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
@@ -84,14 +157,14 @@ describe("Checkbox component tests", function () {
84
157
  expect(submitInput.checked).toBe(false);
85
158
  });
86
159
  test("Renders with correct initial value and initial state when it is uncontrolled", function () {
87
- var _render4 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
160
+ var _render7 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
88
161
  label: "Default label",
89
162
  defaultChecked: true,
90
163
  value: "test-defaultChecked",
91
164
  name: "test"
92
165
  })),
93
- getByRole = _render4.getByRole,
94
- container = _render4.container;
166
+ getByRole = _render7.getByRole,
167
+ container = _render7.container;
95
168
 
96
169
  var checkbox = getByRole("checkbox");
97
170
  var submitInput = container.querySelector("input[name=\"test\"]");
@@ -102,15 +175,15 @@ describe("Checkbox component tests", function () {
102
175
  test("Test disable keyboard and mouse interactions", function () {
103
176
  var onChange = jest.fn();
104
177
 
105
- var _render5 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
178
+ var _render8 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
106
179
  label: "Checkbox",
107
180
  onChange: onChange,
108
181
  disabled: true,
109
182
  name: "test"
110
183
  })),
111
- getByRole = _render5.getByRole,
112
- getByText = _render5.getByText,
113
- container = _render5.container;
184
+ getByRole = _render8.getByRole,
185
+ getByText = _render8.getByText,
186
+ container = _render8.container;
114
187
 
115
188
  var input = getByRole("checkbox");
116
189
  var visibleCheckbox = getByText("Checkbox");
@@ -130,12 +203,12 @@ describe("Checkbox component tests", function () {
130
203
  test("Test keyboard interactions", function () {
131
204
  var onChange = jest.fn();
132
205
 
133
- var _render6 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
206
+ var _render9 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
134
207
  label: "Checkbox",
135
208
  name: "test",
136
209
  onChange: onChange
137
210
  })),
138
- getByRole = _render6.getByRole;
211
+ getByRole = _render9.getByRole;
139
212
 
140
213
  var checkbox = getByRole("checkbox");
141
214
 
@@ -1,5 +1,5 @@
1
- export declare type Space = "xxsmall" | "xsmall" | "small" | "medium" | "large" | "xlarge" | "xxlarge";
2
- export declare type Margin = {
1
+ declare type Space = "xxsmall" | "xsmall" | "small" | "medium" | "large" | "xlarge" | "xxlarge";
2
+ declare type Margin = {
3
3
  top?: Space;
4
4
  bottom?: Space;
5
5
  left?: Space;
@@ -40,6 +40,10 @@ declare type Props = {
40
40
  * If true, the component will display '(Optional)' next to the label.
41
41
  */
42
42
  optional?: boolean;
43
+ /**
44
+ * If true, the component will not be mutable, meaning the user can not edit the control.
45
+ */
46
+ readOnly?: boolean;
43
47
  /**
44
48
  * This function will be called when the user clicks the checkbox.
45
49
  * The new value will be passed as a parameter.
@@ -61,4 +65,8 @@ declare type Props = {
61
65
  */
62
66
  tabIndex?: number;
63
67
  };
68
+ /**
69
+ * Reference to the component.
70
+ */
71
+ export declare type RefType = HTMLDivElement;
64
72
  export default Props;
package/chip/Chip.js CHANGED
@@ -17,13 +17,13 @@ var _react = _interopRequireDefault(require("react"));
17
17
 
18
18
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
19
19
 
20
- var _variables = require("../common/variables.js");
20
+ var _variables = require("../common/variables");
21
21
 
22
- var _utils = require("../common/utils.js");
22
+ var _utils = require("../common/utils");
23
23
 
24
24
  var _useTheme = _interopRequireDefault(require("../useTheme"));
25
25
 
26
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
26
+ var _templateObject, _templateObject2, _templateObject3;
27
27
 
28
28
  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); }
29
29
 
@@ -42,53 +42,42 @@ var DxcChip = function DxcChip(_ref) {
42
42
  var colorsTheme = (0, _useTheme["default"])();
43
43
  return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
44
44
  theme: colorsTheme.chip
45
- }, /*#__PURE__*/_react["default"].createElement(StyledDxcChip, {
45
+ }, /*#__PURE__*/_react["default"].createElement(Chip, {
46
46
  disabled: disabled,
47
47
  margin: margin
48
48
  }, prefixIcon && /*#__PURE__*/_react["default"].createElement(IconContainer, {
49
+ role: typeof onClickPrefix === "function" ? "button" : undefined,
49
50
  disabled: disabled,
50
- prefixIcon: true,
51
- label: label,
52
- mode: "prefix",
51
+ interactuable: typeof onClickPrefix === "function" && !disabled,
53
52
  tabIndex: typeof onClickPrefix === "function" && !disabled ? tabIndex : -1,
54
53
  onClick: function onClick() {
55
54
  return onClickPrefix && !disabled && onClickPrefix();
56
- },
57
- interactuable: typeof onClickPrefix === "function" && !disabled
58
- }, typeof prefixIcon === "string" ? /*#__PURE__*/_react["default"].createElement(PrefixIconContainer, {
55
+ }
56
+ }, typeof prefixIcon === "string" ? /*#__PURE__*/_react["default"].createElement("img", {
59
57
  src: prefixIcon
60
- }) : prefixIcon), label && /*#__PURE__*/_react["default"].createElement(ChipTextContainer, {
58
+ }) : prefixIcon), label && /*#__PURE__*/_react["default"].createElement(LabelContainer, {
61
59
  disabled: disabled
62
60
  }, label), suffixIcon && /*#__PURE__*/_react["default"].createElement(IconContainer, {
61
+ role: typeof onClickSuffix === "function" ? "button" : undefined,
63
62
  disabled: disabled,
64
- suffixIcon: true,
65
- mode: "suffix",
66
- label: label,
63
+ interactuable: typeof onClickSuffix === "function" && !disabled,
67
64
  tabIndex: typeof onClickSuffix === "function" && !disabled ? tabIndex : -1,
68
65
  onClick: function onClick() {
69
- return onClickSuffix && !disabled && onClickSuffix();
70
- },
71
- interactuable: typeof onClickSuffix === "function" && !disabled
72
- }, typeof suffixIcon === "string" ? /*#__PURE__*/_react["default"].createElement(SuffixIconContainer, {
66
+ return !disabled && (onClickSuffix === null || onClickSuffix === void 0 ? void 0 : onClickSuffix());
67
+ }
68
+ }, typeof suffixIcon === "string" ? /*#__PURE__*/_react["default"].createElement("img", {
73
69
  src: suffixIcon
74
70
  }) : suffixIcon)));
75
71
  };
76
72
 
77
- var getCursor = function getCursor(interactuable, disabled) {
78
- if (disabled) {
79
- return "cursor:not-allowed;";
80
- }
81
-
82
- if (interactuable) {
83
- return "cursor:pointer;";
84
- }
85
-
86
- return "cursor:default; outline:none;";
73
+ var calculateWidth = function calculateWidth(margin) {
74
+ return "calc(100% - ".concat((0, _utils.getMargin)(margin, "left"), " - ").concat((0, _utils.getMargin)(margin, "right"), ")");
87
75
  };
88
76
 
89
- var StyledDxcChip = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-flex;\n align-items: center;\n min-height: 40px;\n max-width: ", ";\n background-color: ", ";\n border-radius: ", ";\n border-width: ", ";\n border-style: ", ";\n border-color: ", ";\n padding-top: ", ";\n padding-bottom: ", ";\n padding-left: ", ";\n padding-right: ", ";\n\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n cursor: ", ";\n"])), function (_ref2) {
90
- var margin = _ref2.margin;
91
- return "calc(100% - 40px - ".concat((0, _utils.getMargin)(margin, "left"), " - ").concat((0, _utils.getMargin)(margin, "right"), ")");
77
+ var Chip = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n gap: ", ";\n min-height: 40px;\n max-width: ", ";\n background-color: ", ";\n border-radius: ", ";\n border-width: ", ";\n border-style: ", ";\n border-color: ", ";\n\n padding-top: ", ";\n padding-bottom: ", ";\n padding-left: ", ";\n padding-right: ", ";\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n cursor: ", ";\n"])), function (props) {
78
+ return props.theme.iconSpacing;
79
+ }, function (props) {
80
+ return calculateWidth(props.margin);
92
81
  }, function (props) {
93
82
  return props.disabled && props.theme.disabledBackgroundColor || props.theme.backgroundColor;
94
83
  }, function (props) {
@@ -117,12 +106,12 @@ var StyledDxcChip = _styledComponents["default"].div(_templateObject || (_templa
117
106
  return props.margin && (0, _typeof2["default"])(props.margin) === "object" && props.margin.bottom ? _variables.spaces[props.margin.bottom] : "";
118
107
  }, function (props) {
119
108
  return props.margin && (0, _typeof2["default"])(props.margin) === "object" && props.margin.left ? _variables.spaces[props.margin.left] : "";
120
- }, function (_ref3) {
121
- var disabled = _ref3.disabled;
109
+ }, function (_ref2) {
110
+ var disabled = _ref2.disabled;
122
111
  return disabled && "not-allowed";
123
112
  });
124
113
 
125
- var ChipTextContainer = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n font-family: ", ";\n font-weight: ", ";\n font-style: ", ";\n color: ", ";\n cursor: ", ";\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n"])), function (props) {
114
+ var LabelContainer = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-size: ", ";\n font-family: ", ";\n font-weight: ", ";\n font-style: ", ";\n color: ", ";\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n"])), function (props) {
126
115
  return props.theme.fontSize;
127
116
  }, function (props) {
128
117
  return props.theme.fontFamily;
@@ -132,29 +121,19 @@ var ChipTextContainer = _styledComponents["default"].span(_templateObject2 || (_
132
121
  return props.theme.fontStyle;
133
122
  }, function (props) {
134
123
  return props.disabled ? props.theme.disabledFontColor : props.theme.fontColor;
135
- }, function (_ref4) {
136
- var disabled = _ref4.disabled;
137
- return disabled && "not-allowed" || "default";
138
124
  });
139
125
 
140
- var SuffixIconContainer = _styledComponents["default"].img(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])([""])));
141
-
142
- var PrefixIconContainer = _styledComponents["default"].img(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])([""])));
143
-
144
- var IconContainer = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n ", "\n ", "\n width: ", ";\n height: ", ";\n overflow: hidden;\n\n img,\n svg {\n height: 100%;\n width: 100%;\n }\n &:focus {\n outline-color: ", ";\n outline-width: 2px;\n ", "\n }\n"])), function (props) {
126
+ var IconContainer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n border-radius: 0.25rem;\n color: ", ";\n ", "\n\n ", "\n\n img,\n svg {\n width: ", ";\n height: ", ";\n }\n"])), function (props) {
145
127
  return props.disabled ? props.theme.disabledIconColor : props.theme.iconColor;
128
+ }, function (_ref3) {
129
+ var interactuable = _ref3.interactuable;
130
+ return interactuable && "cursor: pointer;";
146
131
  }, function (props) {
147
- return props.prefixIcon ? "margin-right: ".concat((props.label || props.suffixIcon) && props.theme.iconSpacing || props.prefixIcon && "0", ";") : "margin-left: ".concat((props.label || props.prefixIcon) && props.theme.iconSpacing || props.prefixIcon && "0", ";");
148
- }, function (props) {
149
- return getCursor(props.interactuable, props.disabled);
132
+ return props.interactuable && "\n &:hover {\n color: ".concat(props.theme.hoverIconColor, ";\n }\n &:focus,\n &:focus-visible {\n outline: ").concat(props.theme.focusBorderThickness, " ").concat(props.theme.focusBorderStyle, " ").concat(props.theme.focusColor, ";\n }\n &:active {\n color: ").concat(props.theme.activeIconColor, ";\n }\n ");
150
133
  }, function (props) {
151
134
  return props.theme.iconSize;
152
135
  }, function (props) {
153
136
  return props.theme.iconSize;
154
- }, function (props) {
155
- return props.theme.focusColor;
156
- }, function (props) {
157
- return props.disabled && "outline: none;";
158
137
  });
159
138
 
160
139
  var _default = DxcChip;
@@ -3,6 +3,7 @@ import { userEvent, within } from "@storybook/testing-library";
3
3
  import DxcChip from "./Chip";
4
4
  import Title from "../../.storybook/components/Title";
5
5
  import ExampleContainer from "../../.storybook/components/ExampleContainer";
6
+ import { HalstackProvider } from "../HalstackContext";
6
7
 
7
8
  export default {
8
9
  title: "Chip",
@@ -10,12 +11,43 @@ export default {
10
11
  };
11
12
 
12
13
  const iconSVG = (
13
- <svg viewBox="0 0 24 24" fill="currentColor">
14
- <path d="M0 0h24v24H0z" fill="none" />
15
- <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" />
14
+ <svg
15
+ version="1.1"
16
+ id="Capa_1"
17
+ x="0px"
18
+ y="0px"
19
+ width="438.536px"
20
+ height="438.536px"
21
+ viewBox="0 0 438.536 438.536"
22
+ fill="currentColor"
23
+ >
24
+ <g>
25
+ <path
26
+ d="M414.41,24.123C398.333,8.042,378.963,0,356.315,0H82.228C59.58,0,40.21,8.042,24.126,24.123
27
+ C8.045,40.207,0.003,59.576,0.003,82.225v274.084c0,22.647,8.042,42.018,24.123,58.102c16.084,16.084,35.454,24.126,58.102,24.126
28
+ h274.084c22.648,0,42.018-8.042,58.095-24.126c16.084-16.084,24.126-35.454,24.126-58.102V82.225
29
+ C438.532,59.576,430.49,40.204,414.41,24.123z M373.155,225.548h-49.963V406.84h-74.802V225.548H210.99V163.02h37.401v-37.402
30
+ c0-26.838,6.283-47.107,18.843-60.813c12.559-13.706,33.304-20.555,62.242-20.555h49.963v62.526h-31.401
31
+ c-10.663,0-17.467,1.853-20.417,5.568c-2.949,3.711-4.428,10.23-4.428,19.558v31.119h56.534L373.155,225.548z"
32
+ />
33
+ </g>
34
+ </svg>
35
+ );
36
+
37
+ const smallIconSVG = (
38
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" height="20" width="20">
39
+ <path 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" />
16
40
  </svg>
17
41
  );
18
42
 
43
+ const opinionatedTheme = {
44
+ chip: {
45
+ baseColor: "#e6e6e6",
46
+ fontColor: "#000000",
47
+ iconColor: "#4d4d4d",
48
+ },
49
+ };
50
+
19
51
  export const Chromatic = () => (
20
52
  <>
21
53
  <ExampleContainer>
@@ -23,46 +55,63 @@ export const Chromatic = () => (
23
55
  <DxcChip label="Default Chip" />
24
56
  </ExampleContainer>
25
57
  <ExampleContainer>
26
- <Title title="Chip with prefix" theme="light" level={4} />
27
- <DxcChip label="Chip with prefix" prefixIcon={iconSVG} />
58
+ <Title title="Chip with prefix SVG (small icon)" theme="light" level={4} />
59
+ <DxcChip label="Chip with prefix" prefixIcon={smallIconSVG} />
28
60
  </ExampleContainer>
29
61
  <ExampleContainer>
30
- <Title title="Chip with suffix" theme="light" level={4} />
62
+ <Title title="Chip with suffix SVG (large icon)" theme="light" level={4} />
31
63
  <DxcChip label="Chip with suffix" suffixIcon={iconSVG} />
32
64
  </ExampleContainer>
33
65
  <ExampleContainer>
34
- <Title title="Chip with prefix and suffix" theme="light" level={4} />
35
- <DxcChip label="Chip with prefix and suffix" prefixIcon={iconSVG} suffixIcon={iconSVG} />
66
+ <Title title="Chip with prefix (SVG) and suffix (URL)" theme="light" level={4} />
67
+ <DxcChip
68
+ label="Chip with prefix and suffix"
69
+ prefixIcon={iconSVG}
70
+ suffixIcon="https://upload.wikimedia.org/wikipedia/commons/e/e0/Check_green_icon.svg"
71
+ />
36
72
  </ExampleContainer>
37
73
  <ExampleContainer>
38
74
  <Title title="Disabled chip" theme="light" level={4} />
39
- <DxcChip label="Disabled" disabled prefixIcon={iconSVG} suffixIcon={iconSVG} />
75
+ <DxcChip
76
+ label="Disabled"
77
+ disabled
78
+ prefixIcon={iconSVG}
79
+ suffixIcon="https://upload.wikimedia.org/wikipedia/commons/e/e0/Check_green_icon.svg"
80
+ />
40
81
  </ExampleContainer>
41
82
  <ExampleContainer>
42
83
  <Title title="Chip with ellipsis" theme="light" level={4} />
43
- <DxcChip label="With ellipsis asdfasdf asdf asdfasdf asdf asdfasdf asdfasdf asdf asdf adfasrfasf afsdg afgasfg asdf asdf asdf asdf asdf asdf asdf afdg asfg asdfg asdf asdf asdf asdfasdf asd fas df asd asdf asdf asdfasd fg ssssssssssss ssss" />
84
+ <div style={{ width: "200px" }}>
85
+ <DxcChip label="With ellipsis asdfasdf asdf asdfasdf asdf asdfasdf asdfasdf asdf asdf adfasrfasf afsdg afgasfg asdf asdf asdf asdf asdf asdf asdf afdg asfg asdfg asdf asdf asdf asdfasdf asd fas df asd asdf asdf asdfasd fg ssssssssssss ssss" />
86
+ </div>
44
87
  </ExampleContainer>
45
88
  <ExampleContainer>
46
89
  <Title title="Chip with ellipsis and suffix" theme="light" level={4} />
47
- <DxcChip
48
- suffixIcon={iconSVG}
49
- label="With ellipsis asdfasdf asdf asdfasdf asdf asdfasdf asdfasdf asdf asdf adfasrfasf afsdg afgasfg asdf asdf asdf asdf asdf asdf asdf afdg asfg asdfg asdf asdf asdf asdfasdf asd fas df asd asdf asdf asdfasd fgsss"
50
- />
90
+ <div style={{ width: "200px" }}>
91
+ <DxcChip
92
+ suffixIcon={iconSVG}
93
+ label="With ellipsis asdfasdf asdf asdfasdf asdf asdfasdf asdfasdf asdf asdf adfasrfasf afsdg afgasfg asdf asdf asdf asdf asdf asdf asdf afdg asfg asdfg asdf asdf asdf asdfasdf asd fas df asd asdf asdf asdfasd fgsss"
94
+ />
95
+ </div>
51
96
  </ExampleContainer>
52
97
  <ExampleContainer>
53
98
  <Title title="Chip with ellipsis and prefix" theme="light" level={4} />
54
- <DxcChip
55
- prefixIcon={iconSVG}
56
- label="With ellipsis asdfasdf asdf asdfasdf asdf asdfasdf asdfasdf asdf asdf adfasrfasf afsdg afgasfg asdf asdf asdf asdf asdf asdf asdf afdg asfg asdfg asdf asdf asdf asdfasdf asd fas df asd asdf asdf asdfasd fgsss"
57
- />
99
+ <div style={{ width: "200px" }}>
100
+ <DxcChip
101
+ prefixIcon={iconSVG}
102
+ label="With ellipsis asdfasdf asdf asdfasdf asdf asdfasdf asdfasdf asdf asdf adfasrfasf afsdg afgasfg asdf asdf asdf asdf asdf asdf asdf afdg asfg asdfg asdf asdf asdf asdfasdf asd fas df asd asdf asdf asdfasd fgsss"
103
+ />
104
+ </div>
58
105
  </ExampleContainer>
59
106
  <ExampleContainer>
60
107
  <Title title="Chip with ellipsis, suffix and prefix" theme="light" level={4} />
61
- <DxcChip
62
- prefixIcon={iconSVG}
63
- suffixIcon={iconSVG}
64
- label="With ellipsis asdfasdf asdf asdfasdf asdf asdfasdf asdfasdf asdf asdf adfasrfasf afsdg afgasfg asdf asdf asdf asdf asdf asdf asdf afdg asfg asdfg asdf asdf asdf asdfasdf asd fas df asd asdf asdf asdfasdf"
65
- />
108
+ <div style={{ width: "200px" }}>
109
+ <DxcChip
110
+ prefixIcon={iconSVG}
111
+ suffixIcon={iconSVG}
112
+ label="With ellipsis asdfasdf asdf asdfasdf asdf asdfasdf asdfasdf asdf asdf adfasrfasf afsdg afgasfg asdf asdf asdf asdf asdf asdf asdf afdg asfg asdfg asdf asdf asdf asdfasdf asd fas df asd asdf asdf asdfasdf"
113
+ />
114
+ </div>
66
115
  </ExampleContainer>
67
116
  <Title title="Margins" theme="light" level={2} />
68
117
  <ExampleContainer>
@@ -93,6 +142,52 @@ export const Chromatic = () => (
93
142
  <Title title="Xxlarge margin" theme="light" level={4} />
94
143
  <DxcChip label="xxlarge" margin="xxlarge" />
95
144
  </ExampleContainer>
145
+ <Title title="Opinionated theme" theme="light" level={2} />
146
+ <ExampleContainer>
147
+ <Title title="Chip with prefix and suffix" theme="light" level={4} />
148
+ <HalstackProvider theme={opinionatedTheme}>
149
+ <DxcChip
150
+ label="Chip"
151
+ prefixIcon={iconSVG}
152
+ suffixIcon="https://upload.wikimedia.org/wikipedia/commons/e/e0/Check_green_icon.svg"
153
+ />
154
+ </HalstackProvider>
155
+ </ExampleContainer>
156
+ <ExampleContainer>
157
+ <Title title="Chip with prefix and suffix" theme="light" level={4} />
158
+ <HalstackProvider theme={opinionatedTheme}>
159
+ <DxcChip
160
+ label="Chip"
161
+ disabled
162
+ prefixIcon={iconSVG}
163
+ suffixIcon="https://upload.wikimedia.org/wikipedia/commons/e/e0/Check_green_icon.svg"
164
+ />
165
+ </HalstackProvider>
166
+ </ExampleContainer>
167
+ <ExampleContainer pseudoState="pseudo-hover">
168
+ <Title title="Hovered" theme="light" level={4} />
169
+ <HalstackProvider theme={opinionatedTheme}>
170
+ <DxcChip
171
+ label="Chip"
172
+ prefixIcon={iconSVG}
173
+ suffixIcon={iconSVG}
174
+ onClickPrefix={() => {}}
175
+ onClickSuffix={() => {}}
176
+ />
177
+ </HalstackProvider>
178
+ </ExampleContainer>
179
+ <ExampleContainer pseudoState="pseudo-active">
180
+ <Title title="Actived" theme="light" level={4} />
181
+ <HalstackProvider theme={opinionatedTheme}>
182
+ <DxcChip
183
+ label="Chip"
184
+ prefixIcon={iconSVG}
185
+ suffixIcon={iconSVG}
186
+ onClickPrefix={() => {}}
187
+ onClickSuffix={() => {}}
188
+ />
189
+ </HalstackProvider>
190
+ </ExampleContainer>
96
191
  </>
97
192
  );
98
193
  const ChipPrefixFocused = () => (
@@ -104,16 +199,16 @@ const ChipPrefixFocused = () => (
104
199
  const ChipSuffixFocused = () => (
105
200
  <ExampleContainer>
106
201
  <Title title="Chip with suffix" theme="light" level={4} />
107
- <DxcChip label="Chip with suffix" suffixIcon={iconSVG} onClickSuffix={() => {}} />
202
+ <DxcChip label="Chip with suffix" suffixIcon="https://icons-for-free.com/download-icon-close+icon-1320184117228553763_512.png" onClickSuffix={() => {}} />
108
203
  </ExampleContainer>
109
204
  );
110
205
 
111
206
  export const PrefixFocused = ChipPrefixFocused.bind({});
112
- PrefixFocused.play = async ({ canvasElement }) => {
207
+ PrefixFocused.play = async () => {
113
208
  await userEvent.tab();
114
209
  };
115
210
 
116
211
  export const SuffixFocused = ChipSuffixFocused.bind({});
117
- SuffixFocused.play = async ({ canvasElement }) => {
212
+ SuffixFocused.play = async () => {
118
213
  await userEvent.tab();
119
214
  };
package/chip/Chip.test.js CHANGED
@@ -6,9 +6,7 @@ var _react = _interopRequireDefault(require("react"));
6
6
 
7
7
  var _react2 = require("@testing-library/react");
8
8
 
9
- var _Chip = _interopRequireDefault(require("./Chip"));
10
-
11
- var _invision = _interopRequireDefault(require("../../app/src/images/invision.svg"));
9
+ var _Chip = _interopRequireDefault(require("./Chip.tsx"));
12
10
 
13
11
  describe("Chip component tests", function () {
14
12
  test("Chip renders with correct text", function () {
@@ -24,7 +22,7 @@ describe("Chip component tests", function () {
24
22
 
25
23
  var _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Chip["default"], {
26
24
  label: "Chip",
27
- prefixIcon: _invision["default"],
25
+ prefixIcon: "https://developer.apple.com/design/human-interface-guidelines/foundations/app-icons/images/icon-and-image-large-icon-settings_2x.png",
28
26
  onClickPrefix: onClick
29
27
  })),
30
28
  getByText = _render2.getByText,
@@ -41,7 +39,7 @@ describe("Chip component tests", function () {
41
39
 
42
40
  var _render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Chip["default"], {
43
41
  label: "Chip",
44
- suffixIcon: _invision["default"],
42
+ suffixIcon: "https://developer.apple.com/design/human-interface-guidelines/foundations/app-icons/images/icon-and-image-large-icon-settings_2x.png",
45
43
  onClickSuffix: onClick
46
44
  })),
47
45
  getByText = _render3.getByText,