@atlaskit/emoji 70.13.0 → 70.14.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 (52) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/afm-cc/tsconfig.json +3 -0
  3. package/afm-products/tsconfig.json +3 -0
  4. package/dist/cjs/components/common/FileChooser.js +24 -1
  5. package/dist/cjs/components/i18n.js +10 -0
  6. package/dist/cjs/components/picker/EmojiPickerComponent.compiled.css +3 -0
  7. package/dist/cjs/components/picker/EmojiPickerComponent.js +20 -6
  8. package/dist/cjs/components/picker/EmojiPickerList.js +31 -10
  9. package/dist/cjs/components/picker/EmojiPickerNoResults.compiled.css +12 -0
  10. package/dist/cjs/components/picker/EmojiPickerNoResults.js +47 -0
  11. package/dist/cjs/components/picker/EmojiPickerSizes.js +2 -0
  12. package/dist/cjs/components/picker/EmojiPickerVirtualItems.js +15 -1
  13. package/dist/cjs/components/picker/assets/spot/search-no-result/SearchNoResultDark.js +40 -0
  14. package/dist/cjs/components/picker/assets/spot/search-no-result/SearchNoResultLight.js +43 -0
  15. package/dist/cjs/util/analytics/analytics.js +1 -1
  16. package/dist/es2019/components/common/FileChooser.js +22 -1
  17. package/dist/es2019/components/i18n.js +10 -0
  18. package/dist/es2019/components/picker/EmojiPickerComponent.compiled.css +3 -0
  19. package/dist/es2019/components/picker/EmojiPickerComponent.js +20 -6
  20. package/dist/es2019/components/picker/EmojiPickerList.js +33 -11
  21. package/dist/es2019/components/picker/EmojiPickerNoResults.compiled.css +12 -0
  22. package/dist/es2019/components/picker/EmojiPickerNoResults.js +38 -0
  23. package/dist/es2019/components/picker/EmojiPickerSizes.js +2 -0
  24. package/dist/es2019/components/picker/EmojiPickerVirtualItems.js +7 -0
  25. package/dist/es2019/components/picker/assets/spot/search-no-result/SearchNoResultDark.js +31 -0
  26. package/dist/es2019/components/picker/assets/spot/search-no-result/SearchNoResultLight.js +34 -0
  27. package/dist/es2019/util/analytics/analytics.js +1 -1
  28. package/dist/esm/components/common/FileChooser.js +24 -1
  29. package/dist/esm/components/i18n.js +10 -0
  30. package/dist/esm/components/picker/EmojiPickerComponent.compiled.css +3 -0
  31. package/dist/esm/components/picker/EmojiPickerComponent.js +20 -6
  32. package/dist/esm/components/picker/EmojiPickerList.js +32 -11
  33. package/dist/esm/components/picker/EmojiPickerNoResults.compiled.css +12 -0
  34. package/dist/esm/components/picker/EmojiPickerNoResults.js +38 -0
  35. package/dist/esm/components/picker/EmojiPickerSizes.js +2 -0
  36. package/dist/esm/components/picker/EmojiPickerVirtualItems.js +14 -0
  37. package/dist/esm/components/picker/assets/spot/search-no-result/SearchNoResultDark.js +33 -0
  38. package/dist/esm/components/picker/assets/spot/search-no-result/SearchNoResultLight.js +36 -0
  39. package/dist/esm/util/analytics/analytics.js +1 -1
  40. package/dist/types/components/i18n.d.ts +10 -0
  41. package/dist/types/components/picker/EmojiPickerNoResults.d.ts +7 -0
  42. package/dist/types/components/picker/EmojiPickerSizes.d.ts +1 -0
  43. package/dist/types/components/picker/EmojiPickerVirtualItems.d.ts +6 -1
  44. package/dist/types/components/picker/assets/spot/search-no-result/SearchNoResultDark.d.ts +2 -0
  45. package/dist/types/components/picker/assets/spot/search-no-result/SearchNoResultLight.d.ts +2 -0
  46. package/dist/types-ts4.5/components/i18n.d.ts +10 -0
  47. package/dist/types-ts4.5/components/picker/EmojiPickerNoResults.d.ts +7 -0
  48. package/dist/types-ts4.5/components/picker/EmojiPickerSizes.d.ts +1 -0
  49. package/dist/types-ts4.5/components/picker/EmojiPickerVirtualItems.d.ts +6 -1
  50. package/dist/types-ts4.5/components/picker/assets/spot/search-no-result/SearchNoResultDark.d.ts +2 -0
  51. package/dist/types-ts4.5/components/picker/assets/spot/search-no-result/SearchNoResultLight.d.ts +2 -0
  52. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 70.14.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`a7e9e78cab75f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/a7e9e78cab75f) -
8
+ Prevent native page file drops behind the emoji upload chooser
9
+ - [`6dbd7e73b32c7`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/6dbd7e73b32c7) -
10
+ Update empty state for search results in emoji picker
11
+
3
12
  ## 70.13.0
4
13
 
5
14
  ### Minor Changes
@@ -43,6 +43,9 @@
43
43
  {
44
44
  "path": "../../../design-system/icon/afm-cc/tsconfig.json"
45
45
  },
46
+ {
47
+ "path": "../../../design-system/image/afm-cc/tsconfig.json"
48
+ },
46
49
  {
47
50
  "path": "../../../media/media-client/afm-cc/tsconfig.json"
48
51
  },
@@ -43,6 +43,9 @@
43
43
  {
44
44
  "path": "../../../design-system/icon/afm-products/tsconfig.json"
45
45
  },
46
+ {
47
+ "path": "../../../design-system/image/afm-products/tsconfig.json"
48
+ },
46
49
  {
47
50
  "path": "../../../media/media-client/afm-products/tsconfig.json"
48
51
  },
@@ -20,6 +20,9 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
20
20
  var chooseFileButtonTestId = exports.chooseFileButtonTestId = 'choose-file-button';
21
21
  var fileUploadInputTestId = exports.fileUploadInputTestId = 'file-upload';
22
22
  var dropzoneTestId = exports.dropzoneTestId = 'file-dropzone';
23
+ var hasFilesInTransfer = function hasFilesInTransfer(dataTransfer) {
24
+ return !!(dataTransfer !== null && dataTransfer !== void 0 && dataTransfer.types) && Array.from(dataTransfer.types).includes('Files');
25
+ };
23
26
  var dropzone = null;
24
27
  var dropzoneActive = null;
25
28
  var previewImageStyles = null;
@@ -71,7 +74,21 @@ var FileChooser = function FileChooser(props) {
71
74
  if (!element || !(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
72
75
  return;
73
76
  }
74
- return (0, _adapter.dropTargetForExternal)({
77
+ var suppressNativeFileDrop = function suppressNativeFileDrop(event) {
78
+ if (!hasFilesInTransfer(event.dataTransfer)) {
79
+ return;
80
+ }
81
+ event.preventDefault();
82
+ event.stopPropagation();
83
+ };
84
+
85
+ // eslint-disable-next-line @atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop
86
+ element.addEventListener('dragenter', suppressNativeFileDrop);
87
+ // eslint-disable-next-line @atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop
88
+ element.addEventListener('dragover', suppressNativeFileDrop);
89
+ // eslint-disable-next-line @atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop
90
+ element.addEventListener('drop', suppressNativeFileDrop);
91
+ var cleanupDropTarget = (0, _adapter.dropTargetForExternal)({
75
92
  element: element,
76
93
  canDrop: _file.containsFiles,
77
94
  onDragEnter: function onDragEnter() {
@@ -93,6 +110,12 @@ var FileChooser = function FileChooser(props) {
93
110
  }
94
111
  }
95
112
  });
113
+ return function () {
114
+ element.removeEventListener('dragenter', suppressNativeFileDrop);
115
+ element.removeEventListener('dragover', suppressNativeFileDrop);
116
+ element.removeEventListener('drop', suppressNativeFileDrop);
117
+ cleanupDropTarget();
118
+ };
96
119
  }, [isDropDisabled, handleFileDrop]);
97
120
  var hiddenInput = /*#__PURE__*/_react.default.createElement("input", {
98
121
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
@@ -231,6 +231,16 @@ var messages = exports.messages = (0, _reactIntl.defineMessages)({
231
231
  defaultMessage: 'An emoji with this name exists already',
232
232
  description: 'Error message shown when the user tries to upload an emoji with a name that already exists in the custom emoji set'
233
233
  },
234
+ emojiPickerNoResults: {
235
+ id: 'fabric.emoji.picker.no.results',
236
+ defaultMessage: 'No results',
237
+ description: 'Heading shown in the emoji picker when a search query returns no matching emojis.'
238
+ },
239
+ emojiPickerAddCustomEmoji: {
240
+ id: 'fabric.emoji.picker.add.custom.emoji',
241
+ defaultMessage: 'Add custom emoji',
242
+ description: 'Label for the button shown in the emoji picker no-results screen that opens the custom emoji upload panel.'
243
+ },
234
244
  emojiPickerTitle: {
235
245
  id: 'fabric.emoji.picker',
236
246
  defaultMessage: 'Emoji picker',
@@ -21,13 +21,16 @@
21
21
  ._1xi2idpf{right:0}
22
22
  ._2lx21bp4{flex-direction:column}
23
23
  ._4t3i1784{height:470px}
24
+ ._4t3i19lm{height:514px}
24
25
  ._4t3i1ckg{height:455px}
25
26
  ._4t3i1dsu{height:419px}
27
+ ._4t3i1j8x{height:354px}
26
28
  ._4t3i1sa4{height:390px}
27
29
  ._4t3i2300{height:429px}
28
30
  ._4t3i50k7{height:499px}
29
31
  ._4t3iaq3k{height:295px}
30
32
  ._4t3ibqjm{height:310px}
33
+ ._4t3iihnn{height:434px}
31
34
  ._4t3iixjv{height:375px}
32
35
  ._4t3iqbeb{height:339px}
33
36
  ._4t3iuxo9{height:var(--_19dn98e)}
@@ -76,6 +76,12 @@ var withoutPreviewHeight = {
76
76
  medium: "_4t3iixjv _1tke5x59",
77
77
  large: "_4t3i1ckg _1tke1pna"
78
78
  };
79
+ var emojiPickerHeightNoResults = 354;
80
+ var withNoResultsRefreshHeight = {
81
+ small: "_4t3i1j8x _1tkegx0z",
82
+ medium: "_4t3iihnn _1tke5x59",
83
+ large: "_4t3i19lm _1tke1pna"
84
+ };
79
85
  var FREQUENTLY_USED_MAX = 16;
80
86
  var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
81
87
  var onSelection = _ref.onSelection,
@@ -150,6 +156,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
150
156
  }, []);
151
157
  var openTime = (0, _react.useRef)(0);
152
158
  var isMounting = (0, _react.useRef)(true);
159
+ var lastNonSearchCategory = (0, _react.useRef)(activeCategory);
153
160
  var previousEmojiProvider = (0, _react.useRef)(emojiProvider);
154
161
  var isProgrammaticScroll = (0, _react.useRef)(false);
155
162
  var pickerRef = (0, _react.useRef)(null);
@@ -191,8 +198,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
191
198
  }
192
199
  if (activeCategory !== category) {
193
200
  setActiveCategory(category);
201
+ if (!query && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
202
+ lastNonSearchCategory.current = category;
203
+ }
194
204
  }
195
- }, [activeCategory, uploading, emojiToDelete]);
205
+ }, [activeCategory, uploading, emojiToDelete, query]);
196
206
  var calculateElapsedTime = function calculateElapsedTime() {
197
207
  return Date.now() - openTime.current;
198
208
  };
@@ -409,6 +419,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
409
419
  source: _types.SearchSourceTypes.PICKER
410
420
  };
411
421
  if (searchQuery !== query) {
422
+ // Capture the active category before entering search so we can keep it highlighted
423
+ if (!query && searchQuery && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
424
+ lastNonSearchCategory.current = activeCategory;
425
+ }
412
426
  setQuery(searchQuery);
413
427
  }
414
428
  updateEmojis(searchQuery, options);
@@ -416,7 +430,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
416
430
  // scroll to top when search, which is search results section
417
431
  scrollToTopOfList();
418
432
  }
419
- }, [query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
433
+ }, [activeCategory, query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
420
434
 
421
435
  // When the upload screen is open, intercept any file drag at the window level so it
422
436
  // cannot reach underlying page drop handlers (e.g. the Confluence editor).
@@ -637,7 +651,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
637
651
  role: "dialog",
638
652
  "aria-label": formatMessage(_i18n.messages.emojiPickerTitle),
639
653
  "aria-modal": true,
640
- className: (0, _runtime.ax)([(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
654
+ className: (0, _runtime.ax)([(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
641
655
  style: {
642
656
  "--_19dn98e": (0, _runtime.ix)("".concat(emojiPickerHeight, "px")),
643
657
  "--_gsvyy7": (0, _runtime.ix)("".concat(emojiPickerWidth, "px"))
@@ -682,7 +696,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
682
696
  onOpenUpload: onOpenUpload,
683
697
  size: size,
684
698
  activeCategoryId: activeCategory
685
- }), showPreview && !(emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(_EmojiPickerFooter.default, {
699
+ }), showPreview && !(emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(_EmojiPickerFooter.default, {
686
700
  selectedEmoji: selectedEmoji,
687
701
  uploadEnabled: isUploadSupported && !uploading,
688
702
  onOpenUpload: onOpenUpload
@@ -697,7 +711,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
697
711
  onKeyPress: suppressKeyPress,
698
712
  onKeyUp: suppressKeyPress,
699
713
  onKeyDown: suppressKeyPress,
700
- className: (0, _runtime.ax)([(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
714
+ className: (0, _runtime.ax)([(0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iuxo9 _1bsb10mj _1ul910mj _c71l1y6z _kqswh2mm", !!emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
701
715
  style: {
702
716
  "--_19dn98e": (0, _runtime.ix)("".concat(emojiPickerHeight, "px")),
703
717
  "--_gsvyy7": (0, _runtime.ix)("".concat(emojiPickerWidth, "px"))
@@ -736,7 +750,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
736
750
  onOpenUpload: onOpenUpload,
737
751
  size: size,
738
752
  activeCategoryId: activeCategory
739
- }), showPreview && !(emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(_EmojiPickerFooter.default, {
753
+ }), showPreview && !(emojiToDelete && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(_EmojiPickerFooter.default, {
740
754
  selectedEmoji: selectedEmoji,
741
755
  uploadEnabled: isUploadSupported && !uploading,
742
756
  onOpenUpload: onOpenUpload
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.RENDER_EMOJI_PICKER_LIST_TESTID = exports.EmojiPickerVirtualListInternal = void 0;
9
9
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _reactIntl = require("react-intl");
11
12
  var _react = _interopRequireWildcard(require("react"));
12
13
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
13
14
  var _constants = require("../../util/constants");
@@ -20,6 +21,7 @@ var _utils = require("./utils");
20
21
  var _VirtualList = require("./VirtualList");
21
22
  var _EmojiPickerListContext = require("../../context/EmojiPickerListContext");
22
23
  var _EmojiPickerTabPanel = _interopRequireDefault(require("./EmojiPickerTabPanel"));
24
+ var _i18n = require("../i18n");
23
25
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
24
26
  /**
25
27
  * Test id for wrapper Emoji Picker List div
@@ -68,6 +70,8 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
68
70
  onFileChooserClicked = props.onFileChooserClicked,
69
71
  onOpenUpload = props.onOpenUpload,
70
72
  activeCategoryId = props.activeCategoryId;
73
+ var _useIntl = (0, _reactIntl.useIntl)(),
74
+ formatMessage = _useIntl.formatMessage;
71
75
  var listRef = (0, _react.useRef)(null);
72
76
  var _useState = (0, _react.useState)([]),
73
77
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -185,14 +189,27 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
185
189
  items.push(new _EmojiPickerVirtualItems.LoadingItem());
186
190
  } else {
187
191
  if (query) {
188
- var search = _categories.CategoryDescriptionMap.SEARCH;
189
- // Only a single "result" category
190
- items = [].concat((0, _toConsumableArray2.default)(items), (0, _toConsumableArray2.default)(buildVirtualItemFromGroup({
191
- category: _constants.searchCategory,
192
- title: search.name,
193
- emojis: emojis,
194
- order: search.order
195
- })));
192
+ var search = (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? _categories.CategoryDescriptionMapNew.SEARCH : _categories.CategoryDescriptionMap.SEARCH;
193
+ if (emojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
194
+ // Show a "No results" category heading, then a no-results illustration below it
195
+ items.push(new _EmojiPickerVirtualItems.CategoryHeadingItem({
196
+ id: _constants.searchCategory,
197
+ title: formatMessage(_i18n.messages.emojiPickerNoResults),
198
+ className: categoryClassname
199
+ }));
200
+ items.push(new _EmojiPickerVirtualItems.NoResultsItem({
201
+ onOpenUpload: onOpenUpload,
202
+ uploadEnabled: uploadEnabled
203
+ }));
204
+ } else {
205
+ // Only a single "result" category
206
+ items = [].concat((0, _toConsumableArray2.default)(items), (0, _toConsumableArray2.default)(buildVirtualItemFromGroup({
207
+ category: _constants.searchCategory,
208
+ title: search.name,
209
+ emojis: emojis,
210
+ order: search.order
211
+ })));
212
+ }
196
213
  } else {
197
214
  // Group by category
198
215
 
@@ -217,7 +234,7 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
217
234
  }
218
235
  }
219
236
  // eslint-disable-next-line react-hooks/exhaustive-deps
220
- }, [allEmojiGroups, loading, query, emojis]);
237
+ }, [allEmojiGroups, loading, query, emojis, onOpenUpload, uploadEnabled, formatMessage]);
221
238
  var findCategoryToActivate = function findCategoryToActivate(row) {
222
239
  var category = null;
223
240
  if (row instanceof _EmojiPickerVirtualItems.CategoryHeadingItem) {
@@ -327,8 +344,12 @@ var EmojiPickerVirtualListInternal = exports.EmojiPickerVirtualListInternal = /*
327
344
  // eslint-disable-next-line react-hooks/exhaustive-deps
328
345
  }, [virtualItems, categoriesChanged]);
329
346
  var virtualListHeight = (0, _react.useMemo)(function () {
347
+ if (query && emojis.length === 0 && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
348
+ // No-results state: expand the list height to fit heading + illustration without scrolling
349
+ return _EmojiPickerSizes.sizes.categoryHeadingHeight + _EmojiPickerSizes.sizes.noResultsHeight + (0, _utils.emojiPickerHeightOffset)(size);
350
+ }
330
351
  return (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? _EmojiPickerSizes.sizes.listHeightNew + (0, _utils.emojiPickerHeightOffset)(size) : _EmojiPickerSizes.sizes.listHeight + (0, _utils.emojiPickerHeightOffset)(size);
331
- }, [size]);
352
+ }, [size, query, emojis.length]);
332
353
  return /*#__PURE__*/_react.default.createElement(_EmojiPickerTabPanel.default, {
333
354
  showSearchResults: !!query
334
355
  }, /*#__PURE__*/_react.default.createElement(_EmojiActions.default, {
@@ -0,0 +1,12 @@
1
+
2
+ ._zulppxbi{gap:var(--ds-space-200,1pc)}._19bvpxbi{padding-left:var(--ds-space-200,1pc)}
3
+ ._1bah1h6o{justify-content:center}
4
+ ._1bsb1osq{width:100%}
5
+ ._1e0c1txw{display:flex}
6
+ ._2lx21bp4{flex-direction:column}
7
+ ._4cvr1h6o{align-items:center}
8
+ ._ca0q1ejb{padding-top:var(--ds-space-300,24px)}
9
+ ._n3td1ejb{padding-bottom:var(--ds-space-300,24px)}
10
+ ._u5f3pxbi{padding-right:var(--ds-space-200,1pc)}
11
+ ._vchhusvi{box-sizing:border-box}
12
+ ._y3gn1h6o{text-align:center}
@@ -0,0 +1,47 @@
1
+ /* EmojiPickerNoResults.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ "use strict";
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.default = exports.RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = void 0;
10
+ require("./EmojiPickerNoResults.compiled.css");
11
+ var _react = _interopRequireWildcard(require("react"));
12
+ var React = _react;
13
+ var _runtime = require("@compiled/react/runtime");
14
+ var _tokens = require("@atlaskit/tokens");
15
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
+ var _reactIntl = require("react-intl");
17
+ var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
18
+ var _i18n = require("../i18n");
19
+ var _SearchNoResultDark = _interopRequireDefault(require("./assets/spot/search-no-result/SearchNoResultDark"));
20
+ var _SearchNoResultLight = _interopRequireDefault(require("./assets/spot/search-no-result/SearchNoResultLight"));
21
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
22
+ var noResultsContainer = null;
23
+ var RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = exports.RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = 'render-emoji-picker-no-results';
24
+ var EmojiPickerNoResults = function EmojiPickerNoResults(_ref) {
25
+ var onOpenUpload = _ref.onOpenUpload,
26
+ uploadEnabled = _ref.uploadEnabled;
27
+ var _useThemeObserver = (0, _tokens.useThemeObserver)(),
28
+ colorMode = _useThemeObserver.colorMode;
29
+ var handleOpenUpload = (0, _react.useCallback)(function (event) {
30
+ if ((0, _platformFeatureFlags.fg)('platform_emoji_keep_picker_open_on_upload')) {
31
+ event.preventDefault();
32
+ event.stopPropagation();
33
+ }
34
+ onOpenUpload();
35
+ }, [onOpenUpload]);
36
+ return /*#__PURE__*/React.createElement("div", {
37
+ "data-testid": RENDER_EMOJI_PICKER_NO_RESULTS_TESTID,
38
+ className: (0, _runtime.ax)(["_zulppxbi _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _ca0q1ejb _u5f3pxbi _n3td1ejb _19bvpxbi _y3gn1h6o _1bsb1osq _vchhusvi"])
39
+ }, colorMode === 'dark' ? /*#__PURE__*/React.createElement(_SearchNoResultDark.default, null) : /*#__PURE__*/React.createElement(_SearchNoResultLight.default, null), uploadEnabled && /*#__PURE__*/React.createElement(_reactIntl.FormattedMessage, _i18n.messages.emojiPickerAddCustomEmoji, function (label) {
40
+ return /*#__PURE__*/React.createElement(_standardButton.default, {
41
+ onClick: handleOpenUpload,
42
+ appearance: "default",
43
+ tabIndex: 0
44
+ }, label);
45
+ }));
46
+ };
47
+ var _default = exports.default = EmojiPickerNoResults;
@@ -19,6 +19,8 @@ var sizes = exports.sizes = {
19
19
  // 32px height
20
20
  loadingRowHeight: 150,
21
21
  // Fills remaining space without scrolling when loading.
22
+ noResultsHeight: 300,
23
+ // illustration (200px) + button + padding + gap
22
24
  uploadActionHeight: 40,
23
25
  // 40px height
24
26
  emojiPerRow: 8
@@ -6,7 +6,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
6
6
  Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
- exports.virtualItemRenderer = exports.LoadingItem = exports.EmojisRowItem = exports.CategoryHeadingItem = exports.AbstractItem = void 0;
9
+ exports.virtualItemRenderer = exports.NoResultsItem = exports.LoadingItem = exports.EmojisRowItem = exports.CategoryHeadingItem = exports.AbstractItem = void 0;
10
10
  require("./EmojiPickerVirtualItems.compiled.css");
11
11
  var React = _interopRequireWildcard(require("react"));
12
12
  var _runtime = require("@compiled/react/runtime");
@@ -20,6 +20,7 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
20
20
  var _spinner = _interopRequireDefault(require("@atlaskit/spinner"));
21
21
  var _EmojiPickerCategoryHeading = _interopRequireDefault(require("./EmojiPickerCategoryHeading"));
22
22
  var _EmojiPickerEmojiRow = _interopRequireDefault(require("./EmojiPickerEmojiRow"));
23
+ var _EmojiPickerNoResults = _interopRequireDefault(require("./EmojiPickerNoResults"));
23
24
  var _EmojiPickerSizes = require("./EmojiPickerSizes");
24
25
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
25
26
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
@@ -75,6 +76,19 @@ var CategoryHeadingItem = exports.CategoryHeadingItem = /*#__PURE__*/function (_
75
76
  (0, _inherits2.default)(CategoryHeadingItem, _AbstractItem3);
76
77
  return (0, _createClass2.default)(CategoryHeadingItem);
77
78
  }(AbstractItem);
79
+ var NoResultsItem = exports.NoResultsItem = /*#__PURE__*/function (_AbstractItem4) {
80
+ function NoResultsItem(props) {
81
+ var _this4;
82
+ (0, _classCallCheck2.default)(this, NoResultsItem);
83
+ _this4 = _callSuper(this, NoResultsItem, [props, _EmojiPickerSizes.sizes.noResultsHeight]);
84
+ (0, _defineProperty2.default)(_this4, "renderItem", function () {
85
+ return /*#__PURE__*/React.createElement(_EmojiPickerNoResults.default, _this4.props);
86
+ });
87
+ return _this4;
88
+ }
89
+ (0, _inherits2.default)(NoResultsItem, _AbstractItem4);
90
+ return (0, _createClass2.default)(NoResultsItem);
91
+ }(AbstractItem);
78
92
  var virtualItemRenderer = exports.virtualItemRenderer = function virtualItemRenderer(rows, context) {
79
93
  var index = context.index,
80
94
  key = context.key;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var SearchNoResultDark = function SearchNoResultDark() {
10
+ return /*#__PURE__*/_react.default.createElement("svg", {
11
+ width: "200",
12
+ height: "200",
13
+ viewBox: "0 0 275 275",
14
+ fill: "none",
15
+ xmlns: "http://www.w3.org/2000/svg"
16
+ }, /*#__PURE__*/_react.default.createElement("path", {
17
+ d: "M191.87 88.6702C189.59 84.3102 186.8 79.9902 183.57 75.8102C180.3 71.5802 176.77 67.7402 173.07 64.4102C151.47 44.9002 123.96 41.9102 97.58 56.2202C93.31 58.5402 89.09 61.3002 85.04 64.4402C80.83 67.6902 76.96 71.2302 73.51 74.9502C53.12 96.9602 49.08 124.3 62.42 149.98C64.72 154.4 67.54 158.79 70.81 163.02C74.04 167.2 77.53 170.98 81.18 174.28C93.68 185.57 108.23 191.29 123.43 191.29C134.33 191.29 145.56 188.35 156.61 182.41C161.07 180.01 165.47 177.15 169.68 173.89C173.74 170.75 177.47 167.36 180.79 163.82C201.31 141.86 205.35 114.47 191.87 88.6802V88.6702ZM161.31 163.04C157.7 165.83 153.94 168.29 150.14 170.33C128.76 181.81 107.54 179.6 90.38 164.1C87.33 161.34 84.4 158.16 81.66 154.62C78.89 151.03 76.5 147.34 74.58 143.65C63.91 123.12 67.1 102.02 83.56 84.2502C86.49 81.0802 89.81 78.0602 93.42 75.2702C96.89 72.5802 100.49 70.2302 104.12 68.2602C113.08 63.4002 122.03 60.9802 130.69 60.9802C142.58 60.9802 153.9 65.5402 163.89 74.5702C166.98 77.3602 169.96 80.6002 172.73 84.1902C175.46 87.7302 177.82 91.3702 179.72 95.0102C190.49 115.63 187.32 136.74 170.77 154.45C167.96 157.46 164.77 160.35 161.29 163.04H161.31Z",
18
+ fill: "#4B4D51"
19
+ }), /*#__PURE__*/_react.default.createElement("path", {
20
+ d: "M179.96 171C176.42 166.07 172.62 166.1 168.91 168.97C165.43 171.66 164.5 175.3 168.21 180.09L172.45 185.57L184.2 176.48L179.96 171Z",
21
+ fill: "#4B4D51"
22
+ }), /*#__PURE__*/_react.default.createElement("path", {
23
+ d: "M187.155 174.199L169.513 187.839L202.665 230.717L220.307 217.077L187.155 174.199Z",
24
+ fill: "#4B4D51"
25
+ }), /*#__PURE__*/_react.default.createElement("path", {
26
+ d: "M184.32 176.391L172.35 185.646L183.593 200.186L195.562 190.932L184.32 176.391Z",
27
+ fill: "#7E8188"
28
+ }), /*#__PURE__*/_react.default.createElement("path", {
29
+ fillRule: "evenodd",
30
+ clipRule: "evenodd",
31
+ d: "M157.715 95.8255L103.735 149.805L96.6643 142.734L150.644 88.7544L157.715 95.8255Z",
32
+ fill: "#4B4D51"
33
+ }), /*#__PURE__*/_react.default.createElement("path", {
34
+ fillRule: "evenodd",
35
+ clipRule: "evenodd",
36
+ d: "M150.644 149.805L96.6643 95.8255L103.735 88.7544L157.715 142.734L150.644 149.805Z",
37
+ fill: "#4B4D51"
38
+ }));
39
+ };
40
+ var _default = exports.default = SearchNoResultDark;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var SearchNoResultLight = function SearchNoResultLight() {
10
+ return /*#__PURE__*/_react.default.createElement("svg", {
11
+ width: "200",
12
+ height: "200",
13
+ viewBox: "0 0 275 275",
14
+ fill: "none",
15
+ xmlns: "http://www.w3.org/2000/svg"
16
+ }, /*#__PURE__*/_react.default.createElement("path", {
17
+ d: "M185.8 91.8398C183.73 87.8698 181.19 83.9198 178.16 79.9998C175.09 76.0298 171.85 72.5298 168.49 69.4898C148.48 51.4098 123.89 49.7498 100.86 62.2398C96.93 64.3698 93.05 66.9098 89.24 69.8498C85.27 72.9198 81.7 76.1798 78.54 79.5898C60.71 98.8298 56.14 123 68.5 146.8C70.59 150.82 73.16 154.83 76.23 158.81C79.26 162.73 82.45 166.18 85.77 169.18C105.65 187.13 130.22 188.8 153.36 176.36C157.46 174.16 161.51 171.53 165.48 168.46C169.29 165.52 172.72 162.39 175.77 159.13C193.68 139.96 198.25 115.7 185.78 91.8398H185.8Z",
18
+ fill: "white"
19
+ }), /*#__PURE__*/_react.default.createElement("path", {
20
+ d: "M123.44 191.28C108.24 191.28 93.7 185.56 81.19 174.27C77.54 170.97 74.05 167.18 70.82 163.01C67.55 158.78 64.72 154.39 62.43 149.97C49.09 124.3 53.13 96.9499 73.52 74.9399C76.97 71.2199 80.85 67.6799 85.05 64.4299C89.1 61.2999 93.32 58.5299 97.59 56.2099C123.97 41.8999 151.49 44.8899 173.08 64.3999C176.77 67.7399 180.3 71.5699 183.58 75.7999C186.81 79.9699 189.6 84.2999 191.88 88.6599C205.36 114.45 201.32 141.84 180.8 163.8C177.49 167.35 173.75 170.74 169.69 173.87C165.48 177.12 161.08 179.99 156.62 182.39C145.57 188.33 134.33 191.27 123.44 191.27V191.28ZM130.69 60.9799C122.04 60.9799 113.08 63.3899 104.12 68.2599C100.5 70.2299 96.9 72.5899 93.42 75.2699C89.81 78.0599 86.49 81.0799 83.56 84.2499C67.1 102.02 63.91 123.11 74.58 143.65C76.5 147.34 78.88 151.04 81.66 154.62C84.39 158.15 87.32 161.34 90.38 164.1C107.54 179.6 128.76 181.81 150.14 170.33C153.94 168.29 157.7 165.84 161.31 163.04C164.79 160.35 167.97 157.46 170.79 154.45C187.34 136.74 190.51 115.63 179.74 95.0099C177.84 91.3699 175.48 87.7199 172.75 84.1899C169.97 80.5999 167 77.3599 163.91 74.5699C153.91 65.5399 142.59 60.9799 130.71 60.9799H130.69Z",
21
+ fill: "#DDDEE1"
22
+ }), /*#__PURE__*/_react.default.createElement("path", {
23
+ d: "M179.96 171C176.42 166.07 172.62 166.1 168.91 168.97C165.43 171.66 164.5 175.3 168.21 180.09L172.45 185.57L184.2 176.48L179.96 171Z",
24
+ fill: "#DDDEE1"
25
+ }), /*#__PURE__*/_react.default.createElement("path", {
26
+ d: "M187.155 174.199L169.513 187.839L202.665 230.717L220.307 217.077L187.155 174.199Z",
27
+ fill: "#DDDEE1"
28
+ }), /*#__PURE__*/_react.default.createElement("path", {
29
+ d: "M184.32 176.391L172.35 185.646L183.593 200.186L195.562 190.932L184.32 176.391Z",
30
+ fill: "#B7B9BE"
31
+ }), /*#__PURE__*/_react.default.createElement("path", {
32
+ fillRule: "evenodd",
33
+ clipRule: "evenodd",
34
+ d: "M157.715 95.8255L103.735 149.805L96.6643 142.734L150.644 88.7544L157.715 95.8255Z",
35
+ fill: "#DDDEE1"
36
+ }), /*#__PURE__*/_react.default.createElement("path", {
37
+ fillRule: "evenodd",
38
+ clipRule: "evenodd",
39
+ d: "M150.644 149.805L96.6643 95.8255L103.735 88.7544L157.715 142.734L150.644 149.805Z",
40
+ fill: "#DDDEE1"
41
+ }));
42
+ };
43
+ var _default = exports.default = SearchNoResultLight;
@@ -20,7 +20,7 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
20
20
  actionSubjectId: actionSubjectId,
21
21
  attributes: _objectSpread({
22
22
  packageName: "@atlaskit/emoji",
23
- packageVersion: "70.12.0"
23
+ packageVersion: "70.13.0"
24
24
  }, attributes)
25
25
  };
26
26
  };
@@ -10,6 +10,7 @@ import { containsFiles, getFiles } from '@atlaskit/pragmatic-drag-and-drop/exter
10
10
  export const chooseFileButtonTestId = 'choose-file-button';
11
11
  export const fileUploadInputTestId = 'file-upload';
12
12
  export const dropzoneTestId = 'file-dropzone';
13
+ const hasFilesInTransfer = dataTransfer => !!(dataTransfer !== null && dataTransfer !== void 0 && dataTransfer.types) && Array.from(dataTransfer.types).includes('Files');
13
14
  const dropzone = null;
14
15
  const dropzoneActive = null;
15
16
  const previewImageStyles = null;
@@ -58,7 +59,21 @@ const FileChooser = props => {
58
59
  if (!element || !fg('platform_emoji_picker_refresh')) {
59
60
  return;
60
61
  }
61
- return dropTargetForExternal({
62
+ const suppressNativeFileDrop = event => {
63
+ if (!hasFilesInTransfer(event.dataTransfer)) {
64
+ return;
65
+ }
66
+ event.preventDefault();
67
+ event.stopPropagation();
68
+ };
69
+
70
+ // eslint-disable-next-line @atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop
71
+ element.addEventListener('dragenter', suppressNativeFileDrop);
72
+ // eslint-disable-next-line @atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop
73
+ element.addEventListener('dragover', suppressNativeFileDrop);
74
+ // eslint-disable-next-line @atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop
75
+ element.addEventListener('drop', suppressNativeFileDrop);
76
+ const cleanupDropTarget = dropTargetForExternal({
62
77
  element,
63
78
  canDrop: containsFiles,
64
79
  onDragEnter: () => {
@@ -79,6 +94,12 @@ const FileChooser = props => {
79
94
  }
80
95
  }
81
96
  });
97
+ return () => {
98
+ element.removeEventListener('dragenter', suppressNativeFileDrop);
99
+ element.removeEventListener('dragover', suppressNativeFileDrop);
100
+ element.removeEventListener('drop', suppressNativeFileDrop);
101
+ cleanupDropTarget();
102
+ };
82
103
  }, [isDropDisabled, handleFileDrop]);
83
104
  const hiddenInput = /*#__PURE__*/React.createElement("input", {
84
105
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
@@ -225,6 +225,16 @@ export const messages = defineMessages({
225
225
  defaultMessage: 'An emoji with this name exists already',
226
226
  description: 'Error message shown when the user tries to upload an emoji with a name that already exists in the custom emoji set'
227
227
  },
228
+ emojiPickerNoResults: {
229
+ id: 'fabric.emoji.picker.no.results',
230
+ defaultMessage: 'No results',
231
+ description: 'Heading shown in the emoji picker when a search query returns no matching emojis.'
232
+ },
233
+ emojiPickerAddCustomEmoji: {
234
+ id: 'fabric.emoji.picker.add.custom.emoji',
235
+ defaultMessage: 'Add custom emoji',
236
+ description: 'Label for the button shown in the emoji picker no-results screen that opens the custom emoji upload panel.'
237
+ },
228
238
  emojiPickerTitle: {
229
239
  id: 'fabric.emoji.picker',
230
240
  defaultMessage: 'Emoji picker',
@@ -21,13 +21,16 @@
21
21
  ._1xi2idpf{right:0}
22
22
  ._2lx21bp4{flex-direction:column}
23
23
  ._4t3i1784{height:470px}
24
+ ._4t3i19lm{height:514px}
24
25
  ._4t3i1ckg{height:455px}
25
26
  ._4t3i1dsu{height:419px}
27
+ ._4t3i1j8x{height:354px}
26
28
  ._4t3i1sa4{height:390px}
27
29
  ._4t3i2300{height:429px}
28
30
  ._4t3i50k7{height:499px}
29
31
  ._4t3iaq3k{height:295px}
30
32
  ._4t3ibqjm{height:310px}
33
+ ._4t3iihnn{height:434px}
31
34
  ._4t3iixjv{height:375px}
32
35
  ._4t3iqbeb{height:339px}
33
36
  ._4t3ivixp{height:349px}