@dxc-technology/halstack-react 12.1.0 → 12.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HalstackContext.d.ts +23 -0
- package/HalstackContext.js +31 -21
- package/breadcrumbs/types.d.ts +24 -0
- package/common/coreTokens.d.ts +0 -1
- package/common/coreTokens.js +0 -1
- package/common/variables.d.ts +29 -0
- package/common/variables.js +25 -2
- package/container/types.d.ts +113 -11
- package/contextual-menu/ContextualMenu.js +33 -5
- package/contextual-menu/ContextualMenu.stories.tsx +46 -38
- package/contextual-menu/ItemAction.js +47 -9
- package/contextual-menu/types.d.ts +4 -0
- package/divider/Divider.stories.tsx +2 -1
- package/file-input/FileItem.js +1 -1
- package/icon/Icon.stories.tsx +1 -1
- package/number-input/NumberInput.js +5 -2
- package/number-input/NumberInput.stories.tsx +9 -0
- package/package.json +4 -3
- package/password-input/PasswordInput.js +6 -3
- package/password-input/PasswordInput.stories.tsx +9 -0
- package/resultset-table/ResultsetTable.js +33 -9
- package/resultset-table/ResultsetTable.stories.tsx +1 -1
- package/resultset-table/ResultsetTable.test.js +101 -30
- package/resultset-table/types.d.ts +3 -2
- package/select/Select.js +3 -1
- package/select/Select.stories.tsx +10 -1
- package/text-input/TextInput.js +3 -1
- package/text-input/TextInput.stories.tsx +9 -0
- package/tooltip/Tooltip.accessibility.test.d.ts +1 -0
- package/tooltip/Tooltip.accessibility.test.js +144 -0
- package/tooltip/Tooltip.d.ts +4 -0
- package/tooltip/Tooltip.js +50 -0
- package/tooltip/Tooltip.stories.tsx +111 -0
- package/tooltip/Tooltip.test.d.ts +1 -0
- package/tooltip/Tooltip.test.js +112 -0
- package/tooltip/types.d.ts +16 -0
- package/tooltip/types.js +5 -0
- package/typography/Typography.test.js +23 -0
- package/useTheme.d.ts +23 -0
- package/utils/BaseTypography.js +44 -40
|
@@ -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
|
|
155
|
-
displayValue: "
|
|
156
|
-
|
|
155
|
+
var columnsWithCheckbox = [{
|
|
156
|
+
displayValue: "Id",
|
|
157
|
+
isSortable: true
|
|
158
|
+
}, {
|
|
159
|
+
displayValue: "Checkbox",
|
|
160
|
+
isSortable: false
|
|
157
161
|
}, {
|
|
158
|
-
displayValue: "
|
|
159
|
-
|
|
162
|
+
displayValue: "Name",
|
|
163
|
+
isSortable: false
|
|
160
164
|
}, {
|
|
161
|
-
displayValue: "
|
|
162
|
-
|
|
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: "
|
|
165
|
-
sortValue: "
|
|
181
|
+
displayValue: "002",
|
|
182
|
+
sortValue: "002"
|
|
166
183
|
}, {
|
|
167
|
-
displayValue: "
|
|
168
|
-
|
|
184
|
+
displayValue: /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
|
|
185
|
+
size: "fillParent"
|
|
186
|
+
})
|
|
169
187
|
}, {
|
|
170
|
-
displayValue: "
|
|
171
|
-
sortValue: "OtherValue"
|
|
188
|
+
displayValue: "Louis"
|
|
172
189
|
}, {
|
|
173
|
-
displayValue: ""
|
|
190
|
+
displayValue: "London"
|
|
174
191
|
}], [{
|
|
175
|
-
displayValue: "
|
|
176
|
-
sortValue: "
|
|
192
|
+
displayValue: "003",
|
|
193
|
+
sortValue: "003"
|
|
194
|
+
}, {
|
|
195
|
+
displayValue: /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
|
|
196
|
+
size: "fillParent"
|
|
197
|
+
})
|
|
177
198
|
}, {
|
|
178
|
-
displayValue: "
|
|
179
|
-
sortValue: "OtherValue"
|
|
199
|
+
displayValue: "Lana"
|
|
180
200
|
}, {
|
|
181
|
-
displayValue: "
|
|
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
|
|
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("
|
|
326
|
+
expect(queryByText("7 to 9 of 9")).toBeTruthy();
|
|
302
327
|
});
|
|
303
|
-
test("Resultset table
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
365
|
-
getByRole =
|
|
366
|
-
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);
|
|
@@ -16,7 +16,7 @@ export type Column = {
|
|
|
16
16
|
*/
|
|
17
17
|
isSortable?: boolean;
|
|
18
18
|
};
|
|
19
|
-
|
|
19
|
+
type Cell = {
|
|
20
20
|
/**
|
|
21
21
|
* Value to be displayed in the cell.
|
|
22
22
|
*/
|
|
@@ -27,6 +27,7 @@ export type Row = {
|
|
|
27
27
|
*/
|
|
28
28
|
sortValue?: string;
|
|
29
29
|
};
|
|
30
|
+
export type Row = Cell[];
|
|
30
31
|
type CommonProps = {
|
|
31
32
|
/**
|
|
32
33
|
* An array of objects representing the columns of the table.
|
|
@@ -36,7 +37,7 @@ type CommonProps = {
|
|
|
36
37
|
* An array of objects representing the rows of the table, you will have
|
|
37
38
|
* as many objects as columns in the table.
|
|
38
39
|
*/
|
|
39
|
-
rows: Row[]
|
|
40
|
+
rows: Row[];
|
|
40
41
|
/**
|
|
41
42
|
* Size of the margin to be applied to the component. You can pass an object with 'top',
|
|
42
43
|
* 'bottom', 'left' and 'right' properties in order to specify different margin sizes.
|
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
|
|
414
|
+
const colorsTheme = useTheme();
|
|
406
415
|
|
|
407
416
|
return (
|
|
408
417
|
<>
|
package/text-input/TextInput.js
CHANGED
|
@@ -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,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;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import DxcTooltip from "./Tooltip";
|
|
3
|
+
import ExampleContainer from "../../.storybook/components/ExampleContainer";
|
|
4
|
+
import DxcButton from "../button/Button";
|
|
5
|
+
import { userEvent, within } from "@storybook/test";
|
|
6
|
+
import DxcInset from "../inset/Inset";
|
|
7
|
+
import Title from "../../.storybook/components/Title";
|
|
8
|
+
import DxcFlex from "../flex/Flex";
|
|
9
|
+
|
|
10
|
+
export default {
|
|
11
|
+
title: "Tooltip",
|
|
12
|
+
component: DxcTooltip,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const Tooltip = () => (
|
|
16
|
+
<>
|
|
17
|
+
<Title title="Default tooltip" theme="light" level={4} />
|
|
18
|
+
<ExampleContainer>
|
|
19
|
+
<DxcInset bottom="3rem">
|
|
20
|
+
<DxcTooltip label="Tooltip Test">
|
|
21
|
+
<DxcButton label="Hoverable button" />
|
|
22
|
+
</DxcTooltip>
|
|
23
|
+
</DxcInset>
|
|
24
|
+
</ExampleContainer>
|
|
25
|
+
</>
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const LargeTextWithinTooltip = () => (
|
|
29
|
+
<>
|
|
30
|
+
<Title title="Multiple line tooltip" theme="light" level={4} />
|
|
31
|
+
<ExampleContainer>
|
|
32
|
+
<DxcInset bottom="5rem" left="1rem">
|
|
33
|
+
<DxcTooltip label="Tooltip Test with a large text to display in the container while hovering the component">
|
|
34
|
+
<DxcButton label="Hoverable button" />
|
|
35
|
+
</DxcTooltip>
|
|
36
|
+
</DxcInset>
|
|
37
|
+
</ExampleContainer>
|
|
38
|
+
</>
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const TopTooltip = () => (
|
|
42
|
+
<>
|
|
43
|
+
<Title title="Top tooltip" theme="light" level={4} />
|
|
44
|
+
<ExampleContainer>
|
|
45
|
+
<DxcInset top="3rem">
|
|
46
|
+
<DxcTooltip label="Tooltip Test" position="top">
|
|
47
|
+
<DxcButton label="Hoverable button" />
|
|
48
|
+
</DxcTooltip>
|
|
49
|
+
</DxcInset>
|
|
50
|
+
</ExampleContainer>
|
|
51
|
+
</>
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const LeftTooltip = () => (
|
|
55
|
+
<>
|
|
56
|
+
<Title title="Left tooltip" theme="light" level={4} />
|
|
57
|
+
<ExampleContainer>
|
|
58
|
+
<DxcFlex justifyContent="center">
|
|
59
|
+
<DxcTooltip label="Tooltip Test" position="left">
|
|
60
|
+
<DxcButton label="Hoverable button" />
|
|
61
|
+
</DxcTooltip>
|
|
62
|
+
</DxcFlex>
|
|
63
|
+
</ExampleContainer>
|
|
64
|
+
</>
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const RightTooltip = () => (
|
|
68
|
+
<>
|
|
69
|
+
<Title title="Right tooltip" theme="light" level={4} />
|
|
70
|
+
<ExampleContainer>
|
|
71
|
+
<DxcTooltip label="Tooltip Test" position="right">
|
|
72
|
+
<DxcButton label="Hoverable button" />
|
|
73
|
+
</DxcTooltip>
|
|
74
|
+
</ExampleContainer>
|
|
75
|
+
</>
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
export const Chromatic = Tooltip.bind({});
|
|
79
|
+
Chromatic.play = async ({ canvasElement }) => {
|
|
80
|
+
const canvas = within(canvasElement);
|
|
81
|
+
const buttonList = canvas.getByRole("button");
|
|
82
|
+
await userEvent.hover(buttonList);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const LargeTextTooltip = LargeTextWithinTooltip.bind({});
|
|
86
|
+
LargeTextTooltip.play = async ({ canvasElement }) => {
|
|
87
|
+
const canvas = within(canvasElement);
|
|
88
|
+
const buttonList = canvas.getByRole("button");
|
|
89
|
+
await userEvent.hover(buttonList);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const TooltipPositionTop = TopTooltip.bind({});
|
|
93
|
+
TooltipPositionTop.play = async ({ canvasElement }) => {
|
|
94
|
+
const canvas = within(canvasElement);
|
|
95
|
+
const buttonList = canvas.getByRole("button");
|
|
96
|
+
await userEvent.hover(buttonList);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const TooltipPositionLeft = LeftTooltip.bind({});
|
|
100
|
+
TooltipPositionLeft.play = async ({ canvasElement }) => {
|
|
101
|
+
const canvas = within(canvasElement);
|
|
102
|
+
const buttonList = canvas.getByRole("button");
|
|
103
|
+
await userEvent.hover(buttonList);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export const TooltipPositionRight = RightTooltip.bind({});
|
|
107
|
+
TooltipPositionRight.play = async ({ canvasElement }) => {
|
|
108
|
+
const canvas = within(canvasElement);
|
|
109
|
+
const buttonList = canvas.getByRole("button");
|
|
110
|
+
await userEvent.hover(buttonList);
|
|
111
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|