@dxc-technology/halstack-react 12.0.1 → 12.1.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.
Files changed (71) hide show
  1. package/HalstackContext.d.ts +3 -0
  2. package/HalstackContext.js +5 -1
  3. package/breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  4. package/breadcrumbs/Breadcrumbs.test.js +1 -2
  5. package/card/Card.stories.tsx +1 -1
  6. package/chip/Chip.accessibility.test.js +0 -2
  7. package/chip/Chip.js +21 -10
  8. package/chip/Chip.stories.tsx +43 -79
  9. package/chip/types.d.ts +12 -35
  10. package/common/variables.d.ts +3 -0
  11. package/common/variables.js +4 -1
  12. package/contextual-menu/ContextualMenu.js +24 -4
  13. package/contextual-menu/ContextualMenu.stories.tsx +5 -14
  14. package/contextual-menu/ContextualMenu.test.js +108 -66
  15. package/contextual-menu/GroupItem.js +9 -9
  16. package/contextual-menu/ItemAction.d.ts +1 -1
  17. package/contextual-menu/ItemAction.js +8 -9
  18. package/contextual-menu/SingleItem.d.ts +1 -1
  19. package/contextual-menu/SingleItem.js +14 -14
  20. package/contextual-menu/types.d.ts +9 -6
  21. package/date-input/Calendar.js +46 -30
  22. package/date-input/DateInput.accessibility.test.js +12 -13
  23. package/date-input/DateInput.js +9 -3
  24. package/date-input/DateInput.stories.tsx +5 -6
  25. package/date-input/DateInput.test.js +30 -31
  26. package/date-input/YearPicker.js +9 -4
  27. package/dialog/Dialog.stories.tsx +2 -3
  28. package/dialog/Dialog.test.js +1 -2
  29. package/dropdown/Dropdown.accessibility.test.js +1 -2
  30. package/dropdown/Dropdown.stories.tsx +1 -1
  31. package/dropdown/Dropdown.test.js +1 -2
  32. package/file-input/FileInput.js +1 -3
  33. package/file-input/types.d.ts +0 -4
  34. package/grid/Grid.stories.tsx +3 -1
  35. package/header/Header.stories.tsx +1 -1
  36. package/icon/Icon.js +1 -1
  37. package/main.d.ts +0 -1
  38. package/main.js +0 -1
  39. package/number-input/NumberInput.accessibility.test.js +1 -2
  40. package/number-input/NumberInput.stories.tsx +2 -16
  41. package/number-input/NumberInput.test.js +1 -2
  42. package/package.json +17 -15
  43. package/paginator/Paginator.accessibility.test.js +1 -2
  44. package/paginator/Paginator.test.js +1 -2
  45. package/password-input/PasswordInput.accessibility.test.js +1 -2
  46. package/password-input/PasswordInput.stories.tsx +1 -1
  47. package/password-input/PasswordInput.test.js +1 -2
  48. package/resultset-table/ResultsetTable.accessibility.test.js +1 -2
  49. package/resultset-table/ResultsetTable.stories.tsx +1 -1
  50. package/resultset-table/ResultsetTable.test.js +1 -2
  51. package/select/Select.accessibility.test.js +1 -2
  52. package/select/Select.stories.tsx +1 -1
  53. package/select/Select.test.js +1 -2
  54. package/sidenav/Sidenav.stories.tsx +1 -1
  55. package/slider/Slider.accessibility.test.js +1 -2
  56. package/slider/Slider.test.js +1 -2
  57. package/table/Table.accessibility.test.js +1 -2
  58. package/table/Table.stories.tsx +1 -1
  59. package/table/Table.test.js +1 -2
  60. package/tabs/Tabs.stories.tsx +2 -2
  61. package/tag/Tag.stories.tsx +1 -1
  62. package/text-input/TextInput.accessibility.test.js +1 -2
  63. package/text-input/TextInput.stories.tsx +2 -8
  64. package/text-input/TextInput.test.js +1 -2
  65. package/textarea/Textarea.js +11 -8
  66. package/toggle-group/ToggleGroup.stories.tsx +1 -1
  67. package/typography/Typography.stories.tsx +1 -3
  68. package/useTheme.d.ts +3 -0
  69. package/utils/FocusLock.js +2 -1
  70. package/wizard/Wizard.stories.tsx +1 -1
  71. package/common/fonts.css +0 -2
@@ -60,144 +60,186 @@ var groups = [{
60
60
  label: "Item 8"
61
61
  }];
62
62
  describe("Contextual menu component tests", function () {
63
- test("Default - Renders with correct aria attributes", function () {
64
- var _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
65
- items: items
66
- })),
67
- getAllByRole = _render.getAllByRole,
68
- getByRole = _render.getByRole;
69
- expect(getAllByRole("menuitem").length).toBe(4);
70
- var actions = getAllByRole("button");
71
- expect(actions[0].getAttribute("aria-selected")).toBeTruthy();
72
- expect(getByRole("menu")).toBeTruthy();
73
- });
74
- test("Group - Group items collapse when clicked", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
75
- var _render2, queryByText, getByText, getAllByRole, group1;
63
+ test("Single - Renders with correct aria attributes", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
64
+ var _render, getAllByRole, getByRole, actions;
76
65
  return _regenerator["default"].wrap(function _callee$(_context) {
77
66
  while (1) switch (_context.prev = _context.next) {
78
67
  case 0:
79
- _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
68
+ _render = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
69
+ items: items
70
+ })), getAllByRole = _render.getAllByRole, getByRole = _render.getByRole;
71
+ expect(getAllByRole("menuitem").length).toBe(4);
72
+ actions = getAllByRole("button");
73
+ _context.next = 5;
74
+ return _userEvent["default"].click(actions[0]);
75
+ case 5:
76
+ expect(actions[0].getAttribute("aria-selected")).toBeTruthy();
77
+ expect(getByRole("menu")).toBeTruthy();
78
+ case 7:
79
+ case "end":
80
+ return _context.stop();
81
+ }
82
+ }, _callee);
83
+ })));
84
+ test("Single - An item can appear as selected by default by using the attribute selectedByDefault", function () {
85
+ var test = [{
86
+ label: "Tested item",
87
+ selectedByDefault: true
88
+ }];
89
+ var _render2 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
90
+ items: test
91
+ })),
92
+ getByRole = _render2.getByRole;
93
+ var item = getByRole("button");
94
+ expect(item.getAttribute("aria-selected")).toBeTruthy();
95
+ });
96
+ test("Group - Group items collapse when clicked", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
97
+ var _render3, queryByText, getByText;
98
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
99
+ while (1) switch (_context2.prev = _context2.next) {
100
+ case 0:
101
+ _render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
80
102
  items: groups
81
- })), queryByText = _render2.queryByText, getByText = _render2.getByText, getAllByRole = _render2.getAllByRole;
82
- group1 = getAllByRole("button")[0];
83
- _context.next = 4;
103
+ })), queryByText = _render3.queryByText, getByText = _render3.getByText;
104
+ _context2.next = 3;
84
105
  return _userEvent["default"].click(getByText("Grouped Item 1"));
85
- case 4:
106
+ case 3:
86
107
  expect(getByText("Item 1")).toBeTruthy();
87
108
  expect(getByText("Grouped Item 2")).toBeTruthy();
88
- _context.next = 8;
109
+ _context2.next = 7;
89
110
  return _userEvent["default"].click(getByText("Grouped Item 2"));
90
- case 8:
111
+ case 7:
91
112
  expect(getByText("Item 2")).toBeTruthy();
92
113
  expect(getByText("Item 3")).toBeTruthy();
93
- _context.next = 12;
114
+ _context2.next = 11;
94
115
  return _userEvent["default"].click(getByText("Grouped Item 1"));
95
- case 12:
116
+ case 11:
96
117
  expect(queryByText("Item 1")).toBeFalsy();
97
118
  expect(queryByText("Item 2")).toBeFalsy();
98
119
  expect(queryByText("Item 3")).toBeFalsy();
99
- case 15:
120
+ case 14:
100
121
  case "end":
101
- return _context.stop();
122
+ return _context2.stop();
102
123
  }
103
- }, _callee);
124
+ }, _callee2);
104
125
  })));
105
- test("Group - Renders with correct aria attributes", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
106
- var _render3, getByText, getAllByRole, group1, actions;
107
- return _regenerator["default"].wrap(function _callee2$(_context2) {
108
- while (1) switch (_context2.prev = _context2.next) {
126
+ test("Group - Renders with correct aria attributes", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
127
+ var _render4, getAllByRole, group1, optionToBeClicked;
128
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
129
+ while (1) switch (_context3.prev = _context3.next) {
109
130
  case 0:
110
- _render3 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
131
+ _render4 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
111
132
  items: groups
112
- })), getByText = _render3.getByText, getAllByRole = _render3.getAllByRole;
133
+ })), getAllByRole = _render4.getAllByRole;
113
134
  group1 = getAllByRole("button")[0];
114
- _context2.next = 4;
135
+ _context3.next = 4;
115
136
  return _userEvent["default"].click(group1);
116
137
  case 4:
117
138
  expect(group1.getAttribute("aria-expanded")).toBeTruthy();
118
139
  expect(group1.getAttribute("aria-controls")).toBe(getAllByRole("list")[0].id);
119
- _context2.next = 8;
120
- return _userEvent["default"].click(getByText("Grouped Item 2"));
140
+ _context3.next = 8;
141
+ return _userEvent["default"].click(getAllByRole("button")[2]);
121
142
  case 8:
122
- _context2.next = 10;
123
- return _userEvent["default"].click(getByText("Grouped Item 3"));
143
+ _context3.next = 10;
144
+ return _userEvent["default"].click(getAllByRole("button")[6]);
124
145
  case 10:
125
146
  expect(getAllByRole("menuitem").length).toBe(10);
126
- actions = getAllByRole("button");
127
- expect(actions[4].getAttribute("aria-selected")).toBeTruthy();
128
- case 13:
147
+ optionToBeClicked = getAllByRole("button")[4];
148
+ _context3.next = 14;
149
+ return _userEvent["default"].click(optionToBeClicked);
150
+ case 14:
151
+ expect(optionToBeClicked.getAttribute("aria-selected")).toBeTruthy();
152
+ case 15:
129
153
  case "end":
130
- return _context2.stop();
154
+ return _context3.stop();
131
155
  }
132
- }, _callee2);
156
+ }, _callee3);
133
157
  })));
134
- test("Group - Collapsed groups render as selected when containing a selected item", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
135
- var _render4, getAllByRole, group1, group2, item;
136
- return _regenerator["default"].wrap(function _callee3$(_context3) {
137
- while (1) switch (_context3.prev = _context3.next) {
158
+ test("Group - A grouped item, selected by default, must be visible (expanded group) in the first render of the component", function () {
159
+ var test = [{
160
+ label: "Grouped item",
161
+ items: [{
162
+ label: "Tested item",
163
+ selectedByDefault: true
164
+ }]
165
+ }];
166
+ var _render5 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
167
+ items: test
168
+ })),
169
+ getByText = _render5.getByText,
170
+ getAllByRole = _render5.getAllByRole;
171
+ expect(getByText("Tested item")).toBeTruthy();
172
+ expect(getAllByRole("button")[1].getAttribute("aria-selected")).toBeTruthy();
173
+ });
174
+ test("Group - Collapsed groups render as selected when containing a selected item", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
175
+ var _render6, getAllByRole, group1, group2, item;
176
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
177
+ while (1) switch (_context4.prev = _context4.next) {
138
178
  case 0:
139
- _render4 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
179
+ _render6 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
140
180
  items: groups
141
- })), getAllByRole = _render4.getAllByRole;
181
+ })), getAllByRole = _render6.getAllByRole;
142
182
  group1 = getAllByRole("button")[0];
143
- _context3.next = 4;
183
+ _context4.next = 4;
144
184
  return _userEvent["default"].click(group1);
145
185
  case 4:
146
186
  group2 = getAllByRole("button")[2];
147
- _context3.next = 7;
187
+ _context4.next = 7;
148
188
  return _userEvent["default"].click(group2);
149
189
  case 7:
150
190
  item = getAllByRole("button")[3];
151
- _context3.next = 10;
191
+ _context4.next = 10;
152
192
  return _userEvent["default"].click(item);
153
193
  case 10:
154
194
  expect(item.getAttribute("aria-selected")).toBeTruthy();
155
195
  expect(group1.getAttribute("aria-selected")).toBe("false");
156
196
  expect(group2.getAttribute("aria-selected")).toBe("false");
157
- _context3.next = 15;
197
+ _context4.next = 15;
158
198
  return _userEvent["default"].click(group2);
159
199
  case 15:
160
200
  expect(group2.getAttribute("aria-selected")).toBe("true");
161
- _context3.next = 18;
201
+ _context4.next = 18;
162
202
  return _userEvent["default"].click(group1);
163
203
  case 18:
164
204
  expect(group1.getAttribute("aria-selected")).toBe("true");
165
205
  case 19:
166
206
  case "end":
167
- return _context3.stop();
207
+ return _context4.stop();
168
208
  }
169
- }, _callee3);
209
+ }, _callee4);
170
210
  })));
171
- test("Sections - Renders with correct aria attributes", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
172
- var _render5, getAllByRole, actions;
173
- return _regenerator["default"].wrap(function _callee4$(_context4) {
174
- while (1) switch (_context4.prev = _context4.next) {
211
+ test("Sections - Renders with correct aria attributes", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
212
+ var _render7, getAllByRole, actions, section;
213
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
214
+ while (1) switch (_context5.prev = _context5.next) {
175
215
  case 0:
176
- _render5 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
216
+ _render7 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
177
217
  items: sections
178
- })), getAllByRole = _render5.getAllByRole;
218
+ })), getAllByRole = _render7.getAllByRole;
179
219
  expect(getAllByRole("menuitem").length).toBe(6);
180
220
  actions = getAllByRole("button");
181
- _context4.next = 5;
221
+ _context5.next = 5;
182
222
  return _userEvent["default"].click(actions[0]);
183
223
  case 5:
184
224
  expect(actions[0].getAttribute("aria-selected")).toBeTruthy();
185
225
  expect(getAllByRole("group").length).toBe(2);
186
- case 7:
226
+ section = getAllByRole("group")[0];
227
+ expect(section.getAttribute("aria-labelledby")).toBe("Team repositories");
228
+ case 9:
187
229
  case "end":
188
- return _context4.stop();
230
+ return _context5.stop();
189
231
  }
190
- }, _callee4);
232
+ }, _callee5);
191
233
  })));
192
234
  test("The onSelect event from each item is called correctly", function () {
193
235
  var test = [{
194
236
  label: "Tested item",
195
237
  onSelect: jest.fn()
196
238
  }];
197
- var _render6 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
239
+ var _render8 = (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ContextualMenu["default"], {
198
240
  items: test
199
241
  })),
200
- getByRole = _render6.getByRole;
242
+ getByRole = _render8.getByRole;
201
243
  var item = getByRole("button");
202
244
  _react2.fireEvent.click(item);
203
245
  expect(test[0].onSelect).toHaveBeenCalled();
@@ -23,26 +23,26 @@ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return
23
23
  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; }
24
24
  var isGroupSelected = function isGroupSelected(items, selectedItemId) {
25
25
  return items.some(function (item) {
26
- return "id" in item ? item.id === selectedItemId : isGroupSelected(item.items, selectedItemId);
26
+ if ("items" in item) return isGroupSelected(item.items, selectedItemId);else if (selectedItemId !== -1) return item.id === selectedItemId;else return item.selectedByDefault;
27
27
  });
28
28
  };
29
29
  var GroupItem = function GroupItem(_ref) {
30
30
  var items = _ref.items,
31
31
  props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
32
32
  var groupMenuId = "group-menu-".concat(props.label);
33
- var _useState = (0, _react.useState)(false),
33
+ var _useContext = (0, _react.useContext)(_ContextualMenu.ContextualMenuContext),
34
+ selectedItemId = _useContext.selectedItemId;
35
+ var groupSelected = (0, _react.useMemo)(function () {
36
+ return isGroupSelected(items, selectedItemId);
37
+ }, [items, selectedItemId]);
38
+ var _useState = (0, _react.useState)(groupSelected && selectedItemId === -1 ? true : false),
34
39
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
35
40
  isOpen = _useState2[0],
36
41
  setIsOpen = _useState2[1];
37
- var _useContext = (0, _react.useContext)(_ContextualMenu.ContextualMenuContext),
38
- selectedItemId = _useContext.selectedItemId;
39
- var selected = (0, _react.useMemo)(function () {
40
- return !isOpen && isGroupSelected(items, selectedItemId);
41
- }, [isOpen, items, selectedItemId]);
42
42
  return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_ItemAction["default"], (0, _extends2["default"])({
43
43
  "aria-controls": groupMenuId,
44
44
  "aria-expanded": isOpen ? true : undefined,
45
- "aria-selected": selected,
45
+ "aria-selected": groupSelected && !isOpen,
46
46
  collapseIcon: isOpen ? /*#__PURE__*/_react["default"].createElement(_Icon["default"], {
47
47
  icon: "filled_expand_less"
48
48
  }) : /*#__PURE__*/_react["default"].createElement(_Icon["default"], {
@@ -53,7 +53,7 @@ var GroupItem = function GroupItem(_ref) {
53
53
  return !isOpen;
54
54
  });
55
55
  },
56
- selected: selected
56
+ selected: groupSelected && !isOpen
57
57
  }, props)), isOpen && /*#__PURE__*/_react["default"].createElement(ItemsList, {
58
58
  id: groupMenuId
59
59
  }, items.map(function (item) {
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
2
  import { ItemActionProps } from "./types";
3
- declare const ItemAction: ({ badge, collapseIcon, icon, label, depthLevel, selected, ...props }: ItemActionProps) => React.JSX.Element;
3
+ declare const ItemAction: ({ badge, collapseIcon, icon, label, depthLevel, ...props }: ItemActionProps) => React.JSX.Element;
4
4
  export default ItemAction;
@@ -12,23 +12,21 @@ var _react = _interopRequireDefault(require("react"));
12
12
  var _styledComponents = _interopRequireDefault(require("styled-components"));
13
13
  var _coreTokens = _interopRequireDefault(require("../common/coreTokens"));
14
14
  var _Icon = _interopRequireDefault(require("../icon/Icon"));
15
- var _templateObject, _templateObject2, _templateObject3;
16
- var _excluded = ["badge", "collapseIcon", "icon", "label", "depthLevel", "selected"];
15
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4;
16
+ var _excluded = ["badge", "collapseIcon", "icon", "label", "depthLevel"];
17
17
  var ItemAction = function ItemAction(_ref) {
18
18
  var badge = _ref.badge,
19
19
  collapseIcon = _ref.collapseIcon,
20
20
  icon = _ref.icon,
21
21
  label = _ref.label,
22
22
  depthLevel = _ref.depthLevel,
23
- selected = _ref.selected,
24
23
  props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
25
24
  var modifiedBadge = badge && /*#__PURE__*/_react["default"].cloneElement(badge, {
26
25
  size: "small"
27
26
  });
28
27
  return /*#__PURE__*/_react["default"].createElement(Action, (0, _extends2["default"])({
29
- depthLevel: depthLevel,
30
- selected: selected
31
- }, props), /*#__PURE__*/_react["default"].createElement(Label, null, collapseIcon, icon && depthLevel === 0 && (typeof icon === "string" ? /*#__PURE__*/_react["default"].createElement(_Icon["default"], {
28
+ depthLevel: depthLevel
29
+ }, props), /*#__PURE__*/_react["default"].createElement(Label, null, collapseIcon, icon && depthLevel === 0 && /*#__PURE__*/_react["default"].createElement(Icon, null, typeof icon === "string" ? /*#__PURE__*/_react["default"].createElement(_Icon["default"], {
32
30
  icon: icon
33
31
  }) : icon), /*#__PURE__*/_react["default"].createElement(Text, {
34
32
  onMouseEnter: function onMouseEnter(event) {
@@ -37,7 +35,7 @@ var ItemAction = function ItemAction(_ref) {
37
35
  }
38
36
  }, label)), modifiedBadge);
39
37
  };
40
- var Action = _styledComponents["default"].button(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n border: none;\n border-radius: 4px;\n width: 100%;\n padding: ", ";\n box-shadow: inset 0 0 0 2px transparent;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ", ";\n ", ";\n cursor: pointer;\n overflow: hidden;\n\n &:hover {\n ", ";\n }\n &:active {\n ", ";\n }\n &:focus {\n outline: 2px solid ", ";\n outline-offset: -1px;\n }\n span::before {\n display: flex;\n font-size: 16px;\n }\n svg {\n height: 16px;\n width: 16px;\n }\n"])), function (props) {
38
+ var Action = _styledComponents["default"].button(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n border: none;\n border-radius: 4px;\n width: 100%;\n padding: ", ";\n box-shadow: inset 0 0 0 2px transparent;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ", ";\n ", ";\n cursor: pointer;\n overflow: hidden;\n\n &:hover {\n ", ";\n }\n &:active {\n ", ";\n }\n &:focus {\n outline: 2px solid ", ";\n outline-offset: -1px;\n }\n"])), function (props) {
41
39
  return "".concat(_coreTokens["default"].spacing_4, " ").concat(_coreTokens["default"].spacing_8, " ").concat(_coreTokens["default"].spacing_4, " ", "\n calc(".concat(_coreTokens["default"].spacing_8, " + (").concat(_coreTokens["default"].spacing_24, " * ").concat(props.depthLevel, "))\n "), ";");
42
40
  }, _coreTokens["default"].spacing_16, function (props) {
43
41
  return props.selected ? "background-color: ".concat(_coreTokens["default"].color_purple_100, "; font-weight: ").concat(_coreTokens["default"].type_semibold, ";") : "background-color: ".concat(_coreTokens["default"].color_transparent);
@@ -46,6 +44,7 @@ var Action = _styledComponents["default"].button(_templateObject || (_templateOb
46
44
  }, function (props) {
47
45
  return props.selected ? "background-color: ".concat(_coreTokens["default"].color_purple_200, ";") : "background-color: ".concat(_coreTokens["default"].color_grey_100, ";");
48
46
  }, _coreTokens["default"].color_blue_600);
49
- var Label = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n gap: ", ";\n overflow: hidden;\n"])), _coreTokens["default"].spacing_8);
50
- var Text = _styledComponents["default"].span(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-family: ", ";\n font-size: ", ";\n line-height: 24px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n"])), _coreTokens["default"].color_grey_900, _coreTokens["default"].type_sans, _coreTokens["default"].type_scale_02);
47
+ var Icon = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n font-size: 16px;\n\n svg {\n height: 16px;\n width: 16px;\n }\n"])));
48
+ var Label = _styledComponents["default"].span(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n gap: ", ";\n overflow: hidden;\n"])), _coreTokens["default"].spacing_8);
49
+ var Text = _styledComponents["default"].span(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-family: ", ";\n font-size: ", ";\n line-height: 24px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n"])), _coreTokens["default"].color_grey_900, _coreTokens["default"].type_sans, _coreTokens["default"].type_scale_02);
51
50
  var _default = exports["default"] = ItemAction;
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
2
  import { SingleItemProps } from "./types";
3
- declare const SingleItem: ({ badge, icon, id, label, depthLevel, onSelect }: SingleItemProps) => React.JSX.Element;
3
+ declare const SingleItem: ({ id, onSelect, selectedByDefault, ...props }: SingleItemProps) => React.JSX.Element;
4
4
  export default SingleItem;
@@ -6,18 +6,19 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports["default"] = void 0;
9
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
9
11
  var _react = _interopRequireWildcard(require("react"));
10
12
  var _ContextualMenu = require("./ContextualMenu");
11
13
  var _ItemAction = _interopRequireDefault(require("./ItemAction"));
14
+ var _excluded = ["id", "onSelect", "selectedByDefault"];
12
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); }
13
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; }
14
17
  var SingleItem = function SingleItem(_ref) {
15
- var badge = _ref.badge,
16
- icon = _ref.icon,
17
- id = _ref.id,
18
- label = _ref.label,
19
- depthLevel = _ref.depthLevel,
20
- onSelect = _ref.onSelect;
18
+ var id = _ref.id,
19
+ onSelect = _ref.onSelect,
20
+ selectedByDefault = _ref.selectedByDefault,
21
+ props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
21
22
  var _useContext = (0, _react.useContext)(_ContextualMenu.ContextualMenuContext),
22
23
  selectedItemId = _useContext.selectedItemId,
23
24
  setSelectedItemId = _useContext.setSelectedItemId;
@@ -25,14 +26,13 @@ var SingleItem = function SingleItem(_ref) {
25
26
  setSelectedItemId(id);
26
27
  onSelect === null || onSelect === void 0 ? void 0 : onSelect();
27
28
  };
28
- return /*#__PURE__*/_react["default"].createElement(_ItemAction["default"], {
29
- "aria-selected": selectedItemId === id,
30
- badge: badge,
31
- icon: icon,
32
- label: label,
33
- depthLevel: depthLevel,
29
+ (0, _react.useEffect)(function () {
30
+ if (selectedItemId === -1 && selectedByDefault) setSelectedItemId(id);
31
+ }, [selectedItemId, selectedByDefault, id]);
32
+ return /*#__PURE__*/_react["default"].createElement(_ItemAction["default"], (0, _extends2["default"])({
33
+ "aria-selected": selectedItemId === -1 ? selectedByDefault : selectedItemId === id,
34
34
  onClick: handleClick,
35
- selected: selectedItemId === id
36
- });
35
+ selected: selectedItemId === -1 ? selectedByDefault : selectedItemId === id
36
+ }, props));
37
37
  };
38
38
  var _default = exports["default"] = SingleItem;
@@ -1,16 +1,16 @@
1
1
  import React from "react";
2
2
  type SVG = React.ReactNode & React.SVGProps<SVGSVGElement>;
3
- type Item = {
3
+ type CommonItemProps = {
4
4
  badge?: React.ReactElement;
5
5
  icon?: string | SVG;
6
6
  label: string;
7
+ };
8
+ type Item = CommonItemProps & {
7
9
  onSelect?: () => void;
10
+ selectedByDefault?: boolean;
8
11
  };
9
- type GroupItem = {
10
- badge?: React.ReactElement;
11
- icon?: string | SVG;
12
+ type GroupItem = CommonItemProps & {
12
13
  items: (Item | GroupItem)[];
13
- label: string;
14
14
  };
15
15
  type Section = {
16
16
  items: (Item | GroupItem)[];
@@ -45,9 +45,12 @@ type MenuItemProps = {
45
45
  item: ItemWithId | GroupItemWithId;
46
46
  depthLevel?: number;
47
47
  };
48
- type ItemActionProps = React.ButtonHTMLAttributes<HTMLButtonElement> & Item & {
48
+ type ItemActionProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
49
+ badge?: Item["badge"];
49
50
  collapseIcon?: React.ReactNode;
50
51
  depthLevel: number;
52
+ icon?: Item["icon"];
53
+ label: Item["label"];
51
54
  selected: boolean;
52
55
  };
53
56
  type ContextualMenuContextProps = {
@@ -11,8 +11,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var _styledComponents = _interopRequireDefault(require("styled-components"));
13
13
  var _useTranslatedLabels = _interopRequireDefault(require("../useTranslatedLabels"));
14
- var _Flex = _interopRequireDefault(require("../flex/Flex"));
15
- var _templateObject, _templateObject2, _templateObject3, _templateObject4;
14
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
16
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); }
17
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; }
18
17
  var getDays = function getDays(innerDate) {
@@ -49,12 +48,20 @@ var getDateToFocus = function getDateToFocus(selectedDate, innerDate, today) {
49
48
  var isDaySelected = function isDaySelected(date, selectedDate) {
50
49
  return (selectedDate === null || selectedDate === void 0 ? void 0 : selectedDate.get("month")) === date.month && (selectedDate === null || selectedDate === void 0 ? void 0 : selectedDate.get("year")) === date.year && (selectedDate === null || selectedDate === void 0 ? void 0 : selectedDate.get("date")) === date.day;
51
50
  };
51
+ var divideDaysIntoWeeks = function divideDaysIntoWeeks(data, weekSize) {
52
+ return Array.from({
53
+ length: Math.ceil(data.length / weekSize)
54
+ }, function (_, rowIndex) {
55
+ return data.slice(rowIndex * weekSize, (rowIndex + 1) * weekSize);
56
+ });
57
+ };
52
58
  var Calendar = function Calendar(_ref) {
53
59
  var selectedDate = _ref.selectedDate,
54
60
  innerDate = _ref.innerDate,
55
61
  onInnerDateChange = _ref.onInnerDateChange,
56
62
  onDaySelect = _ref.onDaySelect,
57
63
  today = _ref.today;
64
+ var id = (0, _react.useId)();
58
65
  var _useState = (0, _react.useState)(getDateToFocus(selectedDate, innerDate, today)),
59
66
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
60
67
  dateToFocus = _useState2[0],
@@ -88,7 +95,7 @@ var Calendar = function Calendar(_ref) {
88
95
  (0, _react.useEffect)(function () {
89
96
  if (isFocusable) {
90
97
  var _document$getElementB;
91
- (_document$getElementB = document.getElementById("day_".concat(dateToFocus.get("date"), "_month").concat(dateToFocus.get("month")))) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.focus();
98
+ (_document$getElementB = document.getElementById("".concat(id, "_day_").concat(dateToFocus.get("date"), "_month").concat(dateToFocus.get("month")))) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.focus();
92
99
  setIsFocusable(false);
93
100
  }
94
101
  }, [dateToFocus, isFocusable]);
@@ -146,33 +153,40 @@ var Calendar = function Calendar(_ref) {
146
153
  break;
147
154
  }
148
155
  };
149
- return /*#__PURE__*/_react["default"].createElement(CalendarContainer, null, /*#__PURE__*/_react["default"].createElement(_Flex["default"], {
150
- alignItems: "center",
151
- justifyContent: "space-between"
156
+ return /*#__PURE__*/_react["default"].createElement(CalendarContainer, {
157
+ role: "grid"
158
+ }, /*#__PURE__*/_react["default"].createElement(CalendarHeaderRow, {
159
+ role: "row"
152
160
  }, weekDays.map(function (weekDay) {
153
161
  return /*#__PURE__*/_react["default"].createElement(WeekHeaderCell, {
154
- key: weekDay
162
+ key: weekDay,
163
+ role: "columnheader"
155
164
  }, weekDay);
156
- })), /*#__PURE__*/_react["default"].createElement(DayCellsContainer, {
157
- onBlur: handleOnBlur
158
- }, dayCells.map(function (date, index) {
159
- return /*#__PURE__*/_react["default"].createElement(DayCell, {
160
- onKeyDown: function onKeyDown(event) {
161
- return handleDayKeyboardEvent(event, date);
162
- },
163
- "aria-label": date.day,
164
- id: "day_".concat(date.day, "_month").concat(date.month),
165
- key: "day_".concat(index),
166
- onClick: function onClick() {
167
- return onDateClickHandler(date);
168
- },
169
- selected: isDaySelected(date, selectedDate),
170
- actualMonth: date.month === innerDate.get("month"),
171
- autoFocus: date.day === dateToFocus.get("date") && date.month === dateToFocus.get("month"),
172
- "aria-selected": isDaySelected(date, selectedDate),
173
- tabIndex: date.day === dateToFocus.get("date") && date.month === dateToFocus.get("month") ? 0 : -1,
174
- isCurrentDay: today.get("date") === date.day && today.get("month") === innerDate.get("month") && today.get("month") === date.month && today.get("year") === innerDate.get("year")
175
- }, date.day);
165
+ })), /*#__PURE__*/_react["default"].createElement(MonthContainer, {
166
+ onBlur: handleOnBlur,
167
+ role: "rowgroup"
168
+ }, divideDaysIntoWeeks(dayCells, weekDays.length).map(function (week, rowIndex) {
169
+ return /*#__PURE__*/_react["default"].createElement(WeekContainer, {
170
+ key: "".concat(id, "_week_").concat(rowIndex),
171
+ role: "row"
172
+ }, week.map(function (date, index) {
173
+ return /*#__PURE__*/_react["default"].createElement(DayCellButton, {
174
+ id: "".concat(id, "_day_").concat(date.day, "_month").concat(date.month),
175
+ role: "gridcell",
176
+ "aria-selected": isDaySelected(date, selectedDate),
177
+ onKeyDown: function onKeyDown(event) {
178
+ return handleDayKeyboardEvent(event, date);
179
+ },
180
+ onClick: function onClick() {
181
+ return onDateClickHandler(date);
182
+ },
183
+ selected: isDaySelected(date, selectedDate),
184
+ actualMonth: date.month === innerDate.get("month"),
185
+ autoFocus: date.day === dateToFocus.get("date") && date.month === dateToFocus.get("month"),
186
+ tabIndex: date.day === dateToFocus.get("date") && date.month === dateToFocus.get("month") ? 0 : -1,
187
+ isCurrentDay: today.get("date") === date.day && today.get("month") === innerDate.get("month") && today.get("month") === date.month && today.get("year") === innerDate.get("year")
188
+ }, date.day);
189
+ }));
176
190
  })));
177
191
  };
178
192
  var CalendarContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: center;\n padding: 0px 8px 8px 8px;\n width: 292px;\n font-family: ", ";\n font-size: ", ";\n color: ", ";\n font-weight: ", ";\n"])), function (props) {
@@ -184,9 +198,11 @@ var CalendarContainer = _styledComponents["default"].div(_templateObject || (_te
184
198
  }, function (props) {
185
199
  return props.theme.dateInput.pickerFontWeight;
186
200
  });
187
- var WeekHeaderCell = _styledComponents["default"].span(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n"])));
188
- var DayCellsContainer = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n display: flex;\n gap: 4px;\n flex-wrap: wrap;\n justify-content: space-between;\n"])));
189
- var DayCell = _styledComponents["default"].button(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-flex;\n justify-content: center;\n align-items: center;\n width: 36px;\n height: 36px;\n padding: 0;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n font-family: ", ";\n font-size: ", ";\n color: ", ";\n font-weight: ", ";\n\n &:focus {\n outline: ", " solid 2px;\n }\n &:hover {\n background-color: ", ";\n color: ", ";\n }\n &:active {\n background-color: ", ";\n color: ", ";\n }\n\n ", "\n background-color: ", ";\n color: ", ";\n"])), function (props) {
201
+ var CalendarHeaderRow = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n"])));
202
+ var WeekHeaderCell = _styledComponents["default"].span(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n"])));
203
+ var MonthContainer = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n display: flex;\n gap: 4px;\n flex-direction: column;\n justify-content: space-between;\n"])));
204
+ var WeekContainer = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n box-sizing: border-box;\n display: flex;\n gap: 4px;\n justify-content: space-between;\n"])));
205
+ var DayCellButton = _styledComponents["default"].button(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n display: inline-flex;\n justify-content: center;\n align-items: center;\n width: 36px;\n height: 36px;\n padding: 0;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n font-family: ", ";\n font-size: ", ";\n color: ", ";\n font-weight: ", ";\n\n &:focus {\n outline: ", " solid 2px;\n }\n &:hover {\n background-color: ", ";\n color: ", ";\n }\n &:active {\n background-color: ", ";\n color: ", ";\n }\n\n ", "\n background-color: ", ";\n color: ", ";\n"])), function (props) {
190
206
  return props.theme.dateInput.pickerFontFamily;
191
207
  }, function (props) {
192
208
  return props.theme.dateInput.pickerFontSize;
@@ -10,17 +10,6 @@ var _react2 = require("@testing-library/react");
10
10
  var _axeHelper = require("../../test/accessibility/axe-helper.js");
11
11
  var _DateInput = _interopRequireDefault(require("./DateInput"));
12
12
  var _disabledRules = require("../../test/accessibility/rules/specific/date-input/disabledRules.js");
13
- // TODO: REMOVE
14
-
15
- var disabledRules = {
16
- rules: _disabledRules.disabledRules.reduce(function (rulesObj, rule) {
17
- rulesObj[rule] = {
18
- enabled: false
19
- };
20
- return rulesObj;
21
- }, {})
22
- };
23
-
24
13
  // Mocking DOMRect for Radix Primitive Popover
25
14
  global.globalThis = global;
26
15
  global.DOMRect = {
@@ -41,7 +30,7 @@ global.ResizeObserver = /*#__PURE__*/function () {
41
30
  function ResizeObserver() {
42
31
  (0, _classCallCheck2["default"])(this, ResizeObserver);
43
32
  }
44
- (0, _createClass2["default"])(ResizeObserver, [{
33
+ return (0, _createClass2["default"])(ResizeObserver, [{
45
34
  key: "observe",
46
35
  value: function observe() {}
47
36
  }, {
@@ -51,8 +40,18 @@ global.ResizeObserver = /*#__PURE__*/function () {
51
40
  key: "disconnect",
52
41
  value: function disconnect() {}
53
42
  }]);
54
- return ResizeObserver;
55
43
  }();
44
+
45
+ // TODO: REMOVE
46
+
47
+ var disabledRules = {
48
+ rules: _disabledRules.disabledRules.reduce(function (rulesObj, rule) {
49
+ rulesObj[rule] = {
50
+ enabled: false
51
+ };
52
+ return rulesObj;
53
+ }, {})
54
+ };
56
55
  describe("DateInput component accessibility tests", function () {
57
56
  it("Should not have basic accessibility issues", /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
58
57
  var _render, baseElement, results;