@atlaskit/emoji 66.0.3 → 66.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/components/common/EmojiUploadPicker.js +17 -0
  3. package/dist/cjs/components/common/styles.js +17 -6
  4. package/dist/cjs/components/picker/EmojiPicker.js +5 -0
  5. package/dist/cjs/components/picker/EmojiPickerComponent.js +6 -3
  6. package/dist/cjs/components/picker/EmojiPickerList.js +8 -3
  7. package/dist/cjs/components/picker/EmojiPickerListSearch.js +1 -1
  8. package/dist/cjs/components/picker/EmojiPickerSizes.js +1 -1
  9. package/dist/cjs/components/picker/styles.js +11 -4
  10. package/dist/cjs/components/picker/utils.js +20 -0
  11. package/dist/cjs/util/constants.js +13 -2
  12. package/dist/cjs/version.json +1 -1
  13. package/dist/es2019/components/common/EmojiUploadPicker.js +16 -1
  14. package/dist/es2019/components/common/styles.js +14 -5
  15. package/dist/es2019/components/picker/EmojiPicker.js +6 -0
  16. package/dist/es2019/components/picker/EmojiPickerComponent.js +6 -4
  17. package/dist/es2019/components/picker/EmojiPickerList.js +7 -4
  18. package/dist/es2019/components/picker/EmojiPickerListSearch.js +1 -1
  19. package/dist/es2019/components/picker/EmojiPickerSizes.js +2 -2
  20. package/dist/es2019/components/picker/styles.js +10 -5
  21. package/dist/es2019/components/picker/utils.js +10 -0
  22. package/dist/es2019/util/constants.js +7 -1
  23. package/dist/es2019/version.json +1 -1
  24. package/dist/esm/components/common/EmojiUploadPicker.js +16 -1
  25. package/dist/esm/components/common/styles.js +14 -5
  26. package/dist/esm/components/picker/EmojiPicker.js +6 -0
  27. package/dist/esm/components/picker/EmojiPickerComponent.js +7 -4
  28. package/dist/esm/components/picker/EmojiPickerList.js +8 -4
  29. package/dist/esm/components/picker/EmojiPickerListSearch.js +1 -1
  30. package/dist/esm/components/picker/EmojiPickerSizes.js +2 -2
  31. package/dist/esm/components/picker/styles.js +10 -4
  32. package/dist/esm/components/picker/utils.js +10 -0
  33. package/dist/esm/util/constants.js +7 -1
  34. package/dist/esm/version.json +1 -1
  35. package/dist/types/components/common/styles.d.ts +2 -0
  36. package/dist/types/components/picker/EmojiPicker.d.ts +11 -2
  37. package/dist/types/components/picker/EmojiPickerComponent.d.ts +3 -2
  38. package/dist/types/components/picker/EmojiPickerList.d.ts +3 -1
  39. package/dist/types/components/picker/styles.d.ts +2 -1
  40. package/dist/types/components/picker/utils.d.ts +2 -0
  41. package/dist/types/index.d.ts +1 -1
  42. package/dist/types/types.d.ts +1 -0
  43. package/dist/types/util/constants.d.ts +6 -1
  44. package/package.json +4 -4
  45. package/report.api.md +66 -28
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 66.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`cde71051978`](https://bitbucket.org/atlassian/atlassian-frontend/commits/cde71051978) - [ux] Provide size options for emoji picker, including `small`, `medium`, and `large`. Make `medium` size for emoji picker by default, which will enlarge emoji picker to show more emojis.
8
+
9
+ ### Patch Changes
10
+
11
+ - [`1324afa6676`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1324afa6676) - Add autofocus for emoji picker inside requestAnimationFrame
12
+ - Updated dependencies
13
+
3
14
  ## 66.0.3
4
15
 
5
16
  ### Patch Changes
@@ -23,6 +23,10 @@ var _reactIntlNext = require("react-intl-next");
23
23
 
24
24
  var _textfield = _interopRequireDefault(require("@atlaskit/textfield"));
25
25
 
26
+ var _cross = _interopRequireDefault(require("@atlaskit/icon/glyph/cross"));
27
+
28
+ var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
29
+
26
30
  var ImageUtil = _interopRequireWildcard(require("../../util/image"));
27
31
 
28
32
  var _logger = _interopRequireDefault(require("../../util/logger"));
@@ -83,10 +87,23 @@ var ChooseEmojiFile = function ChooseEmojiFile(props) {
83
87
  return (0, _react2.jsx)("div", {
84
88
  css: _styles.emojiUpload
85
89
  }, (0, _react2.jsx)("div", {
90
+ css: _styles.emojiUploadTop
91
+ }, (0, _react2.jsx)("span", {
86
92
  css: _styles.uploadChooseFileMessage
87
93
  }, (0, _react2.jsx)(_reactIntlNext.FormattedMessage, _i18n.messages.addCustomEmojiLabel, function (message) {
88
94
  return (0, _react2.jsx)("h5", null, message);
89
95
  })), (0, _react2.jsx)("div", {
96
+ css: _styles.closeEmojiUploadButton
97
+ }, (0, _react2.jsx)(_standardButton.default, {
98
+ onClick: onUploadCancelled,
99
+ "aria-describedby": formatMessage(_i18n.messages.cancelLabel),
100
+ appearance: "subtle",
101
+ spacing: "none",
102
+ shouldFitContainer: true
103
+ }, (0, _react2.jsx)(_cross.default, {
104
+ size: "small",
105
+ label: formatMessage(_i18n.messages.cancelLabel)
106
+ })))), (0, _react2.jsx)("div", {
90
107
  css: _styles.uploadChooseFileRow
91
108
  }, (0, _react2.jsx)("span", {
92
109
  css: _styles.uploadChooseFileEmojiName
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- 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.hiddenToneButton = exports.emojiUploadBottom = exports.emojiUpload = exports.emojiToneSelectorContainer = exports.emojiStyles = exports.emojiSprite = exports.emojiShortName = exports.emojiScrollable = 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.cancelButton = exports.buttonSpinner = exports.bigEmojiPreview = exports.addCustomEmojiButton = exports.addCustomEmoji = void 0;
8
+ 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.hiddenToneButton = exports.emojiUploadTop = exports.emojiUploadBottom = exports.emojiUpload = exports.emojiToneSelectorContainer = exports.emojiStyles = exports.emojiSprite = exports.emojiShortName = exports.emojiScrollable = 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;
9
9
 
10
10
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
11
 
@@ -129,7 +129,7 @@ var emojiButton = (0, _react.css)((_css3 = {
129
129
  padding: 0
130
130
  }), (0, _defineProperty2.default)(_css3, '&>span', (_span = {
131
131
  borderRadius: "".concat((0, _constants.borderRadius)(), "px"),
132
- padding: '8px'
132
+ padding: '6px'
133
133
  }, (0, _defineProperty2.default)(_span, "&>.".concat(emojiSprite), {
134
134
  height: '24px',
135
135
  width: '24px'
@@ -234,19 +234,30 @@ var emojiUpload = (0, _react.css)({
234
234
  justifyContent: 'space-around'
235
235
  });
236
236
  exports.emojiUpload = emojiUpload;
237
+ var emojiUploadTop = (0, _react.css)({
238
+ paddingBottom: '7px',
239
+ display: 'flex',
240
+ justifyContent: 'space-between',
241
+ alignItems: 'flex-end',
242
+ fontSize: '12px'
243
+ });
244
+ exports.emojiUploadTop = emojiUploadTop;
237
245
  var uploadChooseFileMessage = (0, _react.css)({
238
- color: (0, _tokens.token)('color.text.subtle', _colors.N300),
239
- fontSize: '12px',
240
- paddingBottom: '7px'
246
+ color: (0, _tokens.token)('color.text.subtle', _colors.N300)
241
247
  });
242
248
  exports.uploadChooseFileMessage = uploadChooseFileMessage;
249
+ var closeEmojiUploadButton = (0, _react.css)({
250
+ display: 'flex'
251
+ });
252
+ exports.closeEmojiUploadButton = closeEmojiUploadButton;
243
253
  var emojiUploadBottom = (0, _react.css)({
244
254
  fontSize: '11px'
245
255
  });
246
256
  exports.emojiUploadBottom = emojiUploadBottom;
247
257
  var uploadChooseFileRow = (0, _react.css)({
248
258
  display: 'flex',
249
- justifyContent: 'space-between'
259
+ justifyContent: 'space-between',
260
+ paddingBottom: '7px'
250
261
  });
251
262
  exports.uploadChooseFileRow = uploadChooseFileRow;
252
263
  var uploadChooseFileEmojiName = (0, _react.css)({
@@ -41,6 +41,8 @@ var _styles = require("./styles");
41
41
 
42
42
  var _UfoErrorBoundary = require("../common/UfoErrorBoundary");
43
43
 
44
+ var _constants = require("../../util/constants");
45
+
44
46
  var _excluded = ["emojiProvider"];
45
47
 
46
48
  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); }; }
@@ -132,6 +134,9 @@ var EmojiPickerInternal = /*#__PURE__*/function (_LoadingEmojiComponen) {
132
134
  }(_LoadingEmojiComponent.default);
133
135
 
134
136
  exports.EmojiPickerInternal = EmojiPickerInternal;
137
+ (0, _defineProperty2.default)(EmojiPickerInternal, "defaultProps", {
138
+ size: _constants.defaultEmojiPickerSize
139
+ });
135
140
  var EmojiPicker = (0, _analyticsNext.withAnalyticsEvents)()(EmojiPickerInternal);
136
141
  var _default = EmojiPicker;
137
142
  exports.default = _default;
@@ -62,7 +62,9 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
62
62
  onSelection = _ref.onSelection,
63
63
  onPickerRef = _ref.onPickerRef,
64
64
  hideToneSelector = _ref.hideToneSelector,
65
- createAnalyticsEvent = _ref.createAnalyticsEvent;
65
+ createAnalyticsEvent = _ref.createAnalyticsEvent,
66
+ _ref$size = _ref.size,
67
+ size = _ref$size === void 0 ? _constants.defaultEmojiPickerSize : _ref$size;
66
68
 
67
69
  var _useState = (0, _react.useState)([]),
68
70
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -575,7 +577,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
575
577
  return (0, _react2.jsx)(_LegacyEmojiContextProvider.default, {
576
578
  emojiContextValue: emojiContextValue
577
579
  }, (0, _react2.jsx)("div", {
578
- css: (0, _styles.emojiPicker)(showPreview),
580
+ css: (0, _styles.emojiPicker)(showPreview, size),
579
581
  ref: onPickerRef,
580
582
  "data-emoji-picker-container": true
581
583
  }, (0, _react2.jsx)(_CategorySelector.default, {
@@ -608,7 +610,8 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
608
610
  onDeleteEmoji: onDeleteEmoji,
609
611
  onCloseDelete: onCloseDelete,
610
612
  onFileChooserClicked: onFileChooserClicked,
611
- onOpenUpload: onOpenUpload
613
+ onOpenUpload: onOpenUpload,
614
+ size: size
612
615
  }), showPreview && (0, _react2.jsx)(_EmojiPickerFooter.default, {
613
616
  selectedEmoji: selectedEmoji
614
617
  })));
@@ -45,6 +45,8 @@ var _EmojiActions = _interopRequireDefault(require("../common/EmojiActions"));
45
45
 
46
46
  var _styles = require("./styles");
47
47
 
48
+ var _utils = require("./utils");
49
+
48
50
  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); }
49
51
 
50
52
  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; }
@@ -296,7 +298,9 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
296
298
  onCloseDelete = _this$props2.onCloseDelete,
297
299
  onDeleteEmoji = _this$props2.onDeleteEmoji,
298
300
  onFileChooserClicked = _this$props2.onFileChooserClicked,
299
- onOpenUpload = _this$props2.onOpenUpload;
301
+ onOpenUpload = _this$props2.onOpenUpload,
302
+ _this$props2$size = _this$props2.size,
303
+ size = _this$props2$size === void 0 ? _constants.defaultEmojiPickerSize : _this$props2$size;
300
304
  return (0, _react2.jsx)("div", {
301
305
  ref: "root",
302
306
  css: _styles.emojiPickerList,
@@ -321,7 +325,7 @@ var EmojiPickerVirtualList = /*#__PURE__*/function (_PureComponent) {
321
325
  onChange: this.onSearch
322
326
  }), (0, _react2.jsx)(_List.List, {
323
327
  ref: "list",
324
- height: _EmojiPickerSizes.sizes.listHeight,
328
+ height: _EmojiPickerSizes.sizes.listHeight + (0, _utils.emojiPickerHeightOffset)(size),
325
329
  overscanRowCount: 5,
326
330
  rowCount: this.virtualItems.length,
327
331
  rowHeight: this.rowSize,
@@ -342,5 +346,6 @@ exports.default = EmojiPickerVirtualList;
342
346
  onEmojiActive: function onEmojiActive() {},
343
347
  onEmojiDelete: function onEmojiDelete() {},
344
348
  onCategoryActivated: function onCategoryActivated() {},
345
- onSearch: function onSearch() {}
349
+ onSearch: function onSearch() {},
350
+ size: _constants.defaultEmojiPickerSize
346
351
  });
@@ -89,7 +89,7 @@ var EmojiPickerListSearch = /*#__PURE__*/function (_PureComponent) {
89
89
  return;
90
90
  }
91
91
 
92
- window.setTimeout(_this.focusInput);
92
+ window.requestAnimationFrame(_this.focusInput);
93
93
  }
94
94
  });
95
95
  return _this;
@@ -8,7 +8,7 @@ exports.sizes = void 0;
8
8
  var _constants = require("../../util/constants");
9
9
 
10
10
  var sizes = {
11
- listHeight: 208,
11
+ listHeight: _constants.emojiPickerListHeight,
12
12
  listWidth: _constants.emojiPickerWidth,
13
13
  searchHeight: 52,
14
14
  // 32px height + 10px padding top/bottom
@@ -13,8 +13,6 @@ var _react = require("@emotion/react");
13
13
 
14
14
  var _tokens = require("@atlaskit/tokens");
15
15
 
16
- var _colors = require("@atlaskit/theme/colors");
17
-
18
16
  var _constants = require("@atlaskit/theme/constants");
19
17
 
20
18
  var _sharedStyles = require("../../util/shared-styles");
@@ -23,10 +21,16 @@ var _styles = require("../common/styles");
23
21
 
24
22
  var _constants2 = require("../../util/constants");
25
23
 
24
+ var _colors = require("@atlaskit/theme/colors");
25
+
26
+ var _utils = require("./utils");
27
+
26
28
  var _css4, _css5, _css6;
27
29
 
28
30
  // Level 1 - picker
29
31
  var emojiPicker = function emojiPicker(hasPreview) {
32
+ var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _constants2.defaultEmojiPickerSize;
33
+ var heightOffset = (0, _utils.emojiPickerHeightOffset)(size);
30
34
  return (0, _react.css)({
31
35
  display: 'flex',
32
36
  flexDirection: 'column',
@@ -35,10 +39,13 @@ var emojiPicker = function emojiPicker(hasPreview) {
35
39
  border: "".concat(_sharedStyles.emojiPickerBorderColor, " 1px solid"),
36
40
  borderRadius: "".concat((0, _constants.borderRadius)(), "px"),
37
41
  boxShadow: _sharedStyles.emojiPickerBoxShadow,
38
- height: "".concat(hasPreview ? _constants2.emojiPickerHeightWithPreview : _constants2.emojiPickerHeight, "px"),
42
+ height: "".concat(hasPreview ? _constants2.emojiPickerHeightWithPreview + heightOffset : _constants2.emojiPickerHeight + heightOffset, "px"),
39
43
  width: "".concat(_constants2.emojiPickerWidth, "px"),
40
44
  marginBottom: '8px',
41
- minWidth: "".concat(_constants2.emojiPickerWidth, "px")
45
+ minWidth: "".concat(_constants2.emojiPickerWidth, "px"),
46
+ minHeight: "".concat(_constants2.emojiPickerMinHeight + heightOffset, "px"),
47
+ maxHeight: 'calc(80vh - 86px)' // ensure showing full picker in small device: mobile header is 40px (Jira) - 56px(Confluence and Atlas), reaction picker height is 24px with margin 6px,
48
+
42
49
  });
43
50
  }; // Level 2
44
51
  /// Category Selector
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.emojiPickerHeightOffset = void 0;
7
+
8
+ var _constants = require("../../util/constants");
9
+
10
+ var emojiPickerHeightOffset = function emojiPickerHeightOffset(size) {
11
+ if (size === 'medium') {
12
+ return _constants.sizeGap;
13
+ } else if (size === 'large') {
14
+ return _constants.sizeGap * 2;
15
+ }
16
+
17
+ return 0;
18
+ };
19
+
20
+ exports.emojiPickerHeightOffset = emojiPickerHeightOffset;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.userCustomTitle = exports.selectedToneStorageKey = exports.migrationUserId = exports.localStoragePrefix = exports.frequentCategory = exports.emojiPickerWidth = exports.emojiPickerHeightWithPreview = exports.emojiPickerHeight = exports.deleteEmojiLabel = exports.defaultListLimit = exports.defaultEmojiHeight = exports.defaultCategories = exports.dataURLPrefix = exports.customType = exports.customTitle = exports.customCategory = exports.analyticsEmojiPrefix = exports.SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = exports.MAX_ORDINAL = void 0;
6
+ exports.userCustomTitle = exports.sizeGap = exports.selectedToneStorageKey = exports.migrationUserId = exports.localStoragePrefix = exports.frequentCategory = exports.emojiPickerWidth = exports.emojiPickerPreviewHeight = exports.emojiPickerMinHeight = exports.emojiPickerListHeight = exports.emojiPickerHeightWithPreview = exports.emojiPickerHeight = exports.deleteEmojiLabel = exports.defaultListLimit = exports.defaultEmojiPickerSize = exports.defaultEmojiHeight = exports.defaultCategories = exports.dataURLPrefix = exports.customType = exports.customTitle = exports.customCategory = exports.analyticsEmojiPrefix = exports.SAMPLING_RATE_EMOJI_RESOURCE_FETCHED_EXP = exports.SAMPLING_RATE_EMOJI_RENDERED_EXP = exports.MAX_ORDINAL = void 0;
7
7
  var customCategory = 'CUSTOM';
8
8
  exports.customCategory = customCategory;
9
9
  var frequentCategory = 'FREQUENT';
@@ -29,9 +29,20 @@ var defaultEmojiHeight = 20;
29
29
  exports.defaultEmojiHeight = defaultEmojiHeight;
30
30
  var emojiPickerWidth = 350;
31
31
  exports.emojiPickerWidth = emojiPickerWidth;
32
+ var sizeGap = 80;
33
+ exports.sizeGap = sizeGap;
34
+ var defaultEmojiPickerSize = 'medium';
35
+ exports.defaultEmojiPickerSize = defaultEmojiPickerSize;
36
+ var emojiPickerMinHeight = 260;
37
+ exports.emojiPickerMinHeight = emojiPickerMinHeight;
32
38
  var emojiPickerHeight = 295;
33
39
  exports.emojiPickerHeight = emojiPickerHeight;
34
- var emojiPickerHeightWithPreview = 348;
40
+ var emojiPickerListHeight = emojiPickerHeight - 58; // picker height - actions height
41
+
42
+ exports.emojiPickerListHeight = emojiPickerListHeight;
43
+ var emojiPickerPreviewHeight = 54;
44
+ exports.emojiPickerPreviewHeight = emojiPickerPreviewHeight;
45
+ var emojiPickerHeightWithPreview = emojiPickerHeight + emojiPickerPreviewHeight;
35
46
  exports.emojiPickerHeightWithPreview = emojiPickerHeightWithPreview;
36
47
  var localStoragePrefix = 'fabric.emoji';
37
48
  exports.localStoragePrefix = localStoragePrefix;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "66.0.3",
3
+ "version": "66.1.0",
4
4
  "sideEffects": false
5
5
  }
@@ -3,6 +3,8 @@ import React, { Fragment, useEffect, useState } from 'react';
3
3
  import { jsx } from '@emotion/react';
4
4
  import { FormattedMessage, injectIntl } from 'react-intl-next';
5
5
  import TextField from '@atlaskit/textfield';
6
+ import CrossIcon from '@atlaskit/icon/glyph/cross';
7
+ import AkButton from '@atlaskit/button/standard-button';
6
8
  import * as ImageUtil from '../../util/image';
7
9
  import debug from '../../util/logger';
8
10
  import { messages } from '../i18n';
@@ -10,7 +12,7 @@ import EmojiErrorMessage from './EmojiErrorMessage';
10
12
  import EmojiUploadPreview from './EmojiUploadPreview';
11
13
  import FileChooser from './FileChooser';
12
14
  import { UploadStatus } from './internal-types';
13
- import { emojiChooseFileErrorMessage, emojiUpload, emojiUploadBottom, uploadChooseFileBrowse, uploadChooseFileEmojiName, uploadChooseFileMessage, uploadChooseFileRow } from './styles';
15
+ import { closeEmojiUploadButton, emojiChooseFileErrorMessage, emojiUpload, emojiUploadBottom, emojiUploadTop, uploadChooseFileBrowse, uploadChooseFileEmojiName, uploadChooseFileMessage, uploadChooseFileRow } from './styles';
14
16
  const disallowedReplacementsMap = new Map([[':', ''], ['!', ''], ['@', ''], ['#', ''], ['%', ''], ['^', ''], ['&', ''], ['*', ''], ['(', ''], [')', ''], [' ', '_']]);
15
17
 
16
18
  const sanitizeName = name => {
@@ -53,8 +55,21 @@ const ChooseEmojiFile = props => {
53
55
  return jsx("div", {
54
56
  css: emojiUpload
55
57
  }, jsx("div", {
58
+ css: emojiUploadTop
59
+ }, jsx("span", {
56
60
  css: uploadChooseFileMessage
57
61
  }, jsx(FormattedMessage, messages.addCustomEmojiLabel, message => jsx("h5", null, message))), jsx("div", {
62
+ css: closeEmojiUploadButton
63
+ }, jsx(AkButton, {
64
+ onClick: onUploadCancelled,
65
+ "aria-describedby": formatMessage(messages.cancelLabel),
66
+ appearance: "subtle",
67
+ spacing: "none",
68
+ shouldFitContainer: true
69
+ }, jsx(CrossIcon, {
70
+ size: "small",
71
+ label: formatMessage(messages.cancelLabel)
72
+ })))), jsx("div", {
58
73
  css: uploadChooseFileRow
59
74
  }, jsx("span", {
60
75
  css: uploadChooseFileEmojiName
@@ -109,7 +109,7 @@ export const emojiButton = css({
109
109
  },
110
110
  '&>span': {
111
111
  borderRadius: `${borderRadius()}px`,
112
- padding: '8px',
112
+ padding: '6px',
113
113
  // Scale sprite to fit regardless of default emoji size
114
114
  [`&>.${emojiSprite}`]: {
115
115
  height: '24px',
@@ -213,17 +213,26 @@ export const emojiUpload = css({
213
213
  flexDirection: 'column',
214
214
  justifyContent: 'space-around'
215
215
  });
216
+ export const emojiUploadTop = css({
217
+ paddingBottom: '7px',
218
+ display: 'flex',
219
+ justifyContent: 'space-between',
220
+ alignItems: 'flex-end',
221
+ fontSize: '12px'
222
+ });
216
223
  export const uploadChooseFileMessage = css({
217
- color: token('color.text.subtle', N300),
218
- fontSize: '12px',
219
- paddingBottom: '7px'
224
+ color: token('color.text.subtle', N300)
225
+ });
226
+ export const closeEmojiUploadButton = css({
227
+ display: 'flex'
220
228
  });
221
229
  export const emojiUploadBottom = css({
222
230
  fontSize: '11px'
223
231
  });
224
232
  export const uploadChooseFileRow = css({
225
233
  display: 'flex',
226
- justifyContent: 'space-between'
234
+ justifyContent: 'space-between',
235
+ paddingBottom: '7px'
227
236
  });
228
237
  export const uploadChooseFileEmojiName = css({
229
238
  flex: '1 1 auto',
@@ -9,6 +9,7 @@ import LoadingEmojiComponent from '../common/LoadingEmojiComponent';
9
9
  import { LoadingItem } from './EmojiPickerVirtualItems';
10
10
  import { emojiPicker } from './styles';
11
11
  import { UfoErrorBoundary } from '../common/UfoErrorBoundary';
12
+ import { defaultEmojiPickerSize } from '../../util/constants';
12
13
 
13
14
  const emojiPickerModuleLoader = () => import(
14
15
  /* webpackChunkName:"@atlaskit-internal_emojiPickerComponent" */
@@ -65,5 +66,10 @@ export class EmojiPickerInternal extends LoadingEmojiComponent {
65
66
  }
66
67
 
67
68
  }
69
+
70
+ _defineProperty(EmojiPickerInternal, "defaultProps", {
71
+ size: defaultEmojiPickerSize
72
+ });
73
+
68
74
  const EmojiPicker = withAnalyticsEvents()(EmojiPickerInternal);
69
75
  export default EmojiPicker;
@@ -5,7 +5,7 @@ import { unstable_batchedUpdates as batchedUpdates } from 'react-dom';
5
5
  import { FormattedMessage } from 'react-intl-next';
6
6
  import { getEmojiVariation } from '../../api/EmojiRepository';
7
7
  import { supportsUploadFeature } from '../../api/EmojiResource';
8
- import { customCategory, frequentCategory } from '../../util/constants';
8
+ import { customCategory, defaultEmojiPickerSize, frequentCategory } from '../../util/constants';
9
9
  import { containsEmojiId, isPromise
10
10
  /*, isEmojiIdEqual, isEmojiLoaded*/
11
11
  , isEmojiDescription } from '../../util/type-helpers';
@@ -27,7 +27,8 @@ const EmojiPickerComponent = ({
27
27
  onSelection,
28
28
  onPickerRef,
29
29
  hideToneSelector,
30
- createAnalyticsEvent
30
+ createAnalyticsEvent,
31
+ size = defaultEmojiPickerSize
31
32
  }) => {
32
33
  const [filteredEmojis, setFilteredEmojis] = useState([]);
33
34
  const [searchEmojis, setSearchEmojis] = useState([]);
@@ -463,7 +464,7 @@ const EmojiPickerComponent = ({
463
464
  return jsx(LegacyEmojiContextProvider, {
464
465
  emojiContextValue: emojiContextValue
465
466
  }, jsx("div", {
466
- css: emojiPicker(showPreview),
467
+ css: emojiPicker(showPreview, size),
467
468
  ref: onPickerRef,
468
469
  "data-emoji-picker-container": true
469
470
  }, jsx(CategorySelector, {
@@ -496,7 +497,8 @@ const EmojiPickerComponent = ({
496
497
  onDeleteEmoji: onDeleteEmoji,
497
498
  onCloseDelete: onCloseDelete,
498
499
  onFileChooserClicked: onFileChooserClicked,
499
- onOpenUpload: onOpenUpload
500
+ onOpenUpload: onOpenUpload,
501
+ size: size
500
502
  }), showPreview && jsx(EmojiPickerFooter, {
501
503
  selectedEmoji: selectedEmoji
502
504
  })));
@@ -4,13 +4,14 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
4
  import React, { PureComponent } from 'react';
5
5
  import { jsx } from '@emotion/react';
6
6
  import { List as VirtualList } from 'react-virtualized/dist/commonjs/List';
7
- import { customCategory, userCustomTitle } from '../../util/constants';
7
+ import { customCategory, defaultEmojiPickerSize, userCustomTitle } from '../../util/constants';
8
8
  import { CategoryDescriptionMap } from './categories';
9
9
  import CategoryTracker from './CategoryTracker';
10
10
  import { sizes } from './EmojiPickerSizes';
11
11
  import { CategoryHeadingItem, EmojisRowItem, LoadingItem, virtualItemRenderer } from './EmojiPickerVirtualItems';
12
12
  import EmojiActions from '../common/EmojiActions';
13
13
  import { emojiPickerList, virtualList } from './styles';
14
+ import { emojiPickerHeightOffset } from './utils';
14
15
  /**
15
16
  * Test id for wrapper Emoji Picker List div
16
17
  */
@@ -243,7 +244,8 @@ export default class EmojiPickerVirtualList extends PureComponent {
243
244
  onCloseDelete,
244
245
  onDeleteEmoji,
245
246
  onFileChooserClicked,
246
- onOpenUpload
247
+ onOpenUpload,
248
+ size = defaultEmojiPickerSize
247
249
  } = this.props;
248
250
  return jsx("div", {
249
251
  ref: "root",
@@ -269,7 +271,7 @@ export default class EmojiPickerVirtualList extends PureComponent {
269
271
  onChange: this.onSearch
270
272
  }), jsx(VirtualList, {
271
273
  ref: "list",
272
- height: sizes.listHeight,
274
+ height: sizes.listHeight + emojiPickerHeightOffset(size),
273
275
  overscanRowCount: 5,
274
276
  rowCount: this.virtualItems.length,
275
277
  rowHeight: this.rowSize,
@@ -288,5 +290,6 @@ _defineProperty(EmojiPickerVirtualList, "defaultProps", {
288
290
  onEmojiActive: () => {},
289
291
  onEmojiDelete: () => {},
290
292
  onCategoryActivated: () => {},
291
- onSearch: () => {}
293
+ onSearch: () => {},
294
+ size: defaultEmojiPickerSize
292
295
  });
@@ -44,7 +44,7 @@ class EmojiPickerListSearch extends PureComponent {
44
44
  return;
45
45
  }
46
46
 
47
- window.setTimeout(this.focusInput);
47
+ window.requestAnimationFrame(this.focusInput);
48
48
  }
49
49
  });
50
50
  }
@@ -1,6 +1,6 @@
1
- import { emojiPickerWidth } from '../../util/constants';
1
+ import { emojiPickerListHeight, emojiPickerWidth } from '../../util/constants';
2
2
  export const sizes = {
3
- listHeight: 208,
3
+ listHeight: emojiPickerListHeight,
4
4
  listWidth: emojiPickerWidth,
5
5
  searchHeight: 52,
6
6
  // 32px height + 10px padding top/bottom
@@ -1,12 +1,14 @@
1
1
  import { css } from '@emotion/react';
2
2
  import { token } from '@atlaskit/tokens';
3
- import { B200, B300, N100A, N200, N30, N30A, N50, N900 } from '@atlaskit/theme/colors';
4
3
  import { borderRadius } from '@atlaskit/theme/constants';
5
4
  import { emojiPickerBorderColor, emojiPickerBoxShadow } from '../../util/shared-styles';
6
5
  import { emojiSprite, placeholder, emojiNodeStyles } from '../common/styles';
7
- import { emojiPickerHeight, emojiPickerHeightWithPreview, emojiPickerWidth } from '../../util/constants'; // Level 1 - picker
6
+ import { defaultEmojiPickerSize, emojiPickerHeight, emojiPickerHeightWithPreview, emojiPickerMinHeight, emojiPickerWidth } from '../../util/constants';
7
+ import { B200, B300, N100A, N200, N30, N30A, N50, N900 } from '@atlaskit/theme/colors';
8
+ import { emojiPickerHeightOffset } from './utils'; // Level 1 - picker
8
9
 
9
- export const emojiPicker = hasPreview => {
10
+ export const emojiPicker = (hasPreview, size = defaultEmojiPickerSize) => {
11
+ const heightOffset = emojiPickerHeightOffset(size);
10
12
  return css({
11
13
  display: 'flex',
12
14
  flexDirection: 'column',
@@ -15,10 +17,13 @@ export const emojiPicker = hasPreview => {
15
17
  border: `${emojiPickerBorderColor} 1px solid`,
16
18
  borderRadius: `${borderRadius()}px`,
17
19
  boxShadow: emojiPickerBoxShadow,
18
- height: `${hasPreview ? emojiPickerHeightWithPreview : emojiPickerHeight}px`,
20
+ height: `${hasPreview ? emojiPickerHeightWithPreview + heightOffset : emojiPickerHeight + heightOffset}px`,
19
21
  width: `${emojiPickerWidth}px`,
20
22
  marginBottom: '8px',
21
- minWidth: `${emojiPickerWidth}px`
23
+ minWidth: `${emojiPickerWidth}px`,
24
+ minHeight: `${emojiPickerMinHeight + heightOffset}px`,
25
+ maxHeight: 'calc(80vh - 86px)' // ensure showing full picker in small device: mobile header is 40px (Jira) - 56px(Confluence and Atlas), reaction picker height is 24px with margin 6px,
26
+
22
27
  });
23
28
  }; // Level 2
24
29
  /// Category Selector
@@ -0,0 +1,10 @@
1
+ import { sizeGap } from '../../util/constants';
2
+ export const emojiPickerHeightOffset = size => {
3
+ if (size === 'medium') {
4
+ return sizeGap;
5
+ } else if (size === 'large') {
6
+ return sizeGap * 2;
7
+ }
8
+
9
+ return 0;
10
+ };
@@ -13,8 +13,14 @@ export const deleteEmojiLabel = 'delete-emoji';
13
13
  export const MAX_ORDINAL = 100000;
14
14
  export const defaultEmojiHeight = 20;
15
15
  export const emojiPickerWidth = 350;
16
+ export const sizeGap = 80;
17
+ export const defaultEmojiPickerSize = 'medium';
18
+ export const emojiPickerMinHeight = 260;
16
19
  export const emojiPickerHeight = 295;
17
- export const emojiPickerHeightWithPreview = 348;
20
+ export const emojiPickerListHeight = emojiPickerHeight - 58; // picker height - actions height
21
+
22
+ export const emojiPickerPreviewHeight = 54;
23
+ export const emojiPickerHeightWithPreview = emojiPickerHeight + emojiPickerPreviewHeight;
18
24
  export const localStoragePrefix = 'fabric.emoji';
19
25
  export const selectedToneStorageKey = `${localStoragePrefix}.selectedTone`;
20
26
  export const defaultCategories = ['PEOPLE', 'NATURE', 'FOODS', 'ACTIVITY', 'PLACES', 'OBJECTS', 'SYMBOLS', 'FLAGS'];
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/emoji",
3
- "version": "66.0.3",
3
+ "version": "66.1.0",
4
4
  "sideEffects": false
5
5
  }
@@ -7,6 +7,8 @@ import React, { Fragment, useEffect, useState } from 'react';
7
7
  import { jsx } from '@emotion/react';
8
8
  import { FormattedMessage, injectIntl } from 'react-intl-next';
9
9
  import TextField from '@atlaskit/textfield';
10
+ import CrossIcon from '@atlaskit/icon/glyph/cross';
11
+ import AkButton from '@atlaskit/button/standard-button';
10
12
  import * as ImageUtil from '../../util/image';
11
13
  import debug from '../../util/logger';
12
14
  import { messages } from '../i18n';
@@ -14,7 +16,7 @@ import EmojiErrorMessage from './EmojiErrorMessage';
14
16
  import EmojiUploadPreview from './EmojiUploadPreview';
15
17
  import FileChooser from './FileChooser';
16
18
  import { UploadStatus } from './internal-types';
17
- import { emojiChooseFileErrorMessage, emojiUpload, emojiUploadBottom, uploadChooseFileBrowse, uploadChooseFileEmojiName, uploadChooseFileMessage, uploadChooseFileRow } from './styles';
19
+ import { closeEmojiUploadButton, emojiChooseFileErrorMessage, emojiUpload, emojiUploadBottom, emojiUploadTop, uploadChooseFileBrowse, uploadChooseFileEmojiName, uploadChooseFileMessage, uploadChooseFileRow } from './styles';
18
20
  var disallowedReplacementsMap = new Map([[':', ''], ['!', ''], ['@', ''], ['#', ''], ['%', ''], ['^', ''], ['&', ''], ['*', ''], ['(', ''], [')', ''], [' ', '_']]);
19
21
 
20
22
  var sanitizeName = function sanitizeName(name) {
@@ -54,10 +56,23 @@ var ChooseEmojiFile = function ChooseEmojiFile(props) {
54
56
  return jsx("div", {
55
57
  css: emojiUpload
56
58
  }, jsx("div", {
59
+ css: emojiUploadTop
60
+ }, jsx("span", {
57
61
  css: uploadChooseFileMessage
58
62
  }, jsx(FormattedMessage, messages.addCustomEmojiLabel, function (message) {
59
63
  return jsx("h5", null, message);
60
64
  })), jsx("div", {
65
+ css: closeEmojiUploadButton
66
+ }, jsx(AkButton, {
67
+ onClick: onUploadCancelled,
68
+ "aria-describedby": formatMessage(messages.cancelLabel),
69
+ appearance: "subtle",
70
+ spacing: "none",
71
+ shouldFitContainer: true
72
+ }, jsx(CrossIcon, {
73
+ size: "small",
74
+ label: formatMessage(messages.cancelLabel)
75
+ })))), jsx("div", {
61
76
  css: uploadChooseFileRow
62
77
  }, jsx("span", {
63
78
  css: uploadChooseFileEmojiName