@atlaskit/emoji 70.12.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 (57) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/afm-cc/tsconfig.json +3 -0
  3. package/afm-products/tsconfig.json +3 -0
  4. package/dist/cjs/api/EmojiUtils.js +8 -1
  5. package/dist/cjs/components/common/FileChooser.js +24 -1
  6. package/dist/cjs/components/i18n.js +10 -0
  7. package/dist/cjs/components/picker/EmojiPickerComponent.compiled.css +3 -0
  8. package/dist/cjs/components/picker/EmojiPickerComponent.js +20 -6
  9. package/dist/cjs/components/picker/EmojiPickerList.js +31 -10
  10. package/dist/cjs/components/picker/EmojiPickerNoResults.compiled.css +12 -0
  11. package/dist/cjs/components/picker/EmojiPickerNoResults.js +47 -0
  12. package/dist/cjs/components/picker/EmojiPickerSizes.js +2 -0
  13. package/dist/cjs/components/picker/EmojiPickerVirtualItems.js +15 -1
  14. package/dist/cjs/components/picker/assets/spot/search-no-result/SearchNoResultDark.js +40 -0
  15. package/dist/cjs/components/picker/assets/spot/search-no-result/SearchNoResultLight.js +43 -0
  16. package/dist/cjs/util/analytics/analytics.js +1 -1
  17. package/dist/es2019/api/EmojiUtils.js +8 -1
  18. package/dist/es2019/components/common/FileChooser.js +22 -1
  19. package/dist/es2019/components/i18n.js +10 -0
  20. package/dist/es2019/components/picker/EmojiPickerComponent.compiled.css +3 -0
  21. package/dist/es2019/components/picker/EmojiPickerComponent.js +20 -6
  22. package/dist/es2019/components/picker/EmojiPickerList.js +33 -11
  23. package/dist/es2019/components/picker/EmojiPickerNoResults.compiled.css +12 -0
  24. package/dist/es2019/components/picker/EmojiPickerNoResults.js +38 -0
  25. package/dist/es2019/components/picker/EmojiPickerSizes.js +2 -0
  26. package/dist/es2019/components/picker/EmojiPickerVirtualItems.js +7 -0
  27. package/dist/es2019/components/picker/assets/spot/search-no-result/SearchNoResultDark.js +31 -0
  28. package/dist/es2019/components/picker/assets/spot/search-no-result/SearchNoResultLight.js +34 -0
  29. package/dist/es2019/util/analytics/analytics.js +1 -1
  30. package/dist/esm/api/EmojiUtils.js +8 -1
  31. package/dist/esm/components/common/FileChooser.js +24 -1
  32. package/dist/esm/components/i18n.js +10 -0
  33. package/dist/esm/components/picker/EmojiPickerComponent.compiled.css +3 -0
  34. package/dist/esm/components/picker/EmojiPickerComponent.js +20 -6
  35. package/dist/esm/components/picker/EmojiPickerList.js +32 -11
  36. package/dist/esm/components/picker/EmojiPickerNoResults.compiled.css +12 -0
  37. package/dist/esm/components/picker/EmojiPickerNoResults.js +38 -0
  38. package/dist/esm/components/picker/EmojiPickerSizes.js +2 -0
  39. package/dist/esm/components/picker/EmojiPickerVirtualItems.js +14 -0
  40. package/dist/esm/components/picker/assets/spot/search-no-result/SearchNoResultDark.js +33 -0
  41. package/dist/esm/components/picker/assets/spot/search-no-result/SearchNoResultLight.js +36 -0
  42. package/dist/esm/util/analytics/analytics.js +1 -1
  43. package/dist/types/api/EmojiUtils.d.ts +1 -1
  44. package/dist/types/components/i18n.d.ts +10 -0
  45. package/dist/types/components/picker/EmojiPickerNoResults.d.ts +7 -0
  46. package/dist/types/components/picker/EmojiPickerSizes.d.ts +1 -0
  47. package/dist/types/components/picker/EmojiPickerVirtualItems.d.ts +6 -1
  48. package/dist/types/components/picker/assets/spot/search-no-result/SearchNoResultDark.d.ts +2 -0
  49. package/dist/types/components/picker/assets/spot/search-no-result/SearchNoResultLight.d.ts +2 -0
  50. package/dist/types-ts4.5/api/EmojiUtils.d.ts +1 -1
  51. package/dist/types-ts4.5/components/i18n.d.ts +10 -0
  52. package/dist/types-ts4.5/components/picker/EmojiPickerNoResults.d.ts +7 -0
  53. package/dist/types-ts4.5/components/picker/EmojiPickerSizes.d.ts +1 -0
  54. package/dist/types-ts4.5/components/picker/EmojiPickerVirtualItems.d.ts +6 -1
  55. package/dist/types-ts4.5/components/picker/assets/spot/search-no-result/SearchNoResultDark.d.ts +2 -0
  56. package/dist/types-ts4.5/components/picker/assets/spot/search-no-result/SearchNoResultLight.d.ts +2 -0
  57. package/package.json +2 -1
@@ -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}
@@ -60,6 +60,12 @@ const withoutPreviewHeight = {
60
60
  medium: "_4t3iixjv _1tke5x59",
61
61
  large: "_4t3i1ckg _1tke1pna"
62
62
  };
63
+ const emojiPickerHeightNoResults = 354;
64
+ const withNoResultsRefreshHeight = {
65
+ small: "_4t3i1j8x _1tkegx0z",
66
+ medium: "_4t3iihnn _1tke5x59",
67
+ large: "_4t3i19lm _1tke1pna"
68
+ };
63
69
  const FREQUENTLY_USED_MAX = 16;
64
70
  const EmojiPickerComponent = ({
65
71
  onSelection,
@@ -92,6 +98,7 @@ const EmojiPickerComponent = ({
92
98
  const emojiPickerList = useMemo(() => /*#__PURE__*/createRef(), []);
93
99
  const openTime = useRef(0);
94
100
  const isMounting = useRef(true);
101
+ const lastNonSearchCategory = useRef(activeCategory);
95
102
  const previousEmojiProvider = useRef(emojiProvider);
96
103
  const isProgrammaticScroll = useRef(false);
97
104
  const pickerRef = useRef(null);
@@ -133,8 +140,11 @@ const EmojiPickerComponent = ({
133
140
  }
134
141
  if (activeCategory !== category) {
135
142
  setActiveCategory(category);
143
+ if (!query && fg('platform_emoji_picker_refresh')) {
144
+ lastNonSearchCategory.current = category;
145
+ }
136
146
  }
137
- }, [activeCategory, uploading, emojiToDelete]);
147
+ }, [activeCategory, uploading, emojiToDelete, query]);
138
148
  const calculateElapsedTime = () => {
139
149
  return Date.now() - openTime.current;
140
150
  };
@@ -347,6 +357,10 @@ const EmojiPickerComponent = ({
347
357
  source: SearchSourceTypes.PICKER
348
358
  };
349
359
  if (searchQuery !== query) {
360
+ // Capture the active category before entering search so we can keep it highlighted
361
+ if (!query && searchQuery && fg('platform_emoji_picker_refresh')) {
362
+ lastNonSearchCategory.current = activeCategory;
363
+ }
350
364
  setQuery(searchQuery);
351
365
  }
352
366
  updateEmojis(searchQuery, options);
@@ -354,7 +368,7 @@ const EmojiPickerComponent = ({
354
368
  // scroll to top when search, which is search results section
355
369
  scrollToTopOfList();
356
370
  }
357
- }, [query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
371
+ }, [activeCategory, query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
358
372
 
359
373
  // When the upload screen is open, intercept any file drag at the window level so it
360
374
  // cannot reach underlying page drop handlers (e.g. the Confluence editor).
@@ -547,7 +561,7 @@ const EmojiPickerComponent = ({
547
561
  role: "dialog",
548
562
  "aria-label": formatMessage(messages.emojiPickerTitle),
549
563
  "aria-modal": true,
550
- className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]])
564
+ className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]])
551
565
  }, /*#__PURE__*/React.createElement("div", {
552
566
  role: "presentation",
553
567
  onKeyPress: suppressKeyPress,
@@ -588,7 +602,7 @@ const EmojiPickerComponent = ({
588
602
  onOpenUpload: onOpenUpload,
589
603
  size: size,
590
604
  activeCategoryId: activeCategory
591
- }), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
605
+ }), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
592
606
  selectedEmoji: selectedEmoji,
593
607
  uploadEnabled: isUploadSupported && !uploading,
594
608
  onOpenUpload: onOpenUpload
@@ -603,7 +617,7 @@ const EmojiPickerComponent = ({
603
617
  onKeyPress: suppressKeyPress,
604
618
  onKeyUp: suppressKeyPress,
605
619
  onKeyDown: suppressKeyPress,
606
- className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]])
620
+ className: ax([fg('platform_emoji_picker_refresh') ? "_19itahnd _2rko1mok _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm" : "_19itahnd _2rkofajl _1e0c1txw _2lx21bp4 _1bah1yb4 _bfhk1bhr _16qs130s _4t3iaq3k _1bsb1edt _1ul91edt _c71l1y6z _kqswh2mm", !!emojiToDelete && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]])
607
621
  }, /*#__PURE__*/React.createElement(CategorySelector, {
608
622
  activeCategoryId: (uploading || emojiToDelete) && fg('platform_emoji_picker_refresh') ? null : activeCategory,
609
623
  dynamicCategories: dynamicCategories,
@@ -638,7 +652,7 @@ const EmojiPickerComponent = ({
638
652
  onOpenUpload: onOpenUpload,
639
653
  size: size,
640
654
  activeCategoryId: activeCategory
641
- }), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
655
+ }), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
642
656
  selectedEmoji: selectedEmoji,
643
657
  uploadEnabled: isUploadSupported && !uploading,
644
658
  onOpenUpload: onOpenUpload
@@ -1,15 +1,17 @@
1
+ import { useIntl } from 'react-intl';
1
2
  import React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
2
3
  import { fg } from '@atlaskit/platform-feature-flags';
3
4
  import { customCategory, defaultEmojiPickerSize, frequentCategory, searchCategory, userCustomTitle, yourUploadsCategory } from '../../util/constants';
4
5
  import { CategoryDescriptionMap, CategoryDescriptionMapNew } from './categories';
5
6
  import CategoryTracker from './CategoryTracker';
6
7
  import { sizes } from './EmojiPickerSizes';
7
- import { CategoryHeadingItem, EmojisRowItem, LoadingItem, virtualItemRenderer } from './EmojiPickerVirtualItems';
8
+ import { CategoryHeadingItem, EmojisRowItem, LoadingItem, NoResultsItem, virtualItemRenderer } from './EmojiPickerVirtualItems';
8
9
  import EmojiActions from '../common/EmojiActions';
9
10
  import { emojiPickerHeightOffset, scrollToRow } from './utils';
10
11
  import { VirtualList } from './VirtualList';
11
12
  import { EmojiPickerListContextProvider } from '../../context/EmojiPickerListContext';
12
13
  import EmojiPickerTabPanel from './EmojiPickerTabPanel';
14
+ import { messages } from '../i18n';
13
15
 
14
16
  /**
15
17
  * Test id for wrapper Emoji Picker List div
@@ -52,6 +54,9 @@ export const EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef((pro
52
54
  onOpenUpload,
53
55
  activeCategoryId
54
56
  } = props;
57
+ const {
58
+ formatMessage
59
+ } = useIntl();
55
60
  const listRef = useRef(null);
56
61
  const [allEmojiGroups, setAllEmojiGroups] = useState([]);
57
62
  const [virtualItems, setVirtualItems] = useState([]);
@@ -153,14 +158,27 @@ export const EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef((pro
153
158
  items.push(new LoadingItem());
154
159
  } else {
155
160
  if (query) {
156
- const search = CategoryDescriptionMap.SEARCH;
157
- // Only a single "result" category
158
- items = [...items, ...buildVirtualItemFromGroup({
159
- category: searchCategory,
160
- title: search.name,
161
- emojis,
162
- order: search.order
163
- })];
161
+ const search = fg('platform_emoji_picker_refresh') ? CategoryDescriptionMapNew.SEARCH : CategoryDescriptionMap.SEARCH;
162
+ if (emojis.length === 0 && fg('platform_emoji_picker_refresh')) {
163
+ // Show a "No results" category heading, then a no-results illustration below it
164
+ items.push(new CategoryHeadingItem({
165
+ id: searchCategory,
166
+ title: formatMessage(messages.emojiPickerNoResults),
167
+ className: categoryClassname
168
+ }));
169
+ items.push(new NoResultsItem({
170
+ onOpenUpload,
171
+ uploadEnabled
172
+ }));
173
+ } else {
174
+ // Only a single "result" category
175
+ items = [...items, ...buildVirtualItemFromGroup({
176
+ category: searchCategory,
177
+ title: search.name,
178
+ emojis,
179
+ order: search.order
180
+ })];
181
+ }
164
182
  } else {
165
183
  // Group by category
166
184
 
@@ -185,7 +203,7 @@ export const EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef((pro
185
203
  }
186
204
  }
187
205
  // eslint-disable-next-line react-hooks/exhaustive-deps
188
- }, [allEmojiGroups, loading, query, emojis]);
206
+ }, [allEmojiGroups, loading, query, emojis, onOpenUpload, uploadEnabled, formatMessage]);
189
207
  const findCategoryToActivate = row => {
190
208
  let category = null;
191
209
  if (row instanceof CategoryHeadingItem) {
@@ -294,8 +312,12 @@ export const EmojiPickerVirtualListInternal = /*#__PURE__*/React.forwardRef((pro
294
312
  // eslint-disable-next-line react-hooks/exhaustive-deps
295
313
  }, [virtualItems, categoriesChanged]);
296
314
  const virtualListHeight = useMemo(() => {
315
+ if (query && emojis.length === 0 && fg('platform_emoji_picker_refresh')) {
316
+ // No-results state: expand the list height to fit heading + illustration without scrolling
317
+ return sizes.categoryHeadingHeight + sizes.noResultsHeight + emojiPickerHeightOffset(size);
318
+ }
297
319
  return fg('platform_emoji_picker_refresh') ? sizes.listHeightNew + emojiPickerHeightOffset(size) : sizes.listHeight + emojiPickerHeightOffset(size);
298
- }, [size]);
320
+ }, [size, query, emojis.length]);
299
321
  return /*#__PURE__*/React.createElement(EmojiPickerTabPanel, {
300
322
  showSearchResults: !!query
301
323
  }, /*#__PURE__*/React.createElement(EmojiActions, {
@@ -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,38 @@
1
+ /* EmojiPickerNoResults.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ import "./EmojiPickerNoResults.compiled.css";
3
+ import * as React from 'react';
4
+ import { ax, ix } from "@compiled/react/runtime";
5
+ import { useCallback } from 'react';
6
+ import { useThemeObserver } from '@atlaskit/tokens';
7
+ import { fg } from '@atlaskit/platform-feature-flags';
8
+ import { FormattedMessage } from 'react-intl';
9
+ import AkButton from '@atlaskit/button/standard-button';
10
+ import { messages } from '../i18n';
11
+ import SearchNoResultDark from './assets/spot/search-no-result/SearchNoResultDark';
12
+ import SearchNoResultLight from './assets/spot/search-no-result/SearchNoResultLight';
13
+ const noResultsContainer = null;
14
+ export const RENDER_EMOJI_PICKER_NO_RESULTS_TESTID = 'render-emoji-picker-no-results';
15
+ const EmojiPickerNoResults = ({
16
+ onOpenUpload,
17
+ uploadEnabled
18
+ }) => {
19
+ const {
20
+ colorMode
21
+ } = useThemeObserver();
22
+ const handleOpenUpload = useCallback(event => {
23
+ if (fg('platform_emoji_keep_picker_open_on_upload')) {
24
+ event.preventDefault();
25
+ event.stopPropagation();
26
+ }
27
+ onOpenUpload();
28
+ }, [onOpenUpload]);
29
+ return /*#__PURE__*/React.createElement("div", {
30
+ "data-testid": RENDER_EMOJI_PICKER_NO_RESULTS_TESTID,
31
+ className: ax(["_zulppxbi _1e0c1txw _2lx21bp4 _4cvr1h6o _1bah1h6o _ca0q1ejb _u5f3pxbi _n3td1ejb _19bvpxbi _y3gn1h6o _1bsb1osq _vchhusvi"])
32
+ }, colorMode === 'dark' ? /*#__PURE__*/React.createElement(SearchNoResultDark, null) : /*#__PURE__*/React.createElement(SearchNoResultLight, null), uploadEnabled && /*#__PURE__*/React.createElement(FormattedMessage, messages.emojiPickerAddCustomEmoji, label => /*#__PURE__*/React.createElement(AkButton, {
33
+ onClick: handleOpenUpload,
34
+ appearance: "default",
35
+ tabIndex: 0
36
+ }, label)));
37
+ };
38
+ export default EmojiPickerNoResults;
@@ -13,6 +13,8 @@ export const sizes = {
13
13
  // 32px height
14
14
  loadingRowHeight: 150,
15
15
  // Fills remaining space without scrolling when loading.
16
+ noResultsHeight: 300,
17
+ // illustration (200px) + button + padding + gap
16
18
  uploadActionHeight: 40,
17
19
  // 40px height
18
20
  emojiPerRow: 8
@@ -7,6 +7,7 @@ import { ax, ix } from "@compiled/react/runtime";
7
7
  import Spinner from '@atlaskit/spinner';
8
8
  import EmojiPickerCategoryHeading from './EmojiPickerCategoryHeading';
9
9
  import EmojiPickerEmojiRow from './EmojiPickerEmojiRow';
10
+ import EmojiPickerNoResults from './EmojiPickerNoResults';
10
11
  import { sizes } from './EmojiPickerSizes';
11
12
  const emojiPickerSpinner = null;
12
13
  export class AbstractItem {
@@ -39,6 +40,12 @@ export class CategoryHeadingItem extends AbstractItem {
39
40
  _defineProperty(this, "renderItem", () => /*#__PURE__*/React.createElement(EmojiPickerCategoryHeading, this.props));
40
41
  }
41
42
  }
43
+ export class NoResultsItem extends AbstractItem {
44
+ constructor(props) {
45
+ super(props, sizes.noResultsHeight);
46
+ _defineProperty(this, "renderItem", () => /*#__PURE__*/React.createElement(EmojiPickerNoResults, this.props));
47
+ }
48
+ }
42
49
  export const virtualItemRenderer = (rows, context) => {
43
50
  const {
44
51
  index,
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ const SearchNoResultDark = () => /*#__PURE__*/React.createElement("svg", {
3
+ width: "200",
4
+ height: "200",
5
+ viewBox: "0 0 275 275",
6
+ fill: "none",
7
+ xmlns: "http://www.w3.org/2000/svg"
8
+ }, /*#__PURE__*/React.createElement("path", {
9
+ 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",
10
+ fill: "#4B4D51"
11
+ }), /*#__PURE__*/React.createElement("path", {
12
+ 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",
13
+ fill: "#4B4D51"
14
+ }), /*#__PURE__*/React.createElement("path", {
15
+ d: "M187.155 174.199L169.513 187.839L202.665 230.717L220.307 217.077L187.155 174.199Z",
16
+ fill: "#4B4D51"
17
+ }), /*#__PURE__*/React.createElement("path", {
18
+ d: "M184.32 176.391L172.35 185.646L183.593 200.186L195.562 190.932L184.32 176.391Z",
19
+ fill: "#7E8188"
20
+ }), /*#__PURE__*/React.createElement("path", {
21
+ fillRule: "evenodd",
22
+ clipRule: "evenodd",
23
+ d: "M157.715 95.8255L103.735 149.805L96.6643 142.734L150.644 88.7544L157.715 95.8255Z",
24
+ fill: "#4B4D51"
25
+ }), /*#__PURE__*/React.createElement("path", {
26
+ fillRule: "evenodd",
27
+ clipRule: "evenodd",
28
+ d: "M150.644 149.805L96.6643 95.8255L103.735 88.7544L157.715 142.734L150.644 149.805Z",
29
+ fill: "#4B4D51"
30
+ }));
31
+ export default SearchNoResultDark;
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ const SearchNoResultLight = () => /*#__PURE__*/React.createElement("svg", {
3
+ width: "200",
4
+ height: "200",
5
+ viewBox: "0 0 275 275",
6
+ fill: "none",
7
+ xmlns: "http://www.w3.org/2000/svg"
8
+ }, /*#__PURE__*/React.createElement("path", {
9
+ 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",
10
+ fill: "white"
11
+ }), /*#__PURE__*/React.createElement("path", {
12
+ 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",
13
+ fill: "#DDDEE1"
14
+ }), /*#__PURE__*/React.createElement("path", {
15
+ 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",
16
+ fill: "#DDDEE1"
17
+ }), /*#__PURE__*/React.createElement("path", {
18
+ d: "M187.155 174.199L169.513 187.839L202.665 230.717L220.307 217.077L187.155 174.199Z",
19
+ fill: "#DDDEE1"
20
+ }), /*#__PURE__*/React.createElement("path", {
21
+ d: "M184.32 176.391L172.35 185.646L183.593 200.186L195.562 190.932L184.32 176.391Z",
22
+ fill: "#B7B9BE"
23
+ }), /*#__PURE__*/React.createElement("path", {
24
+ fillRule: "evenodd",
25
+ clipRule: "evenodd",
26
+ d: "M157.715 95.8255L103.735 149.805L96.6643 142.734L150.644 88.7544L157.715 95.8255Z",
27
+ fill: "#DDDEE1"
28
+ }), /*#__PURE__*/React.createElement("path", {
29
+ fillRule: "evenodd",
30
+ clipRule: "evenodd",
31
+ d: "M150.644 149.805L96.6643 95.8255L103.735 88.7544L157.715 142.734L150.644 149.805Z",
32
+ fill: "#DDDEE1"
33
+ }));
34
+ export default SearchNoResultLight;
@@ -9,7 +9,7 @@ const createEvent = (eventType, action, actionSubject, actionSubjectId, attribut
9
9
  actionSubjectId,
10
10
  attributes: {
11
11
  packageName: "@atlaskit/emoji",
12
- packageVersion: "70.11.2",
12
+ packageVersion: "70.13.0",
13
13
  ...attributes
14
14
  }
15
15
  });
@@ -8,8 +8,11 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
8
8
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9
9
  import { utils as serviceUtils } from '@atlaskit/util-service-support';
10
10
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
11
+ import { ProviderTypes } from '../types';
11
12
  import { isImageRepresentation, isSpriteServiceRepresentation, convertImageToMediaRepresentation, buildEmojiDescriptionWithAltRepresentation } from '../util/type-helpers';
12
13
  import debug from '../util/logger';
14
+ import { fg } from '@atlaskit/platform-feature-flags';
15
+ import { emojiIdToEmoji } from '../util/emojiIdToEmoji';
13
16
  export var emojiRequest = function emojiRequest(provider, options) {
14
17
  var _provider$getRatio = provider.getRatio,
15
18
  getRatio = _provider$getRatio === void 0 ? getPixelRatio : _provider$getRatio,
@@ -131,7 +134,11 @@ export var denormaliseSkinEmoji = function denormaliseSkinEmoji(emoji, meta) {
131
134
  */
132
135
  export var denormaliseEmojiServiceResponse = function denormaliseEmojiServiceResponse(emojiData) {
133
136
  var emojis = emojiData.emojis.map(function (emoji) {
134
- var newRepresentation = denormaliseServiceRepresentation(emoji.representation, emojiData.meta);
137
+ var unicodeEmoji = emojiIdToEmoji(emoji.id);
138
+ var useUnicodeRepresentation = !!(emoji.id && emoji.type === ProviderTypes.STANDARD && unicodeEmoji && fg('platform_twemoji_removal_unicode_emojis'));
139
+ var newRepresentation = useUnicodeRepresentation ? {
140
+ unicodeEmoji: unicodeEmoji
141
+ } : denormaliseServiceRepresentation(emoji.representation, emojiData.meta);
135
142
  var altRepresentation = denormaliseServiceAltRepresentation(emoji.altRepresentations, emojiData.meta);
136
143
  var newSkinVariations = denormaliseSkinEmoji(emoji, emojiData.meta);
137
144
 
@@ -11,6 +11,9 @@ import { containsFiles, getFiles } from '@atlaskit/pragmatic-drag-and-drop/exter
11
11
  export var chooseFileButtonTestId = 'choose-file-button';
12
12
  export var fileUploadInputTestId = 'file-upload';
13
13
  export var dropzoneTestId = 'file-dropzone';
14
+ var hasFilesInTransfer = function hasFilesInTransfer(dataTransfer) {
15
+ return !!(dataTransfer !== null && dataTransfer !== void 0 && dataTransfer.types) && Array.from(dataTransfer.types).includes('Files');
16
+ };
14
17
  var dropzone = null;
15
18
  var dropzoneActive = null;
16
19
  var previewImageStyles = null;
@@ -62,7 +65,21 @@ var FileChooser = function FileChooser(props) {
62
65
  if (!element || !fg('platform_emoji_picker_refresh')) {
63
66
  return;
64
67
  }
65
- return dropTargetForExternal({
68
+ var suppressNativeFileDrop = function suppressNativeFileDrop(event) {
69
+ if (!hasFilesInTransfer(event.dataTransfer)) {
70
+ return;
71
+ }
72
+ event.preventDefault();
73
+ event.stopPropagation();
74
+ };
75
+
76
+ // eslint-disable-next-line @atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop
77
+ element.addEventListener('dragenter', suppressNativeFileDrop);
78
+ // eslint-disable-next-line @atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop
79
+ element.addEventListener('dragover', suppressNativeFileDrop);
80
+ // eslint-disable-next-line @atlaskit/design-system/no-direct-use-of-web-platform-drag-and-drop
81
+ element.addEventListener('drop', suppressNativeFileDrop);
82
+ var cleanupDropTarget = dropTargetForExternal({
66
83
  element: element,
67
84
  canDrop: containsFiles,
68
85
  onDragEnter: function onDragEnter() {
@@ -84,6 +101,12 @@ var FileChooser = function FileChooser(props) {
84
101
  }
85
102
  }
86
103
  });
104
+ return function () {
105
+ element.removeEventListener('dragenter', suppressNativeFileDrop);
106
+ element.removeEventListener('dragover', suppressNativeFileDrop);
107
+ element.removeEventListener('drop', suppressNativeFileDrop);
108
+ cleanupDropTarget();
109
+ };
87
110
  }, [isDropDisabled, handleFileDrop]);
88
111
  var hiddenInput = /*#__PURE__*/React.createElement("input", {
89
112
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
@@ -225,6 +225,16 @@ export var 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
  ._4t3iuxo9{height:var(--_19dn98e)}
@@ -67,6 +67,12 @@ var withoutPreviewHeight = {
67
67
  medium: "_4t3iixjv _1tke5x59",
68
68
  large: "_4t3i1ckg _1tke1pna"
69
69
  };
70
+ var emojiPickerHeightNoResults = 354;
71
+ var withNoResultsRefreshHeight = {
72
+ small: "_4t3i1j8x _1tkegx0z",
73
+ medium: "_4t3iihnn _1tke5x59",
74
+ large: "_4t3i19lm _1tke1pna"
75
+ };
70
76
  var FREQUENTLY_USED_MAX = 16;
71
77
  var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
72
78
  var onSelection = _ref.onSelection,
@@ -141,6 +147,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
141
147
  }, []);
142
148
  var openTime = useRef(0);
143
149
  var isMounting = useRef(true);
150
+ var lastNonSearchCategory = useRef(activeCategory);
144
151
  var previousEmojiProvider = useRef(emojiProvider);
145
152
  var isProgrammaticScroll = useRef(false);
146
153
  var pickerRef = useRef(null);
@@ -182,8 +189,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
182
189
  }
183
190
  if (activeCategory !== category) {
184
191
  setActiveCategory(category);
192
+ if (!query && fg('platform_emoji_picker_refresh')) {
193
+ lastNonSearchCategory.current = category;
194
+ }
185
195
  }
186
- }, [activeCategory, uploading, emojiToDelete]);
196
+ }, [activeCategory, uploading, emojiToDelete, query]);
187
197
  var calculateElapsedTime = function calculateElapsedTime() {
188
198
  return Date.now() - openTime.current;
189
199
  };
@@ -400,6 +410,10 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
400
410
  source: SearchSourceTypes.PICKER
401
411
  };
402
412
  if (searchQuery !== query) {
413
+ // Capture the active category before entering search so we can keep it highlighted
414
+ if (!query && searchQuery && fg('platform_emoji_picker_refresh')) {
415
+ lastNonSearchCategory.current = activeCategory;
416
+ }
403
417
  setQuery(searchQuery);
404
418
  }
405
419
  updateEmojis(searchQuery, options);
@@ -407,7 +421,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
407
421
  // scroll to top when search, which is search results section
408
422
  scrollToTopOfList();
409
423
  }
410
- }, [query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
424
+ }, [activeCategory, query, filteredEmojis, selectedTone, updateEmojis, scrollToTopOfList]);
411
425
 
412
426
  // When the upload screen is open, intercept any file drag at the window level so it
413
427
  // cannot reach underlying page drop handlers (e.g. the Confluence editor).
@@ -628,7 +642,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
628
642
  role: "dialog",
629
643
  "aria-label": formatMessage(messages.emojiPickerTitle),
630
644
  "aria-modal": true,
631
- className: ax([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 && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
645
+ className: ax([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 && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
632
646
  style: {
633
647
  "--_19dn98e": ix("".concat(emojiPickerHeight, "px")),
634
648
  "--_gsvyy7": ix("".concat(emojiPickerWidth, "px"))
@@ -673,7 +687,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
673
687
  onOpenUpload: onOpenUpload,
674
688
  size: size,
675
689
  activeCategoryId: activeCategory
676
- }), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
690
+ }), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
677
691
  selectedEmoji: selectedEmoji,
678
692
  uploadEnabled: isUploadSupported && !uploading,
679
693
  onOpenUpload: onOpenUpload
@@ -688,7 +702,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
688
702
  onKeyPress: suppressKeyPress,
689
703
  onKeyUp: suppressKeyPress,
690
704
  onKeyDown: suppressKeyPress,
691
- className: ax([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 && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
705
+ className: ax([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 && fg('platform_emoji_picker_refresh') ? withDeleteRefreshHeight[size] : uploading && fg('platform_emoji_picker_refresh') ? withUploadRefreshHeight[size] : query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh') ? withNoResultsRefreshHeight[size] : showPreview ? withPreviewHeight[size] : withoutPreviewHeight[size]]),
692
706
  style: {
693
707
  "--_19dn98e": ix("".concat(emojiPickerHeight, "px")),
694
708
  "--_gsvyy7": ix("".concat(emojiPickerWidth, "px"))
@@ -727,7 +741,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
727
741
  onOpenUpload: onOpenUpload,
728
742
  size: size,
729
743
  activeCategoryId: activeCategory
730
- }), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
744
+ }), showPreview && !(emojiToDelete && fg('platform_emoji_picker_refresh')) && !(query && filteredEmojis.length === 0 && fg('platform_emoji_picker_refresh')) && /*#__PURE__*/React.createElement(EmojiPickerFooter, {
731
745
  selectedEmoji: selectedEmoji,
732
746
  uploadEnabled: isUploadSupported && !uploading,
733
747
  onOpenUpload: onOpenUpload