@atlaskit/emoji 71.0.0 → 71.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 (60) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/afm-cc/tsconfig.json +3 -0
  3. package/afm-products/tsconfig.json +3 -0
  4. package/dist/cjs/components/common/Emoji.js +141 -5
  5. package/dist/cjs/components/common/EmojiActions.compiled.css +8 -0
  6. package/dist/cjs/components/common/EmojiActions.js +69 -3
  7. package/dist/cjs/components/common/Popup.js +20 -5
  8. package/dist/cjs/components/common/ProductivityColorSelector.compiled.css +59 -0
  9. package/dist/cjs/components/common/ProductivityColorSelector.js +112 -0
  10. package/dist/cjs/components/common/ResourcedEmojiComponent.js +4 -1
  11. package/dist/cjs/components/common/TonePreviewButton.js +4 -2
  12. package/dist/cjs/components/i18n.js +10 -0
  13. package/dist/cjs/components/picker/EmojiPickerComponent.js +51 -36
  14. package/dist/cjs/components/picker/EmojiPickerList.js +36 -14
  15. package/dist/cjs/components/picker/VirtualList.js +4 -5
  16. package/dist/cjs/util/analytics/analytics.js +1 -1
  17. package/dist/cjs/util/hidden-emojis.js +33 -0
  18. package/dist/cjs/util/productivity-colors.js +51 -0
  19. package/dist/es2019/components/common/Emoji.js +115 -5
  20. package/dist/es2019/components/common/EmojiActions.compiled.css +8 -0
  21. package/dist/es2019/components/common/EmojiActions.js +67 -3
  22. package/dist/es2019/components/common/Popup.js +19 -5
  23. package/dist/es2019/components/common/ProductivityColorSelector.compiled.css +59 -0
  24. package/dist/es2019/components/common/ProductivityColorSelector.js +98 -0
  25. package/dist/es2019/components/common/ResourcedEmojiComponent.js +3 -1
  26. package/dist/es2019/components/common/TonePreviewButton.js +3 -2
  27. package/dist/es2019/components/i18n.js +10 -0
  28. package/dist/es2019/components/picker/EmojiPickerComponent.js +26 -14
  29. package/dist/es2019/components/picker/EmojiPickerList.js +32 -14
  30. package/dist/es2019/components/picker/VirtualList.js +4 -5
  31. package/dist/es2019/util/analytics/analytics.js +1 -1
  32. package/dist/es2019/util/hidden-emojis.js +25 -0
  33. package/dist/es2019/util/productivity-colors.js +37 -0
  34. package/dist/esm/components/common/Emoji.js +142 -6
  35. package/dist/esm/components/common/EmojiActions.compiled.css +8 -0
  36. package/dist/esm/components/common/EmojiActions.js +70 -4
  37. package/dist/esm/components/common/Popup.js +20 -5
  38. package/dist/esm/components/common/ProductivityColorSelector.compiled.css +59 -0
  39. package/dist/esm/components/common/ProductivityColorSelector.js +103 -0
  40. package/dist/esm/components/common/ResourcedEmojiComponent.js +4 -1
  41. package/dist/esm/components/common/TonePreviewButton.js +4 -2
  42. package/dist/esm/components/i18n.js +10 -0
  43. package/dist/esm/components/picker/EmojiPickerComponent.js +51 -36
  44. package/dist/esm/components/picker/EmojiPickerList.js +36 -14
  45. package/dist/esm/components/picker/VirtualList.js +4 -5
  46. package/dist/esm/util/analytics/analytics.js +1 -1
  47. package/dist/esm/util/hidden-emojis.js +27 -0
  48. package/dist/esm/util/productivity-colors.js +45 -0
  49. package/dist/types/components/common/Emoji.d.ts +5 -0
  50. package/dist/types/components/common/EmojiActions.d.ts +6 -0
  51. package/dist/types/components/common/Popup.d.ts +1 -0
  52. package/dist/types/components/common/ProductivityColorSelector.d.ts +17 -0
  53. package/dist/types/components/common/ResourcedEmojiComponent.d.ts +6 -1
  54. package/dist/types/components/common/TonePreviewButton.d.ts +1 -0
  55. package/dist/types/components/i18n.d.ts +10 -0
  56. package/dist/types/components/picker/EmojiPickerList.d.ts +3 -0
  57. package/dist/types/types.d.ts +7 -0
  58. package/dist/types/util/hidden-emojis.d.ts +3 -0
  59. package/dist/types/util/productivity-colors.d.ts +8 -0
  60. package/package.json +3 -2
@@ -4,13 +4,15 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  import "./EmojiActions.compiled.css";
5
5
  import * as React from 'react';
6
6
  import { ax, ix } from "@compiled/react/runtime";
7
- import { Fragment, useState, useRef, memo, useLayoutEffect, useCallback } from 'react';
7
+ import { Fragment, useState, useRef, memo, useLayoutEffect, useCallback, useEffect } from 'react';
8
8
  import { fg } from '@atlaskit/platform-feature-flags';
9
9
  import { FormattedMessage, injectIntl } from 'react-intl';
10
10
  import EmojiDeletePreview from './EmojiDeletePreview';
11
11
  import EmojiUploadPicker from './EmojiUploadPicker';
12
12
  import TonePreviewButton from './TonePreviewButton';
13
13
  import ToneSelector from './ToneSelector';
14
+ import ProductivityColorSelector, { productivityColorSelectorId } from './ProductivityColorSelector';
15
+ import Popup from './Popup';
14
16
  import { EmojiPickerListSearch } from '../picker/EmojiPickerListSearch';
15
17
  import { messages } from '../i18n';
16
18
  import AkButton from '@atlaskit/button/standard-button';
@@ -27,6 +29,7 @@ var addCustomEmoji = null;
27
29
  var addCustomEmojiButton = null;
28
30
  var emojiActionsWrapper = null;
29
31
  var emojiToneSelectorContainer = null;
32
+ var productivityColorPopup = null;
30
33
  var previewFooter = null;
31
34
  var previewFooterNew = null;
32
35
  export var emojiActionsTestId = 'emoji-actions';
@@ -68,11 +71,17 @@ export var AddOwnEmoji = function AddOwnEmoji(props) {
68
71
  })));
69
72
  };
70
73
  var TonesWrapper = function TonesWrapper(props) {
71
- var toneEmoji = props.toneEmoji,
74
+ var activeCategoryId = props.activeCategoryId,
75
+ onProductivityColorSelected = props.onProductivityColorSelected,
76
+ productivityColorPreviewEmojis = props.productivityColorPreviewEmojis,
77
+ selectedProductivityColor = props.selectedProductivityColor,
78
+ toneEmoji = props.toneEmoji,
72
79
  _props$selectedTone = props.selectedTone,
73
80
  selectedTone = _props$selectedTone === void 0 ? DEFAULT_TONE : _props$selectedTone,
74
81
  intl = props.intl,
82
+ onToneClose = props.onToneClose,
75
83
  onToneOpen = props.onToneOpen,
84
+ onToneToggle = props.onToneToggle,
76
85
  showToneSelector = props.showToneSelector;
77
86
  var formatMessage = intl.formatMessage;
78
87
  var tonePreviewButtonRef = useRef(null);
@@ -99,6 +108,41 @@ var TonesWrapper = function TonesWrapper(props) {
99
108
  onToneSelected(toneValue);
100
109
  setFocusTonePreviewButton(true);
101
110
  }, [props]);
111
+ var onProductivityColorSelectedHandler = useCallback(function (color) {
112
+ onProductivityColorSelected === null || onProductivityColorSelected === void 0 || onProductivityColorSelected(color);
113
+ onToneClose();
114
+ setFocusTonePreviewButton(true);
115
+ }, [onProductivityColorSelected, onToneClose]);
116
+ var shouldShowProductivityColorSelector = !!(activeCategoryId === 'ATLASSIAN' && productivityColorPreviewEmojis && selectedProductivityColor && onProductivityColorSelected && FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false));
117
+ if (shouldShowProductivityColorSelector) {
118
+ var previewEmoji = (productivityColorPreviewEmojis === null || productivityColorPreviewEmojis === void 0 ? void 0 : productivityColorPreviewEmojis[selectedProductivityColor]) || Object.values(productivityColorPreviewEmojis || {})[0];
119
+ if (!previewEmoji) {
120
+ return null;
121
+ }
122
+ return /*#__PURE__*/React.createElement("div", {
123
+ className: ax(["_16jlkb7n _1o9zkb7n _i0dlf1ug _ca0q1skh _u5f319bv _n3td1crf _19bvidpf _1e0c1txw _1bahesu3"])
124
+ }, showToneSelector && tonePreviewButtonRef.current && /*#__PURE__*/React.createElement(Popup, {
125
+ target: tonePreviewButtonRef.current,
126
+ relativePosition: "below",
127
+ horizontalAlign: "end-to-start",
128
+ offsetY: 4,
129
+ zIndex: 510
130
+ }, /*#__PURE__*/React.createElement("div", {
131
+ className: ax(["_19itia51 _2rkofajl _bfhk1bhr _16qs130s _ca0q12x7 _u5f312x7 _n3td12x7 _19bv12x7"])
132
+ }, /*#__PURE__*/React.createElement(ProductivityColorSelector, {
133
+ colorPreviewEmojis: productivityColorPreviewEmojis,
134
+ selectedColor: selectedProductivityColor,
135
+ onColorSelected: onProductivityColorSelectedHandler
136
+ }))), /*#__PURE__*/React.createElement(TonePreviewButton, {
137
+ ref: tonePreviewButtonRef,
138
+ ariaControls: productivityColorSelectorId,
139
+ ariaExpanded: showToneSelector,
140
+ emoji: previewEmoji,
141
+ selectOnHover: true,
142
+ onSelected: onToneToggle,
143
+ ariaLabelText: formatMessage(messages.emojiSelectColorButtonAriaLabelText)
144
+ }));
145
+ }
102
146
  if (!toneEmoji) {
103
147
  return null;
104
148
  }
@@ -147,12 +191,19 @@ export var EmojiActions = function EmojiActions(props) {
147
191
  _useState4 = _slicedToArray(_useState3, 2),
148
192
  showToneSelector = _useState4[0],
149
193
  setShowToneSelector = _useState4[1];
194
+ var wasProductivityColorSelectorOpen = useRef(false);
195
+ var shouldUseProductivityColorControl = !!(props.activeCategoryId === 'ATLASSIAN' && props.productivityColorPreviewEmojis && props.selectedProductivityColor && props.onProductivityColorSelected && FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false));
150
196
  var onToneOpenHandler = useCallback(function () {
151
197
  return setShowToneSelector(true);
152
198
  }, []);
153
199
  var onToneCloseHandler = useCallback(function () {
154
200
  return setShowToneSelector(false);
155
201
  }, []);
202
+ var onToneToggleHandler = useCallback(function () {
203
+ setShowToneSelector(function (isOpen) {
204
+ return !isOpen;
205
+ });
206
+ }, []);
156
207
  var onToneSelectedHandler = useCallback(function (toneValue) {
157
208
  setShowToneSelector(false);
158
209
  if (onToneSelected) {
@@ -160,11 +211,24 @@ export var EmojiActions = function EmojiActions(props) {
160
211
  }
161
212
  }, [onToneSelected]);
162
213
  var onMouseLeaveHandler = useCallback(function () {
214
+ if (shouldUseProductivityColorControl) {
215
+ return;
216
+ }
163
217
  if (showToneSelector && onToneSelectorCancelled) {
164
218
  onToneSelectorCancelled();
165
219
  }
166
220
  setShowToneSelector(false);
167
- }, [showToneSelector, onToneSelectorCancelled]);
221
+ }, [shouldUseProductivityColorControl, showToneSelector, onToneSelectorCancelled]);
222
+ useEffect(function () {
223
+ if (shouldUseProductivityColorControl && showToneSelector) {
224
+ wasProductivityColorSelectorOpen.current = true;
225
+ return;
226
+ }
227
+ if (!shouldUseProductivityColorControl && wasProductivityColorSelectorOpen.current) {
228
+ setShowToneSelector(false);
229
+ wasProductivityColorSelectorOpen.current = false;
230
+ }
231
+ }, [shouldUseProductivityColorControl, showToneSelector]);
168
232
  if (uploading) {
169
233
  return FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false) ? /*#__PURE__*/React.createElement("div", {
170
234
  className: ax(["_16jlidpf _1o9zidpf _i0dl1wug"])
@@ -210,11 +274,12 @@ export var EmojiActions = function EmojiActions(props) {
210
274
  onChange: onChange,
211
275
  query: query,
212
276
  resultsCount: resultsCount,
213
- isVisible: !showToneSelector
277
+ isVisible: !showToneSelector || shouldUseProductivityColorControl
214
278
  }), /*#__PURE__*/React.createElement(TonesWrapper, _extends({}, props, {
215
279
  onToneOpen: onToneOpenHandler,
216
280
  onToneClose: onToneCloseHandler,
217
281
  onToneSelected: onToneSelectedHandler,
282
+ onToneToggle: onToneToggleHandler,
218
283
  showToneSelector: showToneSelector
219
284
  })))) : /*#__PURE__*/React.createElement("div", {
220
285
  "data-testid": emojiActionsTestId,
@@ -232,6 +297,7 @@ export var EmojiActions = function EmojiActions(props) {
232
297
  onToneOpen: onToneOpenHandler,
233
298
  onToneClose: onToneCloseHandler,
234
299
  onToneSelected: onToneSelectedHandler,
300
+ onToneToggle: onToneToggleHandler,
235
301
  showToneSelector: showToneSelector
236
302
  }))), /*#__PURE__*/React.createElement(AddOwnEmoji, props));
237
303
  };
@@ -11,6 +11,8 @@ var getTargetNode = function getTargetNode(target) {
11
11
  var Popup = function Popup(props) {
12
12
  var _props$relativePositi = props.relativePosition,
13
13
  relativePosition = _props$relativePositi === void 0 ? 'auto' : _props$relativePositi,
14
+ _props$horizontalAlig = props.horizontalAlign,
15
+ horizontalAlign = _props$horizontalAlig === void 0 ? 'start' : _props$horizontalAlig,
14
16
  _props$offsetX = props.offsetX,
15
17
  offsetX = _props$offsetX === void 0 ? 0 : _props$offsetX,
16
18
  _props$offsetY = props.offsetY,
@@ -24,17 +26,27 @@ var Popup = function Popup(props) {
24
26
  _useState2 = _slicedToArray(_useState, 2),
25
27
  debounced = _useState2[0],
26
28
  setDebounced = _useState2[1];
29
+ var getLeftPosition = useCallback(function (box) {
30
+ if (horizontalAlign === 'end-to-start') {
31
+ return box.left - 152;
32
+ }
33
+ if (horizontalAlign === 'end') {
34
+ var _popup$current;
35
+ return box.right - (((_popup$current = popup.current) === null || _popup$current === void 0 ? void 0 : _popup$current.offsetWidth) || 0) + (offsetX || 0);
36
+ }
37
+ return box.left + (offsetX || 0);
38
+ }, [horizontalAlign, offsetX]);
27
39
  var applyBelowPosition = useCallback(function () {
28
40
  var targetNode = getTargetNode(target);
29
41
  if (targetNode && popup.current) {
30
42
  var box = targetNode.getBoundingClientRect();
31
43
  var top = box.bottom + (offsetY || 0);
32
- var left = box.left + (offsetX || 0);
44
+ var left = getLeftPosition(box);
33
45
  popup.current.style.top = "".concat(top, "px");
34
46
  popup.current.style.bottom = '';
35
47
  popup.current.style.left = "".concat(left, "px");
36
48
  }
37
- }, [offsetX, offsetY, target]);
49
+ }, [getLeftPosition, offsetY, target]);
38
50
  var applyAbovePosition = useCallback(function () {
39
51
  if (typeof window === 'undefined') {
40
52
  return;
@@ -43,12 +55,12 @@ var Popup = function Popup(props) {
43
55
  if (targetNode && popup.current) {
44
56
  var box = targetNode.getBoundingClientRect();
45
57
  var bottom = window.innerHeight - box.top + (offsetY || 0);
46
- var left = box.left + (offsetX || 0);
58
+ var left = getLeftPosition(box);
47
59
  popup.current.style.top = '';
48
60
  popup.current.style.bottom = "".concat(bottom, "px");
49
61
  popup.current.style.left = "".concat(left, "px");
50
62
  }
51
- }, [offsetX, offsetY, target]);
63
+ }, [getLeftPosition, offsetY, target]);
52
64
  var applyAbsolutePosition = useCallback(function () {
53
65
  if (typeof window === 'undefined') {
54
66
  return;
@@ -103,6 +115,9 @@ var Popup = function Popup(props) {
103
115
  }
104
116
  applyAbsolutePosition();
105
117
  renderPopup();
118
+ if (horizontalAlign !== 'start') {
119
+ applyAbsolutePosition();
120
+ }
106
121
  return function () {
107
122
  if (typeof window === 'undefined') {
108
123
  return;
@@ -113,7 +128,7 @@ var Popup = function Popup(props) {
113
128
  document.body.removeChild(popup.current);
114
129
  }
115
130
  };
116
- }, [applyAbsolutePosition, handleResize, renderPopup]);
131
+ }, [applyAbsolutePosition, handleResize, horizontalAlign, renderPopup]);
117
132
  return /*#__PURE__*/React.createElement("div", null);
118
133
  };
119
134
  export default Popup;
@@ -0,0 +1,59 @@
1
+
2
+ ._1355fajl input+span{border-radius:var(--ds-radius-small,3px)}
3
+ ._19itidpf{border:0}
4
+ ._zulp1b66{gap:var(--ds-space-050,4px)}._1030zwfg input+span{height:2pc}
5
+ ._12hvze3t input{margin-right:var(--ds-space-0,0)}
6
+ ._12ultlke input{cursor:pointer}
7
+ ._13yj1o36 input:focus+span{outline-width:medium}
8
+ ._17muzwfg label{height:2pc}
9
+ ._18m915vq{overflow-y:hidden}
10
+ ._18u0ze3t{margin-left:var(--ds-space-0,0)}
11
+ ._19bvidpf{padding-left:0}
12
+ ._19pkze3t{margin-top:var(--ds-space-0,0)}
13
+ ._1bah1h6o{justify-content:center}
14
+ ._1bsbt94y{width:1px}
15
+ ._1bsbzwfg{width:2pc}
16
+ ._1e0c11p5{display:grid}
17
+ ._1e0c1txw{display:flex}
18
+ ._1e7sidpf input{opacity:0}
19
+ ._1eq11h6o label{align-items:center}
20
+ ._1nn0kb7n input{z-index:1}
21
+ ._1p1fzwfg label{width:2pc}
22
+ ._1pi91y54 input:focus+span{box-shadow:0 0 0 2px var(--ds-border-focused,#4688ec)}
23
+ ._1reo15vq{overflow-x:hidden}
24
+ ._1rgfze3t input{margin-left:var(--ds-space-0,0)}
25
+ ._1rgq13zc input:focus+span{transition-duration:0s,.2s}
26
+ ._1ul9idpf{min-width:0}
27
+ ._1vzltlke label{cursor:pointer}
28
+ ._1wqq1h6o label{justify-content:center}
29
+ ._2hwxze3t{margin-right:var(--ds-space-0,0)}
30
+ ._2x4gze3t input{margin-top:var(--ds-space-0,0)}
31
+ ._2z051y6t{grid-template-rows:repeat(2,2pc)}
32
+ ._4cvr1h6o{align-items:center}
33
+ ._4t3it94y{height:1px}
34
+ ._4t3izwfg{height:2pc}
35
+ ._5hv9zwfg input{width:2pc}
36
+ ._6rawzwfg input+span{width:2pc}
37
+ ._6vsr1h6o input+span{justify-content:center}
38
+ ._7kzvidpf input+span{padding-inline-end:0}
39
+ ._8qdiidpf input+span{padding-block-start:0}
40
+ ._ca0qidpf{padding-top:0}
41
+ ._ecyuidpf input+span{padding-block-end:0}
42
+ ._ev8ridpf input+span{padding-inline-start:0}
43
+ ._hxs6glyw input:focus+span{outline-style:none}
44
+ ._khufstnw input{position:absolute}
45
+ ._kqswh2mm{position:relative}
46
+ ._kqswstnw{position:absolute}
47
+ ._n3tdidpf{padding-bottom:0}
48
+ ._ngzz1txw input+span{display:flex}
49
+ ._o5721q9c{white-space:nowrap}
50
+ ._ogtohxbz{clip:rect(0 0 0 0)}
51
+ ._otyrze3t{margin-bottom:var(--ds-space-0,0)}
52
+ ._pytkzwfg input{height:2pc}
53
+ ._smb7plhp input:hover+span{background-color:var(--ds-background-neutral-hovered,#0b120e24)}
54
+ ._soq51h6o input+span{align-items:center}
55
+ ._szw2w5lj input:checked+span{box-shadow:0 0 0 2px var(--ds-border-selected,#1868db)}
56
+ ._tnsm1r31 input:focus+span{outline-color:currentColor}
57
+ ._u5f3idpf{padding-right:0}
58
+ ._x5bdze3t input{margin-bottom:var(--ds-space-0,0)}
59
+ ._yv0e1bbt{grid-template-columns:repeat(5,2pc)}
@@ -0,0 +1,103 @@
1
+ /* ProductivityColorSelector.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ import "./ProductivityColorSelector.compiled.css";
3
+ import * as React from 'react';
4
+ import { ax, ix } from "@compiled/react/runtime";
5
+ import { memo, useContext, useRef } from 'react';
6
+ import { IntlContext } from 'react-intl';
7
+ import { Radio } from '@atlaskit/radio';
8
+ import { productivityColors } from '../../util/productivity-colors';
9
+ import { messages } from '../i18n';
10
+ import Emoji from './Emoji';
11
+ export var productivityColorSelectorTestId = 'productivity-color-selector';
12
+ export var productivityColorSelectorId = 'emoji-picker-productivity-color-selector';
13
+ var selectorGrid = null;
14
+ var visuallyHiddenLegend = null;
15
+ var colorOption = null;
16
+ var colorOptionEmoji = null;
17
+ var getColorLabel = function getColorLabel(color) {
18
+ return "".concat(color.charAt(0).toUpperCase()).concat(color.slice(1), " productivity emoji colour");
19
+ };
20
+ export var ProductivityColorSelector = function ProductivityColorSelector(_ref) {
21
+ var colorPreviewEmojis = _ref.colorPreviewEmojis,
22
+ onColorSelected = _ref.onColorSelected,
23
+ selectedColor = _ref.selectedColor;
24
+ var intl = useContext(IntlContext);
25
+ var radioRefs = useRef([]);
26
+ var hasFocusedSelectedColor = useRef(false);
27
+ var availableColors = productivityColors.filter(function (color) {
28
+ return colorPreviewEmojis[color];
29
+ });
30
+ var colorSelectorAriaLabel = intl ? intl.formatMessage(messages.emojiSelectColorListAriaLabelText) : messages.emojiSelectColorListAriaLabelText.defaultMessage;
31
+ if (!availableColors.length) {
32
+ return null;
33
+ }
34
+ var onArrowKey = function onArrowKey(currentIndex, direction) {
35
+ var _radioRefs$current$ne;
36
+ var nextIndex = (currentIndex + direction + availableColors.length) % availableColors.length;
37
+ (_radioRefs$current$ne = radioRefs.current[nextIndex]) === null || _radioRefs$current$ne === void 0 || _radioRefs$current$ne.focus();
38
+ };
39
+ var stopPickerDismissal = function stopPickerDismissal(event) {
40
+ event.stopPropagation();
41
+ };
42
+ return /*#__PURE__*/React.createElement("fieldset", {
43
+ id: productivityColorSelectorId,
44
+ "data-testid": productivityColorSelectorTestId,
45
+ className: ax(["_19itidpf _zulp1b66 _ca0qidpf _u5f3idpf _n3tdidpf _19bvidpf _1e0c11p5 _yv0e1bbt _2z051y6t _19pkze3t _2hwxze3t _otyrze3t _18u0ze3t _1ul9idpf"])
46
+ }, /*#__PURE__*/React.createElement("legend", {
47
+ className: ax(["_19itidpf _1reo15vq _18m915vq _ca0qidpf _u5f3idpf _n3tdidpf _19bvidpf _ogtohxbz _4t3it94y _kqswstnw _o5721q9c _1bsbt94y"])
48
+ }, colorSelectorAriaLabel), availableColors.map(function (color, index) {
49
+ var emoji = colorPreviewEmojis[color];
50
+ if (!emoji) {
51
+ return null;
52
+ }
53
+ var handleKeyDown = function handleKeyDown(event) {
54
+ if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {
55
+ event.preventDefault();
56
+ onArrowKey(index, -1);
57
+ }
58
+ if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {
59
+ event.preventDefault();
60
+ onArrowKey(index, 1);
61
+ }
62
+ if (event.key === 'Enter') {
63
+ event.preventDefault();
64
+ onColorSelected(color);
65
+ }
66
+ };
67
+ return /*#__PURE__*/React.createElement("div", {
68
+ key: color,
69
+ className: ax(["_4t3izwfg _kqswh2mm _1bsbzwfg _1355fajl _soq51h6o _ngzz1txw _1030zwfg _6vsr1h6o _ecyuidpf _8qdiidpf _7kzvidpf _ev8ridpf _6rawzwfg _tnsm1r31 _hxs6glyw _13yj1o36 _1pi91y54 _1rgq13zc _1eq11h6o _1vzltlke _17muzwfg _1wqq1h6o _1p1fzwfg _12ultlke _pytkzwfg _2x4gze3t _12hvze3t _x5bdze3t _1rgfze3t _1e7sidpf _khufstnw _5hv9zwfg _1nn0kb7n _smb7plhp _szw2w5lj"])
70
+ }, /*#__PURE__*/React.createElement(Radio, {
71
+ ref: function ref(el) {
72
+ radioRefs.current[index] = el;
73
+ if (selectedColor === color) {
74
+ if (el && !hasFocusedSelectedColor.current) {
75
+ el.focus();
76
+ hasFocusedSelectedColor.current = true;
77
+ }
78
+ }
79
+ },
80
+ ariaLabel: getColorLabel(color),
81
+ name: "productivity-emoji-colour",
82
+ isChecked: selectedColor === color,
83
+ onChange: function onChange() {
84
+ return onColorSelected(color);
85
+ },
86
+ onClick: stopPickerDismissal,
87
+ onKeyDown: handleKeyDown,
88
+ onMouseDown: stopPickerDismissal,
89
+ testId: "productivity-color-".concat(color),
90
+ value: color,
91
+ label: /*#__PURE__*/React.createElement("span", {
92
+ className: ax(["_4cvr1h6o _1e0c1txw _4t3izwfg _1bah1h6o _1bsbzwfg"])
93
+ }, /*#__PURE__*/React.createElement(Emoji, {
94
+ emoji: emoji,
95
+ shouldBeInteractive: false,
96
+ "aria-hidden": true,
97
+ fitToHeight: 24
98
+ }))
99
+ }));
100
+ }));
101
+ };
102
+ var _default_1 = /*#__PURE__*/memo(ProductivityColorSelector);
103
+ export default _default_1;
@@ -35,6 +35,8 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(_ref) {
35
35
  _ref$optimisticImageU = _ref.optimisticImageURL,
36
36
  optimisticImageURL = _ref$optimisticImageU === void 0 ? undefined : _ref$optimisticImageU,
37
37
  editorEmoji = _ref.editorEmoji,
38
+ _ref$renderUnicodeEmo = _ref.renderUnicodeEmojiAsImage,
39
+ renderUnicodeEmojiAsImage = _ref$renderUnicodeEmo === void 0 ? true : _ref$renderUnicodeEmo,
38
40
  _ref$pageTitleEmoji = _ref.pageTitleEmoji,
39
41
  pageTitleEmoji = _ref$pageTitleEmoji === void 0 ? false : _ref$pageTitleEmoji,
40
42
  placeholderXcss = _ref.placeholderXcss,
@@ -295,7 +297,8 @@ export var ResourcedEmojiComponent = function ResourcedEmojiComponent(_ref) {
295
297
  showTooltip: showTooltip,
296
298
  fitToHeight: fitToHeight,
297
299
  autoWidth: autoWidth,
298
- editorEmoji: editorEmoji
300
+ editorEmoji: editorEmoji,
301
+ renderUnicodeEmojiAsImage: renderUnicodeEmojiAsImage
299
302
  })));
300
303
  };
301
304
  export default ResourcedEmojiComponent;
@@ -13,6 +13,8 @@ var emojiButtonOutline = null;
13
13
  export var TonePreviewButton = /*#__PURE__*/forwardRef(function (props, ref) {
14
14
  var emoji = props.emoji,
15
15
  selectOnHover = props.selectOnHover,
16
+ _props$ariaControls = props.ariaControls,
17
+ ariaControls = _props$ariaControls === void 0 ? 'emoji-picker-tone-selector' : _props$ariaControls,
16
18
  ariaLabelText = props.ariaLabelText,
17
19
  ariaExpanded = props.ariaExpanded,
18
20
  onSelected = props.onSelected,
@@ -24,7 +26,7 @@ export var TonePreviewButton = /*#__PURE__*/forwardRef(function (props, ref) {
24
26
  onClick: onSelected,
25
27
  "aria-label": ariaLabelText,
26
28
  "aria-expanded": ariaExpanded,
27
- "aria-controls": "emoji-picker-tone-selector"
29
+ "aria-controls": ariaControls
28
30
  // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
29
31
  ,
30
32
  style: {
@@ -44,7 +46,7 @@ export var TonePreviewButton = /*#__PURE__*/forwardRef(function (props, ref) {
44
46
  onClick: onSelected,
45
47
  "aria-label": ariaLabelText,
46
48
  "aria-expanded": ariaExpanded,
47
- "aria-controls": "emoji-picker-tone-selector"
49
+ "aria-controls": ariaControls
48
50
  // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
49
51
  ,
50
52
  style: {
@@ -65,6 +65,16 @@ export var messages = defineMessages({
65
65
  defaultMessage: 'Choose your skin tone, {selectedTone} selected',
66
66
  description: 'Message indicating the purpose of the skin tone selection button and the selected tone'
67
67
  },
68
+ emojiSelectColorButtonAriaLabelText: {
69
+ id: 'fabric.emoji.select.color.ariaLabel',
70
+ defaultMessage: 'Productivity emoji color selector',
71
+ description: 'Message indicating the purpose of the color selection button and the selected color'
72
+ },
73
+ emojiSelectColorListAriaLabelText: {
74
+ id: 'fabric.emoji.select.color.list.ariaLabel',
75
+ defaultMessage: 'Productivity emoji colour selector',
76
+ description: 'Message indicating the purpose of the productivity emoji color list selector'
77
+ },
68
78
  emojiSelectSkinToneListAriaLabelText: {
69
79
  id: 'fabric.emoji.select.skin.list.ariaLabel',
70
80
  defaultMessage: 'Skin tone selector',
@@ -33,6 +33,8 @@ import { createAndFireEventInElementsChannel, categoryClickedEvent, closedPicker
33
33
  import { useEmoji } from '../../hooks/useEmoji';
34
34
  import { useIsMounted } from '../../hooks/useIsMounted';
35
35
  import { messages } from '../i18n';
36
+ import { defaultProductivityColor } from '../../util/productivity-colors';
37
+ import { filterHiddenEmojis } from '../../util/hidden-emojis';
36
38
  var emojiPickerBoxShadow = "var(--ds-shadow-overlay, 0px 8px 12px #1E1F2126, 0px 0px 1px #1E1F214f)";
37
39
  var emojiPickerHeight = 295;
38
40
  var emojiPickerHeightWithPreview = 349; // emojiPickerHeight + emojiPickerPreviewHeight;
@@ -83,6 +85,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
83
85
  var _useEmoji = useEmoji(),
84
86
  emojiProvider = _useEmoji.emojiProvider,
85
87
  isUploadSupported = _useEmoji.isUploadSupported;
88
+ var isTeamojiExperimentEnabled = FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false);
86
89
  var _useState = useState([]),
87
90
  _useState2 = _slicedToArray(_useState, 2),
88
91
  filteredEmojis = _useState2[0],
@@ -107,38 +110,42 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
107
110
  _useState10 = _slicedToArray(_useState1, 2),
108
111
  selectedTone = _useState10[0],
109
112
  setSelectedTone = _useState10[1];
110
- var _useState11 = useState(true),
113
+ var _useState11 = useState(defaultProductivityColor),
111
114
  _useState12 = _slicedToArray(_useState11, 2),
112
- loading = _useState12[0],
113
- setLoading = _useState12[1];
114
- var _useState13 = useState(false),
115
+ selectedProductivityColor = _useState12[0],
116
+ setSelectedProductivityColor = _useState12[1];
117
+ var _useState13 = useState(true),
115
118
  _useState14 = _slicedToArray(_useState13, 2),
116
- uploading = _useState14[0],
117
- setUploading = _useState14[1];
118
- var _useState15 = useState(),
119
+ loading = _useState14[0],
120
+ setLoading = _useState14[1];
121
+ var _useState15 = useState(false),
119
122
  _useState16 = _slicedToArray(_useState15, 2),
120
- selectedEmoji = _useState16[0],
121
- setSelectedEmoji = _useState16[1];
122
- var _useState17 = useState(null),
123
+ uploading = _useState16[0],
124
+ setUploading = _useState16[1];
125
+ var _useState17 = useState(),
123
126
  _useState18 = _slicedToArray(_useState17, 2),
124
- activeCategory = _useState18[0],
125
- setActiveCategory = _useState18[1];
126
- var _useState19 = useState(false),
127
+ selectedEmoji = _useState18[0],
128
+ setSelectedEmoji = _useState18[1];
129
+ var _useState19 = useState(null),
127
130
  _useState20 = _slicedToArray(_useState19, 2),
128
- disableCategories = _useState20[0],
129
- setDisableCategories = _useState20[1];
130
- var _useState21 = useState(),
131
+ activeCategory = _useState20[0],
132
+ setActiveCategory = _useState20[1];
133
+ var _useState21 = useState(false),
131
134
  _useState22 = _slicedToArray(_useState21, 2),
132
- uploadErrorMessage = _useState22[0],
133
- setUploadErrorMessage = _useState22[1];
135
+ disableCategories = _useState22[0],
136
+ setDisableCategories = _useState22[1];
134
137
  var _useState23 = useState(),
135
138
  _useState24 = _slicedToArray(_useState23, 2),
136
- emojiToDelete = _useState24[0],
137
- setEmojiToDelete = _useState24[1];
139
+ uploadErrorMessage = _useState24[0],
140
+ setUploadErrorMessage = _useState24[1];
138
141
  var _useState25 = useState(),
139
142
  _useState26 = _slicedToArray(_useState25, 2),
140
- toneEmoji = _useState26[0],
141
- setToneEmoji = _useState26[1];
143
+ emojiToDelete = _useState26[0],
144
+ setEmojiToDelete = _useState26[1];
145
+ var _useState27 = useState(),
146
+ _useState28 = _slicedToArray(_useState27, 2),
147
+ toneEmoji = _useState28[0],
148
+ setToneEmoji = _useState28[1];
142
149
  var emojiPickerList = useMemo(function () {
143
150
  return /*#__PURE__*/createRef();
144
151
  }, []);
@@ -149,11 +156,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
149
156
  var isProgrammaticScroll = useRef(false);
150
157
  var pickerRef = useRef(null);
151
158
  var setPickerRef = useCallback(function (el) {
152
- if (FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false)) {
159
+ if (isTeamojiExperimentEnabled) {
153
160
  pickerRef.current = el;
154
161
  }
155
162
  onPickerRef === null || onPickerRef === void 0 || onPickerRef(el);
156
- }, [onPickerRef]);
163
+ }, [isTeamojiExperimentEnabled, onPickerRef]);
157
164
  var currentUser = useMemo(function () {
158
165
  return emojiProvider.getCurrentUser();
159
166
  }, [emojiProvider]);
@@ -254,7 +261,8 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
254
261
  }, [filteredEmojis.length, getDynamicCategories, onDynamicCategoryChange, selectedEmoji]);
255
262
  var onFrequentEmojiResult = useCallback(function (frequentEmoji) {
256
263
  // change the category of each of the featured emoji
257
- var recategorised = frequentEmoji.map(function (emoji) {
264
+ var visibleFrequentEmoji = isTeamojiExperimentEnabled ? filterHiddenEmojis(frequentEmoji) : frequentEmoji;
265
+ var recategorised = visibleFrequentEmoji.map(function (emoji) {
258
266
  var clone = JSON.parse(JSON.stringify(emoji));
259
267
  clone.category = frequentCategory;
260
268
  return clone;
@@ -262,10 +270,11 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
262
270
  setStateAfterEmojiChange({
263
271
  frequentEmoji: recategorised
264
272
  });
265
- }, [setStateAfterEmojiChange]);
273
+ }, [isTeamojiExperimentEnabled, setStateAfterEmojiChange]);
266
274
  var onSearchResult = useCallback(function (searchResults) {
267
275
  var frequentlyUsedEmoji = frequentlyUsedEmojis || [];
268
276
  var searchQuery = searchResults.query || '';
277
+ var visibleSearchEmojis = isTeamojiExperimentEnabled ? filterHiddenEmojis(searchResults.emojis) : searchResults.emojis;
269
278
 
270
279
  /**
271
280
  * If there is no user search in the EmojiPicker then it should display all emoji received from the EmojiRepository and should
@@ -274,20 +283,20 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
274
283
  */
275
284
  var emojiToRender;
276
285
  if (!frequentlyUsedEmoji.length || query) {
277
- emojiToRender = searchResults.emojis;
286
+ emojiToRender = visibleSearchEmojis;
278
287
  } else {
279
- emojiToRender = [].concat(_toConsumableArray(searchResults.emojis), _toConsumableArray(frequentlyUsedEmoji));
288
+ emojiToRender = [].concat(_toConsumableArray(visibleSearchEmojis), _toConsumableArray(frequentlyUsedEmoji));
280
289
  }
281
290
  setStateAfterEmojiChange({
282
291
  searchQuery: searchQuery,
283
292
  emojiToRender: emojiToRender,
284
- searchEmoji: searchResults.emojis
293
+ searchEmoji: visibleSearchEmojis
285
294
  });
286
295
  fireAnalytics(pickerSearchedEvent({
287
296
  queryLength: searchQuery.length,
288
- numMatches: searchResults.emojis.length
297
+ numMatches: visibleSearchEmojis.length
289
298
  }));
290
- }, [frequentlyUsedEmojis, query, setStateAfterEmojiChange, fireAnalytics]);
299
+ }, [frequentlyUsedEmojis, isTeamojiExperimentEnabled, query, setStateAfterEmojiChange, fireAnalytics]);
291
300
  var onProviderChange = useMemo(function () {
292
301
  return {
293
302
  result: onSearchResult
@@ -329,6 +338,9 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
329
338
  var onToneSelectorCancelled = useCallback(function () {
330
339
  fireAnalytics(toneSelectorClosedEvent());
331
340
  }, [fireAnalytics]);
341
+ var onProductivityColorSelected = useCallback(function (color) {
342
+ setSelectedProductivityColor(color);
343
+ }, []);
332
344
  var onSelectWrapper = useCallback(function (emojiId, emoji, event) {
333
345
  if (onSelection) {
334
346
  onSelection(emojiId, emoji, event);
@@ -359,17 +371,18 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
359
371
  emojiProvider.findInCategory(categoryId).then(function (emojisInCategory) {
360
372
  if (!disableCategories) {
361
373
  var newSelectedEmoji;
362
- if (emojisInCategory && emojisInCategory.length > 0) {
363
- newSelectedEmoji = getEmojiVariation(emojisInCategory[0], {
374
+ var visibleEmojisInCategory = isTeamojiExperimentEnabled ? filterHiddenEmojis(emojisInCategory || []) : emojisInCategory || [];
375
+ if (visibleEmojisInCategory.length > 0) {
376
+ newSelectedEmoji = getEmojiVariation(visibleEmojisInCategory[0], {
364
377
  skinTone: selectedTone
365
378
  });
366
379
  }
367
380
  if (emojiPickerList.current) {
368
- if (FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false)) {
381
+ if (isTeamojiExperimentEnabled) {
369
382
  isProgrammaticScroll.current = true;
370
383
  }
371
384
  emojiPickerList.current.reveal(categoryId);
372
- if (FeatureGates.getExperimentValue('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', false)) {
385
+ if (isTeamojiExperimentEnabled) {
373
386
  // Clear the flag after the scroll animation has settled.
374
387
  setTimeout(function () {
375
388
  isProgrammaticScroll.current = false;
@@ -385,7 +398,7 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
385
398
  }));
386
399
  }
387
400
  });
388
- }, [disableCategories, emojiPickerList, emojiProvider, fireAnalytics, selectedTone, uploading, emojiToDelete]);
401
+ }, [disableCategories, emojiPickerList, emojiProvider, fireAnalytics, isTeamojiExperimentEnabled, selectedTone, uploading, emojiToDelete]);
389
402
  var recordUsageOnSelection = useMemo(function () {
390
403
  return createRecordSelectionDefault(emojiProvider, onSelectWrapper, function (analytic) {
391
404
  return fireAnalytics(analytic(SearchSourceTypes.PICKER));
@@ -665,11 +678,13 @@ var EmojiPickerComponent = function EmojiPickerComponent(_ref) {
665
678
  onSearch: onSearch,
666
679
  query: query,
667
680
  selectedTone: selectedTone,
681
+ selectedProductivityColor: isTeamojiExperimentEnabled ? selectedProductivityColor : undefined,
668
682
  loading: loading,
669
683
  ref: emojiPickerList,
670
684
  initialUploadName: query,
671
685
  onToneSelected: onToneSelected,
672
686
  onToneSelectorCancelled: onToneSelectorCancelled,
687
+ onProductivityColorSelected: isTeamojiExperimentEnabled ? onProductivityColorSelected : undefined,
673
688
  toneEmoji: toneEmoji,
674
689
  uploading: uploading,
675
690
  emojiToDelete: emojiToDelete,