@atlaskit/emoji 70.10.11 → 70.10.12

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/emoji
2
2
 
3
+ ## 70.10.12
4
+
5
+ ### Patch Changes
6
+
7
+ - [`93fae868945b0`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/93fae868945b0) -
8
+ Fix accessibility - inaccessible skin tones from keyboard navigation
9
+ - Updated dependencies
10
+
3
11
  ## 70.10.11
4
12
 
5
13
  ### Patch Changes
@@ -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__*/React.createElement("div", {
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__*/React.createElement(_EmojiRadioButton.default, {
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.10"
23
+ packageVersion: "70.10.11"
24
24
  }, attributes)
25
25
  };
26
26
  };
@@ -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,
@@ -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.10.10",
12
+ packageVersion: "70.10.11",
13
13
  ...attributes
14
14
  }
15
15
  });
@@ -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.10"
17
+ packageVersion: "70.10.11"
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.11",
3
+ "version": "70.10.12",
4
4
  "description": "Fabric emoji React components",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"