@atlaskit/emoji 70.10.11 → 70.10.13
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.
- package/CHANGELOG.md +16 -0
- package/dist/cjs/components/common/DeleteButton.compiled.css +2 -0
- package/dist/cjs/components/common/DeleteButton.js +9 -2
- package/dist/cjs/components/common/EmojiRadioButton.js +11 -0
- package/dist/cjs/components/common/ToneSelector.js +29 -5
- package/dist/cjs/util/analytics/analytics.js +1 -1
- package/dist/es2019/components/common/DeleteButton.compiled.css +2 -0
- package/dist/es2019/components/common/DeleteButton.js +29 -20
- package/dist/es2019/components/common/EmojiRadioButton.js +9 -0
- package/dist/es2019/components/common/ToneSelector.js +26 -4
- package/dist/es2019/util/analytics/analytics.js +1 -1
- package/dist/esm/components/common/DeleteButton.compiled.css +2 -0
- package/dist/esm/components/common/DeleteButton.js +9 -2
- package/dist/esm/components/common/EmojiRadioButton.js +11 -0
- package/dist/esm/components/common/ToneSelector.js +28 -4
- package/dist/esm/util/analytics/analytics.js +1 -1
- package/dist/types/components/common/EmojiRadioButton.d.ts +1 -0
- package/dist/types-ts4.5/components/common/EmojiRadioButton.d.ts +1 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @atlaskit/emoji
|
|
2
2
|
|
|
3
|
+
## 70.10.13
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`87d80420e93ce`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/87d80420e93ce) -
|
|
8
|
+
Update the emoji delete button icon styling.
|
|
9
|
+
- Updated dependencies
|
|
10
|
+
|
|
11
|
+
## 70.10.12
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [`93fae868945b0`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/93fae868945b0) -
|
|
16
|
+
Fix accessibility - inaccessible skin tones from keyboard navigation
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
|
|
3
19
|
## 70.10.11
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
._13t3idpf span{line-height:0}
|
|
2
|
+
._154ir5cr{top:var(--ds-space-negative-050,-4px)}
|
|
2
3
|
._154ix0bf{top:var(--ds-space-negative-100,-8px)}
|
|
3
4
|
._1bsbf6fq{width:18px}
|
|
4
5
|
._1e0c1txw{display:flex}
|
|
5
6
|
._1pbykb7n{z-index:1}
|
|
7
|
+
._1xi2r5cr{right:var(--ds-space-negative-050,-4px)}
|
|
6
8
|
._1xi2x0bf{right:var(--ds-space-negative-100,-8px)}
|
|
7
9
|
._3um015vq{visibility:hidden}
|
|
8
10
|
._4t3if6fq{height:18px}
|
|
@@ -15,25 +15,32 @@ var _crossCircle = _interopRequireDefault(require("@atlaskit/icon/core/cross-cir
|
|
|
15
15
|
var _constants = require("../../util/constants");
|
|
16
16
|
var _styles = require("./styles");
|
|
17
17
|
var _compiled = require("@atlaskit/primitives/compiled");
|
|
18
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
18
19
|
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); }
|
|
19
20
|
var styles = {
|
|
20
21
|
boxWrapperStyle: "_1bsbf6fq _4t3if6fq"
|
|
21
22
|
};
|
|
22
23
|
var deleteButton = null;
|
|
24
|
+
var refreshedDeleteButton = null;
|
|
23
25
|
|
|
24
26
|
/**
|
|
25
27
|
* Test id for wrapper Emoji delete button
|
|
26
28
|
*/
|
|
27
29
|
var RENDER_EMOJI_DELETE_BUTTON_TESTID = exports.RENDER_EMOJI_DELETE_BUTTON_TESTID = 'render-emoji-delete-button';
|
|
28
30
|
var DeleteButton = function DeleteButton(props) {
|
|
31
|
+
var isEmojiPickerRefreshEnabled = (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh');
|
|
29
32
|
return /*#__PURE__*/React.createElement("span", {
|
|
30
33
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
|
|
31
|
-
className: (0, _runtime.ax)(["_3um015vq _1e0c1txw _kqswstnw _154ix0bf _1xi2x0bf _1pbykb7n _13t3idpf", _styles.emojiDeleteButton]),
|
|
34
|
+
className: (0, _runtime.ax)(["_3um015vq _1e0c1txw _kqswstnw _154ix0bf _1xi2x0bf _1pbykb7n _13t3idpf", isEmojiPickerRefreshEnabled && "_154ir5cr _1xi2r5cr", _styles.emojiDeleteButton]),
|
|
32
35
|
"data-testid": RENDER_EMOJI_DELETE_BUTTON_TESTID
|
|
33
36
|
}, /*#__PURE__*/React.createElement(_standardButton.default, {
|
|
34
37
|
iconBefore: /*#__PURE__*/React.createElement(_compiled.Box, {
|
|
35
38
|
xcss: styles.boxWrapperStyle
|
|
36
|
-
}, /*#__PURE__*/React.createElement(_crossCircle.default, {
|
|
39
|
+
}, isEmojiPickerRefreshEnabled ? /*#__PURE__*/React.createElement(_crossCircle.default, {
|
|
40
|
+
label: _constants.deleteEmojiLabel,
|
|
41
|
+
color: "var(--ds-icon, #292A2E)",
|
|
42
|
+
size: "medium"
|
|
43
|
+
}) : /*#__PURE__*/React.createElement(_crossCircle.default, {
|
|
37
44
|
label: _constants.deleteEmojiLabel,
|
|
38
45
|
color: "var(--ds-text-subtle, #505258)",
|
|
39
46
|
size: "small"
|
|
@@ -10,6 +10,7 @@ exports.default = exports.EmojiRadioButton = void 0;
|
|
|
10
10
|
require("./EmojiRadioButton.compiled.css");
|
|
11
11
|
var _runtime = require("@compiled/react/runtime");
|
|
12
12
|
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
13
14
|
var _Emoji = _interopRequireDefault(require("./Emoji"));
|
|
14
15
|
var _constants = require("../../util/constants");
|
|
15
16
|
var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
|
|
@@ -19,6 +20,13 @@ var emojiRadio = {
|
|
|
19
20
|
default: "_tzy4idpf _kqswstnw _154i14id _1ltv14id _3y8mfajl _157z1r31 _1dzmglyw _1sqm1o36 _fh6w1y54 _1i1213zc"
|
|
20
21
|
};
|
|
21
22
|
var handleKeyDown = function handleKeyDown(props, event) {
|
|
23
|
+
if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh')) {
|
|
24
|
+
var _props$onArrowKey;
|
|
25
|
+
event.preventDefault();
|
|
26
|
+
event.stopPropagation();
|
|
27
|
+
(_props$onArrowKey = props.onArrowKey) === null || _props$onArrowKey === void 0 || _props$onArrowKey.call(props, event.key === 'ArrowRight' ? 1 : -1);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
22
30
|
if (_constants.TONESELECTOR_KEYBOARD_KEYS_SUPPORTED.includes(event.key)) {
|
|
23
31
|
var onSelected = props.onSelected;
|
|
24
32
|
event.preventDefault();
|
|
@@ -48,6 +56,9 @@ var EmojiRadioButton = exports.EmojiRadioButton = /*#__PURE__*/(0, _react.forwar
|
|
|
48
56
|
onKeyDown: function onKeyDown(event) {
|
|
49
57
|
return handleKeyDown(props, event);
|
|
50
58
|
},
|
|
59
|
+
onChange: (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? function (e) {
|
|
60
|
+
return e.preventDefault();
|
|
61
|
+
} : undefined,
|
|
51
62
|
className: (0, _runtime.ax)([emojiRadio.default])
|
|
52
63
|
}), /*#__PURE__*/_react.default.createElement(_Emoji.default, {
|
|
53
64
|
emoji: emoji,
|
|
@@ -8,11 +8,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
});
|
|
9
9
|
exports.toneSelectorTestId = exports.default = exports.ToneSelectorInternal = void 0;
|
|
10
10
|
require("./ToneSelector.compiled.css");
|
|
11
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
-
var React = _react;
|
|
13
11
|
var _runtime = require("@compiled/react/runtime");
|
|
14
12
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
13
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
14
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
15
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
16
16
|
var _analyticsNext = require("@atlaskit/analytics-next");
|
|
17
17
|
var _analytics = require("../../util/analytics");
|
|
18
18
|
var _setSkinToneAriaLabelText = require("./setSkinToneAriaLabelText");
|
|
@@ -39,6 +39,8 @@ var ToneSelectorInternal = exports.ToneSelectorInternal = function ToneSelectorI
|
|
|
39
39
|
isVisible = props.isVisible;
|
|
40
40
|
var isMounted = (0, _react.useRef)(false);
|
|
41
41
|
var selectedToneRadioRef = (0, _react.useRef)(null);
|
|
42
|
+
// Refs for all radio inputs — used for FG-gated arrow-key focus management
|
|
43
|
+
var radioRefs = (0, _react.useRef)([]);
|
|
42
44
|
var _useIntl = (0, _reactIntl.useIntl)(),
|
|
43
45
|
formatMessage = _useIntl.formatMessage;
|
|
44
46
|
var emojiToneCollection = (0, _react.useMemo)(function () {
|
|
@@ -71,6 +73,12 @@ var ToneSelectorInternal = exports.ToneSelectorInternal = function ToneSelectorI
|
|
|
71
73
|
(0, _analytics.createAndFireEventInElementsChannel)(event)(createAnalyticsEvent);
|
|
72
74
|
}
|
|
73
75
|
};
|
|
76
|
+
var _onArrowKey = (0, _react.useCallback)(function (currentIndex, direction) {
|
|
77
|
+
var _radioRefs$current$ne;
|
|
78
|
+
var len = radioRefs.current.length;
|
|
79
|
+
var nextIndex = (currentIndex + direction + len) % len;
|
|
80
|
+
(_radioRefs$current$ne = radioRefs.current[nextIndex]) === null || _radioRefs$current$ne === void 0 || _radioRefs$current$ne.focus();
|
|
81
|
+
}, []);
|
|
74
82
|
var onToneSelectedHandler = function onToneSelectedHandler(toneValue) {
|
|
75
83
|
return function () {
|
|
76
84
|
if (selectedTone === toneValue && onToneClose) {
|
|
@@ -88,14 +96,30 @@ var ToneSelectorInternal = exports.ToneSelectorInternal = function ToneSelectorI
|
|
|
88
96
|
fireAnalyticsEvent((0, _analytics.toneSelectorOpenedEvent)({}));
|
|
89
97
|
}
|
|
90
98
|
isMounted.current = true;
|
|
91
|
-
return /*#__PURE__*/
|
|
99
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
92
100
|
role: "radiogroup",
|
|
93
101
|
"data-testid": toneSelectorTestId,
|
|
94
102
|
id: "emoji-picker-tone-selector",
|
|
95
103
|
"aria-label": formatMessage(_i18n.messages.emojiSelectSkinToneListAriaLabelText),
|
|
96
104
|
className: (0, _runtime.ax)([!isVisible && "_tzy4idpf _3um015vq _1e0cglyw"])
|
|
97
|
-
}, emojiToneCollection.map(function (tone) {
|
|
98
|
-
return /*#__PURE__*/
|
|
105
|
+
}, emojiToneCollection.map(function (tone, renderIndex) {
|
|
106
|
+
return (0, _platformFeatureFlags.fg)('platform_emoji_picker_refresh') ? /*#__PURE__*/_react.default.createElement(_EmojiRadioButton.default, {
|
|
107
|
+
ref: function ref(el) {
|
|
108
|
+
radioRefs.current[renderIndex] = el;
|
|
109
|
+
if (tone.isSelected && selectedToneRadioRef) {
|
|
110
|
+
selectedToneRadioRef.current = el;
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
defaultChecked: tone.isSelected,
|
|
114
|
+
ariaLabelText: tone.label,
|
|
115
|
+
key: "".concat(tone.id),
|
|
116
|
+
emoji: tone,
|
|
117
|
+
onArrowKey: function onArrowKey(direction) {
|
|
118
|
+
return _onArrowKey(renderIndex, direction);
|
|
119
|
+
},
|
|
120
|
+
onSelected: onToneSelectedHandler(tone.toneIndex),
|
|
121
|
+
selectOnHover: true
|
|
122
|
+
}) : /*#__PURE__*/_react.default.createElement(_EmojiRadioButton.default, {
|
|
99
123
|
ref: tone.isSelected ? selectedToneRadioRef : null,
|
|
100
124
|
defaultChecked: tone.isSelected,
|
|
101
125
|
ariaLabelText: tone.label,
|
|
@@ -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.10.
|
|
23
|
+
packageVersion: "70.10.12"
|
|
24
24
|
}, attributes)
|
|
25
25
|
};
|
|
26
26
|
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
._13t3idpf span{line-height:0}
|
|
2
|
+
._154ir5cr{top:var(--ds-space-negative-050,-4px)}
|
|
2
3
|
._154ix0bf{top:var(--ds-space-negative-100,-8px)}
|
|
3
4
|
._1bsbf6fq{width:18px}
|
|
4
5
|
._1e0c1txw{display:flex}
|
|
5
6
|
._1pbykb7n{z-index:1}
|
|
7
|
+
._1xi2r5cr{right:var(--ds-space-negative-050,-4px)}
|
|
6
8
|
._1xi2x0bf{right:var(--ds-space-negative-100,-8px)}
|
|
7
9
|
._3um015vq{visibility:hidden}
|
|
8
10
|
._4t3if6fq{height:18px}
|
|
@@ -7,33 +7,42 @@ import CrossCircleIcon from '@atlaskit/icon/core/cross-circle';
|
|
|
7
7
|
import { deleteEmojiLabel } from '../../util/constants';
|
|
8
8
|
import { emojiDeleteButton } from './styles';
|
|
9
9
|
import { Box } from '@atlaskit/primitives/compiled';
|
|
10
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
10
11
|
const styles = {
|
|
11
12
|
boxWrapperStyle: "_1bsbf6fq _4t3if6fq"
|
|
12
13
|
};
|
|
13
14
|
const deleteButton = null;
|
|
15
|
+
const refreshedDeleteButton = null;
|
|
14
16
|
|
|
15
17
|
/**
|
|
16
18
|
* Test id for wrapper Emoji delete button
|
|
17
19
|
*/
|
|
18
20
|
export const RENDER_EMOJI_DELETE_BUTTON_TESTID = 'render-emoji-delete-button';
|
|
19
|
-
const DeleteButton = props =>
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
21
|
+
const DeleteButton = props => {
|
|
22
|
+
const isEmojiPickerRefreshEnabled = fg('platform_emoji_picker_refresh');
|
|
23
|
+
return /*#__PURE__*/React.createElement("span", {
|
|
24
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
|
|
25
|
+
className: ax(["_3um015vq _1e0c1txw _kqswstnw _154ix0bf _1xi2x0bf _1pbykb7n _13t3idpf", isEmojiPickerRefreshEnabled && "_154ir5cr _1xi2r5cr", emojiDeleteButton]),
|
|
26
|
+
"data-testid": RENDER_EMOJI_DELETE_BUTTON_TESTID
|
|
27
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
28
|
+
iconBefore: /*#__PURE__*/React.createElement(Box, {
|
|
29
|
+
xcss: styles.boxWrapperStyle
|
|
30
|
+
}, isEmojiPickerRefreshEnabled ? /*#__PURE__*/React.createElement(CrossCircleIcon, {
|
|
31
|
+
label: deleteEmojiLabel,
|
|
32
|
+
color: "var(--ds-icon, #292A2E)",
|
|
33
|
+
size: "medium"
|
|
34
|
+
}) : /*#__PURE__*/React.createElement(CrossCircleIcon, {
|
|
35
|
+
label: deleteEmojiLabel,
|
|
36
|
+
color: "var(--ds-text-subtle, #505258)",
|
|
37
|
+
size: "small"
|
|
38
|
+
})),
|
|
39
|
+
onClick: props.onClick
|
|
40
|
+
// TODO: (from codemod) "link" and "subtle-link" appearances are only available in LinkButton, please either provide a href prop then migrate to LinkButton, or remove the appearance from the default button.
|
|
41
|
+
,
|
|
42
|
+
appearance: "subtle-link",
|
|
43
|
+
spacing: "none",
|
|
44
|
+
testId: "emoji-delete-button",
|
|
45
|
+
tabIndex: -1
|
|
46
|
+
}));
|
|
47
|
+
};
|
|
39
48
|
export default DeleteButton;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import "./EmojiRadioButton.compiled.css";
|
|
3
3
|
import { ax, ix } from "@compiled/react/runtime";
|
|
4
4
|
import React, { memo, forwardRef } from 'react';
|
|
5
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
5
6
|
import Emoji from './Emoji';
|
|
6
7
|
import { TONESELECTOR_KEYBOARD_KEYS_SUPPORTED } from '../../util/constants';
|
|
7
8
|
import VisuallyHidden from '@atlaskit/visually-hidden';
|
|
@@ -10,6 +11,13 @@ const emojiRadio = {
|
|
|
10
11
|
default: "_tzy4idpf _kqswstnw _154i14id _1ltv14id _3y8mfajl _157z1r31 _1dzmglyw _1sqm1o36 _fh6w1y54 _1i1213zc"
|
|
11
12
|
};
|
|
12
13
|
const handleKeyDown = (props, event) => {
|
|
14
|
+
if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && fg('platform_emoji_picker_refresh')) {
|
|
15
|
+
var _props$onArrowKey;
|
|
16
|
+
event.preventDefault();
|
|
17
|
+
event.stopPropagation();
|
|
18
|
+
(_props$onArrowKey = props.onArrowKey) === null || _props$onArrowKey === void 0 ? void 0 : _props$onArrowKey.call(props, event.key === 'ArrowRight' ? 1 : -1);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
13
21
|
if (TONESELECTOR_KEYBOARD_KEYS_SUPPORTED.includes(event.key)) {
|
|
14
22
|
const {
|
|
15
23
|
onSelected
|
|
@@ -41,6 +49,7 @@ export const EmojiRadioButton = /*#__PURE__*/forwardRef((props, ref) => {
|
|
|
41
49
|
return (_props$onSelected = props.onSelected) === null || _props$onSelected === void 0 ? void 0 : _props$onSelected.call(props);
|
|
42
50
|
},
|
|
43
51
|
onKeyDown: event => handleKeyDown(props, event),
|
|
52
|
+
onChange: fg('platform_emoji_picker_refresh') ? e => e.preventDefault() : undefined,
|
|
44
53
|
className: ax([emojiRadio.default])
|
|
45
54
|
}), /*#__PURE__*/React.createElement(Emoji, {
|
|
46
55
|
emoji: emoji,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/* ToneSelector.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
2
|
import "./ToneSelector.compiled.css";
|
|
3
|
-
import * as React from 'react';
|
|
4
3
|
import { ax, ix } from "@compiled/react/runtime";
|
|
5
|
-
import { memo, useEffect, useMemo, useRef } from 'react';
|
|
4
|
+
import React, { memo, useCallback, useEffect, useMemo, useRef } from 'react';
|
|
5
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
6
6
|
import { withAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
7
7
|
import { createAndFireEventInElementsChannel, toneSelectedEvent, toneSelectorOpenedEvent } from '../../util/analytics';
|
|
8
8
|
import { setSkinToneAriaLabelText } from './setSkinToneAriaLabelText';
|
|
@@ -28,6 +28,8 @@ export const ToneSelectorInternal = props => {
|
|
|
28
28
|
} = props;
|
|
29
29
|
const isMounted = useRef(false);
|
|
30
30
|
const selectedToneRadioRef = useRef(null);
|
|
31
|
+
// Refs for all radio inputs — used for FG-gated arrow-key focus management
|
|
32
|
+
const radioRefs = useRef([]);
|
|
31
33
|
const {
|
|
32
34
|
formatMessage
|
|
33
35
|
} = useIntl();
|
|
@@ -62,6 +64,12 @@ export const ToneSelectorInternal = props => {
|
|
|
62
64
|
createAndFireEventInElementsChannel(event)(createAnalyticsEvent);
|
|
63
65
|
}
|
|
64
66
|
};
|
|
67
|
+
const onArrowKey = useCallback((currentIndex, direction) => {
|
|
68
|
+
var _radioRefs$current$ne;
|
|
69
|
+
const len = radioRefs.current.length;
|
|
70
|
+
const nextIndex = (currentIndex + direction + len) % len;
|
|
71
|
+
(_radioRefs$current$ne = radioRefs.current[nextIndex]) === null || _radioRefs$current$ne === void 0 ? void 0 : _radioRefs$current$ne.focus();
|
|
72
|
+
}, []);
|
|
65
73
|
const onToneSelectedHandler = toneValue => () => {
|
|
66
74
|
if (selectedTone === toneValue && onToneClose) {
|
|
67
75
|
onToneClose();
|
|
@@ -83,8 +91,22 @@ export const ToneSelectorInternal = props => {
|
|
|
83
91
|
id: "emoji-picker-tone-selector",
|
|
84
92
|
"aria-label": formatMessage(messages.emojiSelectSkinToneListAriaLabelText),
|
|
85
93
|
className: ax([!isVisible && "_tzy4idpf _3um015vq _1e0cglyw"])
|
|
86
|
-
}, emojiToneCollection.map(tone => {
|
|
87
|
-
return /*#__PURE__*/React.createElement(EmojiRadioButton, {
|
|
94
|
+
}, emojiToneCollection.map((tone, renderIndex) => {
|
|
95
|
+
return fg('platform_emoji_picker_refresh') ? /*#__PURE__*/React.createElement(EmojiRadioButton, {
|
|
96
|
+
ref: el => {
|
|
97
|
+
radioRefs.current[renderIndex] = el;
|
|
98
|
+
if (tone.isSelected && selectedToneRadioRef) {
|
|
99
|
+
selectedToneRadioRef.current = el;
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
defaultChecked: tone.isSelected,
|
|
103
|
+
ariaLabelText: tone.label,
|
|
104
|
+
key: `${tone.id}`,
|
|
105
|
+
emoji: tone,
|
|
106
|
+
onArrowKey: direction => onArrowKey(renderIndex, direction),
|
|
107
|
+
onSelected: onToneSelectedHandler(tone.toneIndex),
|
|
108
|
+
selectOnHover: true
|
|
109
|
+
}) : /*#__PURE__*/React.createElement(EmojiRadioButton, {
|
|
88
110
|
ref: tone.isSelected ? selectedToneRadioRef : null,
|
|
89
111
|
defaultChecked: tone.isSelected,
|
|
90
112
|
ariaLabelText: tone.label,
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
._13t3idpf span{line-height:0}
|
|
2
|
+
._154ir5cr{top:var(--ds-space-negative-050,-4px)}
|
|
2
3
|
._154ix0bf{top:var(--ds-space-negative-100,-8px)}
|
|
3
4
|
._1bsbf6fq{width:18px}
|
|
4
5
|
._1e0c1txw{display:flex}
|
|
5
6
|
._1pbykb7n{z-index:1}
|
|
7
|
+
._1xi2r5cr{right:var(--ds-space-negative-050,-4px)}
|
|
6
8
|
._1xi2x0bf{right:var(--ds-space-negative-100,-8px)}
|
|
7
9
|
._3um015vq{visibility:hidden}
|
|
8
10
|
._4t3if6fq{height:18px}
|
|
@@ -7,24 +7,31 @@ import CrossCircleIcon from '@atlaskit/icon/core/cross-circle';
|
|
|
7
7
|
import { deleteEmojiLabel } from '../../util/constants';
|
|
8
8
|
import { emojiDeleteButton } from './styles';
|
|
9
9
|
import { Box } from '@atlaskit/primitives/compiled';
|
|
10
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
10
11
|
var styles = {
|
|
11
12
|
boxWrapperStyle: "_1bsbf6fq _4t3if6fq"
|
|
12
13
|
};
|
|
13
14
|
var deleteButton = null;
|
|
15
|
+
var refreshedDeleteButton = null;
|
|
14
16
|
|
|
15
17
|
/**
|
|
16
18
|
* Test id for wrapper Emoji delete button
|
|
17
19
|
*/
|
|
18
20
|
export var RENDER_EMOJI_DELETE_BUTTON_TESTID = 'render-emoji-delete-button';
|
|
19
21
|
var DeleteButton = function DeleteButton(props) {
|
|
22
|
+
var isEmojiPickerRefreshEnabled = fg('platform_emoji_picker_refresh');
|
|
20
23
|
return /*#__PURE__*/React.createElement("span", {
|
|
21
24
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
|
|
22
|
-
className: ax(["_3um015vq _1e0c1txw _kqswstnw _154ix0bf _1xi2x0bf _1pbykb7n _13t3idpf", emojiDeleteButton]),
|
|
25
|
+
className: ax(["_3um015vq _1e0c1txw _kqswstnw _154ix0bf _1xi2x0bf _1pbykb7n _13t3idpf", isEmojiPickerRefreshEnabled && "_154ir5cr _1xi2r5cr", emojiDeleteButton]),
|
|
23
26
|
"data-testid": RENDER_EMOJI_DELETE_BUTTON_TESTID
|
|
24
27
|
}, /*#__PURE__*/React.createElement(Button, {
|
|
25
28
|
iconBefore: /*#__PURE__*/React.createElement(Box, {
|
|
26
29
|
xcss: styles.boxWrapperStyle
|
|
27
|
-
}, /*#__PURE__*/React.createElement(CrossCircleIcon, {
|
|
30
|
+
}, isEmojiPickerRefreshEnabled ? /*#__PURE__*/React.createElement(CrossCircleIcon, {
|
|
31
|
+
label: deleteEmojiLabel,
|
|
32
|
+
color: "var(--ds-icon, #292A2E)",
|
|
33
|
+
size: "medium"
|
|
34
|
+
}) : /*#__PURE__*/React.createElement(CrossCircleIcon, {
|
|
28
35
|
label: deleteEmojiLabel,
|
|
29
36
|
color: "var(--ds-text-subtle, #505258)",
|
|
30
37
|
size: "small"
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import "./EmojiRadioButton.compiled.css";
|
|
3
3
|
import { ax, ix } from "@compiled/react/runtime";
|
|
4
4
|
import React, { memo, forwardRef } from 'react';
|
|
5
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
5
6
|
import Emoji from './Emoji';
|
|
6
7
|
import { TONESELECTOR_KEYBOARD_KEYS_SUPPORTED } from '../../util/constants';
|
|
7
8
|
import VisuallyHidden from '@atlaskit/visually-hidden';
|
|
@@ -10,6 +11,13 @@ var emojiRadio = {
|
|
|
10
11
|
default: "_tzy4idpf _kqswstnw _154i14id _1ltv14id _3y8mfajl _157z1r31 _1dzmglyw _1sqm1o36 _fh6w1y54 _1i1213zc"
|
|
11
12
|
};
|
|
12
13
|
var handleKeyDown = function handleKeyDown(props, event) {
|
|
14
|
+
if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && fg('platform_emoji_picker_refresh')) {
|
|
15
|
+
var _props$onArrowKey;
|
|
16
|
+
event.preventDefault();
|
|
17
|
+
event.stopPropagation();
|
|
18
|
+
(_props$onArrowKey = props.onArrowKey) === null || _props$onArrowKey === void 0 || _props$onArrowKey.call(props, event.key === 'ArrowRight' ? 1 : -1);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
13
21
|
if (TONESELECTOR_KEYBOARD_KEYS_SUPPORTED.includes(event.key)) {
|
|
14
22
|
var onSelected = props.onSelected;
|
|
15
23
|
event.preventDefault();
|
|
@@ -39,6 +47,9 @@ export var EmojiRadioButton = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
|
39
47
|
onKeyDown: function onKeyDown(event) {
|
|
40
48
|
return handleKeyDown(props, event);
|
|
41
49
|
},
|
|
50
|
+
onChange: fg('platform_emoji_picker_refresh') ? function (e) {
|
|
51
|
+
return e.preventDefault();
|
|
52
|
+
} : undefined,
|
|
42
53
|
className: ax([emojiRadio.default])
|
|
43
54
|
}), /*#__PURE__*/React.createElement(Emoji, {
|
|
44
55
|
emoji: emoji,
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
3
|
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
4
4
|
import "./ToneSelector.compiled.css";
|
|
5
|
-
import * as React from 'react';
|
|
6
5
|
import { ax, ix } from "@compiled/react/runtime";
|
|
7
6
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
8
7
|
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
|
-
import { memo, useEffect, useMemo, useRef } from 'react';
|
|
8
|
+
import React, { memo, useCallback, useEffect, useMemo, useRef } from 'react';
|
|
9
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
10
10
|
import { withAnalyticsEvents } from '@atlaskit/analytics-next';
|
|
11
11
|
import { createAndFireEventInElementsChannel, toneSelectedEvent, toneSelectorOpenedEvent } from '../../util/analytics';
|
|
12
12
|
import { setSkinToneAriaLabelText } from './setSkinToneAriaLabelText';
|
|
@@ -30,6 +30,8 @@ export var ToneSelectorInternal = function ToneSelectorInternal(props) {
|
|
|
30
30
|
isVisible = props.isVisible;
|
|
31
31
|
var isMounted = useRef(false);
|
|
32
32
|
var selectedToneRadioRef = useRef(null);
|
|
33
|
+
// Refs for all radio inputs — used for FG-gated arrow-key focus management
|
|
34
|
+
var radioRefs = useRef([]);
|
|
33
35
|
var _useIntl = useIntl(),
|
|
34
36
|
formatMessage = _useIntl.formatMessage;
|
|
35
37
|
var emojiToneCollection = useMemo(function () {
|
|
@@ -62,6 +64,12 @@ export var ToneSelectorInternal = function ToneSelectorInternal(props) {
|
|
|
62
64
|
createAndFireEventInElementsChannel(event)(createAnalyticsEvent);
|
|
63
65
|
}
|
|
64
66
|
};
|
|
67
|
+
var _onArrowKey = useCallback(function (currentIndex, direction) {
|
|
68
|
+
var _radioRefs$current$ne;
|
|
69
|
+
var len = radioRefs.current.length;
|
|
70
|
+
var nextIndex = (currentIndex + direction + len) % len;
|
|
71
|
+
(_radioRefs$current$ne = radioRefs.current[nextIndex]) === null || _radioRefs$current$ne === void 0 || _radioRefs$current$ne.focus();
|
|
72
|
+
}, []);
|
|
65
73
|
var onToneSelectedHandler = function onToneSelectedHandler(toneValue) {
|
|
66
74
|
return function () {
|
|
67
75
|
if (selectedTone === toneValue && onToneClose) {
|
|
@@ -85,8 +93,24 @@ export var ToneSelectorInternal = function ToneSelectorInternal(props) {
|
|
|
85
93
|
id: "emoji-picker-tone-selector",
|
|
86
94
|
"aria-label": formatMessage(messages.emojiSelectSkinToneListAriaLabelText),
|
|
87
95
|
className: ax([!isVisible && "_tzy4idpf _3um015vq _1e0cglyw"])
|
|
88
|
-
}, emojiToneCollection.map(function (tone) {
|
|
89
|
-
return /*#__PURE__*/React.createElement(EmojiRadioButton, {
|
|
96
|
+
}, emojiToneCollection.map(function (tone, renderIndex) {
|
|
97
|
+
return fg('platform_emoji_picker_refresh') ? /*#__PURE__*/React.createElement(EmojiRadioButton, {
|
|
98
|
+
ref: function ref(el) {
|
|
99
|
+
radioRefs.current[renderIndex] = el;
|
|
100
|
+
if (tone.isSelected && selectedToneRadioRef) {
|
|
101
|
+
selectedToneRadioRef.current = el;
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
defaultChecked: tone.isSelected,
|
|
105
|
+
ariaLabelText: tone.label,
|
|
106
|
+
key: "".concat(tone.id),
|
|
107
|
+
emoji: tone,
|
|
108
|
+
onArrowKey: function onArrowKey(direction) {
|
|
109
|
+
return _onArrowKey(renderIndex, direction);
|
|
110
|
+
},
|
|
111
|
+
onSelected: onToneSelectedHandler(tone.toneIndex),
|
|
112
|
+
selectOnHover: true
|
|
113
|
+
}) : /*#__PURE__*/React.createElement(EmojiRadioButton, {
|
|
90
114
|
ref: tone.isSelected ? selectedToneRadioRef : null,
|
|
91
115
|
defaultChecked: tone.isSelected,
|
|
92
116
|
ariaLabelText: tone.label,
|
|
@@ -14,7 +14,7 @@ var createEvent = function createEvent(eventType, action, actionSubject, actionS
|
|
|
14
14
|
actionSubjectId: actionSubjectId,
|
|
15
15
|
attributes: _objectSpread({
|
|
16
16
|
packageName: "@atlaskit/emoji",
|
|
17
|
-
packageVersion: "70.10.
|
|
17
|
+
packageVersion: "70.10.12"
|
|
18
18
|
}, attributes)
|
|
19
19
|
};
|
|
20
20
|
};
|
|
@@ -10,6 +10,7 @@ export interface Props {
|
|
|
10
10
|
emoji: EmojiDescription;
|
|
11
11
|
onSelected?: () => void;
|
|
12
12
|
selectOnHover?: boolean;
|
|
13
|
+
onArrowKey?: (direction: -1 | 1) => void;
|
|
13
14
|
}
|
|
14
15
|
export declare const EmojiRadioButton: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLInputElement>>;
|
|
15
16
|
declare const _default_1: React.MemoExoticComponent<React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLInputElement>>>;
|
|
@@ -10,6 +10,7 @@ export interface Props {
|
|
|
10
10
|
emoji: EmojiDescription;
|
|
11
11
|
onSelected?: () => void;
|
|
12
12
|
selectOnHover?: boolean;
|
|
13
|
+
onArrowKey?: (direction: -1 | 1) => void;
|
|
13
14
|
}
|
|
14
15
|
export declare const EmojiRadioButton: React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLInputElement>>;
|
|
15
16
|
declare const _default_1: React.MemoExoticComponent<React.ForwardRefExoticComponent<Props & React.RefAttributes<HTMLInputElement>>>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/emoji",
|
|
3
|
-
"version": "70.10.
|
|
3
|
+
"version": "70.10.13",
|
|
4
4
|
"description": "Fabric emoji React components",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"@atlaskit/textfield": "^8.3.0",
|
|
55
55
|
"@atlaskit/tmp-editor-statsig": "^84.3.0",
|
|
56
56
|
"@atlaskit/tokens": "^13.0.0",
|
|
57
|
-
"@atlaskit/tooltip": "^22.
|
|
57
|
+
"@atlaskit/tooltip": "^22.4.0",
|
|
58
58
|
"@atlaskit/ufo": "^0.5.0",
|
|
59
59
|
"@atlaskit/util-service-support": "^6.4.0",
|
|
60
60
|
"@atlaskit/visually-hidden": "^3.1.0",
|