@atlaskit/user-picker 8.8.2 → 8.8.5

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 (34) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/components/BaseUserPicker.js +32 -1
  3. package/dist/cjs/components/EmailOption/main.js +2 -2
  4. package/dist/cjs/components/ExternalUserOption/InfoIcon.js +1 -1
  5. package/dist/cjs/components/ExternalUserOption/main.js +2 -2
  6. package/dist/cjs/components/GroupOption/main.js +2 -2
  7. package/dist/cjs/components/TeamOption/main.js +2 -2
  8. package/dist/cjs/components/UserOption.js +3 -3
  9. package/dist/cjs/components/i18n.js +1 -1
  10. package/dist/cjs/util/ufoExperiences.js +9 -1
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/es2019/components/BaseUserPicker.js +27 -1
  13. package/dist/es2019/components/EmailOption/main.js +2 -2
  14. package/dist/es2019/components/ExternalUserOption/InfoIcon.js +1 -1
  15. package/dist/es2019/components/ExternalUserOption/main.js +2 -2
  16. package/dist/es2019/components/GroupOption/main.js +2 -2
  17. package/dist/es2019/components/TeamOption/main.js +2 -2
  18. package/dist/es2019/components/UserOption.js +3 -3
  19. package/dist/es2019/components/i18n.js +1 -1
  20. package/dist/es2019/util/ufoExperiences.js +7 -0
  21. package/dist/es2019/version.json +1 -1
  22. package/dist/esm/components/BaseUserPicker.js +31 -1
  23. package/dist/esm/components/EmailOption/main.js +2 -2
  24. package/dist/esm/components/ExternalUserOption/InfoIcon.js +1 -1
  25. package/dist/esm/components/ExternalUserOption/main.js +2 -2
  26. package/dist/esm/components/GroupOption/main.js +2 -2
  27. package/dist/esm/components/TeamOption/main.js +2 -2
  28. package/dist/esm/components/UserOption.js +3 -3
  29. package/dist/esm/components/i18n.js +1 -1
  30. package/dist/esm/util/ufoExperiences.js +7 -0
  31. package/dist/esm/version.json +1 -1
  32. package/dist/types/components/BaseUserPicker.d.ts +3 -0
  33. package/dist/types/util/ufoExperiences.d.ts +1 -0
  34. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/user-picker
2
2
 
3
+ ## 8.8.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [`ac9343c3ed4`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ac9343c3ed4) - Replaces usage of deprecated design tokens. No visual or functional changes
8
+ - [`62edf20ab1e`](https://bitbucket.org/atlassian/atlassian-frontend/commits/62edf20ab1e) - Migrates all usage of brand tokens to either selected or information tokens. This change is purely for semantic reasons, there are no visual or behavioural changes.
9
+ - Updated dependencies
10
+
11
+ ## 8.8.4
12
+
13
+ ### Patch Changes
14
+
15
+ - [`d9b9077397d`](https://bitbucket.org/atlassian/atlassian-frontend/commits/d9b9077397d) - [ux] Updated the default copy for the byline when selecting email options in UserPicker.
16
+
17
+ ## 8.8.3
18
+
19
+ ### Patch Changes
20
+
21
+ - [`3553b21ec20`](https://bitbucket.org/atlassian/atlassian-frontend/commits/3553b21ec20) - Render time of user picker list is now tracked with UFO
22
+
3
23
  ## 8.8.2
4
24
 
5
25
  ### Patch Changes
@@ -25,12 +25,16 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
25
25
 
26
26
  var _analyticsNext = require("@atlaskit/analytics-next");
27
27
 
28
+ var _ufo = require("@atlaskit/ufo");
29
+
28
30
  var _debounce = _interopRequireDefault(require("lodash/debounce"));
29
31
 
30
32
  var _react = _interopRequireDefault(require("react"));
31
33
 
32
34
  var _reactIntlNext = require("react-intl-next");
33
35
 
36
+ var _uuid = require("uuid");
37
+
34
38
  var _analytics = require("../analytics");
35
39
 
36
40
  var _batch = require("./batch");
@@ -39,6 +43,8 @@ var _i18n = require("./i18n");
39
43
 
40
44
  var _utils = require("./utils");
41
45
 
46
+ var _ufoExperiences = require("../util/ufoExperiences");
47
+
42
48
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
43
49
 
44
50
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -233,6 +239,18 @@ var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Component) {
233
239
  });
234
240
  }
235
241
  }, 200));
242
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "abortOptionsShownUfoExperience", function () {
243
+ if (_this.optionsShownUfoExperienceInstance.state.id === _ufo.UFOExperienceState.STARTED.id) {
244
+ // There may be an existing UFO timing running from previous key entry or focus,
245
+ // so abort it and restart it just in case.
246
+ _this.optionsShownUfoExperienceInstance.abort();
247
+ }
248
+ });
249
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "startOptionsShownUfoExperience", function () {
250
+ _this.abortOptionsShownUfoExperience();
251
+
252
+ _this.optionsShownUfoExperienceInstance.start();
253
+ });
236
254
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "executeLoadOptions", function (search) {
237
255
  var loadOptions = _this.props.loadOptions;
238
256
 
@@ -253,6 +271,8 @@ var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Component) {
253
271
  _this.startSession();
254
272
  }
255
273
 
274
+ _this.startOptionsShownUfoExperience();
275
+
256
276
  (0, _utils.callCallback)(_this.props.onFocus, _this.getSessionId());
257
277
 
258
278
  _this.setState({
@@ -288,6 +308,8 @@ var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Component) {
288
308
 
289
309
  _this.resetInputState();
290
310
 
311
+ _this.abortOptionsShownUfoExperience();
312
+
291
313
  _this.setState({
292
314
  menuIsOpen: false,
293
315
  options: []
@@ -313,6 +335,8 @@ var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Component) {
313
335
  inputValue: search
314
336
  });
315
337
 
338
+ _this.startOptionsShownUfoExperience();
339
+
316
340
  _this.executeLoadOptions(search);
317
341
  }
318
342
  });
@@ -411,6 +435,7 @@ var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Component) {
411
435
  inputValue: props.search || '',
412
436
  resolving: false
413
437
  };
438
+ _this.optionsShownUfoExperienceInstance = _ufoExperiences.userPickerOptionsShownUfoExperience.getInstance((0, _uuid.v4)());
414
439
  return _this;
415
440
  }
416
441
 
@@ -434,7 +459,9 @@ var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Component) {
434
459
  value: function componentDidUpdate(_, prevState) {
435
460
  var _this$state2 = this.state,
436
461
  menuIsOpen = _this$state2.menuIsOpen,
437
- options = _this$state2.options; // load options when the picker open
462
+ options = _this$state2.options,
463
+ resolving = _this$state2.resolving,
464
+ count = _this$state2.count; // load options when the picker open
438
465
 
439
466
  if (menuIsOpen && !prevState.menuIsOpen) {
440
467
  if (!this.session) {
@@ -459,6 +486,10 @@ var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Component) {
459
486
  this.session.inputChangeTime = Date.now();
460
487
  }
461
488
  }
489
+
490
+ if (menuIsOpen && (!_.loadOptions || prevState.menuIsOpen) && count === 0 && !resolving && [_ufo.UFOExperienceState.STARTED.id, _ufo.UFOExperienceState.IN_PROGRESS.id].includes(this.optionsShownUfoExperienceInstance.state.id)) {
491
+ this.optionsShownUfoExperienceInstance.success();
492
+ }
462
493
  }
463
494
  }, {
464
495
  key: "render",
@@ -67,12 +67,12 @@ var EmailOption = /*#__PURE__*/function (_React$PureComponent) {
67
67
  var id = _this.props.email.id;
68
68
  return /*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
69
69
  key: "name",
70
- color: _this.props.isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text', _colors.N800)
70
+ color: _this.props.isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text', _colors.N800)
71
71
  }, id);
72
72
  });
73
73
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderSecondaryText", function (label) {
74
74
  return /*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
75
- color: _this.props.isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
75
+ color: _this.props.isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
76
76
  }, label);
77
77
  });
78
78
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderOption", function (label) {
@@ -50,7 +50,7 @@ var _default = function _default() {
50
50
  testId: "source-icon",
51
51
  label: "",
52
52
  size: "large",
53
- primaryColor: (0, _tokens.token)('color.text.lowEmphasis', isMouseHovered ? _colors.N200 : _colors.N50)
53
+ primaryColor: (0, _tokens.token)('color.text.subtlest', isMouseHovered ? _colors.N200 : _colors.N50)
54
54
  }));
55
55
  };
56
56
 
@@ -80,7 +80,7 @@ var ExternalUserOption = /*#__PURE__*/function (_React$PureComponent) {
80
80
  var name = _this.props.user.name;
81
81
  return /*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
82
82
  key: "name",
83
- color: _this.props.isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text', _colors.N800)
83
+ color: _this.props.isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text', _colors.N800)
84
84
  }, name);
85
85
  });
86
86
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderSecondaryText", function () {
@@ -97,7 +97,7 @@ var ExternalUserOption = /*#__PURE__*/function (_React$PureComponent) {
97
97
 
98
98
  var emailDomainWithAt = "@".concat(emailDomain);
99
99
  return /*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
100
- color: _this.props.isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
100
+ color: _this.props.isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
101
101
  }, emailUser, /*#__PURE__*/_react.default.createElement(EmailDomainWrapper, null, emailDomainWithAt));
102
102
  });
103
103
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderAvatar", function () {
@@ -74,7 +74,7 @@ var GroupOption = /*#__PURE__*/function (_React$PureComponent) {
74
74
  highlight = _this$props$group.highlight;
75
75
  return [/*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
76
76
  key: "name",
77
- color: isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text', _colors.N800)
77
+ color: isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text', _colors.N800)
78
78
  }, /*#__PURE__*/_react.default.createElement(_HighlightText.HighlightText, {
79
79
  highlights: highlight && highlight.name
80
80
  }, name))];
@@ -88,7 +88,7 @@ var GroupOption = /*#__PURE__*/function (_React$PureComponent) {
88
88
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderByline", function () {
89
89
  var isSelected = _this.props.isSelected;
90
90
  return /*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
91
- color: isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
91
+ color: isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
92
92
  }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _i18n.messages.groupByline));
93
93
  });
94
94
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getLozengeProps", function () {
@@ -64,7 +64,7 @@ var TeamOption = /*#__PURE__*/function (_React$PureComponent) {
64
64
  highlight = _this$props$team.highlight;
65
65
  return [/*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
66
66
  key: "name",
67
- color: _this.props.isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text', _colors.N800)
67
+ color: _this.props.isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text', _colors.N800)
68
68
  }, /*#__PURE__*/_react.default.createElement(_HighlightText.HighlightText, {
69
69
  highlights: highlight && highlight.name
70
70
  }, name))];
@@ -104,7 +104,7 @@ var TeamOption = /*#__PURE__*/function (_React$PureComponent) {
104
104
  });
105
105
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getBylineComponent", function (isSelected, message) {
106
106
  return /*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
107
- color: isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
107
+ color: isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
108
108
  }, message);
109
109
  });
110
110
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderAvatar", function () {
@@ -61,7 +61,7 @@ var UserOption = /*#__PURE__*/function (_React$PureComponent) {
61
61
  highlight = _this$props$user.highlight;
62
62
  var result = [/*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
63
63
  key: "name",
64
- color: _this.props.isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text', _colors.N800)
64
+ color: _this.props.isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text', _colors.N800)
65
65
  }, /*#__PURE__*/_react.default.createElement(_HighlightText.HighlightText, {
66
66
  highlights: highlight && highlight.name
67
67
  }, name))];
@@ -70,7 +70,7 @@ var UserOption = /*#__PURE__*/function (_React$PureComponent) {
70
70
  result.push( /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {
71
71
  key: "publicName"
72
72
  }, ' ', /*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
73
- color: _this.props.isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
73
+ color: _this.props.isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
74
74
  }, "(", /*#__PURE__*/_react.default.createElement(_HighlightText.HighlightText, {
75
75
  highlights: highlight && highlight.publicName
76
76
  }, publicName), ")")));
@@ -80,7 +80,7 @@ var UserOption = /*#__PURE__*/function (_React$PureComponent) {
80
80
  });
81
81
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderSecondaryText", function () {
82
82
  return _this.props.user.byline ? /*#__PURE__*/_react.default.createElement(_AvatarItemOption.TextWrapper, {
83
- color: _this.props.isSelected ? (0, _tokens.token)('color.text.brand', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
83
+ color: _this.props.isSelected ? (0, _tokens.token)('color.text.selected', _colors.B400) : (0, _tokens.token)('color.text.subtlest', _colors.N200)
84
84
  }, _this.props.user.byline) : undefined;
85
85
  });
86
86
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderAvatar", function () {
@@ -55,7 +55,7 @@ var messages = (0, _reactIntlNext.defineMessages)({
55
55
  },
56
56
  selectToAddEmail: {
57
57
  id: 'fabric.elements.user-picker.email.select.to.add',
58
- defaultMessage: 'Select then Invite',
58
+ defaultMessage: 'Select an email address',
59
59
  description: 'Byline for valid email option.'
60
60
  },
61
61
  continueToAddEmail: {
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.userPickerRenderedUfoExperience = exports.UfoErrorBoundary = void 0;
8
+ exports.userPickerRenderedUfoExperience = exports.userPickerOptionsShownUfoExperience = exports.UfoErrorBoundary = void 0;
9
9
 
10
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
11
 
@@ -33,6 +33,14 @@ var userPickerRenderedUfoExperience = new _ufo.ConcurrentExperience('user-picker
33
33
  performanceType: _ufo.ExperiencePerformanceTypes.PageSegmentLoad
34
34
  });
35
35
  exports.userPickerRenderedUfoExperience = userPickerRenderedUfoExperience;
36
+ var userPickerOptionsShownUfoExperience = new _ufo.ConcurrentExperience('user-picker-options-shown', {
37
+ platform: {
38
+ component: 'user-picker'
39
+ },
40
+ type: _ufo.ExperienceTypes.Operation,
41
+ performanceType: _ufo.ExperiencePerformanceTypes.InlineResult
42
+ });
43
+ exports.userPickerOptionsShownUfoExperience = userPickerOptionsShownUfoExperience;
36
44
 
37
45
  var UfoErrorBoundary = /*#__PURE__*/function (_React$Component) {
38
46
  (0, _inherits2.default)(UfoErrorBoundary, _React$Component);
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/user-picker",
3
- "version": "8.8.2",
3
+ "version": "8.8.5",
4
4
  "sideEffects": false
5
5
  }
@@ -1,13 +1,16 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import { withAnalyticsEvents } from '@atlaskit/analytics-next';
4
+ import { UFOExperienceState } from '@atlaskit/ufo';
4
5
  import debounce from 'lodash/debounce';
5
6
  import React from 'react';
6
7
  import { FormattedMessage } from 'react-intl-next';
8
+ import { v4 as uuidv4 } from 'uuid';
7
9
  import { cancelEvent, clearEvent, createAndFireEventInElementsChannel, deleteEvent, failedEvent, focusEvent, searchedEvent, selectEvent, startSession } from '../analytics';
8
10
  import { batchByKey } from './batch';
9
11
  import { messages } from './i18n';
10
12
  import { callCallback, extractOptionValue, getOptions, isIterable, isPopupUserPickerByComponent, isDefaultValuePopulated, isSingleValue, optionToSelectableOptions } from './utils';
13
+ import { userPickerOptionsShownUfoExperience } from '../util/ufoExperiences';
11
14
 
12
15
  const loadingMessage = () => null;
13
16
 
@@ -198,6 +201,19 @@ export class BaseUserPickerWithoutAnalytics extends React.Component {
198
201
  }
199
202
  }, 200));
200
203
 
204
+ _defineProperty(this, "abortOptionsShownUfoExperience", () => {
205
+ if (this.optionsShownUfoExperienceInstance.state.id === UFOExperienceState.STARTED.id) {
206
+ // There may be an existing UFO timing running from previous key entry or focus,
207
+ // so abort it and restart it just in case.
208
+ this.optionsShownUfoExperienceInstance.abort();
209
+ }
210
+ });
211
+
212
+ _defineProperty(this, "startOptionsShownUfoExperience", () => {
213
+ this.abortOptionsShownUfoExperience();
214
+ this.optionsShownUfoExperienceInstance.start();
215
+ });
216
+
201
217
  _defineProperty(this, "executeLoadOptions", search => {
202
218
  const {
203
219
  loadOptions
@@ -220,6 +236,7 @@ export class BaseUserPickerWithoutAnalytics extends React.Component {
220
236
  this.startSession();
221
237
  }
222
238
 
239
+ this.startOptionsShownUfoExperience();
223
240
  callCallback(this.props.onFocus, this.getSessionId());
224
241
  this.setState({
225
242
  menuIsOpen: true
@@ -253,6 +270,7 @@ export class BaseUserPickerWithoutAnalytics extends React.Component {
253
270
  }
254
271
 
255
272
  this.resetInputState();
273
+ this.abortOptionsShownUfoExperience();
256
274
  this.setState({
257
275
  menuIsOpen: false,
258
276
  options: []
@@ -276,6 +294,7 @@ export class BaseUserPickerWithoutAnalytics extends React.Component {
276
294
  this.setState({
277
295
  inputValue: search
278
296
  });
297
+ this.startOptionsShownUfoExperience();
279
298
  this.executeLoadOptions(search);
280
299
  }
281
300
  });
@@ -373,6 +392,7 @@ export class BaseUserPickerWithoutAnalytics extends React.Component {
373
392
  inputValue: props.search || '',
374
393
  resolving: false
375
394
  };
395
+ this.optionsShownUfoExperienceInstance = userPickerOptionsShownUfoExperience.getInstance(uuidv4());
376
396
  }
377
397
 
378
398
  componentDidMount() {
@@ -393,7 +413,9 @@ export class BaseUserPickerWithoutAnalytics extends React.Component {
393
413
  componentDidUpdate(_, prevState) {
394
414
  const {
395
415
  menuIsOpen,
396
- options
416
+ options,
417
+ resolving,
418
+ count
397
419
  } = this.state; // load options when the picker open
398
420
 
399
421
  if (menuIsOpen && !prevState.menuIsOpen) {
@@ -419,6 +441,10 @@ export class BaseUserPickerWithoutAnalytics extends React.Component {
419
441
  this.session.inputChangeTime = Date.now();
420
442
  }
421
443
  }
444
+
445
+ if (menuIsOpen && (!_.loadOptions || prevState.menuIsOpen) && count === 0 && !resolving && [UFOExperienceState.STARTED.id, UFOExperienceState.IN_PROGRESS.id].includes(this.optionsShownUfoExperienceInstance.state.id)) {
446
+ this.optionsShownUfoExperienceInstance.success();
447
+ }
422
448
  }
423
449
 
424
450
  render() {
@@ -25,13 +25,13 @@ export class EmailOption extends React.PureComponent {
25
25
  } = this.props;
26
26
  return /*#__PURE__*/React.createElement(TextWrapper, {
27
27
  key: "name",
28
- color: this.props.isSelected ? token('color.text.brand', B400) : token('color.text', N800)
28
+ color: this.props.isSelected ? token('color.text.selected', B400) : token('color.text', N800)
29
29
  }, id);
30
30
  });
31
31
 
32
32
  _defineProperty(this, "renderSecondaryText", label => {
33
33
  return /*#__PURE__*/React.createElement(TextWrapper, {
34
- color: this.props.isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
34
+ color: this.props.isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
35
35
  }, label);
36
36
  });
37
37
 
@@ -17,6 +17,6 @@ export default (() => {
17
17
  testId: "source-icon",
18
18
  label: "",
19
19
  size: "large",
20
- primaryColor: token('color.text.lowEmphasis', isMouseHovered ? N200 : N50)
20
+ primaryColor: token('color.text.subtlest', isMouseHovered ? N200 : N50)
21
21
  }));
22
22
  });
@@ -33,7 +33,7 @@ export class ExternalUserOption extends React.PureComponent {
33
33
  } = this.props;
34
34
  return /*#__PURE__*/React.createElement(TextWrapper, {
35
35
  key: "name",
36
- color: this.props.isSelected ? token('color.text.brand', B400) : token('color.text', N800)
36
+ color: this.props.isSelected ? token('color.text.selected', B400) : token('color.text', N800)
37
37
  }, name);
38
38
  });
39
39
 
@@ -49,7 +49,7 @@ export class ExternalUserOption extends React.PureComponent {
49
49
  const [emailUser, emailDomain] = email.split('@');
50
50
  const emailDomainWithAt = `@${emailDomain}`;
51
51
  return /*#__PURE__*/React.createElement(TextWrapper, {
52
- color: this.props.isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
52
+ color: this.props.isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
53
53
  }, emailUser, /*#__PURE__*/React.createElement(EmailDomainWrapper, null, emailDomainWithAt));
54
54
  });
55
55
 
@@ -31,7 +31,7 @@ export class GroupOption extends React.PureComponent {
31
31
  } = this.props;
32
32
  return [/*#__PURE__*/React.createElement(TextWrapper, {
33
33
  key: "name",
34
- color: isSelected ? token('color.text.brand', B400) : token('color.text', N800)
34
+ color: isSelected ? token('color.text.selected', B400) : token('color.text', N800)
35
35
  }, /*#__PURE__*/React.createElement(HighlightText, {
36
36
  highlights: highlight && highlight.name
37
37
  }, name))];
@@ -47,7 +47,7 @@ export class GroupOption extends React.PureComponent {
47
47
  isSelected
48
48
  } = this.props;
49
49
  return /*#__PURE__*/React.createElement(TextWrapper, {
50
- color: isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
50
+ color: isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
51
51
  }, /*#__PURE__*/React.createElement(FormattedMessage, messages.groupByline));
52
52
  });
53
53
 
@@ -21,7 +21,7 @@ export class TeamOption extends React.PureComponent {
21
21
  } = this.props;
22
22
  return [/*#__PURE__*/React.createElement(TextWrapper, {
23
23
  key: "name",
24
- color: this.props.isSelected ? token('color.text.brand', B400) : token('color.text', N800)
24
+ color: this.props.isSelected ? token('color.text.selected', B400) : token('color.text', N800)
25
25
  }, /*#__PURE__*/React.createElement(HighlightText, {
26
26
  highlights: highlight && highlight.name
27
27
  }, name))];
@@ -64,7 +64,7 @@ export class TeamOption extends React.PureComponent {
64
64
  });
65
65
 
66
66
  _defineProperty(this, "getBylineComponent", (isSelected, message) => /*#__PURE__*/React.createElement(TextWrapper, {
67
- color: isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
67
+ color: isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
68
68
  }, message));
69
69
 
70
70
  _defineProperty(this, "renderAvatar", () => {
@@ -20,7 +20,7 @@ export class UserOption extends React.PureComponent {
20
20
  } = this.props;
21
21
  const result = [/*#__PURE__*/React.createElement(TextWrapper, {
22
22
  key: "name",
23
- color: this.props.isSelected ? token('color.text.brand', B400) : token('color.text', N800)
23
+ color: this.props.isSelected ? token('color.text.selected', B400) : token('color.text', N800)
24
24
  }, /*#__PURE__*/React.createElement(HighlightText, {
25
25
  highlights: highlight && highlight.name
26
26
  }, name))];
@@ -29,7 +29,7 @@ export class UserOption extends React.PureComponent {
29
29
  result.push( /*#__PURE__*/React.createElement(React.Fragment, {
30
30
  key: "publicName"
31
31
  }, ' ', /*#__PURE__*/React.createElement(TextWrapper, {
32
- color: this.props.isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
32
+ color: this.props.isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
33
33
  }, "(", /*#__PURE__*/React.createElement(HighlightText, {
34
34
  highlights: highlight && highlight.publicName
35
35
  }, publicName), ")")));
@@ -39,7 +39,7 @@ export class UserOption extends React.PureComponent {
39
39
  });
40
40
 
41
41
  _defineProperty(this, "renderSecondaryText", () => this.props.user.byline ? /*#__PURE__*/React.createElement(TextWrapper, {
42
- color: this.props.isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
42
+ color: this.props.isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
43
43
  }, this.props.user.byline) : undefined);
44
44
 
45
45
  _defineProperty(this, "renderAvatar", () => {
@@ -47,7 +47,7 @@ export const messages = defineMessages({
47
47
  },
48
48
  selectToAddEmail: {
49
49
  id: 'fabric.elements.user-picker.email.select.to.add',
50
- defaultMessage: 'Select then Invite',
50
+ defaultMessage: 'Select an email address',
51
51
  description: 'Byline for valid email option.'
52
52
  },
53
53
  continueToAddEmail: {
@@ -7,6 +7,13 @@ export const userPickerRenderedUfoExperience = new ConcurrentExperience('user-pi
7
7
  type: ExperienceTypes.Load,
8
8
  performanceType: ExperiencePerformanceTypes.PageSegmentLoad
9
9
  });
10
+ export const userPickerOptionsShownUfoExperience = new ConcurrentExperience('user-picker-options-shown', {
11
+ platform: {
12
+ component: 'user-picker'
13
+ },
14
+ type: ExperienceTypes.Operation,
15
+ performanceType: ExperiencePerformanceTypes.InlineResult
16
+ });
10
17
  export class UfoErrorBoundary extends React.Component {
11
18
  componentDidCatch() {
12
19
  const instance = userPickerRenderedUfoExperience.getInstance(this.props.id);
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/user-picker",
3
- "version": "8.8.2",
3
+ "version": "8.8.5",
4
4
  "sideEffects": false
5
5
  }
@@ -18,13 +18,16 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
18
18
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
19
19
 
20
20
  import { withAnalyticsEvents } from '@atlaskit/analytics-next';
21
+ import { UFOExperienceState } from '@atlaskit/ufo';
21
22
  import debounce from 'lodash/debounce';
22
23
  import React from 'react';
23
24
  import { FormattedMessage } from 'react-intl-next';
25
+ import { v4 as uuidv4 } from 'uuid';
24
26
  import { cancelEvent, clearEvent, createAndFireEventInElementsChannel, deleteEvent, failedEvent, focusEvent, searchedEvent, selectEvent, startSession } from '../analytics';
25
27
  import { batchByKey } from './batch';
26
28
  import { messages } from './i18n';
27
29
  import { callCallback, extractOptionValue, getOptions, isIterable, isPopupUserPickerByComponent, isDefaultValuePopulated, isSingleValue, optionToSelectableOptions } from './utils';
30
+ import { userPickerOptionsShownUfoExperience } from '../util/ufoExperiences';
28
31
 
29
32
  var loadingMessage = function loadingMessage() {
30
33
  return null;
@@ -224,6 +227,20 @@ export var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compon
224
227
  }
225
228
  }, 200));
226
229
 
230
+ _defineProperty(_assertThisInitialized(_this), "abortOptionsShownUfoExperience", function () {
231
+ if (_this.optionsShownUfoExperienceInstance.state.id === UFOExperienceState.STARTED.id) {
232
+ // There may be an existing UFO timing running from previous key entry or focus,
233
+ // so abort it and restart it just in case.
234
+ _this.optionsShownUfoExperienceInstance.abort();
235
+ }
236
+ });
237
+
238
+ _defineProperty(_assertThisInitialized(_this), "startOptionsShownUfoExperience", function () {
239
+ _this.abortOptionsShownUfoExperience();
240
+
241
+ _this.optionsShownUfoExperienceInstance.start();
242
+ });
243
+
227
244
  _defineProperty(_assertThisInitialized(_this), "executeLoadOptions", function (search) {
228
245
  var loadOptions = _this.props.loadOptions;
229
246
 
@@ -245,6 +262,8 @@ export var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compon
245
262
  _this.startSession();
246
263
  }
247
264
 
265
+ _this.startOptionsShownUfoExperience();
266
+
248
267
  callCallback(_this.props.onFocus, _this.getSessionId());
249
268
 
250
269
  _this.setState({
@@ -282,6 +301,8 @@ export var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compon
282
301
 
283
302
  _this.resetInputState();
284
303
 
304
+ _this.abortOptionsShownUfoExperience();
305
+
285
306
  _this.setState({
286
307
  menuIsOpen: false,
287
308
  options: []
@@ -309,6 +330,8 @@ export var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compon
309
330
  inputValue: search
310
331
  });
311
332
 
333
+ _this.startOptionsShownUfoExperience();
334
+
312
335
  _this.executeLoadOptions(search);
313
336
  }
314
337
  });
@@ -414,6 +437,7 @@ export var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compon
414
437
  inputValue: props.search || '',
415
438
  resolving: false
416
439
  };
440
+ _this.optionsShownUfoExperienceInstance = userPickerOptionsShownUfoExperience.getInstance(uuidv4());
417
441
  return _this;
418
442
  }
419
443
 
@@ -437,7 +461,9 @@ export var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compon
437
461
  value: function componentDidUpdate(_, prevState) {
438
462
  var _this$state2 = this.state,
439
463
  menuIsOpen = _this$state2.menuIsOpen,
440
- options = _this$state2.options; // load options when the picker open
464
+ options = _this$state2.options,
465
+ resolving = _this$state2.resolving,
466
+ count = _this$state2.count; // load options when the picker open
441
467
 
442
468
  if (menuIsOpen && !prevState.menuIsOpen) {
443
469
  if (!this.session) {
@@ -462,6 +488,10 @@ export var BaseUserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Compon
462
488
  this.session.inputChangeTime = Date.now();
463
489
  }
464
490
  }
491
+
492
+ if (menuIsOpen && (!_.loadOptions || prevState.menuIsOpen) && count === 0 && !resolving && [UFOExperienceState.STARTED.id, UFOExperienceState.IN_PROGRESS.id].includes(this.optionsShownUfoExperienceInstance.state.id)) {
493
+ this.optionsShownUfoExperienceInstance.success();
494
+ }
465
495
  }
466
496
  }, {
467
497
  key: "render",
@@ -48,13 +48,13 @@ export var EmailOption = /*#__PURE__*/function (_React$PureComponent) {
48
48
  var id = _this.props.email.id;
49
49
  return /*#__PURE__*/React.createElement(TextWrapper, {
50
50
  key: "name",
51
- color: _this.props.isSelected ? token('color.text.brand', B400) : token('color.text', N800)
51
+ color: _this.props.isSelected ? token('color.text.selected', B400) : token('color.text', N800)
52
52
  }, id);
53
53
  });
54
54
 
55
55
  _defineProperty(_assertThisInitialized(_this), "renderSecondaryText", function (label) {
56
56
  return /*#__PURE__*/React.createElement(TextWrapper, {
57
- color: _this.props.isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
57
+ color: _this.props.isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
58
58
  }, label);
59
59
  });
60
60
 
@@ -28,6 +28,6 @@ export default (function () {
28
28
  testId: "source-icon",
29
29
  label: "",
30
30
  size: "large",
31
- primaryColor: token('color.text.lowEmphasis', isMouseHovered ? N200 : N50)
31
+ primaryColor: token('color.text.subtlest', isMouseHovered ? N200 : N50)
32
32
  }));
33
33
  });
@@ -47,7 +47,7 @@ export var ExternalUserOption = /*#__PURE__*/function (_React$PureComponent) {
47
47
  var name = _this.props.user.name;
48
48
  return /*#__PURE__*/React.createElement(TextWrapper, {
49
49
  key: "name",
50
- color: _this.props.isSelected ? token('color.text.brand', B400) : token('color.text', N800)
50
+ color: _this.props.isSelected ? token('color.text.selected', B400) : token('color.text', N800)
51
51
  }, name);
52
52
  });
53
53
 
@@ -65,7 +65,7 @@ export var ExternalUserOption = /*#__PURE__*/function (_React$PureComponent) {
65
65
 
66
66
  var emailDomainWithAt = "@".concat(emailDomain);
67
67
  return /*#__PURE__*/React.createElement(TextWrapper, {
68
- color: _this.props.isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
68
+ color: _this.props.isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
69
69
  }, emailUser, /*#__PURE__*/React.createElement(EmailDomainWrapper, null, emailDomainWithAt));
70
70
  });
71
71
 
@@ -47,7 +47,7 @@ export var GroupOption = /*#__PURE__*/function (_React$PureComponent) {
47
47
  highlight = _this$props$group.highlight;
48
48
  return [/*#__PURE__*/React.createElement(TextWrapper, {
49
49
  key: "name",
50
- color: isSelected ? token('color.text.brand', B400) : token('color.text', N800)
50
+ color: isSelected ? token('color.text.selected', B400) : token('color.text', N800)
51
51
  }, /*#__PURE__*/React.createElement(HighlightText, {
52
52
  highlights: highlight && highlight.name
53
53
  }, name))];
@@ -63,7 +63,7 @@ export var GroupOption = /*#__PURE__*/function (_React$PureComponent) {
63
63
  _defineProperty(_assertThisInitialized(_this), "renderByline", function () {
64
64
  var isSelected = _this.props.isSelected;
65
65
  return /*#__PURE__*/React.createElement(TextWrapper, {
66
- color: isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
66
+ color: isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
67
67
  }, /*#__PURE__*/React.createElement(FormattedMessage, messages.groupByline));
68
68
  });
69
69
 
@@ -41,7 +41,7 @@ export var TeamOption = /*#__PURE__*/function (_React$PureComponent) {
41
41
  highlight = _this$props$team.highlight;
42
42
  return [/*#__PURE__*/React.createElement(TextWrapper, {
43
43
  key: "name",
44
- color: _this.props.isSelected ? token('color.text.brand', B400) : token('color.text', N800)
44
+ color: _this.props.isSelected ? token('color.text.selected', B400) : token('color.text', N800)
45
45
  }, /*#__PURE__*/React.createElement(HighlightText, {
46
46
  highlights: highlight && highlight.name
47
47
  }, name))];
@@ -83,7 +83,7 @@ export var TeamOption = /*#__PURE__*/function (_React$PureComponent) {
83
83
 
84
84
  _defineProperty(_assertThisInitialized(_this), "getBylineComponent", function (isSelected, message) {
85
85
  return /*#__PURE__*/React.createElement(TextWrapper, {
86
- color: isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
86
+ color: isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
87
87
  }, message);
88
88
  });
89
89
 
@@ -40,7 +40,7 @@ export var UserOption = /*#__PURE__*/function (_React$PureComponent) {
40
40
  highlight = _this$props$user.highlight;
41
41
  var result = [/*#__PURE__*/React.createElement(TextWrapper, {
42
42
  key: "name",
43
- color: _this.props.isSelected ? token('color.text.brand', B400) : token('color.text', N800)
43
+ color: _this.props.isSelected ? token('color.text.selected', B400) : token('color.text', N800)
44
44
  }, /*#__PURE__*/React.createElement(HighlightText, {
45
45
  highlights: highlight && highlight.name
46
46
  }, name))];
@@ -49,7 +49,7 @@ export var UserOption = /*#__PURE__*/function (_React$PureComponent) {
49
49
  result.push( /*#__PURE__*/React.createElement(React.Fragment, {
50
50
  key: "publicName"
51
51
  }, ' ', /*#__PURE__*/React.createElement(TextWrapper, {
52
- color: _this.props.isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
52
+ color: _this.props.isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
53
53
  }, "(", /*#__PURE__*/React.createElement(HighlightText, {
54
54
  highlights: highlight && highlight.publicName
55
55
  }, publicName), ")")));
@@ -60,7 +60,7 @@ export var UserOption = /*#__PURE__*/function (_React$PureComponent) {
60
60
 
61
61
  _defineProperty(_assertThisInitialized(_this), "renderSecondaryText", function () {
62
62
  return _this.props.user.byline ? /*#__PURE__*/React.createElement(TextWrapper, {
63
- color: _this.props.isSelected ? token('color.text.brand', B400) : token('color.text.subtlest', N200)
63
+ color: _this.props.isSelected ? token('color.text.selected', B400) : token('color.text.subtlest', N200)
64
64
  }, _this.props.user.byline) : undefined;
65
65
  });
66
66
 
@@ -47,7 +47,7 @@ export var messages = defineMessages({
47
47
  },
48
48
  selectToAddEmail: {
49
49
  id: 'fabric.elements.user-picker.email.select.to.add',
50
- defaultMessage: 'Select then Invite',
50
+ defaultMessage: 'Select an email address',
51
51
  description: 'Byline for valid email option.'
52
52
  },
53
53
  continueToAddEmail: {
@@ -17,6 +17,13 @@ export var userPickerRenderedUfoExperience = new ConcurrentExperience('user-pick
17
17
  type: ExperienceTypes.Load,
18
18
  performanceType: ExperiencePerformanceTypes.PageSegmentLoad
19
19
  });
20
+ export var userPickerOptionsShownUfoExperience = new ConcurrentExperience('user-picker-options-shown', {
21
+ platform: {
22
+ component: 'user-picker'
23
+ },
24
+ type: ExperienceTypes.Operation,
25
+ performanceType: ExperiencePerformanceTypes.InlineResult
26
+ });
20
27
  export var UfoErrorBoundary = /*#__PURE__*/function (_React$Component) {
21
28
  _inherits(UfoErrorBoundary, _React$Component);
22
29
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/user-picker",
3
- "version": "8.8.2",
3
+ "version": "8.8.5",
4
4
  "sideEffects": false
5
5
  }
@@ -19,6 +19,7 @@ export declare class BaseUserPickerWithoutAnalytics extends React.Component<Base
19
19
  private selectRef;
20
20
  private session?;
21
21
  private journeyId?;
22
+ private optionsShownUfoExperienceInstance;
22
23
  constructor(props: BaseUserPickerProps);
23
24
  private getSessionId;
24
25
  private withSelectRef;
@@ -32,6 +33,8 @@ export declare class BaseUserPickerWithoutAnalytics extends React.Component<Base
32
33
  private addOptions;
33
34
  private handleLoadOptionsError;
34
35
  private debouncedLoadOptions;
36
+ abortOptionsShownUfoExperience: () => void;
37
+ startOptionsShownUfoExperience: () => void;
35
38
  private executeLoadOptions;
36
39
  private handleFocus;
37
40
  private resetInputState;
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { ConcurrentExperience } from '@atlaskit/ufo';
3
3
  export declare const userPickerRenderedUfoExperience: ConcurrentExperience;
4
+ export declare const userPickerOptionsShownUfoExperience: ConcurrentExperience;
4
5
  export declare class UfoErrorBoundary extends React.Component<{
5
6
  id: string;
6
7
  }> {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/user-picker",
3
- "version": "8.8.2",
3
+ "version": "8.8.5",
4
4
  "description": "Fabric component for display a dropdown to select a user from",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -35,7 +35,7 @@
35
35
  "@atlaskit/select": "^15.2.0",
36
36
  "@atlaskit/spinner": "^15.1.4",
37
37
  "@atlaskit/theme": "^12.1.0",
38
- "@atlaskit/tokens": "^0.7.0",
38
+ "@atlaskit/tokens": "^0.8.0",
39
39
  "@atlaskit/tooltip": "^17.5.0",
40
40
  "@atlaskit/ufo": "^0.1.0",
41
41
  "@babel/runtime": "^7.0.0",