@pingux/astro 1.0.1 → 1.1.0-alpha.11

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 (66) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/lib/cjs/components/AccordionGridGroup/AccordionGridGroup.test.js +24 -0
  3. package/lib/cjs/components/AccordionGridItem/AccordionGridItemBody.js +1 -1
  4. package/lib/cjs/components/AccordionGridItem/AccordionGridItemHeader.js +1 -1
  5. package/lib/cjs/components/AccordionGroup/AccordionGroup.test.js +33 -1
  6. package/lib/cjs/components/AccordionItem/AccordionItem.js +5 -4
  7. package/lib/cjs/components/Button/Button.js +1 -2
  8. package/lib/cjs/components/Button/Button.stories.js +2 -1
  9. package/lib/cjs/components/Button/Button.test.js +2 -1
  10. package/lib/cjs/components/ColorField/ColorField.js +1 -0
  11. package/lib/cjs/components/ComboBoxField/ComboBoxField.js +7 -0
  12. package/lib/cjs/components/ComboBoxField/ComboBoxField.stories.js +25 -1
  13. package/lib/cjs/components/ComboBoxField/ComboBoxField.test.js +44 -0
  14. package/lib/cjs/components/FileInputField/FileItem.js +2 -1
  15. package/lib/cjs/components/IconButton/IconButton.js +1 -1
  16. package/lib/cjs/components/IconButton/IconButton.stories.js +8 -17
  17. package/lib/cjs/components/IconButton/IconButton.test.js +4 -5
  18. package/lib/cjs/components/ImageUploadField/ImagePreviewButton.js +2 -1
  19. package/lib/cjs/components/List/List.js +3 -0
  20. package/lib/cjs/components/List/List.stories.js +7 -2
  21. package/lib/cjs/components/ListBox/ListBox.js +3 -6
  22. package/lib/cjs/components/ListBox/ListBox.test.js +2 -0
  23. package/lib/cjs/components/ListBox/Option.js +6 -0
  24. package/lib/cjs/components/ListView/ListView.stories.js +580 -39
  25. package/lib/cjs/components/Messages/Message.js +2 -2
  26. package/lib/cjs/components/MultivaluesField/MultivaluesField.js +3 -2
  27. package/lib/cjs/components/OverlayPanel/OverlayPanel.stories.js +15 -14
  28. package/lib/cjs/components/PopoverContainer/PopoverContainer.test.js +15 -0
  29. package/lib/cjs/components/TextArea/TextArea.js +5 -1
  30. package/lib/cjs/components/TooltipTrigger/TooltipTrigger.stories.js +45 -2
  31. package/lib/cjs/styles/variants/accordion.js +2 -2
  32. package/lib/cjs/styles/variants/boxes.js +2 -1
  33. package/lib/cjs/styles/variants/buttons.js +47 -2
  34. package/lib/components/AccordionGridGroup/AccordionGridGroup.test.js +23 -1
  35. package/lib/components/AccordionGridItem/AccordionGridItemBody.js +1 -1
  36. package/lib/components/AccordionGridItem/AccordionGridItemHeader.js +1 -1
  37. package/lib/components/AccordionGroup/AccordionGroup.test.js +30 -1
  38. package/lib/components/AccordionItem/AccordionItem.js +6 -5
  39. package/lib/components/Button/Button.js +2 -3
  40. package/lib/components/Button/Button.stories.js +2 -1
  41. package/lib/components/Button/Button.test.js +2 -1
  42. package/lib/components/ColorField/ColorField.js +1 -0
  43. package/lib/components/ComboBoxField/ComboBoxField.js +7 -0
  44. package/lib/components/ComboBoxField/ComboBoxField.stories.js +21 -0
  45. package/lib/components/ComboBoxField/ComboBoxField.test.js +35 -0
  46. package/lib/components/FileInputField/FileItem.js +2 -1
  47. package/lib/components/IconButton/IconButton.js +1 -1
  48. package/lib/components/IconButton/IconButton.stories.js +7 -13
  49. package/lib/components/IconButton/IconButton.test.js +4 -5
  50. package/lib/components/ImageUploadField/ImagePreviewButton.js +2 -1
  51. package/lib/components/List/List.js +2 -0
  52. package/lib/components/List/List.stories.js +6 -2
  53. package/lib/components/ListBox/ListBox.js +3 -5
  54. package/lib/components/ListBox/ListBox.test.js +2 -0
  55. package/lib/components/ListBox/Option.js +6 -0
  56. package/lib/components/ListView/ListView.stories.js +577 -39
  57. package/lib/components/Messages/Message.js +2 -2
  58. package/lib/components/MultivaluesField/MultivaluesField.js +3 -2
  59. package/lib/components/OverlayPanel/OverlayPanel.stories.js +7 -5
  60. package/lib/components/PopoverContainer/PopoverContainer.test.js +16 -1
  61. package/lib/components/TextArea/TextArea.js +5 -1
  62. package/lib/components/TooltipTrigger/TooltipTrigger.stories.js +33 -1
  63. package/lib/styles/variants/accordion.js +2 -2
  64. package/lib/styles/variants/boxes.js +1 -1
  65. package/lib/styles/variants/buttons.js +46 -2
  66. package/package.json +1 -1
@@ -22,8 +22,6 @@ var _collections = require("@react-stately/collections");
22
22
 
23
23
  var _hooks = require("../../hooks");
24
24
 
25
- var _Button = _interopRequireDefault(require("../Button/Button"));
26
-
27
25
  var _OverlayPanel = _interopRequireDefault(require("./OverlayPanel"));
28
26
 
29
27
  var _index = require("../../index");
@@ -66,15 +64,18 @@ var Default = function Default(_ref) {
66
64
  var state = (0, _hooks.useOverlayPanelState)();
67
65
  return (// Application must be wrapped in an OverlayProvider so that it can be hidden from screen
68
66
  // readers when an overlay opens.
69
- (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.Text, null, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur."), (0, _react2.jsx)("br", null), (0, _react2.jsx)(_Button["default"], {
67
+ (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.Text, null, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur."), (0, _react2.jsx)("br", null), (0, _react2.jsx)(_index.Button, {
70
68
  onPress: state.open
71
69
  }, "Open Panel"), (0, _react2.jsx)(_OverlayPanel["default"], (0, _extends2["default"])({
72
70
  isOpen: state.isOpen
73
- }, args), (0, _react2.jsx)(_index.Box, null, (0, _react2.jsx)(_Button["default"], {
71
+ }, args), (0, _react2.jsx)(_index.Box, null, (0, _react2.jsx)(_index.Button, {
74
72
  onPress: state.close
75
- }, "Close Panel"), (0, _react2.jsx)(_index.Text, {
76
- pt: "md"
77
- }, "Children render here."))))
73
+ }, "Close Panel"), (0, _react2.jsx)(_index.AccordionGroup, args, (0, _react2.jsx)(_collections.Item, {
74
+ key: "accordionKey",
75
+ textValue: "accordionKey",
76
+ label: "Accordion Label",
77
+ "data-id": "accordionItem"
78
+ }, (0, _react2.jsx)(_index.Text, null, "Render me!"))))))
78
79
  );
79
80
  };
80
81
 
@@ -106,7 +107,7 @@ var InnerPanel = function InnerPanel(_ref2) {
106
107
  variant: "overlayPanel.overlayPanelInner" // applies higher z-index
107
108
  ,
108
109
  isOpen: innerState.isOpen
109
- }, args), (0, _react2.jsx)(_index.Box, null, (0, _react2.jsx)(_Button["default"], {
110
+ }, args), (0, _react2.jsx)(_index.Box, null, (0, _react2.jsx)(_index.Button, {
110
111
  onPress: innerState.close
111
112
  }, "Close Inner Panel"), (0, _react2.jsx)(_index.Text, {
112
113
  pt: "md"
@@ -121,7 +122,7 @@ var InnerPanel = function InnerPanel(_ref2) {
121
122
  sx: {
122
123
  p: '12px'
123
124
  }
124
- }, (0, _react2.jsx)(_Button["default"], {
125
+ }, (0, _react2.jsx)(_index.Button, {
125
126
  onPress: closeOuterPanel
126
127
  }, "Close Panel"), (0, _react2.jsx)(_index.Text, {
127
128
  pt: "md",
@@ -164,14 +165,14 @@ var InnerPanel = function InnerPanel(_ref2) {
164
165
  mr: "auto"
165
166
  }, "Form 5")), (0, _react2.jsx)(_index.Separator, {
166
167
  margin: "0"
167
- })), (0, _react2.jsx)("br", null), (0, _react2.jsx)(_Button["default"], {
168
+ })), (0, _react2.jsx)("br", null), (0, _react2.jsx)(_index.Button, {
168
169
  onPress: toggleMessagesOpen
169
- }, "Toggle Messages"), (0, _react2.jsx)("br", null), (0, _react2.jsx)(_Button["default"], {
170
+ }, "Toggle Messages"), (0, _react2.jsx)("br", null), (0, _react2.jsx)(_index.Button, {
170
171
  onPress: innerState.open
171
172
  }, "Open Inner Panel"), inner)));
172
173
  return (// Application must be wrapped in an OverlayProvider so that it can be hidden from screen
173
174
  // readers when an overlay opens.
174
- (0, _react2.jsx)(_react["default"].Fragment, null, (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_Button["default"], {
175
+ (0, _react2.jsx)(_react["default"].Fragment, null, (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.Button, {
175
176
  onPress: state.open
176
177
  }, "Open Panel"), outer), messagesOpen && (0, _react2.jsx)(_index.Messages, {
177
178
  sx: {
@@ -192,14 +193,14 @@ var CustomWidth = function CustomWidth() {
192
193
  // readers when an overlay opens.
193
194
  //
194
195
  // For a custom width, provide the width via the 'sx' prop
195
- (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.Text, null, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur."), (0, _react2.jsx)("br", null), (0, _react2.jsx)(_Button["default"], {
196
+ (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.Text, null, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur."), (0, _react2.jsx)("br", null), (0, _react2.jsx)(_index.Button, {
196
197
  onPress: state.open
197
198
  }, "Open Panel"), (0, _react2.jsx)(_OverlayPanel["default"], {
198
199
  isOpen: state.isOpen,
199
200
  sx: {
200
201
  width: '720px'
201
202
  }
202
- }, (0, _react2.jsx)(_index.Box, null, (0, _react2.jsx)(_Button["default"], {
203
+ }, (0, _react2.jsx)(_index.Box, null, (0, _react2.jsx)(_index.Button, {
203
204
  onPress: state.close
204
205
  }, "Close Panel"), (0, _react2.jsx)(_index.Text, {
205
206
  pt: "md"
@@ -17,6 +17,13 @@ var _react2 = require("@emotion/react");
17
17
  var getComponent = function getComponent() {
18
18
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
19
19
  return (0, _testWrapper.render)((0, _react2.jsx)(_react["default"].Fragment, null, (0, _react2.jsx)(_PopoverContainer["default"], props, (0, _react2.jsx)(_index.Box, null, "I am in a popover"))));
20
+ };
21
+
22
+ var getComponentInOverlayPanel = function getComponentInOverlayPanel() {
23
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
24
+ return (0, _testWrapper.render)((0, _react2.jsx)(_index.OverlayPanel, {
25
+ isOpen: true
26
+ }, (0, _react2.jsx)(_PopoverContainer["default"], props, (0, _react2.jsx)(_index.Box, null, "I am in a popover"))));
20
27
  }; // Need to be added to each test file to test accessibility using axe.
21
28
 
22
29
 
@@ -39,4 +46,12 @@ test('should render a popover with no arrow', function () {
39
46
  var arrow = _testWrapper.screen.queryByTestId('popover-arrow');
40
47
 
41
48
  expect(arrow).not.toBeInTheDocument();
49
+ });
50
+ test('popover will not open if wrapped in an overlayPanel', function () {
51
+ getComponentInOverlayPanel({
52
+ popoverProps: {
53
+ 'data-test-id': 'popover-test'
54
+ }
55
+ });
56
+ expect(_testWrapper.screen.queryByTestId('popover-test')).not.toBeInTheDocument();
42
57
  });
@@ -29,7 +29,11 @@ var _react2 = require("@emotion/react");
29
29
  */
30
30
  var TextArea = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
31
31
  return (0, _react2.jsx)(_themeUi.Textarea, (0, _extends2["default"])({
32
- ref: ref
32
+ ref: ref // this requires to fix safari resizing issue (UIP-4995)
33
+ ,
34
+ sx: {
35
+ position: 'relative'
36
+ }
33
37
  }, props));
34
38
  });
35
39
  TextArea.displayName = 'TextArea';
@@ -8,16 +8,20 @@ _Object$defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
10
 
11
- exports.Disabled = exports.isOpen = exports.withDelayProp = exports.withDirectionProp = exports.withAlignProp = exports.Default = exports["default"] = void 0;
11
+ exports.TextWithTooltip = exports.ChipWithTooltip = exports.IconWithTooltip = exports.Disabled = exports.isOpen = exports.withDelayProp = exports.withDirectionProp = exports.withAlignProp = exports.Default = exports["default"] = void 0;
12
12
 
13
13
  var _react = _interopRequireDefault(require("react"));
14
14
 
15
15
  var _EarthIcon = _interopRequireDefault(require("mdi-react/EarthIcon"));
16
16
 
17
+ var _PersonIcon = _interopRequireDefault(require("mdi-react/PersonIcon"));
18
+
17
19
  var _index = require("../../index");
18
20
 
19
21
  var _IconButton = _interopRequireDefault(require("../IconButton"));
20
22
 
23
+ var _Text = _interopRequireDefault(require("../Text"));
24
+
21
25
  var _react2 = require("@emotion/react");
22
26
 
23
27
  var _default = {
@@ -80,4 +84,43 @@ Disabled.parameters = {
80
84
  story: 'The tooltip can be disabled without disabling the button press events.'
81
85
  }
82
86
  }
83
- };
87
+ };
88
+
89
+ var IconWithTooltip = function IconWithTooltip() {
90
+ return (0, _react2.jsx)(_index.Box, {
91
+ pl: 50
92
+ }, (0, _react2.jsx)(_index.TooltipTrigger, null, (0, _react2.jsx)(_IconButton["default"], {
93
+ variant: "tooltipIconButton"
94
+ }, (0, _react2.jsx)(_index.Icon, {
95
+ icon: _PersonIcon["default"]
96
+ })), (0, _react2.jsx)(_index.Tooltip, null, "Useful tooltip")));
97
+ };
98
+
99
+ exports.IconWithTooltip = IconWithTooltip;
100
+
101
+ var ChipWithTooltip = function ChipWithTooltip() {
102
+ return (0, _react2.jsx)(_index.Box, {
103
+ pl: 50
104
+ }, (0, _react2.jsx)(_index.TooltipTrigger, null, (0, _react2.jsx)(_index.Button, {
105
+ variant: "tooltipChip",
106
+ bg: "neutral.10"
107
+ }, (0, _react2.jsx)(_Text["default"], {
108
+ variant: "label",
109
+ sx: {
110
+ textTransform: 'uppercase'
111
+ },
112
+ color: "white"
113
+ }, "Some text")), (0, _react2.jsx)(_index.Tooltip, null, "Useful tooltip")));
114
+ };
115
+
116
+ exports.ChipWithTooltip = ChipWithTooltip;
117
+
118
+ var TextWithTooltip = function TextWithTooltip() {
119
+ return (0, _react2.jsx)(_index.Box, {
120
+ pl: 50
121
+ }, (0, _react2.jsx)(_index.TooltipTrigger, null, (0, _react2.jsx)(_index.Button, {
122
+ variant: "tooltipInline"
123
+ }, "Some text"), (0, _react2.jsx)(_index.Tooltip, null, "Useful tooltip")));
124
+ };
125
+
126
+ exports.TextWithTooltip = TextWithTooltip;
@@ -27,11 +27,11 @@ var accordion = {
27
27
  alignItems: 'flex-start'
28
28
  };
29
29
  var accordionBody = {
30
- display: 'none !important',
30
+ display: 'none',
31
31
  pt: 'md',
32
32
  width: '100%',
33
33
  '.is-open &': {
34
- display: 'flex !important'
34
+ display: 'flex'
35
35
  }
36
36
  };
37
37
  var accordionGridHeader = {
@@ -8,7 +8,7 @@ _Object$defineProperty2(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
10
 
11
- exports["default"] = void 0;
11
+ exports["default"] = exports.chip = void 0;
12
12
 
13
13
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
14
14
 
@@ -131,6 +131,7 @@ var chip = {
131
131
  }
132
132
  }
133
133
  };
134
+ exports.chip = chip;
134
135
  var inputInContainerSlot = {
135
136
  position: 'absolute',
136
137
  bg: 'transparent',
@@ -32,6 +32,8 @@ var _text = require("./text");
32
32
 
33
33
  var _colors = require("../colors");
34
34
 
35
+ var _boxes = require("./boxes");
36
+
35
37
  function ownKeys(object, enumerableOnly) { var keys = (0, _keys["default"])(object); if (_getOwnPropertySymbols["default"]) { var symbols = (0, _getOwnPropertySymbols["default"])(object); if (enumerableOnly) symbols = (0, _filter["default"])(symbols).call(symbols, function (sym) { return (0, _getOwnPropertyDescriptor["default"])(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
36
38
 
37
39
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; (0, _forEach["default"])(_context = ownKeys(Object(source), true)).call(_context, function (key) { (0, _defineProperty3["default"])(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors["default"]) { (0, _defineProperties["default"])(target, (0, _getOwnPropertyDescriptors["default"])(source)); } else { var _context2; (0, _forEach["default"])(_context2 = ownKeys(Object(source))).call(_context2, function (key) { (0, _defineProperty2["default"])(target, key, (0, _getOwnPropertyDescriptor["default"])(source, key)); }); } } return target; }
@@ -87,7 +89,7 @@ var iconButton = {
87
89
  width: 'inherit',
88
90
  height: 'inherit',
89
91
  path: {
90
- fill: 'neutral.20'
92
+ fill: 'neutral.40'
91
93
  },
92
94
  outline: 'none',
93
95
  '&.is-focused': _objectSpread({}, defaultFocus),
@@ -102,6 +104,10 @@ var iconButton = {
102
104
  }
103
105
  };
104
106
 
107
+ var square = _objectSpread(_objectSpread({}, iconButton), {}, {
108
+ borderRadius: '2px'
109
+ });
110
+
105
111
  var modalCloseButton = _objectSpread(_objectSpread({}, iconButton), {}, {
106
112
  position: 'absolute',
107
113
  top: 14,
@@ -239,6 +245,10 @@ var inverted = _objectSpread(_objectSpread({}, iconButton), {}, {
239
245
  }
240
246
  });
241
247
 
248
+ var invertedSquare = _objectSpread(_objectSpread({}, inverted), {}, {
249
+ borderRadius: '2px'
250
+ });
251
+
242
252
  var applicationPortal = _objectSpread(_objectSpread({}, iconButton), {}, {
243
253
  background: 'transparent',
244
254
  '&.is-focused': _objectSpread({}, defaultFocus),
@@ -467,6 +477,36 @@ var fileInputField = {
467
477
  boxShadow: 'focus'
468
478
  }
469
479
  };
480
+
481
+ var tooltipChip = _objectSpread(_objectSpread({}, _boxes.chip), {}, {
482
+ cursor: 'default',
483
+ '&.is-hovered, &.is-pressed': {
484
+ cursor: 'default',
485
+ outline: 'none'
486
+ }
487
+ });
488
+
489
+ var tooltipIconButton = _objectSpread(_objectSpread({}, iconButton), {}, {
490
+ cursor: 'default',
491
+ '&.is-hovered, &.is-pressed': {
492
+ backgroundColor: 'inherit',
493
+ cursor: 'default',
494
+ path: {
495
+ fill: 'neutral.20'
496
+ }
497
+ }
498
+ });
499
+
500
+ var tooltipInline = _objectSpread(_objectSpread({}, text), {}, {
501
+ cursor: 'default',
502
+ alignSelf: 'flex-start',
503
+ '&.is-hovered, &.is-pressed': {
504
+ backgroundColor: 'inherit',
505
+ cursor: 'default',
506
+ textDecoration: 'inherit'
507
+ }
508
+ });
509
+
470
510
  var _default = {
471
511
  accordionHeader: accordionHeader,
472
512
  chipDeleteButton: chipDeleteButton,
@@ -499,6 +539,11 @@ var _default = {
499
539
  helpHint: helpHint,
500
540
  modalCloseButton: modalCloseButton,
501
541
  applicationPortalPinned: applicationPortalPinned,
502
- applicationPortal: applicationPortal
542
+ applicationPortal: applicationPortal,
543
+ square: square,
544
+ invertedSquare: invertedSquare,
545
+ tooltipChip: tooltipChip,
546
+ tooltipIconButton: tooltipIconButton,
547
+ tooltipInline: tooltipInline
503
548
  };
504
549
  exports["default"] = _default;
@@ -4,7 +4,7 @@ import { Item } from '@react-stately/collections';
4
4
  import userEvent from '@testing-library/user-event';
5
5
  import axeTest from '../../utils/testUtils/testAxe';
6
6
  import { act, fireEvent, render, screen } from '../../utils/testUtils/testWrapper';
7
- import { Link, Box } from '../../index';
7
+ import { Link, Box, OverlayPanel } from '../../index';
8
8
  import AccordionGridGroup from '../AccordionGridGroup';
9
9
  import { jsx as ___EmotionJSX } from "@emotion/react";
10
10
  var testId = 'test-accordion';
@@ -26,6 +26,22 @@ var getComponent = function getComponent() {
26
26
  }, ___EmotionJSX(Box, null, ___EmotionJSX(Link, null, "Header Button"), ___EmotionJSX(Link, null, "Second Header Button")), ___EmotionJSX(Box, null, ___EmotionJSX(Link, null, "Body Button"), ___EmotionJSX(Link, null, "Second Body Button")))));
27
27
  };
28
28
 
29
+ var getComponentInOverlayPanel = function getComponentInOverlayPanel() {
30
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
31
+ return render(___EmotionJSX(OverlayPanel, {
32
+ isOpen: true
33
+ }, ___EmotionJSX(AccordionGridGroup, _extends({}, defaultProps, props), ___EmotionJSX(Item, {
34
+ key: "first",
35
+ textValue: "Duplicate"
36
+ }, ___EmotionJSX(Box, null, ___EmotionJSX(Link, null, "Header Button"), ___EmotionJSX(Link, null, "Second Header Button")), ___EmotionJSX(Box, null, ___EmotionJSX(Link, null, "Body Button"), ___EmotionJSX(Link, null, "Second Body Button"))), ___EmotionJSX(Item, {
37
+ key: "second",
38
+ textValue: "Duplicate"
39
+ }, ___EmotionJSX(Box, null, ___EmotionJSX(Link, null, "Header Button"), ___EmotionJSX(Link, null, "Second Header Button")), ___EmotionJSX(Box, null, ___EmotionJSX(Link, null, "Body Button"), ___EmotionJSX(Link, null, "Second Body Button"))), ___EmotionJSX(Item, {
40
+ key: "third",
41
+ textValue: "Duplicate"
42
+ }, ___EmotionJSX(Box, null, ___EmotionJSX(Link, null, "Header Button"), ___EmotionJSX(Link, null, "Second Header Button")), ___EmotionJSX(Box, null, ___EmotionJSX(Link, null, "Body Button"), ___EmotionJSX(Link, null, "Second Body Button"))))));
43
+ };
44
+
29
45
  axeTest(getComponent, {
30
46
  // landmark-unique rule conflicts with react-aria role definition
31
47
  rules: {
@@ -166,4 +182,10 @@ test('default expanded keys expands an accordion item', function () {
166
182
  var row = screen.getAllByRole('row');
167
183
  var selectedRow = row[0];
168
184
  expect(selectedRow).toHaveAttribute('aria-selected', 'true');
185
+ });
186
+ test('items do not automatically expand if wrapped in an open OverlayPanel', function () {
187
+ getComponentInOverlayPanel();
188
+ var row = screen.getAllByRole('row');
189
+ var selectedRow = row[0];
190
+ expect(selectedRow).not.toHaveAttribute('aria-selected', 'true');
169
191
  });
@@ -52,7 +52,7 @@ var AccordionGridItemBody = /*#__PURE__*/forwardRef(function (props, ref) {
52
52
  }, mergedProps, {
53
53
  isSelected: isSelected,
54
54
  className: classNames,
55
- "aria-label": ariaLabel || 'Grid Cell'
55
+ "aria-label": ariaLabel
56
56
  }), children);
57
57
  });
58
58
  AccordionGridItemBody.propTypes = {
@@ -76,7 +76,7 @@ var AccordionGridItemHeader = /*#__PURE__*/forwardRef(function (props, ref) {
76
76
  isSelected: isSelected,
77
77
  className: classNames
78
78
  }, others, {
79
- "aria-label": ariaLabel || 'Grid Cell'
79
+ "aria-label": ariaLabel
80
80
  }), ___EmotionJSX(Box, {
81
81
  isRow: true
82
82
  }, children, ___EmotionJSX(Box, {
@@ -7,6 +7,7 @@ import axeTest from '../../utils/testUtils/testAxe';
7
7
  import { act, fireEvent, render, screen } from '../../utils/testUtils/testWrapper';
8
8
  import Text from '../Text';
9
9
  import AccordionGroup from '../AccordionGroup';
10
+ import { OverlayPanel } from '../../index';
10
11
  import { jsx as ___EmotionJSX } from "@emotion/react";
11
12
  var testId = 'test-accordion';
12
13
  var defaultProps = {
@@ -16,6 +17,28 @@ var defaultProps = {
16
17
  var getComponent = function getComponent() {
17
18
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
18
19
  return render(___EmotionJSX(AccordionGroup, _extends({}, defaultProps, props), ___EmotionJSX(Item, {
20
+ key: "first",
21
+ textValue: "Duplicate",
22
+ "data-id": "first",
23
+ label: "Accordion item"
24
+ }, ___EmotionJSX(Text, null, "Render me!")), ___EmotionJSX(Item, {
25
+ key: "second",
26
+ textValue: "Duplicate",
27
+ "data-id": "second",
28
+ label: "Accordion item"
29
+ }, ___EmotionJSX(Text, null, "Render me!")), ___EmotionJSX(Item, {
30
+ key: "third",
31
+ textValue: "Duplicate",
32
+ "data-id": "third",
33
+ label: "Accordion item"
34
+ }, ___EmotionJSX(Text, null, "Render me!"))));
35
+ };
36
+
37
+ var getComponentInOverlayPanel = function getComponentInOverlayPanel() {
38
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
39
+ return render(___EmotionJSX(OverlayPanel, {
40
+ isOpen: true
41
+ }, ___EmotionJSX(AccordionGroup, _extends({}, defaultProps, props), ___EmotionJSX(Item, {
19
42
  key: "first",
20
43
  textValue: "Duplicate",
21
44
  "data-id": "first"
@@ -27,7 +50,7 @@ var getComponent = function getComponent() {
27
50
  key: "third",
28
51
  textValue: "Duplicate",
29
52
  "data-id": "third"
30
- }, ___EmotionJSX(Text, null, "Render me!"))));
53
+ }, ___EmotionJSX(Text, null, "Render me!")))));
31
54
  }; // Need to be added to each test file to test accessibility using axe.
32
55
 
33
56
 
@@ -197,4 +220,10 @@ test('Item accepts a data-id and the data-id can be found in the DOM', function
197
220
  var selectedItem = buttons[0];
198
221
  var parentElement = selectedItem.parentElement;
199
222
  expect(parentElement).toHaveAttribute('data-id', 'first');
223
+ });
224
+ test('items do not automatically expand if wrapped in an open OverlayPanel', function () {
225
+ getComponentInOverlayPanel();
226
+ var buttons = screen.getAllByRole('button');
227
+ var selectedItem = buttons[0];
228
+ expect(selectedItem).not.toHaveAttribute('aria-expanded', 'true');
200
229
  });
@@ -11,7 +11,7 @@ import { useAccordionItem } from '@react-aria/accordion';
11
11
  import { useButton } from '@react-aria/button';
12
12
  import { useFocusRing } from '@react-aria/focus';
13
13
  import { Text, Icon, Box } from '../../index';
14
- import { useAriaLabelWarning, useStatusClasses } from '../../hooks';
14
+ import { useStatusClasses } from '../../hooks';
15
15
  import { AccordionContext } from '../../context/AccordionContext';
16
16
  import { jsx as ___EmotionJSX } from "@emotion/react";
17
17
  var AccordionItem = /*#__PURE__*/forwardRef(function (props, ref) {
@@ -72,12 +72,11 @@ var AccordionItem = /*#__PURE__*/forwardRef(function (props, ref) {
72
72
  buttonClasses = _useStatusClasses2.classNames;
73
73
 
74
74
  var ariaLabel = props['aria-label'] || item.props.label;
75
- useAriaLabelWarning('AccordionItem', ariaLabel);
76
75
  return ___EmotionJSX(Box, _extends({
77
76
  variant: "accordion.accordion",
78
77
  className: itemClasses
79
78
  }, others, containerProps), ___EmotionJSX(ThemeUIButton, _extends({
80
- "aria-label": ariaLabel || 'Accordion',
79
+ "aria-label": ariaLabel,
81
80
  ref: buttonRef,
82
81
  sx: {
83
82
  display: 'flex',
@@ -94,9 +93,11 @@ var AccordionItem = /*#__PURE__*/forwardRef(function (props, ref) {
94
93
  ml: "5px"
95
94
  }, ___EmotionJSX(Icon, {
96
95
  icon: isOpen ? MenuUp : MenuDown
97
- }))), ___EmotionJSX(Box, _extends({
96
+ }))), isOpen && ___EmotionJSX(Box, _extends({
98
97
  variant: "accordion.accordionBody"
99
- }, accordionRegionProps, regionProps), item.rendered));
98
+ }, accordionRegionProps, regionProps, {
99
+ className: itemClasses
100
+ }), item.rendered));
100
101
  });
101
102
  AccordionItem.propTypes = {
102
103
  'aria-label': PropTypes.string,
@@ -21,7 +21,7 @@ import { useButton } from '@react-aria/button';
21
21
  import { useHover } from '@react-aria/interactions';
22
22
  import { useFocusRing } from '@react-aria/focus';
23
23
  import { mergeProps } from '@react-aria/utils';
24
- import { useAriaLabelWarning, useStatusClasses, usePropWarning } from '../../hooks';
24
+ import { useStatusClasses, usePropWarning } from '../../hooks';
25
25
  import Loader from '../Loader';
26
26
  import { jsx as ___EmotionJSX } from "@emotion/react";
27
27
  var Button = /*#__PURE__*/forwardRef(function (props, ref) {
@@ -70,9 +70,8 @@ var Button = /*#__PURE__*/forwardRef(function (props, ref) {
70
70
  classNames = _useStatusClasses.classNames;
71
71
 
72
72
  var ariaLabel = props['aria-label'];
73
- useAriaLabelWarning('Button', ariaLabel);
74
73
  return ___EmotionJSX(ThemeUIButton, _extends({
75
- "aria-label": ariaLabel || 'Button',
74
+ "aria-label": ariaLabel,
76
75
  ref: buttonRef,
77
76
  className: classNames,
78
77
  role: "button",
@@ -62,7 +62,8 @@ export var TextIconButton = function TextIconButton() {
62
62
  export var TextButton = function TextButton() {
63
63
  return ___EmotionJSX(Button, {
64
64
  mb: "sm",
65
- variant: "text"
65
+ variant: "text",
66
+ "aria-label": "Add option"
66
67
  }, ___EmotionJSX(Text, {
67
68
  variant: "label",
68
69
  color: "active"
@@ -7,7 +7,8 @@ import Button from '.';
7
7
  import { jsx as ___EmotionJSX } from "@emotion/react";
8
8
  var testId = 'test-button';
9
9
  var defaultProps = {
10
- 'data-testid': testId
10
+ 'data-testid': testId,
11
+ 'aria-label': 'Test button'
11
12
  };
12
13
 
13
14
  var getComponent = function getComponent() {
@@ -108,6 +108,7 @@ var ColorField = /*#__PURE__*/forwardRef(function (props, ref) {
108
108
  return _concatInstanceProperty(_context2 = _concatInstanceProperty(_context3 = _concatInstanceProperty(_context4 = "rgba(".concat(colorValue === null || colorValue === void 0 ? void 0 : colorValue.red, ", ")).call(_context4, colorValue === null || colorValue === void 0 ? void 0 : colorValue.green, ", ")).call(_context3, colorValue === null || colorValue === void 0 ? void 0 : colorValue.blue, ", ")).call(_context2, colorValue === null || colorValue === void 0 ? void 0 : colorValue.alpha, ")");
109
109
  }, []);
110
110
  return ___EmotionJSX(Box, fieldContainerProps, label && ___EmotionJSX(Label, fieldLabelProps), ___EmotionJSX(Button, _extends({
111
+ "aria-label": "Select color",
111
112
  bg: getRgbaFromState(state),
112
113
  onPress: handleButtonPress,
113
114
  ref: triggerRef,
@@ -116,6 +116,12 @@ var ComboBoxField = /*#__PURE__*/forwardRef(function (props, ref) {
116
116
  useImperativeHandle(ref, function () {
117
117
  return inputRef.current;
118
118
  });
119
+ /* istanbul ignore next */
120
+
121
+ var onSelectionChangeHandler = function onSelectionChangeHandler(key) {
122
+ var newVal = key || selectedKey || '';
123
+ if (onSelectionChange) onSelectionChange(newVal);
124
+ };
119
125
 
120
126
  var _useFilter = useFilter({
121
127
  sensitivity: 'base'
@@ -123,6 +129,7 @@ var ComboBoxField = /*#__PURE__*/forwardRef(function (props, ref) {
123
129
  contains = _useFilter.contains;
124
130
 
125
131
  var state = useComboBoxState(_objectSpread(_objectSpread({}, comboBoxOptions), {}, {
132
+ onSelectionChange: hasCustomValue ? onSelectionChangeHandler : onSelectionChange,
126
133
  defaultFilter: contains
127
134
  }));
128
135
 
@@ -330,6 +330,27 @@ export var ControlledFiltering = function ControlledFiltering() {
330
330
  }, item.name);
331
331
  }));
332
332
  };
333
+ export var ControlledWithCustomValue = function ControlledWithCustomValue() {
334
+ var _useState9 = useState(''),
335
+ _useState10 = _slicedToArray(_useState9, 2),
336
+ inputValue = _useState10[0],
337
+ setInputValue = _useState10[1];
338
+
339
+ return ___EmotionJSX(OverlayProvider, null, ___EmotionJSX(ComboBoxField, _extends({
340
+ label: "Example label",
341
+ defaultItems: items
342
+ }, actions, {
343
+ inputValue: inputValue,
344
+ selectedKey: inputValue,
345
+ onInputChange: setInputValue,
346
+ onSelectionChange: setInputValue,
347
+ hasCustomValue: true
348
+ }), function (item) {
349
+ return ___EmotionJSX(Item, {
350
+ key: item.name
351
+ }, item.name);
352
+ }));
353
+ };
333
354
  export var AllowCustomValue = function AllowCustomValue() {
334
355
  return ___EmotionJSX(OverlayProvider, null, ___EmotionJSX(ComboBoxField, _extends({
335
356
  label: "Example label",
@@ -639,6 +639,41 @@ test('two listbox can not be open at the same time', function () {
639
639
  name: 'Tango'
640
640
  })).toBeInTheDocument();
641
641
  });
642
+ test('should handle selecting custom option', function () {
643
+ getComponent({
644
+ hasCustomValue: true
645
+ });
646
+ var input = screen.queryByRole('combobox');
647
+ expect(input).toHaveValue(''); // type something
648
+
649
+ userEvent.type(input, 'custom'); // set input value as selected
650
+
651
+ userEvent.type(input, '{enter}', {
652
+ skipClick: true
653
+ });
654
+ expect(screen.queryByRole('listbox')).not.toBeInTheDocument();
655
+ expect(screen.queryByRole('combobox')).toHaveValue('custom'); // blur input
656
+
657
+ userEvent.tab();
658
+ expect(input).toHaveValue('custom');
659
+ });
660
+ test('onSelectionChange works properly with custom value', function () {
661
+ var onSelectionChange = jest.fn();
662
+ getComponent({
663
+ hasCustomValue: true,
664
+ onSelectionChange: onSelectionChange,
665
+ onInputChange: onSelectionChange
666
+ });
667
+ var input = screen.queryByRole('combobox');
668
+ expect(input).toHaveValue('');
669
+ expect(onSelectionChange).not.toHaveBeenCalled(); // Should fire when input value was typed, and enter was pressed
670
+
671
+ userEvent.type(input, 'custom{enter}');
672
+ expect(onSelectionChange).toHaveBeenCalledWith('custom'); // Should fire when input is cleared
673
+
674
+ userEvent.type(input, '{selectall}{backspace}{enter}');
675
+ expect(onSelectionChange).toHaveBeenCalledWith('');
676
+ });
642
677
  test('should have no accessibility violations', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
643
678
  var _getComponent6, container, results;
644
679
 
@@ -37,7 +37,8 @@ var FileItem = function FileItem(props) {
37
37
 
38
38
  default:
39
39
  return {
40
- icon: InsertDriveFileIcon
40
+ icon: InsertDriveFileIcon,
41
+ color: 'neutral.10'
41
42
  };
42
43
  }
43
44
  }, [status]);
@@ -83,7 +83,7 @@ var IconButton = /*#__PURE__*/forwardRef(function (props, ref) {
83
83
  tabIndex: 0,
84
84
  ref: buttonRef,
85
85
  className: classNames,
86
- "aria-label": ariaLabel || 'Icon Button',
86
+ "aria-label": ariaLabel,
87
87
  sx: chipBg && isHovered && {
88
88
  'path': {
89
89
  fill: chipBg