@dxc-technology/halstack-react 0.0.0-2c43bcf → 0.0.0-2c7db3b

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 (39) hide show
  1. package/HalstackContext.d.ts +23 -0
  2. package/HalstackContext.js +26 -16
  3. package/common/coreTokens.d.ts +0 -1
  4. package/common/coreTokens.js +0 -1
  5. package/common/variables.d.ts +29 -0
  6. package/common/variables.js +25 -2
  7. package/contextual-menu/ContextualMenu.js +56 -8
  8. package/contextual-menu/ContextualMenu.stories.tsx +50 -51
  9. package/contextual-menu/ContextualMenu.test.js +108 -66
  10. package/contextual-menu/GroupItem.js +9 -9
  11. package/contextual-menu/ItemAction.d.ts +1 -1
  12. package/contextual-menu/ItemAction.js +52 -15
  13. package/contextual-menu/SingleItem.d.ts +1 -1
  14. package/contextual-menu/SingleItem.js +14 -14
  15. package/contextual-menu/types.d.ts +9 -6
  16. package/divider/Divider.stories.tsx +2 -1
  17. package/icon/Icon.stories.tsx +1 -1
  18. package/number-input/NumberInput.js +5 -2
  19. package/number-input/NumberInput.stories.tsx +9 -0
  20. package/package.json +4 -3
  21. package/password-input/PasswordInput.js +6 -3
  22. package/password-input/PasswordInput.stories.tsx +9 -0
  23. package/resultset-table/ResultsetTable.js +33 -9
  24. package/resultset-table/ResultsetTable.stories.tsx +1 -1
  25. package/resultset-table/ResultsetTable.test.js +101 -30
  26. package/select/Select.js +3 -1
  27. package/select/Select.stories.tsx +10 -1
  28. package/text-input/TextInput.js +3 -1
  29. package/text-input/TextInput.stories.tsx +9 -0
  30. package/tooltip/Tooltip.accessibility.test.d.ts +1 -0
  31. package/tooltip/Tooltip.accessibility.test.js +144 -0
  32. package/tooltip/Tooltip.d.ts +4 -0
  33. package/tooltip/Tooltip.js +50 -0
  34. package/tooltip/Tooltip.stories.tsx +111 -0
  35. package/tooltip/Tooltip.test.d.ts +1 -0
  36. package/tooltip/Tooltip.test.js +112 -0
  37. package/tooltip/types.d.ts +16 -0
  38. package/tooltip/types.js +5 -0
  39. package/useTheme.d.ts +23 -0
@@ -3,6 +3,7 @@ import { userEvent, within } from "@storybook/test";
3
3
  import DxcPasswordInput from "./PasswordInput";
4
4
  import Title from "../../.storybook/components/Title";
5
5
  import ExampleContainer from "../../.storybook/components/ExampleContainer";
6
+ import DxcFlex from "../flex/Flex";
6
7
 
7
8
  export default {
8
9
  title: "Password Input",
@@ -81,6 +82,14 @@ export const Chromatic = () => (
81
82
  <Title title="FillParent size" theme="light" level={4} />
82
83
  <DxcPasswordInput label="FillParent" size="fillParent" />
83
84
  </ExampleContainer>
85
+ <ExampleContainer>
86
+ <Title title="Without label" theme="light" level={4} />
87
+ <DxcFlex justifyContent="space-between" gap="1rem">
88
+ <DxcPasswordInput label="fillParent" size="fillParent" />
89
+ <DxcPasswordInput label="medium" size="medium" />
90
+ <DxcPasswordInput label="large" size="large" />
91
+ </DxcFlex>
92
+ </ExampleContainer>
84
93
  </>
85
94
  );
86
95
 
@@ -26,8 +26,8 @@ var normalizeSortValue = function normalizeSortValue(sortValue) {
26
26
  };
27
27
  var sortArray = function sortArray(index, order, resultset) {
28
28
  return resultset.slice().sort(function (element1, element2) {
29
- var sortValueA = normalizeSortValue(element1[index].sortValue || element1[index].displayValue);
30
- var sortValueB = normalizeSortValue(element2[index].sortValue || element2[index].displayValue);
29
+ var sortValueA = normalizeSortValue(element1.cells[index].sortValue || element1[index].displayValue);
30
+ var sortValueB = normalizeSortValue(element2.cells[index].sortValue || element2[index].displayValue);
31
31
  var comparison = 0;
32
32
  if ((0, _typeof2["default"])(sortValueA) === "object") {
33
33
  comparison = -1;
@@ -47,6 +47,17 @@ var getMinItemsPerPageIndex = function getMinItemsPerPageIndex(currentPageIntern
47
47
  var getMaxItemsPerPageIndex = function getMaxItemsPerPageIndex(minItemsPerPageIndex, itemsPerPage, resultset, page) {
48
48
  return minItemsPerPageIndex + itemsPerPage > resultset.length ? resultset.length : itemsPerPage * page - 1;
49
49
  };
50
+ var assignIdsToRows = function assignIdsToRows(resultset) {
51
+ if (resultset.length > 0) {
52
+ return resultset.map(function (row, index) {
53
+ return {
54
+ cells: row,
55
+ id: "row_".concat(index)
56
+ };
57
+ });
58
+ }
59
+ return [];
60
+ };
50
61
  var DxcResultsetTable = function DxcResultsetTable(_ref) {
51
62
  var columns = _ref.columns,
52
63
  rows = _ref.rows,
@@ -76,6 +87,10 @@ var DxcResultsetTable = function DxcResultsetTable(_ref) {
76
87
  _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
77
88
  sortOrder = _useState6[0],
78
89
  changeSortOrder = _useState6[1];
90
+ var prevRowCountRef = (0, _react.useRef)(rows.length);
91
+ var rowsWithIds = (0, _react.useMemo)(function () {
92
+ return assignIdsToRows(rows);
93
+ }, [rows]);
79
94
  var minItemsPerPageIndex = (0, _react.useMemo)(function () {
80
95
  return getMinItemsPerPageIndex(page, itemsPerPage, page);
81
96
  }, [itemsPerPage, page]);
@@ -83,8 +98,8 @@ var DxcResultsetTable = function DxcResultsetTable(_ref) {
83
98
  return getMaxItemsPerPageIndex(minItemsPerPageIndex, itemsPerPage, rows, page);
84
99
  }, [itemsPerPage, minItemsPerPageIndex, page, rows]);
85
100
  var sortedResultset = (0, _react.useMemo)(function () {
86
- return sortColumnIndex !== -1 ? sortArray(sortColumnIndex, sortOrder, rows) : rows;
87
- }, [sortColumnIndex, sortOrder, rows]);
101
+ return sortColumnIndex !== -1 ? sortArray(sortColumnIndex, sortOrder, rowsWithIds) : rowsWithIds;
102
+ }, [sortColumnIndex, sortOrder, rowsWithIds]);
88
103
  var filteredResultset = (0, _react.useMemo)(function () {
89
104
  return sortedResultset && sortedResultset.slice(minItemsPerPageIndex, maxItemsPerPageIndex + 1);
90
105
  }, [sortedResultset, minItemsPerPageIndex, maxItemsPerPageIndex]);
@@ -98,9 +113,18 @@ var DxcResultsetTable = function DxcResultsetTable(_ref) {
98
113
  };
99
114
  (0, _react.useEffect)(function () {
100
115
  if (!hidePaginator) {
101
- rows.length > 0 ? changePage(1) : changePage(0);
116
+ if (rows.length === 0) {
117
+ changePage(0);
118
+ } else if (rows.length < prevRowCountRef.current) {
119
+ var lastPage = Math.ceil(rows.length / itemsPerPage);
120
+ var prevLastPage = Math.ceil(prevRowCountRef.current / itemsPerPage);
121
+ if (lastPage < prevLastPage) {
122
+ changePage(Math.min(lastPage, page));
123
+ }
124
+ }
125
+ prevRowCountRef.current = rows.length;
102
126
  }
103
- }, [rows]);
127
+ }, [rows.length]);
104
128
  return /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
105
129
  theme: colorsTheme.table
106
130
  }, /*#__PURE__*/_react["default"].createElement(DxcResultsetTableContainer, {
@@ -122,10 +146,10 @@ var DxcResultsetTable = function DxcResultsetTable(_ref) {
122
146
  mode: mode,
123
147
  "aria-label": column.isSortable ? "Sort column" : undefined
124
148
  }, /*#__PURE__*/_react["default"].createElement("span", null, column.displayValue), column.isSortable && /*#__PURE__*/_react["default"].createElement(SortIcon, null, sortColumnIndex === index ? sortOrder === "ascending" ? _Icons["default"].arrowUp : _Icons["default"].arrowDown : _Icons["default"].bothArrows)));
125
- }))), /*#__PURE__*/_react["default"].createElement("tbody", null, filteredResultset.map(function (cells, rowIndex) {
149
+ }))), /*#__PURE__*/_react["default"].createElement("tbody", null, filteredResultset.map(function (row) {
126
150
  return /*#__PURE__*/_react["default"].createElement("tr", {
127
- key: "resultSetTableCell_".concat(page, "_").concat(rowIndex)
128
- }, cells.map(function (cellContent, cellIndex) {
151
+ key: "resultSetTableCell_".concat(row.id)
152
+ }, row.cells.map(function (cellContent, cellIndex) {
129
153
  return /*#__PURE__*/_react["default"].createElement("td", {
130
154
  key: "resultSetTableCellContent_".concat(cellIndex)
131
155
  }, cellContent.displayValue);
@@ -409,5 +409,5 @@ export const DropdownAction = ResultsetActionsCellDropdown.bind({});
409
409
  DropdownAction.play = async ({ canvasElement }) => {
410
410
  const canvas = within(canvasElement);
411
411
  const dropdown = canvas.getAllByRole("button")[5];
412
- await userEvent.click(dropdown);
412
+ userEvent.click(dropdown);
413
413
  };
@@ -9,6 +9,7 @@ var _react = _interopRequireDefault(require("react"));
9
9
  var _react2 = require("@testing-library/react");
10
10
  var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
11
11
  var _ResultsetTable = _interopRequireDefault(require("./ResultsetTable"));
12
+ var _Checkbox = _interopRequireDefault(require("../checkbox/Checkbox"));
12
13
  // Mocking DOMRect for Radix Primitive Popover
13
14
  global.globalThis = global;
14
15
  global.DOMRect = {
@@ -151,36 +152,55 @@ var rows = [[{
151
152
  displayValue: "Barcelona",
152
153
  sortValue: "Barcelona"
153
154
  }]];
154
- var rows2 = [[{
155
- displayValue: "546",
156
- sortValue: "465"
155
+ var columnsWithCheckbox = [{
156
+ displayValue: "Id",
157
+ isSortable: true
158
+ }, {
159
+ displayValue: "Checkbox",
160
+ isSortable: false
157
161
  }, {
158
- displayValue: "OtherValue",
159
- sortValue: "OtherValue"
162
+ displayValue: "Name",
163
+ isSortable: false
160
164
  }, {
161
- displayValue: "OtherValue",
162
- sortValue: "OtherValue"
165
+ displayValue: "City",
166
+ isSortable: false
167
+ }];
168
+ var rowsWithCheckbox = [[{
169
+ displayValue: "001",
170
+ sortValue: "001"
171
+ }, {
172
+ displayValue: /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
173
+ size: "fillParent",
174
+ defaultChecked: true
175
+ })
176
+ }, {
177
+ displayValue: "Peter"
178
+ }, {
179
+ displayValue: "Miami"
163
180
  }], [{
164
- displayValue: "978",
165
- sortValue: "465"
181
+ displayValue: "002",
182
+ sortValue: "002"
166
183
  }, {
167
- displayValue: "OtherValue",
168
- sortValue: "OtherValue"
184
+ displayValue: /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
185
+ size: "fillParent"
186
+ })
169
187
  }, {
170
- displayValue: "OtherValue",
171
- sortValue: "OtherValue"
188
+ displayValue: "Louis"
172
189
  }, {
173
- displayValue: ""
190
+ displayValue: "London"
174
191
  }], [{
175
- displayValue: "678",
176
- sortValue: "344"
192
+ displayValue: "003",
193
+ sortValue: "003"
194
+ }, {
195
+ displayValue: /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
196
+ size: "fillParent"
197
+ })
177
198
  }, {
178
- displayValue: "OtherValue",
179
- sortValue: "OtherValue"
199
+ displayValue: "Lana"
180
200
  }, {
181
- displayValue: "OtherValue",
182
- sortValue: "OtherValue"
201
+ displayValue: "Amsterdam"
183
202
  }]];
203
+ var rows2 = [].concat(rows).slice(0, -1);
184
204
  describe("Resultset table component tests", function () {
185
205
  test("Resultset table rendered correctly", function () {
186
206
  var _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
@@ -284,42 +304,93 @@ describe("Resultset table component tests", function () {
284
304
  expect(component.queryByText("Tina")).toBeTruthy();
285
305
  expect(component.queryByText("Cosmin")).not.toBeTruthy();
286
306
  });
287
- test("Resultset table change rows should go to first page", function () {
307
+ test("Resultset table should go one page back when removing the last page data", function () {
288
308
  var _render6 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
289
309
  columns: columns,
290
310
  rows: rows,
291
311
  itemsPerPage: 3
292
312
  })),
313
+ getAllByRole = _render6.getAllByRole,
293
314
  queryByText = _render6.queryByText,
294
315
  rerender = _render6.rerender;
316
+ expect(queryByText("1 to 3 of 10")).toBeTruthy();
317
+ var lastButton = getAllByRole("button")[4];
295
318
  expect(queryByText("Peter")).toBeTruthy();
319
+ _react2.fireEvent.click(lastButton);
320
+ expect(queryByText("10 to 10 of 10")).toBeTruthy();
296
321
  rerender( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
297
322
  columns: columns,
298
323
  rows: rows2,
299
324
  itemsPerPage: 3
300
325
  }));
301
- expect(queryByText("1 to 3 of 3")).toBeTruthy();
326
+ expect(queryByText("7 to 9 of 9")).toBeTruthy();
302
327
  });
303
- test("Resultset table change itemsPerPage should go to first page", function () {
328
+ test("Resultset table shouldn't go one page back when there is data left in the last page", function () {
304
329
  var _render7 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
330
+ columns: columns,
331
+ rows: rows,
332
+ itemsPerPage: 2
333
+ })),
334
+ getAllByRole = _render7.getAllByRole,
335
+ queryByText = _render7.queryByText,
336
+ rerender = _render7.rerender;
337
+ expect(queryByText("1 to 2 of 10")).toBeTruthy();
338
+ var lastButton = getAllByRole("button")[4];
339
+ expect(queryByText("Peter")).toBeTruthy();
340
+ _react2.fireEvent.click(lastButton);
341
+ expect(queryByText("9 to 10 of 10")).toBeTruthy();
342
+ rerender( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
343
+ columns: columns,
344
+ rows: rows2,
345
+ itemsPerPage: 2
346
+ }));
347
+ expect(queryByText("9 to 9 of 9")).toBeTruthy();
348
+ });
349
+ test("Resultset table uncontrolled components maintain its value when sorting", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
350
+ var _render8, getAllByRole, columnHeader, sortButton;
351
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
352
+ while (1) switch (_context2.prev = _context2.next) {
353
+ case 0:
354
+ _render8 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
355
+ columns: columnsWithCheckbox,
356
+ rows: rowsWithCheckbox,
357
+ itemsPerPage: 3
358
+ })), getAllByRole = _render8.getAllByRole;
359
+ columnHeader = getAllByRole("columnheader")[0];
360
+ sortButton = getAllByRole("button")[0];
361
+ expect(getAllByRole("checkbox")[0].getAttribute("aria-checked")).toBe("true");
362
+ expect(columnHeader.getAttribute("aria-sort")).toBe("none");
363
+ _react2.fireEvent.click(sortButton);
364
+ expect(columnHeader.getAttribute("aria-sort")).toBe("ascending");
365
+ _react2.fireEvent.click(sortButton);
366
+ expect(columnHeader.getAttribute("aria-sort")).toBe("descending");
367
+ expect(getAllByRole("checkbox")[0].getAttribute("aria-checked")).toBe("false");
368
+ case 10:
369
+ case "end":
370
+ return _context2.stop();
371
+ }
372
+ }, _callee2);
373
+ })));
374
+ test("Resultset table change itemsPerPage should go to first page", function () {
375
+ var _render9 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
305
376
  columns: columns,
306
377
  rows: rows,
307
378
  itemsPerPage: 3,
308
379
  itemsPerPageOptions: [2, 3]
309
380
  })),
310
- getAllByRole = _render7.getAllByRole;
381
+ getAllByRole = _render9.getAllByRole;
311
382
  var lastButton = getAllByRole("button")[4];
312
383
  expect(getAllByRole("row").length - 1).toEqual(3);
313
384
  _react2.fireEvent.click(lastButton);
314
385
  expect(getAllByRole("row").length - 1).toEqual(1);
315
386
  });
316
387
  test("Resultset table may not use the paginator", function () {
317
- var _render8 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
388
+ var _render10 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
318
389
  columns: columns,
319
390
  rows: rows,
320
391
  hidePaginator: true
321
392
  })),
322
- getAllByRole = _render8.getAllByRole;
393
+ getAllByRole = _render10.getAllByRole;
323
394
  var nextButton = getAllByRole("button")[3];
324
395
  expect(nextButton).not.toBeTruthy();
325
396
  });
@@ -356,14 +427,14 @@ describe("Resultset table component tests", function () {
356
427
  }),
357
428
  sortValue: "Actions"
358
429
  }]];
359
- var _render9 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
430
+ var _render11 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ResultsetTable["default"], {
360
431
  columns: columns,
361
432
  rows: actionRows,
362
433
  itemsPerPage: 3
363
434
  })),
364
- getAllByRole = _render9.getAllByRole,
365
- getByRole = _render9.getByRole,
366
- getByText = _render9.getByText;
435
+ getAllByRole = _render11.getAllByRole,
436
+ getByRole = _render11.getByRole,
437
+ getByText = _render11.getByText;
367
438
  var dropdown = getAllByRole("button")[2];
368
439
  (0, _react2.act)(function () {
369
440
  _userEvent["default"].click(dropdown);
package/select/Select.js CHANGED
@@ -462,8 +462,10 @@ var sizes = {
462
462
  var calculateWidth = function calculateWidth(margin, size) {
463
463
  return size === "fillParent" ? "calc(".concat(sizes[size], " - ").concat((0, _utils.getMargin)(margin, "left"), " - ").concat((0, _utils.getMargin)(margin, "right"), ")") : sizes[size];
464
464
  };
465
- var SelectContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n\n width: ", ";\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n"])), function (props) {
465
+ var SelectContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n\n width: ", ";\n ", ";\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n"])), function (props) {
466
466
  return calculateWidth(props.margin, props.size);
467
+ }, function (props) {
468
+ return props.size !== "fillParent" && "min-width:" + calculateWidth(props.margin, props.size);
467
469
  }, function (props) {
468
470
  return props.margin && (0, _typeof2["default"])(props.margin) !== "object" ? _variables.spaces[props.margin] : "0px";
469
471
  }, function (props) {
@@ -9,6 +9,7 @@ import useTheme from "../useTheme";
9
9
  import { HalstackProvider } from "../HalstackContext";
10
10
  import { disabledRules } from "../../test/accessibility/rules/specific/select/disabledRules";
11
11
  import preview from "../../.storybook/preview";
12
+ import DxcFlex from "../flex/Flex";
12
13
 
13
14
  export default {
14
15
  title: "Select",
@@ -305,6 +306,14 @@ const Select = () => (
305
306
  <Title title="Fillparent size" theme="light" level={4} />
306
307
  <DxcSelect label="Fillparent" options={single_options} size="fillParent" />
307
308
  </ExampleContainer>
309
+ <ExampleContainer>
310
+ <Title title="Different sizes inside a flex" theme="light" level={4} />
311
+ <DxcFlex justifyContent="space-between" gap="1rem">
312
+ <DxcSelect label="fillParent" size="fillParent" options={single_options} />
313
+ <DxcSelect label="medium" size="medium" options={single_options} />
314
+ <DxcSelect label="large" size="large" options={single_options} />
315
+ </DxcFlex>
316
+ </ExampleContainer>
308
317
  <Title title="Margins" theme="light" level={2} />
309
318
  <ExampleContainer>
310
319
  <Title title="xxsmall margin" theme="light" level={4} />
@@ -402,7 +411,7 @@ const Select = () => (
402
411
  );
403
412
 
404
413
  const SelectListbox = () => {
405
- const colorsTheme: any = useTheme();
414
+ const colorsTheme = useTheme();
406
415
 
407
416
  return (
408
417
  <>
@@ -478,8 +478,10 @@ var DxcTextInput = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, re
478
478
  "aria-live": error ? "assertive" : "off"
479
479
  }, error)));
480
480
  });
481
- var TextInputContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n width: ", ";\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n"])), function (props) {
481
+ var TextInputContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n width: ", ";\n ", ";\n margin: ", ";\n margin-top: ", ";\n margin-right: ", ";\n margin-bottom: ", ";\n margin-left: ", ";\n"])), function (props) {
482
482
  return calculateWidth(props.margin, props.size);
483
+ }, function (props) {
484
+ return props.size !== "fillParent" && "min-width:" + calculateWidth(props.margin, props.size);
483
485
  }, function (props) {
484
486
  return props.margin && (0, _typeof2["default"])(props.margin) !== "object" ? _variables.spaces[props.margin] : "0px";
485
487
  }, function (props) {
@@ -7,6 +7,7 @@ import Suggestions from "./Suggestions";
7
7
  import { ThemeProvider } from "styled-components";
8
8
  import useTheme from "../useTheme";
9
9
  import { HalstackProvider } from "../HalstackContext";
10
+ import DxcFlex from "../flex/Flex";
10
11
 
11
12
  export default {
12
13
  title: "Text Input",
@@ -268,6 +269,14 @@ export const Chromatic = () => (
268
269
  <Title title="FillParent size" theme="light" level={4} />
269
270
  <DxcTextInput label="FillParent" size="fillParent" />
270
271
  </ExampleContainer>
272
+ <ExampleContainer>
273
+ <Title title="Different sizes inside a flex" theme="light" level={4} />
274
+ <DxcFlex justifyContent="space-between" gap="1.5rem">
275
+ <DxcTextInput label="Text input" size="fillParent" />
276
+ <DxcTextInput label="Text input" size="medium" />
277
+ <DxcTextInput label="Text input" size="large" />
278
+ </DxcFlex>
279
+ </ExampleContainer>
271
280
  <Title title="Opinionated theme" theme="light" level={2} />
272
281
  <ExampleContainer>
273
282
  <HalstackProvider theme={opinionatedTheme}>
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _react2 = require("@testing-library/react");
10
+ var _axeHelper = require("../../test/accessibility/axe-helper.js");
11
+ var _Tooltip = _interopRequireDefault(require("./Tooltip"));
12
+ var _Button = _interopRequireDefault(require("../button/Button"));
13
+ global.globalThis = global;
14
+ global.DOMRect = {
15
+ fromRect: function fromRect() {
16
+ return {
17
+ top: 0,
18
+ left: 0,
19
+ bottom: 0,
20
+ right: 0,
21
+ width: 0,
22
+ height: 0,
23
+ x: 0,
24
+ y: 0
25
+ };
26
+ }
27
+ };
28
+ global.ResizeObserver = /*#__PURE__*/function () {
29
+ function ResizeObserver() {
30
+ (0, _classCallCheck2["default"])(this, ResizeObserver);
31
+ }
32
+ return (0, _createClass2["default"])(ResizeObserver, [{
33
+ key: "observe",
34
+ value: function observe() {}
35
+ }, {
36
+ key: "unobserve",
37
+ value: function unobserve() {}
38
+ }, {
39
+ key: "disconnect",
40
+ value: function disconnect() {}
41
+ }]);
42
+ }();
43
+ describe("Tooltip component accessibility tests", function () {
44
+ it("Should not have basic accessibility issues for bottom position", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
45
+ var _render, baseElement, getByText, triggerElement, results;
46
+ return _regenerator["default"].wrap(function _callee$(_context) {
47
+ while (1) switch (_context.prev = _context.next) {
48
+ case 0:
49
+ // baseElement is needed when using React Portals
50
+ _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
51
+ label: "Tooltip Test",
52
+ position: "bottom"
53
+ }, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
54
+ label: "Hoverable button"
55
+ }))), baseElement = _render.baseElement, getByText = _render.getByText;
56
+ triggerElement = getByText("Hoverable button");
57
+ _react2.fireEvent.mouseEnter(triggerElement);
58
+ _context.next = 5;
59
+ return (0, _axeHelper.axe)(baseElement);
60
+ case 5:
61
+ results = _context.sent;
62
+ expect(results).toHaveNoViolations();
63
+ case 7:
64
+ case "end":
65
+ return _context.stop();
66
+ }
67
+ }, _callee);
68
+ })));
69
+ it("Should not have basic accessibility issues for top position", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
70
+ var _render2, baseElement, getByText, triggerElement, results;
71
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
72
+ while (1) switch (_context2.prev = _context2.next) {
73
+ case 0:
74
+ // baseElement is needed when using React Portals
75
+ _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
76
+ label: "Tooltip Test",
77
+ position: "top"
78
+ }, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
79
+ label: "Hoverable button"
80
+ }))), baseElement = _render2.baseElement, getByText = _render2.getByText;
81
+ triggerElement = getByText("Hoverable button");
82
+ _react2.fireEvent.mouseEnter(triggerElement);
83
+ _context2.next = 5;
84
+ return (0, _axeHelper.axe)(baseElement);
85
+ case 5:
86
+ results = _context2.sent;
87
+ expect(results).toHaveNoViolations();
88
+ case 7:
89
+ case "end":
90
+ return _context2.stop();
91
+ }
92
+ }, _callee2);
93
+ })));
94
+ it("Should not have basic accessibility issues for left position", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
95
+ var _render3, baseElement, getByText, triggerElement, results;
96
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
97
+ while (1) switch (_context3.prev = _context3.next) {
98
+ case 0:
99
+ // baseElement is needed when using React Portals
100
+ _render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
101
+ label: "Tooltip Test",
102
+ position: "left"
103
+ }, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
104
+ label: "Hoverable button"
105
+ }))), baseElement = _render3.baseElement, getByText = _render3.getByText;
106
+ triggerElement = getByText("Hoverable button");
107
+ _react2.fireEvent.mouseEnter(triggerElement);
108
+ _context3.next = 5;
109
+ return (0, _axeHelper.axe)(baseElement);
110
+ case 5:
111
+ results = _context3.sent;
112
+ expect(results).toHaveNoViolations();
113
+ case 7:
114
+ case "end":
115
+ return _context3.stop();
116
+ }
117
+ }, _callee3);
118
+ })));
119
+ it("Should not have basic accessibility issues for right position", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
120
+ var _render4, baseElement, getByText, triggerElement, results;
121
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
122
+ while (1) switch (_context4.prev = _context4.next) {
123
+ case 0:
124
+ // baseElement is needed when using React Portals
125
+ _render4 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
126
+ label: "Tooltip Test",
127
+ position: "right"
128
+ }, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
129
+ label: "Hoverable button"
130
+ }))), baseElement = _render4.baseElement, getByText = _render4.getByText;
131
+ triggerElement = getByText("Hoverable button");
132
+ _react2.fireEvent.mouseEnter(triggerElement);
133
+ _context4.next = 5;
134
+ return (0, _axeHelper.axe)(baseElement);
135
+ case 5:
136
+ results = _context4.sent;
137
+ expect(results).toHaveNoViolations();
138
+ case 7:
139
+ case "end":
140
+ return _context4.stop();
141
+ }
142
+ }, _callee4);
143
+ })));
144
+ });
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import TooltipPropsType from "./types";
3
+ declare const DxcTooltip: ({ position, label, children }: TooltipPropsType) => JSX.Element;
4
+ export default DxcTooltip;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
10
+ var _react = _interopRequireDefault(require("react"));
11
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
12
+ var Tooltip = _interopRequireWildcard(require("@radix-ui/react-tooltip"));
13
+ var _coreTokens = _interopRequireDefault(require("../common/coreTokens"));
14
+ var _templateObject, _templateObject2, _templateObject3;
15
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
16
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
17
+ var Triangle = function Triangle() {
18
+ return /*#__PURE__*/_react["default"].createElement("svg", {
19
+ width: "12",
20
+ height: "6",
21
+ viewBox: "0 0 12 6",
22
+ xmlns: "http://www.w3.org/2000/svg",
23
+ preserveAspectRatio: "none",
24
+ display: "block"
25
+ }, /*#__PURE__*/_react["default"].createElement("path", {
26
+ d: "M0.351562 0L5.30131 4.94975C5.69184 5.34027 6.325 5.34027 6.71552 4.94975L11.6653 0H6.00842H0.351562Z",
27
+ fill: _coreTokens["default"].color_grey_800
28
+ }));
29
+ };
30
+ var DxcTooltip = function DxcTooltip(_ref) {
31
+ var _ref$position = _ref.position,
32
+ position = _ref$position === void 0 ? "bottom" : _ref$position,
33
+ label = _ref.label,
34
+ children = _ref.children;
35
+ return label ? /*#__PURE__*/_react["default"].createElement(Tooltip.Provider, {
36
+ delayDuration: 300
37
+ }, /*#__PURE__*/_react["default"].createElement(Tooltip.Root, null, /*#__PURE__*/_react["default"].createElement(Tooltip.Trigger, {
38
+ asChild: true
39
+ }, /*#__PURE__*/_react["default"].createElement(TooltipTriggerContainer, null, children)), /*#__PURE__*/_react["default"].createElement(Tooltip.Portal, null, /*#__PURE__*/_react["default"].createElement(StyledTooltipContent, {
40
+ side: position,
41
+ sideOffset: 8
42
+ }, /*#__PURE__*/_react["default"].createElement(TooltipContainer, null, label), /*#__PURE__*/_react["default"].createElement(Tooltip.Arrow, {
43
+ asChild: true,
44
+ "aria-hidden": true
45
+ }, /*#__PURE__*/_react["default"].createElement(Triangle, null)))))) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, children);
46
+ };
47
+ var TooltipTriggerContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-flex;\n position: relative;\n"])));
48
+ var StyledTooltipContent = (0, _styledComponents["default"])(Tooltip.Content)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n z-index: 2147483647;\n\n animation-duration: 0.2s;\n animation-timing-function: ease-out;\n\n /* Additional optimization to prevent blurry text in certain browsers */\n -webkit-font-smoothing: antialiased;\n transform: translateZ(0) scale(1, 1);\n\n &[data-side=\"top\"] {\n animation-name: slideUp;\n }\n &[data-side=\"bottom\"] {\n animation-name: slideDown;\n }\n &[data-side=\"left\"] {\n animation-name: slideLeft;\n }\n &[data-side=\"right\"] {\n animation-name: slideRight;\n }\n @keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @keyframes slideLeft {\n from {\n opacity: 0;\n transform: translateX(10px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n @keyframes slideRight {\n from {\n opacity: 0;\n transform: translateX(-10px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n"])));
49
+ var TooltipContainer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n padding: 8px 12px;\n border-radius: 4px;\n font-size: ", ";\n font-family: ", ";\n max-width: 242px;\n color: ", ";\n background-color: ", ";\n border-color: ", ";\n"])), _coreTokens["default"].type_scale_01, _coreTokens["default"].type_sans, _coreTokens["default"].color_white, _coreTokens["default"].color_grey_800, _coreTokens["default"].color_grey_800);
50
+ var _default = exports["default"] = DxcTooltip;