@atlaskit/emoji 67.2.0 → 67.3.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 (102) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/api/EmojiResource.js +6 -0
  3. package/dist/cjs/components/common/DeletableEmojiTooltipContent.js +34 -0
  4. package/dist/cjs/components/common/DeleteButton.js +2 -1
  5. package/dist/cjs/components/common/Emoji.js +94 -81
  6. package/dist/cjs/components/common/EmojiActions.js +8 -6
  7. package/dist/cjs/components/common/EmojiDeletePreview.js +19 -6
  8. package/dist/cjs/components/common/EmojiErrorMessage.js +13 -5
  9. package/dist/cjs/components/common/EmojiRadioButton.js +1 -0
  10. package/dist/cjs/components/common/EmojiUploadPicker.js +30 -29
  11. package/dist/cjs/components/common/EmojiUploadPreview.js +12 -5
  12. package/dist/cjs/components/common/FileChooser.js +7 -1
  13. package/dist/cjs/components/common/ResourcedEmoji.js +5 -3
  14. package/dist/cjs/components/common/RetryableButton.js +9 -3
  15. package/dist/cjs/components/common/ToolTipContentWithKeymap.js +25 -0
  16. package/dist/cjs/components/common/styles.js +45 -19
  17. package/dist/cjs/components/i18n.js +17 -2
  18. package/dist/cjs/components/picker/CategorySelector.js +2 -1
  19. package/dist/cjs/components/picker/CategoryTracker.js +5 -0
  20. package/dist/cjs/components/picker/EmojiPickerComponent.js +12 -6
  21. package/dist/cjs/components/picker/EmojiPickerList.js +49 -8
  22. package/dist/cjs/components/picker/EmojiPickerListSearch.js +4 -1
  23. package/dist/cjs/components/picker/VirtualList.js +8 -3
  24. package/dist/cjs/{util → hooks}/useInView.js +3 -2
  25. package/dist/cjs/util/browser-support.js +11 -3
  26. package/dist/cjs/util/constants.js +4 -1
  27. package/dist/cjs/util/keymaps.js +55 -0
  28. package/dist/cjs/version.json +1 -1
  29. package/dist/es2019/api/EmojiResource.js +6 -0
  30. package/dist/es2019/components/common/DeletableEmojiTooltipContent.js +27 -0
  31. package/dist/es2019/components/common/DeleteButton.js +2 -1
  32. package/dist/es2019/components/common/Emoji.js +90 -72
  33. package/dist/es2019/components/common/EmojiActions.js +9 -7
  34. package/dist/es2019/components/common/EmojiDeletePreview.js +17 -7
  35. package/dist/es2019/components/common/EmojiErrorMessage.js +10 -4
  36. package/dist/es2019/components/common/EmojiRadioButton.js +1 -0
  37. package/dist/es2019/components/common/EmojiUploadPicker.js +32 -27
  38. package/dist/es2019/components/common/EmojiUploadPreview.js +9 -5
  39. package/dist/es2019/components/common/FileChooser.js +7 -1
  40. package/dist/es2019/components/common/ResourcedEmoji.js +5 -3
  41. package/dist/es2019/components/common/RetryableButton.js +9 -3
  42. package/dist/es2019/components/common/ToolTipContentWithKeymap.js +15 -0
  43. package/dist/es2019/components/common/styles.js +39 -15
  44. package/dist/es2019/components/i18n.js +17 -2
  45. package/dist/es2019/components/picker/CategorySelector.js +2 -1
  46. package/dist/es2019/components/picker/CategoryTracker.js +3 -0
  47. package/dist/es2019/components/picker/EmojiPickerComponent.js +12 -6
  48. package/dist/es2019/components/picker/EmojiPickerList.js +48 -8
  49. package/dist/es2019/components/picker/EmojiPickerListSearch.js +3 -1
  50. package/dist/es2019/components/picker/VirtualList.js +7 -3
  51. package/dist/es2019/{util → hooks}/useInView.js +2 -2
  52. package/dist/es2019/util/browser-support.js +9 -1
  53. package/dist/es2019/util/constants.js +2 -0
  54. package/dist/es2019/util/keymaps.js +43 -0
  55. package/dist/es2019/version.json +1 -1
  56. package/dist/esm/api/EmojiResource.js +6 -0
  57. package/dist/esm/components/common/DeletableEmojiTooltipContent.js +25 -0
  58. package/dist/esm/components/common/DeleteButton.js +2 -1
  59. package/dist/esm/components/common/Emoji.js +94 -82
  60. package/dist/esm/components/common/EmojiActions.js +9 -7
  61. package/dist/esm/components/common/EmojiDeletePreview.js +17 -7
  62. package/dist/esm/components/common/EmojiErrorMessage.js +11 -4
  63. package/dist/esm/components/common/EmojiRadioButton.js +1 -0
  64. package/dist/esm/components/common/EmojiUploadPicker.js +32 -31
  65. package/dist/esm/components/common/EmojiUploadPreview.js +9 -5
  66. package/dist/esm/components/common/FileChooser.js +7 -1
  67. package/dist/esm/components/common/ResourcedEmoji.js +5 -3
  68. package/dist/esm/components/common/RetryableButton.js +9 -3
  69. package/dist/esm/components/common/ToolTipContentWithKeymap.js +14 -0
  70. package/dist/esm/components/common/styles.js +38 -16
  71. package/dist/esm/components/i18n.js +17 -2
  72. package/dist/esm/components/picker/CategorySelector.js +2 -1
  73. package/dist/esm/components/picker/CategoryTracker.js +5 -0
  74. package/dist/esm/components/picker/EmojiPickerComponent.js +12 -6
  75. package/dist/esm/components/picker/EmojiPickerList.js +49 -8
  76. package/dist/esm/components/picker/EmojiPickerListSearch.js +4 -1
  77. package/dist/esm/components/picker/VirtualList.js +8 -3
  78. package/dist/esm/{util → hooks}/useInView.js +2 -2
  79. package/dist/esm/util/browser-support.js +9 -1
  80. package/dist/esm/util/constants.js +2 -0
  81. package/dist/esm/util/keymaps.js +43 -0
  82. package/dist/esm/version.json +1 -1
  83. package/dist/types/components/common/DeletableEmojiTooltipContent.d.ts +6 -0
  84. package/dist/types/components/common/Emoji.d.ts +6 -0
  85. package/dist/types/components/common/EmojiErrorMessage.d.ts +1 -0
  86. package/dist/types/components/common/FileChooser.d.ts +1 -0
  87. package/dist/types/components/common/RetryableButton.d.ts +2 -1
  88. package/dist/types/components/common/ToolTipContentWithKeymap.d.ts +9 -0
  89. package/dist/types/components/common/styles.d.ts +6 -2
  90. package/dist/types/components/i18n.d.ts +15 -0
  91. package/dist/types/components/picker/CategoryTracker.d.ts +1 -0
  92. package/dist/types/components/picker/EmojiPickerList.d.ts +8 -1
  93. package/dist/types/components/picker/EmojiPickerListSearch.d.ts +1 -0
  94. package/dist/types/components/picker/VirtualList.d.ts +21 -1
  95. package/dist/types/types.d.ts +1 -1
  96. package/dist/types/util/browser-support.d.ts +6 -1
  97. package/dist/types/util/constants.d.ts +3 -1
  98. package/dist/types/util/keymaps.d.ts +14 -0
  99. package/dist/types/util/type-helpers.d.ts +1 -1
  100. package/package.json +2 -2
  101. package/report.api.md +16 -1
  102. /package/dist/types/{util → hooks}/useInView.d.ts +0 -0
@@ -19,7 +19,7 @@ var _reactFocusLock = _interopRequireDefault(require("react-focus-lock"));
19
19
  var ImageUtil = _interopRequireWildcard(require("../../util/image"));
20
20
  var _logger = _interopRequireDefault(require("../../util/logger"));
21
21
  var _i18n = require("../i18n");
22
- var _EmojiErrorMessage = _interopRequireDefault(require("./EmojiErrorMessage"));
22
+ var _EmojiErrorMessage = _interopRequireWildcard(require("./EmojiErrorMessage"));
23
23
  var _EmojiUploadPreview = _interopRequireDefault(require("./EmojiUploadPreview"));
24
24
  var _FileChooser = _interopRequireDefault(require("./FileChooser"));
25
25
  var _internalTypes = require("./internal-types");
@@ -34,6 +34,7 @@ var uploadEmojiComponentTestId = 'upload-emoji-component';
34
34
  exports.uploadEmojiComponentTestId = uploadEmojiComponentTestId;
35
35
  var cancelEmojiUploadPickerTestId = 'cancel-emoji-upload-picker';
36
36
  exports.cancelEmojiUploadPickerTestId = cancelEmojiUploadPickerTestId;
37
+ var addCustomEmojiChooseFileScreenreaderId = 'fabric.emoji.choose.file.label.id';
37
38
  var disallowedReplacementsMap = new Map([[':', ''], ['!', ''], ['@', ''], ['#', ''], ['%', ''], ['^', ''], ['&', ''], ['*', ''], ['(', ''], [')', ''], [' ', '_']]);
38
39
  var sanitizeName = function sanitizeName(name) {
39
40
  // prevent / replace certain characters, allow others
@@ -65,18 +66,12 @@ var ChooseEmojiFile = /*#__PURE__*/(0, _react.memo)(function (props) {
65
66
  onUploadCancelled();
66
67
  }
67
68
  }, [onUploadCancelled]);
68
- var setInputFocus = (0, _react.useCallback)(function () {
69
- var _inputRef$current, _document$activeEleme, _inputRef$current2;
70
- (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
71
- if (((_document$activeEleme = document.activeElement) === null || _document$activeEleme === void 0 ? void 0 : _document$activeEleme.id) !== ((_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.id)) {
72
- setInputFocus();
73
- }
69
+ (0, _react.useLayoutEffect)(function () {
70
+ requestAnimationFrame(function () {
71
+ var _inputRef$current;
72
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
73
+ });
74
74
  }, []);
75
-
76
- // make sure input has focus after update
77
- (0, _react.useEffect)(function () {
78
- window.requestAnimationFrame(setInputFocus);
79
- }, [setInputFocus]);
80
75
  var cancelLabel = formatMessage(_i18n.messages.cancelLabel);
81
76
  var emojiPlaceholder = formatMessage(_i18n.messages.emojiPlaceholder);
82
77
  var emojiNameAriaLabel = formatMessage(_i18n.messages.emojiNameAriaLabel);
@@ -86,11 +81,12 @@ var ChooseEmojiFile = /*#__PURE__*/(0, _react.memo)(function (props) {
86
81
  "data-testid": uploadEmojiComponentTestId
87
82
  }, (0, _react2.jsx)("div", {
88
83
  css: _styles.emojiUploadTop
89
- }, (0, _react2.jsx)("span", {
90
- css: _styles.uploadChooseFileMessage
91
- }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.addCustomEmojiLabel, function (message) {
92
- return (0, _react2.jsx)("h5", null, message);
93
- })), (0, _react2.jsx)("div", {
84
+ }, (0, _react2.jsx)("h2", {
85
+ css: [_styles.uploadChooseFileMessage, _styles.headingH5]
86
+ }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.addCustomEmojiLabel), (0, _react2.jsx)("span", {
87
+ "aria-hidden": "true",
88
+ css: _styles.requiredSymbol
89
+ }, "*")), (0, _react2.jsx)("div", {
94
90
  css: _styles.closeEmojiUploadButton
95
91
  }, (0, _react2.jsx)(_standardButton.default, {
96
92
  onClick: onUploadCancelled,
@@ -117,19 +113,24 @@ var ChooseEmojiFile = /*#__PURE__*/(0, _react.memo)(function (props) {
117
113
  autoFocus: true,
118
114
  testId: uploadEmojiNameInputTestId,
119
115
  ref: inputRef,
120
- id: "new-emoji-name-input"
116
+ id: "new-emoji-name-input",
117
+ "aria-required": true
121
118
  })), (0, _react2.jsx)("span", {
122
119
  css: _styles.uploadChooseFileBrowse
123
120
  }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.emojiChooseFileScreenReaderDescription, function (screenReaderDescription) {
124
121
  return (0, _react2.jsx)(_react.Fragment, null, (0, _react2.jsx)("span", {
125
122
  hidden: true,
126
123
  id: fileChooserButtonDescriptionId
127
- }, screenReaderDescription), (0, _react2.jsx)(_FileChooser.default, {
124
+ }, screenReaderDescription), (0, _react2.jsx)("span", {
125
+ hidden: true,
126
+ id: addCustomEmojiChooseFileScreenreaderId
127
+ }, emojiChooseFileTitle), (0, _react2.jsx)(_FileChooser.default, {
128
128
  label: emojiChooseFileTitle,
129
129
  onChange: onChooseFile,
130
130
  onClick: onClick,
131
131
  accept: "image/png,image/jpeg,image/gif",
132
132
  ariaDescribedBy: fileChooserButtonDescriptionId,
133
+ ariaLabelledBy: "".concat(_EmojiErrorMessage.emojiErrorScreenreaderTestId, " ").concat(addCustomEmojiChooseFileScreenreaderId),
133
134
  isDisabled: disableChooser
134
135
  }));
135
136
  }))), (0, _react2.jsx)("div", {
@@ -140,7 +141,7 @@ var ChooseEmojiFile = /*#__PURE__*/(0, _react.memo)(function (props) {
140
141
  })));
141
142
  });
142
143
  var EmojiUploadPicker = function EmojiUploadPicker(props) {
143
- var _document$activeEleme2;
144
+ var _document$activeEleme;
144
145
  var errorMessage = props.errorMessage,
145
146
  initialUploadName = props.initialUploadName,
146
147
  onUploadEmoji = props.onUploadEmoji,
@@ -168,7 +169,7 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
168
169
  previewImage = _useState10[0],
169
170
  setPreviewImage = _useState10[1];
170
171
  // document is undefined during ssr rendering and throws an error
171
- var lastFocusedElementId = (0, _react.useRef)(typeof document !== 'undefined' ? (_document$activeEleme2 = document.activeElement) === null || _document$activeEleme2 === void 0 ? void 0 : _document$activeEleme2.id : '');
172
+ var lastFocusedElementId = (0, _react.useRef)(typeof document !== 'undefined' ? (_document$activeEleme = document.activeElement) === null || _document$activeEleme === void 0 ? void 0 : _document$activeEleme.id : '');
172
173
  (0, _react.useEffect)(function () {
173
174
  if (errorMessage) {
174
175
  setUploadStatus(_internalTypes.UploadStatus.Error);
@@ -231,7 +232,7 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
231
232
  }, []);
232
233
  var errorOnUpload = (0, _react.useCallback)(function (event) {
233
234
  (0, _logger.default)('File load error: ', event);
234
- setChooseEmojiErrorMessage(_i18n.messages.emojiUploadFailed);
235
+ setChooseEmojiErrorMessage((0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.emojiUploadFailed));
235
236
  cancelChooseFile();
236
237
  }, [cancelChooseFile]);
237
238
  var onFileLoad = (0, _react.useCallback)(function (file) {
@@ -252,7 +253,7 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
252
253
  case 7:
253
254
  _context.prev = 7;
254
255
  _context.t0 = _context["catch"](0);
255
- setChooseEmojiErrorMessage(_i18n.messages.emojiInvalidImage);
256
+ setChooseEmojiErrorMessage((0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.emojiInvalidImage));
256
257
  cancelChooseFile();
257
258
  case 11:
258
259
  case "end":
@@ -272,7 +273,7 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
272
273
  var reader = new FileReader();
273
274
  var file = files[0];
274
275
  if (ImageUtil.hasFileExceededSize(file)) {
275
- setChooseEmojiErrorMessage(_i18n.messages.emojiImageTooBig);
276
+ setChooseEmojiErrorMessage((0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.emojiImageTooBig));
276
277
  cancelChooseFile();
277
278
  return;
278
279
  }
@@ -296,9 +297,9 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
296
297
  }
297
298
  }, 0, lastFocusedElementId.current);
298
299
  }, [clearUploadPicker, onUploadCancelled]);
299
- var chooseErrorMessage = (0, _react.useMemo)(function () {
300
- return chooseEmojiErrorMessage ? (0, _react2.jsx)(_reactIntlNext.FormattedMessage, chooseEmojiErrorMessage) : undefined;
301
- }, [chooseEmojiErrorMessage]);
300
+ var onChooseFileClicked = function onChooseFileClicked() {
301
+ onFileChooserClicked && onFileChooserClicked();
302
+ };
302
303
  return (0, _react2.jsx)(_reactFocusLock.default, {
303
304
  noFocusGuards: true
304
305
  }, name && previewImage ? (0, _react2.jsx)(_EmojiUploadPreview.default, {
@@ -311,10 +312,10 @@ var EmojiUploadPicker = function EmojiUploadPicker(props) {
311
312
  }) : (0, _react2.jsx)(ChooseEmojiFile, {
312
313
  name: name,
313
314
  onChooseFile: onChooseFile,
314
- onClick: onFileChooserClicked,
315
+ onClick: onChooseFileClicked,
315
316
  onNameChange: onNameChange,
316
317
  onUploadCancelled: cancelUpload,
317
- errorMessage: chooseErrorMessage,
318
+ errorMessage: chooseEmojiErrorMessage,
318
319
  intl: intl
319
320
  }));
320
321
  };
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
@@ -18,18 +19,21 @@ var _reactIntlNext = require("react-intl-next");
18
19
  var _constants = require("../../util/constants");
19
20
  var _i18n = require("../i18n");
20
21
  var _Emoji = _interopRequireDefault(require("./Emoji"));
21
- var _EmojiErrorMessage = _interopRequireDefault(require("./EmojiErrorMessage"));
22
+ var _EmojiErrorMessage = _interopRequireWildcard(require("./EmojiErrorMessage"));
22
23
  var _internalTypes = require("./internal-types");
23
24
  var _RetryableButton = _interopRequireDefault(require("./RetryableButton"));
24
25
  var _styles = require("./styles");
25
26
  var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
27
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
26
29
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
27
30
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
28
31
  var uploadPreviewTestId = 'upload-preview';
29
32
  exports.uploadPreviewTestId = uploadPreviewTestId;
30
33
  var cancelUploadButtonTestId = 'cancel-upload-button';
31
34
  exports.cancelUploadButtonTestId = cancelUploadButtonTestId;
32
- var addEmojiButtonDescriptionId = 'add.emoji.button.screen.reader.description.id';
35
+ var addEmojiPreviewDescriptionId = 'fabric.emoji.preview.description.id';
36
+ var addEmojiButtonLabelId = 'fabric.emoji.add.label.id';
33
37
  var EmojiUploadPreview = /*#__PURE__*/function (_PureComponent) {
34
38
  (0, _inherits2.default)(EmojiUploadPreview, _PureComponent);
35
39
  var _super = _createSuper(EmojiUploadPreview);
@@ -87,18 +91,21 @@ var EmojiUploadPreview = /*#__PURE__*/function (_PureComponent) {
87
91
  message: errorMessage,
88
92
  tooltip: true
89
93
  }) : null, !errorMessage && (0, _react2.jsx)(_visuallyHidden.default, {
90
- id: addEmojiButtonDescriptionId
94
+ id: addEmojiPreviewDescriptionId
91
95
  }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, _i18n.messages.emojiPreview, {
92
96
  values: {
93
97
  emoji: name
94
98
  }
95
- }))), (0, _react2.jsx)(_RetryableButton.default, {
99
+ }))), (0, _react2.jsx)(_visuallyHidden.default, {
100
+ id: addEmojiButtonLabelId
101
+ }, errorMessage ? formatMessage(_i18n.messages.retryLabel) : formatMessage(_i18n.messages.addEmojiLabel)), (0, _react2.jsx)(_RetryableButton.default, {
96
102
  label: formatMessage(_i18n.messages.addEmojiLabel),
97
103
  onSubmit: onAddEmoji,
98
104
  appearance: "primary",
99
105
  loading: uploading,
100
106
  error: !!errorMessage,
101
- ariaDescribedby: addEmojiButtonDescriptionId
107
+ ariaDescribedBy: addEmojiPreviewDescriptionId,
108
+ ariaLabelledBy: "".concat(_EmojiErrorMessage.emojiErrorScreenreaderTestId, " ").concat(addEmojiButtonLabelId)
102
109
  }), (0, _react2.jsx)(_customThemeButton.default, {
103
110
  onClick: onUploadCancelled,
104
111
  appearance: "subtle",
@@ -17,12 +17,15 @@ exports.fileUploadInputTestId = fileUploadInputTestId;
17
17
  var FileChooser = function FileChooser(props) {
18
18
  var accept = props.accept,
19
19
  ariaDescribedBy = props.ariaDescribedBy,
20
+ ariaLabelledBy = props.ariaLabelledBy,
20
21
  isDisabled = props.isDisabled,
21
22
  label = props.label,
22
23
  onChange = props.onChange,
23
24
  onClick = props.onClick;
24
25
  var filePickerRef = (0, _react.useRef)(null);
26
+ var fileButtonRef = (0, _react.useRef)(null);
25
27
  var handleOnChooseFile = function handleOnChooseFile() {
28
+ var _fileButtonRef$curren;
26
29
  if (!filePickerRef.current) {
27
30
  return;
28
31
  }
@@ -30,12 +33,15 @@ var FileChooser = function FileChooser(props) {
30
33
  onClick();
31
34
  }
32
35
  filePickerRef.current.click();
36
+ (_fileButtonRef$curren = fileButtonRef.current) === null || _fileButtonRef$curren === void 0 ? void 0 : _fileButtonRef$curren.focus();
33
37
  };
34
38
  return /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_standardButton.default, {
35
39
  onClick: handleOnChooseFile,
36
40
  isDisabled: isDisabled,
37
41
  "aria-describedby": ariaDescribedBy,
38
- testId: chooseFileButtonTestId
42
+ "aria-labelledby": ariaLabelledBy,
43
+ testId: chooseFileButtonTestId,
44
+ ref: fileButtonRef
39
45
  }, label), /*#__PURE__*/_react.default.createElement("input", {
40
46
  className: "emojiUploadFileInput",
41
47
  ref: filePickerRef,
@@ -26,7 +26,8 @@ var ResourcedEmojiComponent = (0, _reactLoadable.default)({
26
26
  }
27
27
  });
28
28
  var ResourcedEmoji = function ResourcedEmoji(props) {
29
- var emojiId = props.emojiId;
29
+ var emojiId = props.emojiId,
30
+ optimisticImageURL = props.optimisticImageURL;
30
31
  (0, _react.useEffect)(function () {
31
32
  if (!emojiId) {
32
33
  return;
@@ -36,7 +37,8 @@ var ResourcedEmoji = function ResourcedEmoji(props) {
36
37
  });
37
38
  _analytics.ufoExperiences['emoji-rendered'].getInstance(emojiId.id || emojiId.shortName).addMetadata({
38
39
  source: 'ResourcedEmoji',
39
- emojiId: emojiId.id
40
+ emojiId: emojiId.id,
41
+ isOptimisticImageURL: !!optimisticImageURL
40
42
  });
41
43
  return function () {
42
44
  (0, _analytics.sampledUfoRenderedEmoji)(emojiId).abort({
@@ -46,7 +48,7 @@ var ResourcedEmoji = function ResourcedEmoji(props) {
46
48
  }
47
49
  });
48
50
  };
49
- }, [emojiId]);
51
+ }, [emojiId, optimisticImageURL]);
50
52
  return /*#__PURE__*/_react.default.createElement(_UfoErrorBoundary.UfoErrorBoundary, {
51
53
  experiences: [_analytics.ufoExperiences['emoji-rendered'].getInstance(props.emojiId.id || props.emojiId.shortName)]
52
54
  }, /*#__PURE__*/_react.default.createElement(ResourcedEmojiComponent, props));
@@ -23,13 +23,17 @@ var LoadingSpinner = function LoadingSpinner() {
23
23
  }, (0, _react.jsx)(_spinner.default, null));
24
24
  };
25
25
  var RetryButton = function RetryButton(props) {
26
- var onSubmit = props.onSubmit;
26
+ var onSubmit = props.onSubmit,
27
+ ariaLabelledBy = props.ariaLabelledBy,
28
+ ariaDescribedBy = props.ariaDescribedBy;
27
29
  return (0, _react.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.retryLabel, function (retryLabel) {
28
30
  return (0, _react.jsx)(_customThemeButton.default, {
29
31
  css: _styles.uploadRetryButton,
30
32
  appearance: "warning",
31
33
  onClick: onSubmit,
32
34
  testId: retryUploadButtonTestId,
35
+ "aria-describedby": ariaDescribedBy,
36
+ "aria-labelledby": ariaLabelledBy,
33
37
  autoFocus: true
34
38
  }, retryLabel);
35
39
  });
@@ -38,13 +42,15 @@ var UploadButton = function UploadButton(props) {
38
42
  var appearance = props.appearance,
39
43
  onSubmit = props.onSubmit,
40
44
  label = props.label,
41
- ariaDescribedby = props.ariaDescribedby;
45
+ ariaLabelledBy = props.ariaLabelledBy,
46
+ ariaDescribedBy = props.ariaDescribedBy;
42
47
  return (0, _react.jsx)(_customThemeButton.default, {
43
48
  css: _styles.uploadEmojiButton,
44
49
  appearance: appearance,
45
50
  onClick: onSubmit,
46
51
  testId: uploadEmojiButtonTestId,
47
- "aria-describedby": ariaDescribedby,
52
+ "aria-describedby": ariaDescribedBy,
53
+ "aria-labelledby": ariaLabelledBy,
48
54
  autoFocus: true
49
55
  }, label);
50
56
  };
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.ToolTipContentWithKeymap = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _react2 = require("@emotion/react");
10
+ var _keymaps = require("../../util/keymaps");
11
+ var _styles = require("./styles");
12
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
14
+ /** @jsx jsx */
15
+
16
+ var ToolTipContentWithKeymap = /*#__PURE__*/_react.default.memo(function (_ref) {
17
+ var description = _ref.description,
18
+ shortcutOverride = _ref.shortcutOverride,
19
+ keymap = _ref.keymap;
20
+ var shortcut = shortcutOverride || keymap && (0, _keymaps.formatShortcut)(keymap);
21
+ return shortcut || description ? (0, _react2.jsx)(_react.Fragment, null, description, shortcut && description && "\xA0", shortcut && (0, _react2.jsx)("span", {
22
+ css: _styles.tooltipShortcutStyle
23
+ }, shortcut)) : null;
24
+ });
25
+ exports.ToolTipContentWithKeymap = ToolTipContentWithKeymap;
@@ -4,13 +4,14 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.uploadRetryButton = exports.uploadPreviewText = exports.uploadPreviewFooter = exports.uploadPreview = exports.uploadEmojiButton = exports.uploadChooseFileRow = exports.uploadChooseFileMessage = exports.uploadChooseFileEmojiName = exports.uploadChooseFileBrowse = exports.uploadAddRow = exports.submitDelete = exports.selectOnHoverStyles = exports.previewText = exports.previewImg = exports.previewButtonGroup = exports.preview = exports.placeholderContainerAnimated = exports.placeholderContainer = exports.placeholder = exports.hidden = exports.emojiUploadTop = exports.emojiUploadBottom = exports.emojiUpload = exports.emojiToneSelectorContainer = exports.emojiStyles = exports.emojiSprite = exports.emojiShortName = exports.emojiScrollable = exports.emojiRadio = exports.emojiPreviewErrorMessage = exports.emojiPickerAddEmoji = exports.emojiNodeStyles = exports.emojiName = exports.emojiMainStyle = exports.emojiImage = exports.emojiDeleteErrorMessage = exports.emojiDeleteButton = exports.emojiContainer = exports.emojiChooseFileErrorMessage = exports.emojiButton = exports.emojiActionsWrapper = exports.deleteText = exports.deletePreview = exports.deleteFooter = exports.deleteButton = exports.commonSelectedStyles = exports.closeEmojiUploadButton = exports.cancelButton = exports.buttonSpinner = exports.bigEmojiPreview = exports.addCustomEmojiButton = exports.addCustomEmoji = void 0;
7
+ exports.uploadRetryButton = exports.uploadPreviewText = exports.uploadPreviewFooter = exports.uploadPreview = exports.uploadEmojiButton = exports.uploadChooseFileRow = exports.uploadChooseFileMessage = exports.uploadChooseFileEmojiName = exports.uploadChooseFileBrowse = exports.uploadAddRow = exports.tooltipShortcutStyle = exports.submitDelete = exports.selectOnHoverStyles = exports.requiredSymbol = exports.previewText = exports.previewImg = exports.previewButtonGroup = exports.preview = exports.placeholderContainerAnimated = exports.placeholderContainer = exports.placeholder = exports.hidden = exports.headingH5 = exports.emojiUploadTop = exports.emojiUploadBottom = exports.emojiUpload = exports.emojiToneSelectorContainer = exports.emojiSpriteContainer = exports.emojiSprite = exports.emojiShortName = exports.emojiScrollable = exports.emojiRadio = exports.emojiPreviewErrorMessage = exports.emojiPickerAddEmoji = exports.emojiNodeStyles = exports.emojiName = exports.emojiMainStyle = exports.emojiImageContainer = exports.emojiImage = exports.emojiDeleteErrorMessage = exports.emojiDeleteButton = exports.emojiChooseFileErrorMessage = exports.emojiButton = exports.emojiActionsWrapper = exports.deleteText = exports.deletePreview = exports.deleteFooter = exports.deleteButton = exports.deletableEmoji = exports.commonSelectedStyles = exports.closeEmojiUploadButton = exports.cancelButton = exports.buttonSpinner = exports.bigEmojiPreview = exports.addCustomEmojiButton = exports.addCustomEmoji = void 0;
8
8
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _react = require("@emotion/react");
11
11
  var _constants = require("../../util/constants");
12
12
  var _sharedStyles = require("../../util/shared-styles");
13
13
  var _colors = require("@atlaskit/theme/colors");
14
+ var _constants2 = require("@atlaskit/theme/constants");
14
15
  var _css, _css2, _templateObject, _span, _css3, _css6, _input;
15
16
  var commonSelectedStyles = 'emoji-common-selected';
16
17
  exports.commonSelectedStyles = commonSelectedStyles;
@@ -26,18 +27,16 @@ var emojiDeleteButton = 'emoji-common-deleteButton';
26
27
  exports.emojiDeleteButton = emojiDeleteButton;
27
28
  var emojiMainStyle = 'emoji-common-main-styles';
28
29
  exports.emojiMainStyle = emojiMainStyle;
30
+ var deletableEmoji = 'emoji-common-deletable';
31
+ exports.deletableEmoji = deletableEmoji;
29
32
  var deleteButton = (0, _react.css)({
30
33
  // hide by default
31
34
  visibility: 'hidden',
32
35
  display: 'flex',
33
- height: '0px',
34
- // 40px emoji width with 2px left offset
35
- width: '38px',
36
- alignItems: 'flex-end',
37
- justifyContent: 'flex-end',
38
- // vertically align button and prevent emoji offset
39
- paddingTop: '4px',
40
- marginBottom: '-4px'
36
+ position: 'absolute',
37
+ top: '-8px',
38
+ right: '-8px',
39
+ zIndex: 1
41
40
  });
42
41
  exports.deleteButton = deleteButton;
43
42
  var emojiToneSelectorContainer = (0, _react.css)({
@@ -47,7 +46,7 @@ var emojiToneSelectorContainer = (0, _react.css)({
47
46
  padding: '10px 10px 11px 0'
48
47
  });
49
48
  exports.emojiToneSelectorContainer = emojiToneSelectorContainer;
50
- var emojiStyles = (0, _react.css)((_css = {
49
+ var emojiImageContainer = (0, _react.css)((_css = {
51
50
  borderRadius: "var(--ds-radius-100, 3px)",
52
51
  backgroundColor: 'transparent',
53
52
  display: 'inline-block',
@@ -55,21 +54,26 @@ var emojiStyles = (0, _react.css)((_css = {
55
54
  // Ensure along with vertical align middle, we don't increase the line height for p and some
56
55
  // headings. Smaller headings get a slight increase in height, cannot add more negative margin
57
56
  // as a "selected" emoji (e.g. in the editor) will not look good.
58
- margin: '-1px 0'
57
+ margin: '-1px 0',
58
+ img: {
59
+ display: 'block'
60
+ }
59
61
  }, (0, _defineProperty2.default)(_css, "&.".concat(commonSelectedStyles, ",&.").concat(selectOnHoverStyles, ":hover"), {
60
62
  backgroundColor: _sharedStyles.akEmojiSelectedBackgroundColor
61
63
  }), (0, _defineProperty2.default)(_css, "&.".concat(commonSelectedStyles, ",&.").concat(selectOnHoverStyles, ":hover .").concat(emojiDeleteButton), {
62
64
  // show delete button on hover
63
65
  visibility: 'visible'
64
- }), (0, _defineProperty2.default)(_css, "img", {
65
- display: 'block'
66
+ }), (0, _defineProperty2.default)(_css, "&.".concat(deletableEmoji), {
67
+ position: 'relative'
68
+ }), (0, _defineProperty2.default)(_css, "&.".concat(deletableEmoji, ":focus-within .").concat(emojiDeleteButton), {
69
+ visibility: 'visible'
66
70
  }), (0, _defineProperty2.default)(_css, '&:focus', {
67
71
  boxShadow: "0 0 0 2px ".concat("var(--ds-border-focused, ".concat(_colors.B100, ")")),
68
72
  transitionDuration: '0s, 0.2s',
69
73
  outline: 'none'
70
74
  }), _css));
71
- exports.emojiStyles = emojiStyles;
72
- var emojiContainer = (0, _react.css)((_css2 = {
75
+ exports.emojiImageContainer = emojiImageContainer;
76
+ var emojiSpriteContainer = (0, _react.css)((_css2 = {
73
77
  display: 'inline-block',
74
78
  // Ensure along with vertical align middle, we don't increase the line height for h1..h6, and p
75
79
  margin: '-1px 0'
@@ -86,7 +90,7 @@ var emojiContainer = (0, _react.css)((_css2 = {
86
90
  transitionDuration: '0s, 0.2s',
87
91
  outline: 'none'
88
92
  }), _css2));
89
- exports.emojiContainer = emojiContainer;
93
+ exports.emojiSpriteContainer = emojiSpriteContainer;
90
94
  var placeholder = 'emoji-common-placeholder';
91
95
  exports.placeholder = placeholder;
92
96
  var placeholderContainer = (0, _react.css)({
@@ -214,12 +218,12 @@ var previewImg = (0, _react.css)((_css6 = {
214
218
  display: 'inline-block',
215
219
  flex: 'initial',
216
220
  width: '32px'
217
- }, (0, _defineProperty2.default)(_css6, "& .".concat(emojiSprite, ", > span"), {
221
+ }, (0, _defineProperty2.default)(_css6, "& .".concat(emojiSprite, ", span[role=\"img\"]"), {
218
222
  width: '32px',
219
223
  height: '32px',
220
224
  padding: 0,
221
225
  maxHeight: 'inherit'
222
- }), (0, _defineProperty2.default)(_css6, "& > span > img", {
226
+ }), (0, _defineProperty2.default)(_css6, "& span[role=\"img\"] > img", {
223
227
  position: 'relative',
224
228
  left: '50%',
225
229
  top: '50%',
@@ -366,6 +370,19 @@ var deleteText = (0, _react.css)({
366
370
  }
367
371
  });
368
372
  exports.deleteText = deleteText;
373
+ var headingH5 = (0, _react.css)({
374
+ fontSize: "var(--ds-font-size-075, 12px)",
375
+ fontWeight: "var(--ds-font-weight-semibold, 600)",
376
+ letterSpacing: '-0.003em',
377
+ lineHeight: "var(--ds-font-lineHeight-100, 16px)"
378
+ });
379
+ exports.headingH5 = headingH5;
380
+ var requiredSymbol = (0, _react.css)({
381
+ paddingLeft: "".concat((0, _constants2.gridSize)() / 4, "px"),
382
+ color: "var(--ds-text-danger, ".concat(_colors.R400, ")"),
383
+ fontFamily: (0, _constants2.fontFamily)()
384
+ });
385
+ exports.requiredSymbol = requiredSymbol;
369
386
  var previewButtonGroup = (0, _react.css)({
370
387
  display: 'flex'
371
388
  });
@@ -446,4 +463,13 @@ var emojiActionsWrapper = (0, _react.css)({
446
463
  justifyContent: 'flex-end',
447
464
  alignItems: 'center'
448
465
  });
449
- exports.emojiActionsWrapper = emojiActionsWrapper;
466
+ exports.emojiActionsWrapper = emojiActionsWrapper;
467
+ var tooltipShortcutStyle = (0, _react.css)({
468
+ borderRadius: '3px',
469
+ backgroundColor: "var(--ds-background-inverse-subtle, ".concat(_colors.N400, ")"),
470
+ padding: '0 2px',
471
+ /* TODO: fix in develop: https://atlassian.slack.com/archives/CFG3PSQ9E/p1647395052443259?thread_ts=1647394572.556029&cid=CFG3PSQ9E */
472
+ /* stylelint-disable-next-line */
473
+ label: 'tooltip-shortcut'
474
+ });
475
+ exports.tooltipShortcutStyle = tooltipShortcutStyle;
@@ -6,6 +6,16 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.messages = void 0;
7
7
  var _reactIntlNext = require("react-intl-next");
8
8
  var messages = (0, _reactIntlNext.defineMessages)({
9
+ deleteEmojiTooltip: {
10
+ id: 'fabric.emoji.delete.tooltip',
11
+ defaultMessage: 'Delete',
12
+ description: 'Tooltip content for delete emoji when focus on deletable emoji'
13
+ },
14
+ deleteEmojiTooltipForScreenreader: {
15
+ id: 'fabric.emoji.delete.screenreader.tooltip',
16
+ defaultMessage: 'To delete {shortName} emoji, press Backspace',
17
+ description: 'Tooltip content for delete emoji when focus on deletable emoji'
18
+ },
9
19
  deleteEmojiTitle: {
10
20
  id: 'fabric.emoji.delete.title',
11
21
  defaultMessage: 'Remove emoji',
@@ -108,7 +118,7 @@ var messages = (0, _reactIntlNext.defineMessages)({
108
118
  },
109
119
  categoriesSelectorLabel: {
110
120
  id: 'fabric.emoji.categories.label',
111
- defaultMessage: 'Choose a emoji category',
121
+ defaultMessage: 'Choose an emoji category',
112
122
  description: 'Aria label for Emoji categories selector at the top of emoji picker'
113
123
  },
114
124
  categoriesSearchResults: {
@@ -208,13 +218,18 @@ var messages = (0, _reactIntlNext.defineMessages)({
208
218
  },
209
219
  emojiPickerGrid: {
210
220
  id: 'fabric.emoji.pickerlist.grid',
211
- defaultMessage: '{showSearchResults, select, true{Search results} other{Emojis}}',
221
+ defaultMessage: '{showSearchResults, select, true{Search results} other{Emojis}}.',
212
222
  description: "Aria label for emoji picker grid, showSearchResults is a boolean variable, message will be \"Entering Emojis table\", or \"Leaving Emojis\""
213
223
  },
214
224
  emojiButtonRoleDescription: {
215
225
  id: 'fabric.emoji.emojipicker.emoi.roledescription',
216
226
  defaultMessage: 'emoji button',
217
227
  description: "Aria roledescription for emoji button, used in emoji picker."
228
+ },
229
+ error: {
230
+ id: 'fabric.emoji.emojipicker.error',
231
+ defaultMessage: 'Error!',
232
+ description: "Aria label for error icon, apperaed in emoji uploader screens and delete emoji screens of emoji picker"
218
233
  }
219
234
  });
220
235
  exports.messages = messages;
@@ -76,6 +76,7 @@ var CategorySelector = function CategorySelector(props) {
76
76
  return;
77
77
  }
78
78
  e.preventDefault();
79
+ e.stopPropagation();
79
80
  var lastCategoryIndex = categories.length - 1;
80
81
  switch (e.key) {
81
82
  // navigate to the right category
@@ -137,7 +138,7 @@ var CategorySelector = function CategorySelector(props) {
137
138
  "data-focus-index": index,
138
139
  "aria-label": categoryName,
139
140
  "aria-controls": currentFocus === index ? _EmojiPickerList.RENDER_EMOJI_PICKER_LIST_TESTID : undefined,
140
- "aria-selected": currentFocus === index ? true : false,
141
+ "aria-selected": categoryId === activeCategoryId,
141
142
  css: categoryClasses,
142
143
  disabled: disableCategories,
143
144
  onClick: handleClick(categoryId, index),
@@ -37,6 +37,11 @@ var CategoryTracker = /*#__PURE__*/function () {
37
37
  value: function getRow(category) {
38
38
  return this.categoryToRow.get(category);
39
39
  }
40
+ }, {
41
+ key: "getFirstCategory",
42
+ value: function getFirstCategory() {
43
+ return this.rowToCategory.get(0);
44
+ }
40
45
  }]);
41
46
  return CategoryTracker;
42
47
  }();
@@ -163,8 +163,6 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
163
163
  if (emojiToRender && !(0, _typeHelpers.containsEmojiId)(emojiToRender, selectedEmoji)) {
164
164
  (0, _reactDom.unstable_batchedUpdates)(function () {
165
165
  setSelectedEmoji(undefined);
166
- // Only enable categories for full emoji list (non-search)
167
- setActiveCategory(null);
168
166
  });
169
167
  }
170
168
  (0, _reactDom.unstable_batchedUpdates)(function () {
@@ -333,12 +331,12 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
333
331
  });
334
332
  fireAnalytics((0, _analytics.uploadBeginButton)());
335
333
  }, [emojiProvider, fireAnalytics]);
336
- var scrollToUploadedEmoji = (0, _react.useCallback)(function () {
334
+ var scrollToUploadedEmoji = (0, _react.useCallback)(function (emojiDescription) {
337
335
  if (emojiPickerList.current) {
338
336
  // Wait a tick to ensure repaint and updated height for picker list
339
337
  window.setTimeout(function () {
340
338
  var _emojiPickerList$curr2;
341
- (_emojiPickerList$curr2 = emojiPickerList.current) === null || _emojiPickerList$curr2 === void 0 ? void 0 : _emojiPickerList$curr2.scrollToRecentlyUploaded();
339
+ (_emojiPickerList$curr2 = emojiPickerList.current) === null || _emojiPickerList$curr2 === void 0 ? void 0 : _emojiPickerList$curr2.scrollToRecentlyUploaded(emojiDescription);
342
340
  }, 0);
343
341
  }
344
342
  }, [emojiPickerList]);
@@ -355,7 +353,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
355
353
  setSelectedEmoji(emojiDescription);
356
354
  setUploading(false);
357
355
  });
358
- scrollToUploadedEmoji();
356
+ scrollToUploadedEmoji(emojiDescription);
359
357
  };
360
358
  (0, _UploadEmoji.uploadEmoji)(upload, emojiProvider, errorSetter, onSuccess, fireAnalytics, retry);
361
359
  }, [emojiProvider, fireAnalytics, scrollToUploadedEmoji]);
@@ -407,6 +405,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
407
405
  fireAnalytics((0, _analytics.openedPickerEvent)());
408
406
  isMounting.current = false;
409
407
  }
408
+
409
+ // stop all key propagation to other event listeners
410
+ var suppressKeyPress = function suppressKeyPress(e) {
411
+ e.stopPropagation();
412
+ };
410
413
  (0, _react.useEffect)(function () {
411
414
  // componentDidMount logic
412
415
  if (!isMounted) {
@@ -461,7 +464,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
461
464
  "data-emoji-picker-container": true,
462
465
  role: "dialog",
463
466
  "aria-label": formatMessage(_i18n.messages.emojiPickerTitle),
464
- "aria-modal": true
467
+ "aria-modal": true,
468
+ onKeyPress: suppressKeyPress,
469
+ onKeyUp: suppressKeyPress,
470
+ onKeyDown: suppressKeyPress
465
471
  }, (0, _react2.jsx)(_CategorySelector.default, {
466
472
  activeCategoryId: activeCategory,
467
473
  dynamicCategories: dynamicCategories,