@atlaskit/reactions 35.11.6 → 35.11.8

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,26 @@
1
1
  # @atlaskit/reactions
2
2
 
3
+ ## 35.11.8
4
+
5
+ ### Patch Changes
6
+
7
+ - [`603c0eaa6238b`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/603c0eaa6238b) -
8
+ Fix reading order of the reaction picker for assistive technologies. When the
9
+ `a11y_reactions_reading_order` gate is enabled, the expanded picker panel is rendered inline as a
10
+ DOM sibling directly after the trigger button instead of in a portal at the end of the document,
11
+ so screen readers encounter the expanded content in the correct order. Visual placement is
12
+ unchanged as the popper continues to position with `position: fixed`.
13
+ - Updated dependencies
14
+
15
+ ## 35.11.7
16
+
17
+ ### Patch Changes
18
+
19
+ - [`bc98a973e0455`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/bc98a973e0455) -
20
+ [ux] A11Y-31804: Add semantic list markup to the hoverable reaction selector gated by experiment
21
+ `platform_a11y_reactions_hover_selector_list`
22
+ - Updated dependencies
23
+
3
24
  ## 35.11.6
4
25
 
5
26
  ### Patch Changes
@@ -61,6 +61,9 @@
61
61
  {
62
62
  "path": "../../../design-system/motion/afm-cc/tsconfig.json"
63
63
  },
64
+ {
65
+ "path": "../../../platform/feature-experiments/afm-cc/tsconfig.json"
66
+ },
64
67
  {
65
68
  "path": "../../../platform/feature-flags/afm-cc/tsconfig.json"
66
69
  },
@@ -61,6 +61,9 @@
61
61
  {
62
62
  "path": "../../../design-system/motion/afm-products/tsconfig.json"
63
63
  },
64
+ {
65
+ "path": "../../../platform/feature-experiments/afm-products/tsconfig.json"
66
+ },
64
67
  {
65
68
  "path": "../../../platform/feature-flags/afm-products/tsconfig.json"
66
69
  },
@@ -11,7 +11,7 @@ var _analyticsGasTypes = require("@atlaskit/analytics-gas-types");
11
11
  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; }
12
12
  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) { (0, _defineProperty2.default)(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; } // eslint-disable-next-line @typescript-eslint/consistent-type-imports
13
13
  var packageName = "@atlaskit/reactions";
14
- var packageVersion = "35.11.5";
14
+ var packageVersion = "35.11.7";
15
15
  /**
16
16
  * TODO: move to utility package?
17
17
  * A random sampling function
@@ -241,7 +241,11 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
241
241
  }
242
242
  onOpen();
243
243
  // ufo reactions picker opened success
244
- _ufo.PickerRender.success();
244
+ _ufo.PickerRender.success({
245
+ metadata: {
246
+ readingOrderInline: (0, _platformFeatureFlags.fg)('a11y_reactions_reading_order')
247
+ }
248
+ });
245
249
  }, [hoverableReactionPicker, isPopupTrayOpen, setIsPopupTrayOpen, isTriggerClicked, setIsTriggerClicked, isHoverableReactionPickerEmojiPickerOpen, onOpen, settings, popperPlacement]);
246
250
  var handleTriggerMouseEnter = (0, _react.useCallback)(function () {
247
251
  if (hoverableReactionPicker) {
@@ -284,6 +288,33 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
284
288
  close();
285
289
  onCancel();
286
290
  };
291
+ var pickerPanel = /*#__PURE__*/_react.default.createElement(PopperWrapper, {
292
+ settings: settings,
293
+ popperModifiers: popperModifiers,
294
+ isOpen: isPopupTrayOpen,
295
+ onClose: onClose,
296
+ triggerRef: triggerRef,
297
+ zIndex: reactionPickerPopperZIndex || _constants.layers.flag()
298
+ }, settings.showFullPicker || hoverableReactionPicker && isHoverableReactionPickerEmojiPickerOpen ? /*#__PURE__*/_react.default.createElement(_compiled.Box, {
299
+ xcss: additionalStyles.selectorContainer,
300
+ onMouseEnter: handlePopupMouseEnter,
301
+ onMouseLeave: handlePopupMouseLeave
302
+ }, /*#__PURE__*/_react.default.createElement(_picker.EmojiPicker, {
303
+ emojiProvider: emojiProvider,
304
+ onSelection: onEmojiSelected,
305
+ size: emojiPickerSize
306
+ })) : /*#__PURE__*/_react.default.createElement(_compiled.Box, {
307
+ xcss: additionalStyles.selectorContainer,
308
+ onMouseEnter: handlePopupMouseEnter,
309
+ onMouseLeave: handlePopupMouseLeave
310
+ }, /*#__PURE__*/_react.default.createElement(_Selector.Selector, {
311
+ emojiProvider: emojiProvider,
312
+ onSelection: onEmojiSelected,
313
+ showMore: allowAllEmojis,
314
+ onMoreClick: onSelectMoreClick,
315
+ pickerQuickReactionEmojiIds: pickerQuickReactionEmojiIds,
316
+ hoverableReactionPickerSelector: hoverableReactionPicker
317
+ })));
287
318
  return /*#__PURE__*/_react.default.createElement("div", {
288
319
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
289
320
  className: (0, _runtime.ax)(["_s7n4nkob _1pra1o8l", wrapperClassName]),
@@ -328,35 +359,14 @@ var ReactionPicker = exports.ReactionPicker = /*#__PURE__*/_react.default.memo(f
328
359
  emojiPickerSize: emojiPickerSize
329
360
  }))
330
361
  );
331
- }), isPopupTrayOpen && /*#__PURE__*/_react.default.createElement(_portal.default, {
332
- zIndex: reactionPickerPopperZIndex || _constants.layers.flag()
333
- }, /*#__PURE__*/_react.default.createElement(PopperWrapper, {
334
- settings: settings,
335
- popperModifiers: popperModifiers,
336
- isOpen: isPopupTrayOpen,
337
- onClose: onClose,
338
- triggerRef: triggerRef,
362
+ }), isPopupTrayOpen && ((0, _platformFeatureFlags.fg)('a11y_reactions_reading_order') ?
363
+ // Render the picker panel inline (a DOM sibling directly after the trigger)
364
+ // so assistive technologies encounter the expanded content in the correct
365
+ // reading order. The popper still positions with `position: fixed`, so the
366
+ // visual placement is unchanged.
367
+ pickerPanel : /*#__PURE__*/_react.default.createElement(_portal.default, {
339
368
  zIndex: reactionPickerPopperZIndex || _constants.layers.flag()
340
- }, settings.showFullPicker || hoverableReactionPicker && isHoverableReactionPickerEmojiPickerOpen ? /*#__PURE__*/_react.default.createElement(_compiled.Box, {
341
- xcss: additionalStyles.selectorContainer,
342
- onMouseEnter: handlePopupMouseEnter,
343
- onMouseLeave: handlePopupMouseLeave
344
- }, /*#__PURE__*/_react.default.createElement(_picker.EmojiPicker, {
345
- emojiProvider: emojiProvider,
346
- onSelection: onEmojiSelected,
347
- size: emojiPickerSize
348
- })) : /*#__PURE__*/_react.default.createElement(_compiled.Box, {
349
- xcss: additionalStyles.selectorContainer,
350
- onMouseEnter: handlePopupMouseEnter,
351
- onMouseLeave: handlePopupMouseLeave
352
- }, /*#__PURE__*/_react.default.createElement(_Selector.Selector, {
353
- emojiProvider: emojiProvider,
354
- onSelection: onEmojiSelected,
355
- showMore: allowAllEmojis,
356
- onMoreClick: onSelectMoreClick,
357
- pickerQuickReactionEmojiIds: pickerQuickReactionEmojiIds,
358
- hoverableReactionPickerSelector: hoverableReactionPicker
359
- }))))));
369
+ }, pickerPanel))));
360
370
  });
361
371
  var PopperWrapper = exports.PopperWrapper = function PopperWrapper(props) {
362
372
  var triggerRef = props.triggerRef,
@@ -1,10 +1,12 @@
1
1
  ._zulp1b66{gap:var(--ds-space-050,4px)}._12l2u2gc{margin-inline-end:var(--ds-space-100,8px)}
2
+ ._18u0ze3t{margin-left:var(--ds-space-0,0)}
2
3
  ._19bv1b66{padding-left:var(--ds-space-050,4px)}
3
4
  ._19pkze3t{margin-top:var(--ds-space-0,0)}
4
5
  ._1e0c1o8l{display:inline-block}
5
6
  ._1o51q7pw{animation-fill-mode:forwards}
6
7
  ._1p3lnqa1{border-left-style:solid}
7
8
  ._1pgl1ytf{animation-timing-function:ease-in-out}
9
+ ._2hwxze3t{margin-right:var(--ds-space-0,0)}
8
10
  ._2mzuglyw{list-style-type:none}
9
11
  ._4t3i1tcg{height:24px}
10
12
  ._5sag6ebc{animation-duration:.15s}
@@ -13,6 +15,7 @@
13
15
  ._ca0q1b66{padding-top:var(--ds-space-050,4px)}
14
16
  ._j7hqordv{animation-name:k12q5x3s}
15
17
  ._n3td1b66{padding-bottom:var(--ds-space-050,4px)}
18
+ ._otyrze3t{margin-bottom:var(--ds-space-0,0)}
16
19
  ._t6vde4h9{border-left-width:var(--ds-border-width,1px)}
17
20
  ._tzy4idpf{opacity:0}
18
21
  ._u5f31b66{padding-right:var(--ds-space-050,4px)}
@@ -13,6 +13,7 @@ var React = _react;
13
13
  var _runtime = require("@compiled/react/runtime");
14
14
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
15
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
16
+ var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled");
16
17
  var _compiled = require("@atlaskit/primitives/compiled");
17
18
  var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
18
19
  var _i18n = require("../shared/i18n");
@@ -25,7 +26,8 @@ var styles = {
25
26
  container: "_ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66",
26
27
  emojiContainer: "_2mzuglyw _19pkze3t",
27
28
  separator: "_t6vde4h9 _5wra1l7x _1p3lnqa1 _ahbq1b66 _12l2u2gc _4t3i1tcg _1e0c1o8l",
28
- hoverableReactionPickerSelectorContainer: "_zulp1b66 _ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66"
29
+ hoverableReactionPickerSelectorContainer: "_zulp1b66 _ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66",
30
+ hoverableReactionPickerSelectorList: "_zulp1b66 _ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66 _19pkze3t _2hwxze3t _otyrze3t _18u0ze3t _2mzuglyw"
29
31
  };
30
32
  var revealAnimation = null;
31
33
  var revealStyle = null;
@@ -65,6 +67,7 @@ var Selector = exports.Selector = function Selector(_ref2) {
65
67
  setIsTeamojiPickerRefreshEnabled((0, _expValEquals.expValEquals)('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', true));
66
68
  }, []);
67
69
  var quickReactionEmojiIds = pickerQuickReactionEmojiIds !== null && pickerQuickReactionEmojiIds !== void 0 ? pickerQuickReactionEmojiIds : (0, _constants.getDefaultReactions)(isTeamojiPickerRefreshEnabled);
70
+ var shouldRenderHoverableReactionPickerSelectorList = hoverableReactionPickerSelector && (0, _isExperimentEnabled.isExperimentEnabled)('platform_a11y_reactions_hover_selector_list');
68
71
 
69
72
  /**
70
73
  * Render the default emoji icon
@@ -72,7 +75,7 @@ var Selector = exports.Selector = function Selector(_ref2) {
72
75
  * @param index location of the emoji in the array
73
76
  */
74
77
  var renderEmoji = function renderEmoji(emoji, index) {
75
- var _emoji$id, _emoji$id2;
78
+ var _emoji$id, _emoji$id2, _emoji$id3;
76
79
  var emojiButtonAndTooltip = /*#__PURE__*/React.createElement(_tooltip.default, {
77
80
  key: (_emoji$id = emoji.id) !== null && _emoji$id !== void 0 ? _emoji$id : emoji.shortName,
78
81
  content: emoji.shortName
@@ -82,8 +85,12 @@ var Selector = exports.Selector = function Selector(_ref2) {
82
85
  onClick: onSelection,
83
86
  hoverableReactionPickerSelectorEmoji: hoverableReactionPickerSelector
84
87
  }));
85
- return hoverableReactionPickerSelector ? emojiButtonAndTooltip : /*#__PURE__*/React.createElement(Reveal, {
88
+ return hoverableReactionPickerSelector ? shouldRenderHoverableReactionPickerSelectorList ? /*#__PURE__*/React.createElement(_compiled.Box, {
89
+ as: "li",
86
90
  key: (_emoji$id2 = emoji.id) !== null && _emoji$id2 !== void 0 ? _emoji$id2 : emoji.shortName,
91
+ xcss: styles.emojiContainer
92
+ }, emojiButtonAndTooltip) : emojiButtonAndTooltip : /*#__PURE__*/React.createElement(Reveal, {
93
+ key: (_emoji$id3 = emoji.id) !== null && _emoji$id3 !== void 0 ? _emoji$id3 : emoji.shortName,
87
94
  testId: RENDER_SELECTOR_TESTID
88
95
  }, emojiButtonAndTooltip);
89
96
  };
@@ -97,8 +104,9 @@ var Selector = exports.Selector = function Selector(_ref2) {
97
104
  reactionPickerTriggerText: _i18n.messages.addNewReaction.defaultMessage,
98
105
  fullWidthSelectorTrayReactionPickerTrigger: true
99
106
  }), /*#__PURE__*/React.createElement(_compiled.Inline, {
107
+ as: shouldRenderHoverableReactionPickerSelectorList ? 'ul' : undefined,
100
108
  alignBlock: "center",
101
- xcss: hoverableReactionPickerSelector ? styles.hoverableReactionPickerSelectorContainer : styles.container
109
+ xcss: shouldRenderHoverableReactionPickerSelectorList ? styles.hoverableReactionPickerSelectorList : styles.hoverableReactionPickerSelectorContainer
102
110
  }, quickReactionEmojiIds.map(renderEmoji)));
103
111
  }
104
112
  var isSelectorListMarkupFixEnabled = (0, _expValEquals.expValEquals)('platform_a11y_fixes_reactions_selector_list', 'isEnabled', true);
@@ -2,7 +2,7 @@
2
2
  import { createAndFireEvent } from '@atlaskit/analytics-next';
3
3
  import { UI_EVENT_TYPE, OPERATIONAL_EVENT_TYPE } from '@atlaskit/analytics-gas-types';
4
4
  const packageName = "@atlaskit/reactions";
5
- const packageVersion = "35.11.5";
5
+ const packageVersion = "35.11.7";
6
6
  /**
7
7
  * TODO: move to utility package?
8
8
  * A random sampling function
@@ -198,7 +198,11 @@ export const ReactionPicker = /*#__PURE__*/React.memo(props => {
198
198
  }
199
199
  onOpen();
200
200
  // ufo reactions picker opened success
201
- PickerRender.success();
201
+ PickerRender.success({
202
+ metadata: {
203
+ readingOrderInline: fg('a11y_reactions_reading_order')
204
+ }
205
+ });
202
206
  }, [hoverableReactionPicker, isPopupTrayOpen, setIsPopupTrayOpen, isTriggerClicked, setIsTriggerClicked, isHoverableReactionPickerEmojiPickerOpen, onOpen, settings, popperPlacement]);
203
207
  const handleTriggerMouseEnter = useCallback(() => {
204
208
  if (hoverableReactionPicker) {
@@ -241,6 +245,33 @@ export const ReactionPicker = /*#__PURE__*/React.memo(props => {
241
245
  close();
242
246
  onCancel();
243
247
  };
248
+ const pickerPanel = /*#__PURE__*/React.createElement(PopperWrapper, {
249
+ settings: settings,
250
+ popperModifiers: popperModifiers,
251
+ isOpen: isPopupTrayOpen,
252
+ onClose: onClose,
253
+ triggerRef: triggerRef,
254
+ zIndex: reactionPickerPopperZIndex || layers.flag()
255
+ }, settings.showFullPicker || hoverableReactionPicker && isHoverableReactionPickerEmojiPickerOpen ? /*#__PURE__*/React.createElement(Box, {
256
+ xcss: additionalStyles.selectorContainer,
257
+ onMouseEnter: handlePopupMouseEnter,
258
+ onMouseLeave: handlePopupMouseLeave
259
+ }, /*#__PURE__*/React.createElement(EmojiPicker, {
260
+ emojiProvider: emojiProvider,
261
+ onSelection: onEmojiSelected,
262
+ size: emojiPickerSize
263
+ })) : /*#__PURE__*/React.createElement(Box, {
264
+ xcss: additionalStyles.selectorContainer,
265
+ onMouseEnter: handlePopupMouseEnter,
266
+ onMouseLeave: handlePopupMouseLeave
267
+ }, /*#__PURE__*/React.createElement(Selector, {
268
+ emojiProvider: emojiProvider,
269
+ onSelection: onEmojiSelected,
270
+ showMore: allowAllEmojis,
271
+ onMoreClick: onSelectMoreClick,
272
+ pickerQuickReactionEmojiIds: pickerQuickReactionEmojiIds,
273
+ hoverableReactionPickerSelector: hoverableReactionPicker
274
+ })));
244
275
  return /*#__PURE__*/React.createElement("div", {
245
276
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
246
277
  className: ax(["_s7n4nkob _1pra1o8l", wrapperClassName]),
@@ -284,35 +315,14 @@ export const ReactionPicker = /*#__PURE__*/React.memo(props => {
284
315
  reactionPickerTriggerText: reactionPickerTriggerText,
285
316
  isListItem: isListItem,
286
317
  emojiPickerSize: emojiPickerSize
287
- }))), isPopupTrayOpen && /*#__PURE__*/React.createElement(Portal, {
288
- zIndex: reactionPickerPopperZIndex || layers.flag()
289
- }, /*#__PURE__*/React.createElement(PopperWrapper, {
290
- settings: settings,
291
- popperModifiers: popperModifiers,
292
- isOpen: isPopupTrayOpen,
293
- onClose: onClose,
294
- triggerRef: triggerRef,
318
+ }))), isPopupTrayOpen && (fg('a11y_reactions_reading_order') ?
319
+ // Render the picker panel inline (a DOM sibling directly after the trigger)
320
+ // so assistive technologies encounter the expanded content in the correct
321
+ // reading order. The popper still positions with `position: fixed`, so the
322
+ // visual placement is unchanged.
323
+ pickerPanel : /*#__PURE__*/React.createElement(Portal, {
295
324
  zIndex: reactionPickerPopperZIndex || layers.flag()
296
- }, settings.showFullPicker || hoverableReactionPicker && isHoverableReactionPickerEmojiPickerOpen ? /*#__PURE__*/React.createElement(Box, {
297
- xcss: additionalStyles.selectorContainer,
298
- onMouseEnter: handlePopupMouseEnter,
299
- onMouseLeave: handlePopupMouseLeave
300
- }, /*#__PURE__*/React.createElement(EmojiPicker, {
301
- emojiProvider: emojiProvider,
302
- onSelection: onEmojiSelected,
303
- size: emojiPickerSize
304
- })) : /*#__PURE__*/React.createElement(Box, {
305
- xcss: additionalStyles.selectorContainer,
306
- onMouseEnter: handlePopupMouseEnter,
307
- onMouseLeave: handlePopupMouseLeave
308
- }, /*#__PURE__*/React.createElement(Selector, {
309
- emojiProvider: emojiProvider,
310
- onSelection: onEmojiSelected,
311
- showMore: allowAllEmojis,
312
- onMoreClick: onSelectMoreClick,
313
- pickerQuickReactionEmojiIds: pickerQuickReactionEmojiIds,
314
- hoverableReactionPickerSelector: hoverableReactionPicker
315
- }))))));
325
+ }, pickerPanel))));
316
326
  });
317
327
  export const PopperWrapper = props => {
318
328
  const {
@@ -1,10 +1,12 @@
1
1
  ._zulp1b66{gap:var(--ds-space-050,4px)}._12l2u2gc{margin-inline-end:var(--ds-space-100,8px)}
2
+ ._18u0ze3t{margin-left:var(--ds-space-0,0)}
2
3
  ._19bv1b66{padding-left:var(--ds-space-050,4px)}
3
4
  ._19pkze3t{margin-top:var(--ds-space-0,0)}
4
5
  ._1e0c1o8l{display:inline-block}
5
6
  ._1o51q7pw{animation-fill-mode:forwards}
6
7
  ._1p3lnqa1{border-left-style:solid}
7
8
  ._1pgl1ytf{animation-timing-function:ease-in-out}
9
+ ._2hwxze3t{margin-right:var(--ds-space-0,0)}
8
10
  ._2mzuglyw{list-style-type:none}
9
11
  ._4t3i1tcg{height:24px}
10
12
  ._5sag6ebc{animation-duration:.15s}
@@ -13,6 +15,7 @@
13
15
  ._ca0q1b66{padding-top:var(--ds-space-050,4px)}
14
16
  ._j7hqordv{animation-name:k12q5x3s}
15
17
  ._n3td1b66{padding-bottom:var(--ds-space-050,4px)}
18
+ ._otyrze3t{margin-bottom:var(--ds-space-0,0)}
16
19
  ._t6vde4h9{border-left-width:var(--ds-border-width,1px)}
17
20
  ._tzy4idpf{opacity:0}
18
21
  ._u5f31b66{padding-right:var(--ds-space-050,4px)}
@@ -4,6 +4,7 @@ import * as React from 'react';
4
4
  import { ax, ix } from "@compiled/react/runtime";
5
5
  import { Fragment, useEffect, useState } from 'react';
6
6
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
7
+ import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
7
8
  import { Box, Inline } from '@atlaskit/primitives/compiled';
8
9
  import Tooltip from '@atlaskit/tooltip';
9
10
  import { messages } from '../shared/i18n';
@@ -15,7 +16,8 @@ const styles = {
15
16
  container: "_ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66",
16
17
  emojiContainer: "_2mzuglyw _19pkze3t",
17
18
  separator: "_t6vde4h9 _5wra1l7x _1p3lnqa1 _ahbq1b66 _12l2u2gc _4t3i1tcg _1e0c1o8l",
18
- hoverableReactionPickerSelectorContainer: "_zulp1b66 _ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66"
19
+ hoverableReactionPickerSelectorContainer: "_zulp1b66 _ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66",
20
+ hoverableReactionPickerSelectorList: "_zulp1b66 _ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66 _19pkze3t _2hwxze3t _otyrze3t _18u0ze3t _2mzuglyw"
19
21
  };
20
22
  const revealAnimation = null;
21
23
  const revealStyle = null;
@@ -53,6 +55,7 @@ export const Selector = ({
53
55
  setIsTeamojiPickerRefreshEnabled(expValEquals('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', true));
54
56
  }, []);
55
57
  const quickReactionEmojiIds = pickerQuickReactionEmojiIds !== null && pickerQuickReactionEmojiIds !== void 0 ? pickerQuickReactionEmojiIds : getDefaultReactions(isTeamojiPickerRefreshEnabled);
58
+ const shouldRenderHoverableReactionPickerSelectorList = hoverableReactionPickerSelector && isExperimentEnabled('platform_a11y_reactions_hover_selector_list');
56
59
 
57
60
  /**
58
61
  * Render the default emoji icon
@@ -60,7 +63,7 @@ export const Selector = ({
60
63
  * @param index location of the emoji in the array
61
64
  */
62
65
  const renderEmoji = (emoji, index) => {
63
- var _emoji$id, _emoji$id2;
66
+ var _emoji$id, _emoji$id2, _emoji$id3;
64
67
  const emojiButtonAndTooltip = /*#__PURE__*/React.createElement(Tooltip, {
65
68
  key: (_emoji$id = emoji.id) !== null && _emoji$id !== void 0 ? _emoji$id : emoji.shortName,
66
69
  content: emoji.shortName
@@ -70,8 +73,12 @@ export const Selector = ({
70
73
  onClick: onSelection,
71
74
  hoverableReactionPickerSelectorEmoji: hoverableReactionPickerSelector
72
75
  }));
73
- return hoverableReactionPickerSelector ? emojiButtonAndTooltip : /*#__PURE__*/React.createElement(Reveal, {
76
+ return hoverableReactionPickerSelector ? shouldRenderHoverableReactionPickerSelectorList ? /*#__PURE__*/React.createElement(Box, {
77
+ as: "li",
74
78
  key: (_emoji$id2 = emoji.id) !== null && _emoji$id2 !== void 0 ? _emoji$id2 : emoji.shortName,
79
+ xcss: styles.emojiContainer
80
+ }, emojiButtonAndTooltip) : emojiButtonAndTooltip : /*#__PURE__*/React.createElement(Reveal, {
81
+ key: (_emoji$id3 = emoji.id) !== null && _emoji$id3 !== void 0 ? _emoji$id3 : emoji.shortName,
75
82
  testId: RENDER_SELECTOR_TESTID
76
83
  }, emojiButtonAndTooltip);
77
84
  };
@@ -85,8 +92,9 @@ export const Selector = ({
85
92
  reactionPickerTriggerText: messages.addNewReaction.defaultMessage,
86
93
  fullWidthSelectorTrayReactionPickerTrigger: true
87
94
  }), /*#__PURE__*/React.createElement(Inline, {
95
+ as: shouldRenderHoverableReactionPickerSelectorList ? 'ul' : undefined,
88
96
  alignBlock: "center",
89
- xcss: hoverableReactionPickerSelector ? styles.hoverableReactionPickerSelectorContainer : styles.container
97
+ xcss: shouldRenderHoverableReactionPickerSelectorList ? styles.hoverableReactionPickerSelectorList : styles.hoverableReactionPickerSelectorContainer
90
98
  }, quickReactionEmojiIds.map(renderEmoji)));
91
99
  }
92
100
  const isSelectorListMarkupFixEnabled = expValEquals('platform_a11y_fixes_reactions_selector_list', 'isEnabled', true);
@@ -5,7 +5,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
5
5
  import { createAndFireEvent } from '@atlaskit/analytics-next';
6
6
  import { UI_EVENT_TYPE, OPERATIONAL_EVENT_TYPE } from '@atlaskit/analytics-gas-types';
7
7
  var packageName = "@atlaskit/reactions";
8
- var packageVersion = "35.11.5";
8
+ var packageVersion = "35.11.7";
9
9
  /**
10
10
  * TODO: move to utility package?
11
11
  * A random sampling function
@@ -232,7 +232,11 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
232
232
  }
233
233
  onOpen();
234
234
  // ufo reactions picker opened success
235
- PickerRender.success();
235
+ PickerRender.success({
236
+ metadata: {
237
+ readingOrderInline: fg('a11y_reactions_reading_order')
238
+ }
239
+ });
236
240
  }, [hoverableReactionPicker, isPopupTrayOpen, setIsPopupTrayOpen, isTriggerClicked, setIsTriggerClicked, isHoverableReactionPickerEmojiPickerOpen, onOpen, settings, popperPlacement]);
237
241
  var handleTriggerMouseEnter = useCallback(function () {
238
242
  if (hoverableReactionPicker) {
@@ -275,6 +279,33 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
275
279
  close();
276
280
  onCancel();
277
281
  };
282
+ var pickerPanel = /*#__PURE__*/React.createElement(PopperWrapper, {
283
+ settings: settings,
284
+ popperModifiers: popperModifiers,
285
+ isOpen: isPopupTrayOpen,
286
+ onClose: onClose,
287
+ triggerRef: triggerRef,
288
+ zIndex: reactionPickerPopperZIndex || layers.flag()
289
+ }, settings.showFullPicker || hoverableReactionPicker && isHoverableReactionPickerEmojiPickerOpen ? /*#__PURE__*/React.createElement(Box, {
290
+ xcss: additionalStyles.selectorContainer,
291
+ onMouseEnter: handlePopupMouseEnter,
292
+ onMouseLeave: handlePopupMouseLeave
293
+ }, /*#__PURE__*/React.createElement(EmojiPicker, {
294
+ emojiProvider: emojiProvider,
295
+ onSelection: onEmojiSelected,
296
+ size: emojiPickerSize
297
+ })) : /*#__PURE__*/React.createElement(Box, {
298
+ xcss: additionalStyles.selectorContainer,
299
+ onMouseEnter: handlePopupMouseEnter,
300
+ onMouseLeave: handlePopupMouseLeave
301
+ }, /*#__PURE__*/React.createElement(Selector, {
302
+ emojiProvider: emojiProvider,
303
+ onSelection: onEmojiSelected,
304
+ showMore: allowAllEmojis,
305
+ onMoreClick: onSelectMoreClick,
306
+ pickerQuickReactionEmojiIds: pickerQuickReactionEmojiIds,
307
+ hoverableReactionPickerSelector: hoverableReactionPicker
308
+ })));
278
309
  return /*#__PURE__*/React.createElement("div", {
279
310
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
280
311
  className: ax(["_s7n4nkob _1pra1o8l", wrapperClassName]),
@@ -319,35 +350,14 @@ export var ReactionPicker = /*#__PURE__*/React.memo(function (props) {
319
350
  emojiPickerSize: emojiPickerSize
320
351
  }))
321
352
  );
322
- }), isPopupTrayOpen && /*#__PURE__*/React.createElement(Portal, {
323
- zIndex: reactionPickerPopperZIndex || layers.flag()
324
- }, /*#__PURE__*/React.createElement(PopperWrapper, {
325
- settings: settings,
326
- popperModifiers: popperModifiers,
327
- isOpen: isPopupTrayOpen,
328
- onClose: onClose,
329
- triggerRef: triggerRef,
353
+ }), isPopupTrayOpen && (fg('a11y_reactions_reading_order') ?
354
+ // Render the picker panel inline (a DOM sibling directly after the trigger)
355
+ // so assistive technologies encounter the expanded content in the correct
356
+ // reading order. The popper still positions with `position: fixed`, so the
357
+ // visual placement is unchanged.
358
+ pickerPanel : /*#__PURE__*/React.createElement(Portal, {
330
359
  zIndex: reactionPickerPopperZIndex || layers.flag()
331
- }, settings.showFullPicker || hoverableReactionPicker && isHoverableReactionPickerEmojiPickerOpen ? /*#__PURE__*/React.createElement(Box, {
332
- xcss: additionalStyles.selectorContainer,
333
- onMouseEnter: handlePopupMouseEnter,
334
- onMouseLeave: handlePopupMouseLeave
335
- }, /*#__PURE__*/React.createElement(EmojiPicker, {
336
- emojiProvider: emojiProvider,
337
- onSelection: onEmojiSelected,
338
- size: emojiPickerSize
339
- })) : /*#__PURE__*/React.createElement(Box, {
340
- xcss: additionalStyles.selectorContainer,
341
- onMouseEnter: handlePopupMouseEnter,
342
- onMouseLeave: handlePopupMouseLeave
343
- }, /*#__PURE__*/React.createElement(Selector, {
344
- emojiProvider: emojiProvider,
345
- onSelection: onEmojiSelected,
346
- showMore: allowAllEmojis,
347
- onMoreClick: onSelectMoreClick,
348
- pickerQuickReactionEmojiIds: pickerQuickReactionEmojiIds,
349
- hoverableReactionPickerSelector: hoverableReactionPicker
350
- }))))));
360
+ }, pickerPanel))));
351
361
  });
352
362
  export var PopperWrapper = function PopperWrapper(props) {
353
363
  var triggerRef = props.triggerRef,
@@ -1,10 +1,12 @@
1
1
  ._zulp1b66{gap:var(--ds-space-050,4px)}._12l2u2gc{margin-inline-end:var(--ds-space-100,8px)}
2
+ ._18u0ze3t{margin-left:var(--ds-space-0,0)}
2
3
  ._19bv1b66{padding-left:var(--ds-space-050,4px)}
3
4
  ._19pkze3t{margin-top:var(--ds-space-0,0)}
4
5
  ._1e0c1o8l{display:inline-block}
5
6
  ._1o51q7pw{animation-fill-mode:forwards}
6
7
  ._1p3lnqa1{border-left-style:solid}
7
8
  ._1pgl1ytf{animation-timing-function:ease-in-out}
9
+ ._2hwxze3t{margin-right:var(--ds-space-0,0)}
8
10
  ._2mzuglyw{list-style-type:none}
9
11
  ._4t3i1tcg{height:24px}
10
12
  ._5sag6ebc{animation-duration:.15s}
@@ -13,6 +15,7 @@
13
15
  ._ca0q1b66{padding-top:var(--ds-space-050,4px)}
14
16
  ._j7hqordv{animation-name:k12q5x3s}
15
17
  ._n3td1b66{padding-bottom:var(--ds-space-050,4px)}
18
+ ._otyrze3t{margin-bottom:var(--ds-space-0,0)}
16
19
  ._t6vde4h9{border-left-width:var(--ds-border-width,1px)}
17
20
  ._tzy4idpf{opacity:0}
18
21
  ._u5f31b66{padding-right:var(--ds-space-050,4px)}
@@ -5,6 +5,7 @@ import * as React from 'react';
5
5
  import { ax, ix } from "@compiled/react/runtime";
6
6
  import { Fragment, useEffect, useState } from 'react';
7
7
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
8
+ import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
8
9
  import { Box, Inline } from '@atlaskit/primitives/compiled';
9
10
  import Tooltip from '@atlaskit/tooltip';
10
11
  import { messages } from '../shared/i18n';
@@ -16,7 +17,8 @@ var styles = {
16
17
  container: "_ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66",
17
18
  emojiContainer: "_2mzuglyw _19pkze3t",
18
19
  separator: "_t6vde4h9 _5wra1l7x _1p3lnqa1 _ahbq1b66 _12l2u2gc _4t3i1tcg _1e0c1o8l",
19
- hoverableReactionPickerSelectorContainer: "_zulp1b66 _ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66"
20
+ hoverableReactionPickerSelectorContainer: "_zulp1b66 _ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66",
21
+ hoverableReactionPickerSelectorList: "_zulp1b66 _ca0q1b66 _u5f31b66 _n3td1b66 _19bv1b66 _19pkze3t _2hwxze3t _otyrze3t _18u0ze3t _2mzuglyw"
20
22
  };
21
23
  var revealAnimation = null;
22
24
  var revealStyle = null;
@@ -56,6 +58,7 @@ export var Selector = function Selector(_ref2) {
56
58
  setIsTeamojiPickerRefreshEnabled(expValEquals('platform_teamoji_26_refresh_emoji_picker', 'isEnabled', true));
57
59
  }, []);
58
60
  var quickReactionEmojiIds = pickerQuickReactionEmojiIds !== null && pickerQuickReactionEmojiIds !== void 0 ? pickerQuickReactionEmojiIds : getDefaultReactions(isTeamojiPickerRefreshEnabled);
61
+ var shouldRenderHoverableReactionPickerSelectorList = hoverableReactionPickerSelector && isExperimentEnabled('platform_a11y_reactions_hover_selector_list');
59
62
 
60
63
  /**
61
64
  * Render the default emoji icon
@@ -63,7 +66,7 @@ export var Selector = function Selector(_ref2) {
63
66
  * @param index location of the emoji in the array
64
67
  */
65
68
  var renderEmoji = function renderEmoji(emoji, index) {
66
- var _emoji$id, _emoji$id2;
69
+ var _emoji$id, _emoji$id2, _emoji$id3;
67
70
  var emojiButtonAndTooltip = /*#__PURE__*/React.createElement(Tooltip, {
68
71
  key: (_emoji$id = emoji.id) !== null && _emoji$id !== void 0 ? _emoji$id : emoji.shortName,
69
72
  content: emoji.shortName
@@ -73,8 +76,12 @@ export var Selector = function Selector(_ref2) {
73
76
  onClick: onSelection,
74
77
  hoverableReactionPickerSelectorEmoji: hoverableReactionPickerSelector
75
78
  }));
76
- return hoverableReactionPickerSelector ? emojiButtonAndTooltip : /*#__PURE__*/React.createElement(Reveal, {
79
+ return hoverableReactionPickerSelector ? shouldRenderHoverableReactionPickerSelectorList ? /*#__PURE__*/React.createElement(Box, {
80
+ as: "li",
77
81
  key: (_emoji$id2 = emoji.id) !== null && _emoji$id2 !== void 0 ? _emoji$id2 : emoji.shortName,
82
+ xcss: styles.emojiContainer
83
+ }, emojiButtonAndTooltip) : emojiButtonAndTooltip : /*#__PURE__*/React.createElement(Reveal, {
84
+ key: (_emoji$id3 = emoji.id) !== null && _emoji$id3 !== void 0 ? _emoji$id3 : emoji.shortName,
78
85
  testId: RENDER_SELECTOR_TESTID
79
86
  }, emojiButtonAndTooltip);
80
87
  };
@@ -88,8 +95,9 @@ export var Selector = function Selector(_ref2) {
88
95
  reactionPickerTriggerText: messages.addNewReaction.defaultMessage,
89
96
  fullWidthSelectorTrayReactionPickerTrigger: true
90
97
  }), /*#__PURE__*/React.createElement(Inline, {
98
+ as: shouldRenderHoverableReactionPickerSelectorList ? 'ul' : undefined,
91
99
  alignBlock: "center",
92
- xcss: hoverableReactionPickerSelector ? styles.hoverableReactionPickerSelectorContainer : styles.container
100
+ xcss: shouldRenderHoverableReactionPickerSelectorList ? styles.hoverableReactionPickerSelectorList : styles.hoverableReactionPickerSelectorContainer
93
101
  }, quickReactionEmojiIds.map(renderEmoji)));
94
102
  }
95
103
  var isSelectorListMarkupFixEnabled = expValEquals('platform_a11y_fixes_reactions_selector_list', 'isEnabled', true);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/reactions",
3
- "version": "35.11.6",
3
+ "version": "35.11.8",
4
4
  "description": "Reactions component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -40,21 +40,22 @@
40
40
  "@atlaskit/emoji": "^71.15.0",
41
41
  "@atlaskit/feature-gate-js-client": "^6.0.0",
42
42
  "@atlaskit/heading": "^7.0.0",
43
- "@atlaskit/icon": "^37.2.0",
43
+ "@atlaskit/icon": "^37.3.0",
44
44
  "@atlaskit/link": "^5.0.0",
45
45
  "@atlaskit/modal-dialog": "^16.2.0",
46
46
  "@atlaskit/motion": "^8.0.0",
47
+ "@atlaskit/platform-feature-experiments": "^0.3.0",
47
48
  "@atlaskit/platform-feature-flags": "^2.1.0",
48
- "@atlaskit/popper": "^8.5.0",
49
- "@atlaskit/popup": "^5.2.0",
50
- "@atlaskit/portal": "^6.1.0",
49
+ "@atlaskit/popper": "^9.0.0",
50
+ "@atlaskit/popup": "^6.0.0",
51
+ "@atlaskit/portal": "^6.2.0",
51
52
  "@atlaskit/primitives": "^22.2.0",
52
53
  "@atlaskit/react-compiler-gating": "^0.2.0",
53
54
  "@atlaskit/react-ufo": "^7.3.0",
54
55
  "@atlaskit/spinner": "^20.1.0",
55
56
  "@atlaskit/tabs": "^20.1.0",
56
57
  "@atlaskit/theme": "^26.1.0",
57
- "@atlaskit/tmp-editor-statsig": "^138.0.0",
58
+ "@atlaskit/tmp-editor-statsig": "^139.0.0",
58
59
  "@atlaskit/tokens": "^16.3.0",
59
60
  "@atlaskit/tooltip": "^24.0.0",
60
61
  "@atlaskit/ufo": "^1.0.0",
@@ -73,6 +74,7 @@
73
74
  "@atlaskit/editor-test-helpers": "workspace:^",
74
75
  "@atlaskit/util-data-test": "^19.1.0",
75
76
  "@atlassian/a11y-jest-testing": "^0.14.0",
77
+ "@atlassian/experiment-test-utils": "^0.2.0",
76
78
  "@atlassian/feature-flags-test-utils": "^1.2.0",
77
79
  "@testing-library/dom": "^10.1.0",
78
80
  "@testing-library/jest-dom": "^6.4.5",
@@ -139,6 +141,15 @@
139
141
  },
140
142
  "platform_a11y_fixes_reaction_emoji": {
141
143
  "type": "boolean"
144
+ },
145
+ "a11y_reactions_reading_order": {
146
+ "type": "boolean"
147
+ }
148
+ },
149
+ "platform-experiments": {
150
+ "platform_a11y_reactions_hover_selector_list": {
151
+ "param": "isEnabled",
152
+ "defaultValue": false
142
153
  }
143
154
  },
144
155
  "sideEffects": [