@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 67.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`f31280da145`](https://bitbucket.org/atlassian/atlassian-frontend/commits/f31280da145) - fix category reset when tone changed, update error message translations, improve error message for screen reader, improve auto focus on choose file screen
8
+
9
+ ### Patch Changes
10
+
11
+ - [`e8ff53a79be`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e8ff53a79be) - minor accessibility improvements in emoji picker
12
+ - [`53c4778831c`](https://bitbucket.org/atlassian/atlassian-frontend/commits/53c4778831c) - [ux] add keyboard support for delete emoji
13
+ - [`3256c34030f`](https://bitbucket.org/atlassian/atlassian-frontend/commits/3256c34030f) - Fix picker so that it always highlights the first category when first opened
14
+ - [`788a4d63c82`](https://bitbucket.org/atlassian/atlassian-frontend/commits/788a4d63c82) - fix focus issue with tone selector
15
+ - [`10ae56adac7`](https://bitbucket.org/atlassian/atlassian-frontend/commits/10ae56adac7) - fix: emoji is shown as grey box after successfully uploading
16
+
17
+ ## 67.2.1
18
+
19
+ ### Patch Changes
20
+
21
+ - [`a73ef9ebecb`](https://bitbucket.org/atlassian/atlassian-frontend/commits/a73ef9ebecb) - Add ssr rendering metadata to resourced emoji loaded experience
22
+
3
23
  ## 67.2.0
4
24
 
5
25
  ### Minor Changes
@@ -742,6 +742,12 @@ var UploadingEmojiResource = /*#__PURE__*/function (_EmojiResource) {
742
742
  return Promise.reject('No media api support is configured');
743
743
  }
744
744
  return _this14.siteEmojiResource.uploadEmoji(upload, retry).then(function (emoji) {
745
+ // Use file preview blob URL to temporarily fix the graybox issue after uploading,
746
+ // Because the media service takes time to process the image.
747
+ // Ideally should improve CachingMediaImage by using mediaClient or mediaImage,
748
+ // But that requires more efforts in FE & BE.
749
+ // TODO: revist this when pick up COLLAB-2294
750
+ emoji.representation.imagePath = upload.dataURL;
745
751
  _this14.addUnknownEmoji(emoji);
746
752
  _this14.refreshLastFilter();
747
753
  return emoji;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.DeletableEmojiTooltipContentForScreenReader = exports.DeletableEmojiTooltipContent = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _react = _interopRequireDefault(require("react"));
10
+ var _reactIntlNext = require("react-intl-next");
11
+ var _i18n = require("../i18n");
12
+ var _ToolTipContentWithKeymap = require("./ToolTipContentWithKeymap");
13
+ var _keymaps = require("../../util/keymaps");
14
+ var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
15
+ var DeletableEmojiTooltipContent = function DeletableEmojiTooltipContent() {
16
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
17
+ formatMessage = _useIntl.formatMessage;
18
+ return /*#__PURE__*/_react.default.createElement(_ToolTipContentWithKeymap.ToolTipContentWithKeymap, {
19
+ description: formatMessage(_i18n.messages.deleteEmojiTooltip),
20
+ keymap: _keymaps.backspace
21
+ });
22
+ };
23
+ exports.DeletableEmojiTooltipContent = DeletableEmojiTooltipContent;
24
+ var DeletableEmojiTooltipContentForScreenReader = function DeletableEmojiTooltipContentForScreenReader(_ref) {
25
+ var emoji = _ref.emoji;
26
+ return /*#__PURE__*/_react.default.createElement(_visuallyHidden.default, {
27
+ id: "screenreader-emoji-".concat(emoji.id)
28
+ }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, _i18n.messages.deleteEmojiTooltipForScreenreader, {
29
+ values: {
30
+ shortName: emoji.shortName
31
+ }
32
+ })));
33
+ };
34
+ exports.DeletableEmojiTooltipContentForScreenReader = DeletableEmojiTooltipContentForScreenReader;
@@ -32,7 +32,8 @@ var DeleteButton = function DeleteButton(props) {
32
32
  onClick: props.onClick,
33
33
  appearance: "subtle-link",
34
34
  spacing: "none",
35
- testId: "emoji-delete-button"
35
+ testId: "emoji-delete-button",
36
+ tabIndex: -1
36
37
  }));
37
38
  };
38
39
  var _default = DeleteButton;
@@ -5,13 +5,14 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = exports.SpriteEmoji = exports.ImageEmoji = exports.Emoji = void 0;
8
+ exports.default = exports.SpriteEmoji = exports.ImageEmoji = exports.EmojiNodeWrapper = exports.Emoji = void 0;
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
9
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
11
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
13
  var _react = _interopRequireWildcard(require("react"));
14
14
  var _react2 = require("@emotion/react");
15
+ var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
15
16
  var _EmojiUtils = require("../../api/EmojiUtils");
16
17
  var _constants = require("../../util/constants");
17
18
  var _typeHelpers = require("../../util/type-helpers");
@@ -20,11 +21,11 @@ var _mouse = require("../../util/mouse");
20
21
  var _DeleteButton = _interopRequireDefault(require("./DeleteButton"));
21
22
  var _styles = require("./styles");
22
23
  var _analytics = require("../../util/analytics");
23
- var _browserSupport = require("../../util/browser-support");
24
- var _useInView3 = require("../../util/useInView");
24
+ var _browserSupport = _interopRequireDefault(require("../../util/browser-support"));
25
+ var _useInView3 = require("../../hooks/useInView");
25
26
  var _ufoExperiences = require("../../util/analytics/ufoExperiences");
26
- var _excluded = ["emoji", "fitToHeight", "selected", "selectOnHover", "className", "showTooltip", "shouldBeInteractive", "tabIndex", "onSelected", "onMouseMove", "onFocus", "onDelete", "onLoadError", "onLoadSuccess", "showDelete", "disableLazyLoad", "autoWidth"],
27
- _excluded2 = ["emoji", "fitToHeight", "selected", "selectOnHover", "className", "showTooltip", "showDelete", "shouldBeInteractive", "tabIndex", "onSelected", "onMouseMove", "onFocus", "onDelete", "onLoadError", "onLoadSuccess", "disableLazyLoad", "autoWidth"];
27
+ var _DeletableEmojiTooltipContent = require("./DeletableEmojiTooltipContent");
28
+ var _excluded = ["emoji", "fitToHeight", "selected", "selectOnHover", "className", "showTooltip", "showDelete", "shouldBeInteractive", "tabIndex", "onSelected", "onMouseMove", "onFocus", "onDelete", "onLoadError", "onLoadSuccess", "disableLazyLoad", "autoWidth", "children", "type"];
28
29
  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); }
29
30
  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; }
30
31
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
@@ -41,17 +42,21 @@ var handleMouseDown = function handleMouseDown(props, event) {
41
42
  onSelected((0, _typeHelpers.toEmojiId)(emoji), emoji, event);
42
43
  }
43
44
  };
44
- var handleKeyPress = function handleKeyPress(props, event) {
45
- // Clicked emoji delete button
46
- if (event.target instanceof Element && event.target.getAttribute('aria-label') === _constants.deleteEmojiLabel) {
45
+ var handleKeyDown = function handleKeyDown(props, event) {
46
+ if (!_constants.EMOJI_KEYBOARD_KEYS_SUPPORTED.includes(event.key)) {
47
47
  return;
48
48
  }
49
- var emoji = props.emoji,
50
- onSelected = props.onSelected;
51
49
  event.preventDefault();
52
- if (onSelected && (event.key === 'Enter' || event.key === ' ')) {
50
+ event.stopPropagation();
51
+ var emoji = props.emoji,
52
+ onSelected = props.onSelected,
53
+ showDelete = props.showDelete;
54
+ if (onSelected && (event.key === _constants.KeyboardKeys.Enter || event.key === _constants.KeyboardKeys.Space)) {
53
55
  onSelected((0, _typeHelpers.toEmojiId)(emoji), emoji, event);
54
56
  }
57
+ if (showDelete && event.key === _constants.KeyboardKeys.Backspace) {
58
+ handleDelete(props, event);
59
+ }
55
60
  };
56
61
  var handleMouseMove = function handleMouseMove(props, event) {
57
62
  var emoji = props.emoji,
@@ -96,21 +101,7 @@ var SpriteEmoji = function SpriteEmoji(props) {
96
101
  fitToHeight = props.fitToHeight,
97
102
  selected = props.selected,
98
103
  selectOnHover = props.selectOnHover,
99
- className = props.className,
100
- showTooltip = props.showTooltip,
101
- _props$shouldBeIntera = props.shouldBeInteractive,
102
- shouldBeInteractive = _props$shouldBeIntera === void 0 ? false : _props$shouldBeIntera,
103
- tabIndex = props.tabIndex,
104
- onSelected = props.onSelected,
105
- onMouseMove = props.onMouseMove,
106
- onFocus = props.onFocus,
107
- onDelete = props.onDelete,
108
- onLoadError = props.onLoadError,
109
- onLoadSuccess = props.onLoadSuccess,
110
- showDelete = props.showDelete,
111
- disableLazyLoad = props.disableLazyLoad,
112
- autoWidth = props.autoWidth,
113
- other = (0, _objectWithoutProperties2.default)(props, _excluded);
104
+ className = props.className;
114
105
  var representation = emoji.representation;
115
106
  var sprite = representation.sprite;
116
107
  var classes = "".concat(_styles.emojiNodeStyles, " ").concat(selected ? _styles.commonSelectedStyles : '', " ").concat(selectOnHover ? _styles.selectOnHoverStyles : '', " ").concat(className ? className : '');
@@ -130,28 +121,10 @@ var SpriteEmoji = function SpriteEmoji(props) {
130
121
  backgroundPosition: "".concat(xPositionInPercent, "% ").concat(yPositionInPercent, "%"),
131
122
  backgroundSize: "".concat(sprite.column * 100, "% ").concat(sprite.row * 100, "%")
132
123
  }, sizing);
133
- return (0, _react2.jsx)("span", (0, _extends2.default)({
134
- "data-testid": "sprite-emoji-".concat(emoji.shortName),
135
- "data-emoji-type": "sprite",
136
- tabIndex: shouldBeInteractive ? tabIndex || 0 : undefined,
137
- role: shouldBeInteractive ? 'button' : 'img',
138
- css: _styles.emojiContainer,
139
- className: classes,
140
- onKeyPress: function onKeyPress(event) {
141
- return handleKeyPress(props, event);
142
- },
143
- onMouseDown: function onMouseDown(event) {
144
- handleMouseDown(props, event);
145
- },
146
- onMouseEnter: function onMouseEnter(event) {
147
- handleMouseMove(props, event);
148
- },
149
- onFocus: function onFocus(event) {
150
- handleFocus(props, event);
151
- },
152
- "aria-label": emoji.shortName,
153
- title: showTooltip ? emoji.shortName : ''
154
- }, other), (0, _react2.jsx)("span", {
124
+ return (0, _react2.jsx)(EmojiNodeWrapper, (0, _extends2.default)({}, props, {
125
+ type: "sprite",
126
+ className: classes
127
+ }), (0, _react2.jsx)("span", {
155
128
  className: _styles.emojiSprite,
156
129
  style: style
157
130
  }, "\xA0"));
@@ -165,20 +138,10 @@ var ImageEmoji = function ImageEmoji(props) {
165
138
  selected = props.selected,
166
139
  selectOnHover = props.selectOnHover,
167
140
  className = props.className,
168
- showTooltip = props.showTooltip,
169
141
  showDelete = props.showDelete,
170
- _props$shouldBeIntera2 = props.shouldBeInteractive,
171
- shouldBeInteractive = _props$shouldBeIntera2 === void 0 ? false : _props$shouldBeIntera2,
172
- tabIndex = props.tabIndex,
173
- onSelected = props.onSelected,
174
- onMouseMove = props.onMouseMove,
175
- onFocus = props.onFocus,
176
- onDelete = props.onDelete,
177
- onLoadError = props.onLoadError,
178
142
  onLoadSuccess = props.onLoadSuccess,
179
143
  disableLazyLoad = props.disableLazyLoad,
180
- autoWidth = props.autoWidth,
181
- other = (0, _objectWithoutProperties2.default)(props, _excluded2);
144
+ autoWidth = props.autoWidth;
182
145
  var _useInView = (0, _useInView3.useInView)({
183
146
  triggerOnce: true
184
147
  }),
@@ -186,7 +149,7 @@ var ImageEmoji = function ImageEmoji(props) {
186
149
  ref = _useInView2[0],
187
150
  inView = _useInView2[1];
188
151
  var ufoExp = (0, _analytics.sampledUfoRenderedEmoji)(emoji);
189
- var classes = "".concat(_styles.emojiMainStyle, " ").concat(_styles.emojiNodeStyles, " ").concat(selected ? _styles.commonSelectedStyles : '', " ").concat(selectOnHover ? _styles.selectOnHoverStyles : '', " ").concat(_styles.emojiImage, " ").concat(className ? className : '');
152
+ var classes = "".concat(_styles.emojiMainStyle, " ").concat(_styles.emojiNodeStyles, " ").concat(selected ? _styles.commonSelectedStyles : '', " ").concat(selectOnHover ? _styles.selectOnHoverStyles : '', " ").concat(_styles.emojiImage, " ").concat(className ? className : '', " ").concat(showDelete ? _styles.deletableEmoji : '');
190
153
  var width;
191
154
  var height;
192
155
  var src;
@@ -200,14 +163,6 @@ var ImageEmoji = function ImageEmoji(props) {
200
163
  width = representation.width;
201
164
  height = representation.height;
202
165
  }
203
- var deleteButton;
204
- if (showDelete) {
205
- deleteButton = (0, _react2.jsx)(_DeleteButton.default, {
206
- onClick: function onClick(event) {
207
- return handleDelete(props, event);
208
- }
209
- });
210
- }
211
166
  var sizing = {};
212
167
  if (fitToHeight && width && height) {
213
168
  // Presize image, to prevent reflow due to size changes after loading
@@ -241,7 +196,7 @@ var ImageEmoji = function ImageEmoji(props) {
241
196
  }
242
197
  ufoExp.success({
243
198
  metadata: {
244
- IBSupported: _browserSupport.isIntersectionObserverSupported
199
+ IBSupported: _browserSupport.default.supportsIntersectionObserver
245
200
  }
246
201
  });
247
202
  if (onLoadSuccess) {
@@ -276,15 +231,74 @@ var ImageEmoji = function ImageEmoji(props) {
276
231
  onError: onError,
277
232
  onLoad: onLoad
278
233
  }, sizing));
234
+
235
+ // show a tooltip for deletable emoji only on focus
236
+ if (showDelete) {
237
+ return (0, _react2.jsx)(_tooltip.default, {
238
+ content: (0, _react2.jsx)(_DeletableEmojiTooltipContent.DeletableEmojiTooltipContent, null),
239
+ position: "right-start",
240
+ tag: "span"
241
+ }, (0, _react2.jsx)(EmojiNodeWrapper, (0, _extends2.default)({}, props, {
242
+ "aria-labelledby": "screenreader-emoji-".concat(emoji.id),
243
+ type: "image",
244
+ className: classes,
245
+ ref: ref,
246
+ showTooltip: false // avoid showing both tooltip and title
247
+ ,
248
+ onMouseOver: function onMouseOver(e) {
249
+ var _document$activeEleme;
250
+ // only disable tooltip when not on focus
251
+ if (!((_document$activeEleme = document.activeElement) !== null && _document$activeEleme !== void 0 && _document$activeEleme.contains(e.target))) {
252
+ e.stopPropagation();
253
+ }
254
+ }
255
+ }), emojiNode, (0, _react2.jsx)(_DeleteButton.default, {
256
+ onClick: function onClick(event) {
257
+ return handleDelete(props, event);
258
+ }
259
+ }), (0, _react2.jsx)(_DeletableEmojiTooltipContent.DeletableEmojiTooltipContentForScreenReader, {
260
+ emoji: emoji
261
+ })));
262
+ }
263
+ return (0, _react2.jsx)(EmojiNodeWrapper, (0, _extends2.default)({}, props, {
264
+ type: "image",
265
+ className: classes,
266
+ ref: ref
267
+ }), emojiNode);
268
+ };
269
+ exports.ImageEmoji = ImageEmoji;
270
+ var EmojiNodeWrapper = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
271
+ var emoji = props.emoji,
272
+ fitToHeight = props.fitToHeight,
273
+ selected = props.selected,
274
+ selectOnHover = props.selectOnHover,
275
+ className = props.className,
276
+ showTooltip = props.showTooltip,
277
+ showDelete = props.showDelete,
278
+ _props$shouldBeIntera = props.shouldBeInteractive,
279
+ shouldBeInteractive = _props$shouldBeIntera === void 0 ? false : _props$shouldBeIntera,
280
+ tabIndex = props.tabIndex,
281
+ onSelected = props.onSelected,
282
+ onMouseMove = props.onMouseMove,
283
+ onFocus = props.onFocus,
284
+ onDelete = props.onDelete,
285
+ onLoadError = props.onLoadError,
286
+ onLoadSuccess = props.onLoadSuccess,
287
+ disableLazyLoad = props.disableLazyLoad,
288
+ autoWidth = props.autoWidth,
289
+ children = props.children,
290
+ type = props.type,
291
+ other = (0, _objectWithoutProperties2.default)(props, _excluded);
279
292
  return (0, _react2.jsx)("span", (0, _extends2.default)({
280
- "data-testid": "image-emoji-".concat(emoji.shortName),
281
- "data-emoji-type": "image",
282
- css: _styles.emojiStyles,
293
+ ref: ref,
294
+ "data-testid": "".concat(type, "-emoji-").concat(emoji.shortName),
295
+ "data-emoji-type": type,
283
296
  tabIndex: shouldBeInteractive ? tabIndex || 0 : undefined,
284
297
  role: shouldBeInteractive ? 'button' : 'img',
285
- className: classes,
286
- onKeyPress: function onKeyPress(event) {
287
- return handleKeyPress(props, event);
298
+ css: type === 'sprite' ? _styles.emojiSpriteContainer : _styles.emojiImageContainer,
299
+ className: className,
300
+ onKeyDown: function onKeyDown(event) {
301
+ return handleKeyDown(props, event);
288
302
  },
289
303
  onMouseDown: function onMouseDown(event) {
290
304
  handleMouseDown(props, event);
@@ -296,11 +310,10 @@ var ImageEmoji = function ImageEmoji(props) {
296
310
  handleFocus(props, event);
297
311
  },
298
312
  "aria-label": emoji.shortName,
299
- title: showTooltip ? emoji.shortName : '',
300
- ref: ref
301
- }, other), deleteButton, emojiNode);
302
- };
303
- exports.ImageEmoji = ImageEmoji;
313
+ title: showTooltip ? emoji.shortName : undefined // TODO: COLLAB-2351 - use @atlaskit/Tooltip in future for non-deletable emoji if enabled showTooltip
314
+ }, other), children);
315
+ });
316
+ exports.EmojiNodeWrapper = EmojiNodeWrapper;
304
317
  var Emoji = function Emoji(props) {
305
318
  var emoji = props.emoji;
306
319
  // start emoji rendered experience, it may have already started earlier in ResourcedEmoji or CachingEmoji
@@ -64,14 +64,15 @@ var TonesWrapper = function TonesWrapper(props) {
64
64
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
65
65
  focusTonePreviewButton = _useState2[0],
66
66
  setFocusTonePreviewButton = _useState2[1];
67
- (0, _react.useEffect)(function () {
68
- if (focusTonePreviewButton && tonePreviewButtonRef.current) {
69
- tonePreviewButtonRef.current.focus();
67
+ (0, _react.useLayoutEffect)(function () {
68
+ if (focusTonePreviewButton && !showToneSelector) {
69
+ var _tonePreviewButtonRef;
70
+ (_tonePreviewButtonRef = tonePreviewButtonRef.current) === null || _tonePreviewButtonRef === void 0 ? void 0 : _tonePreviewButtonRef.focus();
70
71
  }
71
72
  return function () {
72
73
  setFocusTonePreviewButton(false);
73
74
  };
74
- });
75
+ }, [focusTonePreviewButton, showToneSelector]);
75
76
  var onToneCloseHandler = function onToneCloseHandler() {
76
77
  var onToneClose = props.onToneClose;
77
78
  onToneClose();
@@ -174,10 +175,11 @@ var EmojiActions = function EmojiActions(props) {
174
175
  onMouseLeave: onMouseLeaveHandler
175
176
  }, (0, _react2.jsx)("div", {
176
177
  css: _styles.emojiActionsWrapper
177
- }, !showToneSelector && (0, _react2.jsx)(_EmojiPickerListSearch.EmojiPickerListSearch, {
178
+ }, (0, _react2.jsx)(_EmojiPickerListSearch.EmojiPickerListSearch, {
178
179
  onChange: onChange,
179
180
  query: query,
180
- resultsCount: resultsCount
181
+ resultsCount: resultsCount,
182
+ isVisible: !showToneSelector
181
183
  }), (0, _react2.jsx)(TonesWrapper, (0, _extends2.default)({}, props, {
182
184
  onToneOpen: onToneOpenHandler,
183
185
  onToneClose: onToneCloseHandler,
@@ -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
  });
@@ -17,15 +18,20 @@ var _react = require("react");
17
18
  var _react2 = require("@emotion/react");
18
19
  var _reactIntlNext = require("react-intl-next");
19
20
  var _customThemeButton = _interopRequireDefault(require("@atlaskit/button/custom-theme-button"));
21
+ var _reactFocusLock = _interopRequireDefault(require("react-focus-lock"));
20
22
  var _i18n = require("../i18n");
21
23
  var _CachingEmoji = _interopRequireDefault(require("./CachingEmoji"));
22
- var _EmojiErrorMessage = _interopRequireDefault(require("./EmojiErrorMessage"));
24
+ var _EmojiErrorMessage = _interopRequireWildcard(require("./EmojiErrorMessage"));
23
25
  var _RetryableButton = _interopRequireDefault(require("./RetryableButton"));
24
26
  var _styles = require("./styles");
27
+ var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
28
+ 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); }
29
+ 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; }
25
30
  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); }; }
26
31
  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; } }
27
32
  var emojiDeletePreviewTestId = 'emoji-delete-preview';
28
33
  exports.emojiDeletePreviewTestId = emojiDeletePreviewTestId;
34
+ var deleteEmojiLabelId = 'fabric.emoji.delete.label.id';
29
35
  var EmojiDeletePreview = /*#__PURE__*/function (_Component) {
30
36
  (0, _inherits2.default)(EmojiDeletePreview, _Component);
31
37
  var _super = _createSuper(EmojiDeletePreview);
@@ -82,12 +88,16 @@ var EmojiDeletePreview = /*#__PURE__*/function (_Component) {
82
88
  loading = _this$state.loading,
83
89
  error = _this$state.error;
84
90
  var formatMessage = intl.formatMessage;
85
- return (0, _react2.jsx)("div", {
91
+ return (0, _react2.jsx)(_reactFocusLock.default, {
92
+ noFocusGuards: true
93
+ }, (0, _react2.jsx)("div", {
86
94
  css: _styles.deletePreview,
87
95
  "data-testid": emojiDeletePreviewTestId
88
96
  }, (0, _react2.jsx)("div", {
89
97
  css: _styles.deleteText
90
- }, (0, _react2.jsx)("h5", null, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.deleteEmojiTitle)), (0, _react2.jsx)(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, _i18n.messages.deleteEmojiDescription, {
98
+ }, (0, _react2.jsx)("h2", {
99
+ css: _styles.headingH5
100
+ }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.deleteEmojiTitle)), (0, _react2.jsx)(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, _i18n.messages.deleteEmojiDescription, {
91
101
  values: {
92
102
  emojiShortName: emoji.shortName
93
103
  }
@@ -101,17 +111,20 @@ var EmojiDeletePreview = /*#__PURE__*/function (_Component) {
101
111
  message: formatMessage(_i18n.messages.deleteEmojiFailed),
102
112
  messageStyles: _styles.emojiDeleteErrorMessage,
103
113
  tooltip: true
104
- }) : null : null, (0, _react2.jsx)(_RetryableButton.default, {
114
+ }) : null : null, (0, _react2.jsx)(_visuallyHidden.default, {
115
+ id: deleteEmojiLabelId
116
+ }, formatMessage(_i18n.messages.deleteEmojiLabel)), (0, _react2.jsx)(_RetryableButton.default, {
105
117
  label: formatMessage(_i18n.messages.deleteEmojiLabel),
106
118
  onSubmit: this.onSubmit,
107
119
  appearance: "danger",
108
120
  loading: loading,
109
- error: error
121
+ error: error,
122
+ ariaLabelledBy: "".concat(_EmojiErrorMessage.emojiErrorScreenreaderTestId, " ").concat(deleteEmojiLabelId)
110
123
  }), (0, _react2.jsx)(_customThemeButton.default, {
111
124
  appearance: "subtle",
112
125
  onClick: this.onCancel,
113
126
  css: _styles.cancelButton
114
- }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.cancelLabel)))));
127
+ }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.cancelLabel))))));
115
128
  }
116
129
  }]);
117
130
  return EmojiDeletePreview;
@@ -4,14 +4,18 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.emojiErrorMessageTooltipTestId = exports.emojiErrorMessageTestId = exports.emojiErrorIconTestId = exports.default = void 0;
7
+ exports.emojiErrorScreenreaderTestId = exports.emojiErrorMessageTooltipTestId = exports.emojiErrorMessageTestId = exports.emojiErrorIconTestId = exports.default = void 0;
8
8
  var _react = require("react");
9
9
  var _react2 = require("@emotion/react");
10
10
  var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
11
11
  var _error = _interopRequireDefault(require("@atlaskit/icon/glyph/error"));
12
12
  var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
13
+ var _reactIntlNext = require("react-intl-next");
14
+ var _i18n = require("../i18n");
13
15
  /** @jsx jsx */
14
16
 
17
+ var emojiErrorScreenreaderTestId = 'emoji-error-screenreader-message';
18
+ exports.emojiErrorScreenreaderTestId = emojiErrorScreenreaderTestId;
15
19
  var emojiErrorMessageTestId = 'emoji-error-message';
16
20
  exports.emojiErrorMessageTestId = emojiErrorMessageTestId;
17
21
  var emojiErrorMessageTooltipTestId = 'emoji-error-message-tooltip';
@@ -22,6 +26,8 @@ var EmojiErrorMessage = function EmojiErrorMessage(props) {
22
26
  var messageStyles = props.messageStyles,
23
27
  message = props.message,
24
28
  tooltip = props.tooltip;
29
+ var _useIntl = (0, _reactIntlNext.useIntl)(),
30
+ formatMessage = _useIntl.formatMessage;
25
31
  var visualContent = tooltip ? (0, _react2.jsx)("div", {
26
32
  css: messageStyles,
27
33
  "data-testid": emojiErrorMessageTestId
@@ -30,19 +36,21 @@ var EmojiErrorMessage = function EmojiErrorMessage(props) {
30
36
  position: "top",
31
37
  testId: emojiErrorMessageTooltipTestId
32
38
  }, (0, _react2.jsx)(_error.default, {
33
- label: "Error",
39
+ label: formatMessage(_i18n.messages.error),
34
40
  size: "medium",
35
41
  testId: emojiErrorIconTestId
36
42
  }))) : (0, _react2.jsx)("div", {
37
43
  css: messageStyles,
38
44
  "data-testid": emojiErrorMessageTestId
39
45
  }, (0, _react2.jsx)(_error.default, {
40
- label: "Error",
46
+ label: formatMessage(_i18n.messages.error),
41
47
  size: "small"
42
48
  }), message);
43
49
  return (0, _react2.jsx)(_react.Fragment, null, (0, _react2.jsx)(_visuallyHidden.default, {
44
- role: "alert"
45
- }, message), visualContent);
50
+ id: emojiErrorScreenreaderTestId
51
+ }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.error, function (errMsg) {
52
+ return (0, _react2.jsx)("span", null, errMsg, " ", message, ".");
53
+ })), visualContent);
46
54
  };
47
55
  var _default = EmojiErrorMessage;
48
56
  exports.default = _default;
@@ -28,6 +28,7 @@ var handleKeyPress = function handleKeyPress(props, event) {
28
28
  if (_constants.TONESELECTOR_KEYBOARD_KEYS_SUPPORTED.includes(event.key)) {
29
29
  var onSelected = props.onSelected;
30
30
  event.preventDefault();
31
+ event.stopPropagation();
31
32
  if (onSelected) {
32
33
  onSelected();
33
34
  }