@atlaskit/link-picker 1.43.0 → 1.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/ui/link-picker/search-results/link-search-list/index.js +16 -14
  3. package/dist/cjs/ui/link-picker/search-results/link-search-list/list-item/index.js +54 -30
  4. package/dist/cjs/ui/link-picker/search-results/link-search-list/list-item/styled.js +3 -11
  5. package/dist/cjs/ui/main.js +1 -1
  6. package/dist/es2019/ui/link-picker/search-results/link-search-list/index.js +17 -15
  7. package/dist/es2019/ui/link-picker/search-results/link-search-list/list-item/index.js +43 -23
  8. package/dist/es2019/ui/link-picker/search-results/link-search-list/list-item/styled.js +3 -11
  9. package/dist/es2019/ui/main.js +1 -1
  10. package/dist/esm/ui/link-picker/search-results/link-search-list/index.js +17 -15
  11. package/dist/esm/ui/link-picker/search-results/link-search-list/list-item/index.js +54 -31
  12. package/dist/esm/ui/link-picker/search-results/link-search-list/list-item/styled.js +3 -11
  13. package/dist/esm/ui/main.js +1 -1
  14. package/dist/types/common/types.d.ts +11 -0
  15. package/dist/types/index.d.ts +1 -1
  16. package/dist/types/ui/link-picker/search-results/link-search-list/list-item/index.d.ts +1 -0
  17. package/dist/types/ui/link-picker/search-results/link-search-list/list-item/styled.d.ts +0 -1
  18. package/dist/types-ts4.5/common/types.d.ts +14 -0
  19. package/dist/types-ts4.5/index.d.ts +1 -1
  20. package/dist/types-ts4.5/ui/link-picker/search-results/link-search-list/list-item/index.d.ts +1 -0
  21. package/dist/types-ts4.5/ui/link-picker/search-results/link-search-list/list-item/styled.d.ts +0 -1
  22. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @atlaskit/link-picker
2
2
 
3
+ ## 1.44.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#132649](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/132649)
8
+ [`b99bd2fb0aeeb`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/b99bd2fb0aeeb) -
9
+ Fixes support for plugin empty state behind ff. If successful will be made available in future
10
+ release.
11
+ - [#131548](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/131548)
12
+ [`282ddb3575504`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/282ddb3575504) -
13
+ [ux] Allow custom subtitle content in the link picker, and allow link item names to extend over
14
+ multiple lines. Both changes are opt-in via a LinkPickerPlugin, so these new features will only
15
+ appear if the plugin is changed to consume them.
16
+
3
17
  ## 1.43.0
4
18
 
5
19
  ### Minor Changes
@@ -12,6 +12,7 @@ var _react = require("react");
12
12
  var _react2 = require("@emotion/react");
13
13
  var _reactIntlNext = require("react-intl-next");
14
14
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
15
+ var _primitives = require("@atlaskit/primitives");
15
16
  var _spinner = _interopRequireDefault(require("@atlaskit/spinner"));
16
17
  var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
17
18
  var _minHeightContainer = require("../../../../common/ui/min-height-container");
@@ -49,10 +50,11 @@ var testIds = exports.testIds = _objectSpread(_objectSpread(_objectSpread({}, _l
49
50
  searchResultLoadingIndicator: 'link-picker.results-loading-indicator',
50
51
  tabsLoadingIndicator: 'link-picker.tabs-loading-indicator'
51
52
  });
52
- var emptyStateNoResultsWrapper = (0, _react2.css)({
53
- minHeight: "var(--ds-space-200, 16px)"
53
+ var emptyStateNoResultsWrapper = (0, _primitives.xcss)({
54
+ minHeight: 'space.200'
54
55
  });
55
56
  var LinkSearchList = exports.LinkSearchList = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
57
+ var _activePlugin$uiOptio;
56
58
  var onChange = _ref.onChange,
57
59
  onSelect = _ref.onSelect,
58
60
  onKeyDown = _ref.onKeyDown,
@@ -108,20 +110,19 @@ var LinkSearchList = exports.LinkSearchList = /*#__PURE__*/(0, _react.forwardRef
108
110
  }, [activeIndex, items, onKeyDown]);
109
111
  if ((items === null || items === void 0 ? void 0 : items.length) === 0) {
110
112
  if ((0, _platformFeatureFlags.fg)('platform.linking-platform.link-picker.enable-empty-state')) {
111
- if (hasSearchTerm) {
112
- return (0, _react2.jsx)(_linkSearchNoResults.NoResults, null);
113
- } else {
114
- return (
115
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
116
- (0, _react2.jsx)("div", {
117
- css: emptyStateNoResultsWrapper
118
- }, activePlugin !== null && activePlugin !== void 0 && activePlugin.emptyStateNoResults ? activePlugin.emptyStateNoResults() : null)
119
- );
113
+ if (!hasSearchTerm) {
114
+ var _activePlugin$emptySt;
115
+ var emptyState = activePlugin === null || activePlugin === void 0 || (_activePlugin$emptySt = activePlugin.emptyStateNoResults) === null || _activePlugin$emptySt === void 0 ? void 0 : _activePlugin$emptySt.call(activePlugin);
116
+ if (emptyState) {
117
+ return (0, _react2.jsx)(_primitives.Box, {
118
+ xcss: emptyStateNoResultsWrapper
119
+ }, emptyState);
120
+ }
120
121
  }
121
- } else {
122
- return (0, _react2.jsx)(_linkSearchNoResults.NoResults, null);
123
122
  }
123
+ return (0, _react2.jsx)(_linkSearchNoResults.NoResults, null);
124
124
  }
125
+ var listItemNameMaxLines = activePlugin === null || activePlugin === void 0 || (_activePlugin$uiOptio = activePlugin.uiOptions) === null || _activePlugin$uiOptio === void 0 ? void 0 : _activePlugin$uiOptio.listItemNameMaxLines;
125
126
  if (items && items.length > 0) {
126
127
  itemsContent = (0, _react2.jsx)(_react.Fragment, null, (0, _react2.jsx)("div", {
127
128
  // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
@@ -162,7 +163,8 @@ var LinkSearchList = exports.LinkSearchList = /*#__PURE__*/(0, _react.forwardRef
162
163
  tabIndex: getTabIndex(index),
163
164
  ref: function ref(el) {
164
165
  return itemRefCallback(el, item.objectId);
165
- }
166
+ },
167
+ nameMaxLines: listItemNameMaxLines
166
168
  });
167
169
  })));
168
170
  }
@@ -1,12 +1,15 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.testIds = exports.LinkSearchListItem = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
7
9
  var _react = require("react");
8
10
  var _react2 = require("@emotion/react");
9
11
  var _reactIntlNext = require("react-intl-next");
12
+ var _primitives = require("@atlaskit/primitives");
10
13
  var _transformTimeStamp = require("../../../transformTimeStamp");
11
14
  var _styled = require("./styled");
12
15
  /**
@@ -63,21 +66,54 @@ var ListItemIcon = function ListItemIcon(props) {
63
66
  }))
64
67
  );
65
68
  };
66
- var LinkSearchListItem = exports.LinkSearchListItem = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
67
- var item = _ref.item,
68
- selected = _ref.selected,
69
- id = _ref.id,
70
- role = _ref.role,
71
- onSelect = _ref.onSelect,
72
- tabIndex = _ref.tabIndex,
73
- onKeyDown = _ref.onKeyDown,
74
- onFocus = _ref.onFocus;
69
+ var ListItemSubtitle = function ListItemSubtitle(_ref) {
70
+ var _ref$items = (0, _slicedToArray2.default)(_ref.items, 2),
71
+ firstItem = _ref$items[0],
72
+ secondItem = _ref$items[1];
73
+ return /* eslint-disable @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766 */(
74
+ (0, _react2.jsx)("div", {
75
+ "data-testid": "".concat(testIds.searchResultItem, "-subtitle"),
76
+ css: _styled.listItemContextStyles
77
+ }, (0, _react2.jsx)("div", {
78
+ css: _styled.listItemContainerStyles
79
+ }, (0, _react2.jsx)("span", {
80
+ css: _styled.listItemContainerInnerStyles
81
+ }, firstItem)), secondItem && (0, _react2.jsx)("div", {
82
+ css: _styled.listItemContainerInnerStyles
83
+ }, (0, _react2.jsx)(_react.Fragment, null, "\xA0 \u2022\xA0 "), (0, _react2.jsx)(_react.Fragment, null, secondItem)))
84
+ );
85
+ /* eslint-enable @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766 */
86
+ };
87
+ var getDefaultSubtitleItems = function getDefaultSubtitleItems(item, intl) {
88
+ var container = item.container;
89
+ var date = (0, _transformTimeStamp.transformTimeStamp)(intl, item.lastViewedDate, item.lastUpdatedDate);
90
+ if (container) {
91
+ if (date) {
92
+ return [container, date];
93
+ }
94
+ return [container];
95
+ }
96
+ if (date) {
97
+ return [date];
98
+ }
99
+ return undefined;
100
+ };
101
+ var LinkSearchListItem = exports.LinkSearchListItem = /*#__PURE__*/(0, _react.forwardRef)(function (_ref2, ref) {
102
+ var item = _ref2.item,
103
+ selected = _ref2.selected,
104
+ id = _ref2.id,
105
+ role = _ref2.role,
106
+ onSelect = _ref2.onSelect,
107
+ tabIndex = _ref2.tabIndex,
108
+ onKeyDown = _ref2.onKeyDown,
109
+ onFocus = _ref2.onFocus,
110
+ _ref2$nameMaxLines = _ref2.nameMaxLines,
111
+ nameMaxLines = _ref2$nameMaxLines === void 0 ? 1 : _ref2$nameMaxLines;
75
112
  var intl = (0, _reactIntlNext.useIntl)();
76
113
  var handleSelect = function handleSelect() {
77
114
  return onSelect(item.objectId);
78
115
  };
79
- var container = item.container || null;
80
- var date = (0, _transformTimeStamp.transformTimeStamp)(intl, item.lastViewedDate, item.lastUpdatedDate);
116
+ var subtitleItems = item.subtitleItems || getDefaultSubtitleItems(item, intl);
81
117
  return (0, _react2.jsx)("div", {
82
118
  // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
83
119
  css: (0, _styled.composeListItemStyles)(selected),
@@ -95,24 +131,12 @@ var LinkSearchListItem = exports.LinkSearchListItem = /*#__PURE__*/(0, _react.fo
95
131
  intl: intl
96
132
  }), (0, _react2.jsx)("div", {
97
133
  css: _styled.itemNameStyles
98
- }, (0, _react2.jsx)("div", {
99
- "data-testid": "".concat(testIds.searchResultItem, "-title")
100
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
101
- ,
102
- css: _styled.listItemNameStyles,
103
- title: item.name
104
- }, item.name), (0, _react2.jsx)("div", {
105
- "data-testid": "".concat(testIds.searchResultItem, "-subtitle"),
106
- css: _styled.listItemContextStyles
107
- }, container &&
108
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
109
- (0, _react2.jsx)("div", {
110
- css: _styled.listItemContainerStyles
134
+ }, (0, _react2.jsx)(_primitives.Text, {
135
+ maxLines: nameMaxLines
111
136
  }, (0, _react2.jsx)("span", {
112
- css: _styled.listItemContainerInnerStyles
113
- }, container)), date &&
114
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
115
- (0, _react2.jsx)("div", {
116
- css: _styled.listItemContainerInnerStyles
117
- }, container && (0, _react2.jsx)(_react.Fragment, null, "\xA0 \u2022\xA0 "), (0, _react2.jsx)(_react.Fragment, null, date)))));
137
+ "data-testid": "".concat(testIds.searchResultItem, "-title"),
138
+ title: item.name
139
+ }, item.name)), subtitleItems && (0, _react2.jsx)(ListItemSubtitle, {
140
+ items: subtitleItems
141
+ })));
118
142
  });
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.relativeFontSizeToBase16 = exports.listItemNameStyles = exports.listItemContextStyles = exports.listItemContainerStyles = exports.listItemContainerInnerStyles = exports.itemNameStyles = exports.itemIconStyles = exports.imgStyles = exports.composeListItemStyles = void 0;
6
+ exports.relativeFontSizeToBase16 = exports.listItemContextStyles = exports.listItemContainerStyles = exports.listItemContainerInnerStyles = exports.itemNameStyles = exports.itemIconStyles = exports.imgStyles = exports.composeListItemStyles = void 0;
7
7
  var _react = require("@emotion/react");
8
8
  var _colors = require("@atlaskit/theme/colors");
9
9
  var _constants = require("@atlaskit/theme/constants");
@@ -68,16 +68,8 @@ var composeListItemStyles = exports.composeListItemStyles = function composeList
68
68
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
69
69
  var itemNameStyles = exports.itemNameStyles = (0, _react.css)({
70
70
  overflow: 'hidden',
71
- alignContent: 'center'
72
- });
73
-
74
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
75
- var listItemNameStyles = exports.listItemNameStyles = (0, _react.css)({
76
- color: "var(--ds-text, ".concat(_colors.N800, ")"),
77
- overflow: 'hidden',
78
- textOverflow: 'ellipsis',
79
- whiteSpace: 'nowrap',
80
- lineHeight: '20px'
71
+ alignContent: 'center',
72
+ width: '100%'
81
73
  });
82
74
 
83
75
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
@@ -32,7 +32,7 @@ var testIds = exports.testIds = {
32
32
  };
33
33
  var PACKAGE_DATA = exports.PACKAGE_DATA = {
34
34
  packageName: "@atlaskit/link-picker" || '',
35
- packageVersion: "1.43.0" || '',
35
+ packageVersion: "1.44.0" || '',
36
36
  componentName: _constants.COMPONENT_NAME,
37
37
  source: _constants.COMPONENT_NAME
38
38
  };
@@ -6,9 +6,10 @@ import _extends from "@babel/runtime/helpers/extends";
6
6
  import { forwardRef, Fragment, useCallback, useRef } from 'react';
7
7
 
8
8
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
9
- import { css, jsx } from '@emotion/react';
9
+ import { jsx } from '@emotion/react';
10
10
  import { defineMessages, FormattedMessage } from 'react-intl-next';
11
11
  import { fg } from '@atlaskit/platform-feature-flags';
12
+ import { Box, xcss } from '@atlaskit/primitives';
12
13
  import Spinner from '@atlaskit/spinner';
13
14
  import VisuallyHidden from '@atlaskit/visually-hidden';
14
15
  import { MinHeightContainer } from '../../../../common/ui/min-height-container';
@@ -42,8 +43,8 @@ export const testIds = {
42
43
  searchResultLoadingIndicator: 'link-picker.results-loading-indicator',
43
44
  tabsLoadingIndicator: 'link-picker.tabs-loading-indicator'
44
45
  };
45
- const emptyStateNoResultsWrapper = css({
46
- minHeight: "var(--ds-space-200, 16px)"
46
+ const emptyStateNoResultsWrapper = xcss({
47
+ minHeight: 'space.200'
47
48
  });
48
49
  export const LinkSearchList = /*#__PURE__*/forwardRef(({
49
50
  onChange,
@@ -62,6 +63,7 @@ export const LinkSearchList = /*#__PURE__*/forwardRef(({
62
63
  activePlugin,
63
64
  ...restProps
64
65
  }, ref) => {
66
+ var _activePlugin$uiOptio;
65
67
  let itemsContent;
66
68
  let loadingContent;
67
69
  const linkListTitle = hasSearchTerm ? messages.titleResults : messages.titleRecentlyViewed;
@@ -102,20 +104,19 @@ export const LinkSearchList = /*#__PURE__*/forwardRef(({
102
104
  }, [activeIndex, items, onKeyDown]);
103
105
  if ((items === null || items === void 0 ? void 0 : items.length) === 0) {
104
106
  if (fg('platform.linking-platform.link-picker.enable-empty-state')) {
105
- if (hasSearchTerm) {
106
- return jsx(NoResults, null);
107
- } else {
108
- return (
109
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
110
- jsx("div", {
111
- css: emptyStateNoResultsWrapper
112
- }, activePlugin !== null && activePlugin !== void 0 && activePlugin.emptyStateNoResults ? activePlugin.emptyStateNoResults() : null)
113
- );
107
+ if (!hasSearchTerm) {
108
+ var _activePlugin$emptySt;
109
+ const emptyState = activePlugin === null || activePlugin === void 0 ? void 0 : (_activePlugin$emptySt = activePlugin.emptyStateNoResults) === null || _activePlugin$emptySt === void 0 ? void 0 : _activePlugin$emptySt.call(activePlugin);
110
+ if (emptyState) {
111
+ return jsx(Box, {
112
+ xcss: emptyStateNoResultsWrapper
113
+ }, emptyState);
114
+ }
114
115
  }
115
- } else {
116
- return jsx(NoResults, null);
117
116
  }
117
+ return jsx(NoResults, null);
118
118
  }
119
+ const listItemNameMaxLines = activePlugin === null || activePlugin === void 0 ? void 0 : (_activePlugin$uiOptio = activePlugin.uiOptions) === null || _activePlugin$uiOptio === void 0 ? void 0 : _activePlugin$uiOptio.listItemNameMaxLines;
119
120
  if (items && items.length > 0) {
120
121
  itemsContent = jsx(Fragment, null, jsx("div", {
121
122
  // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
@@ -151,7 +152,8 @@ export const LinkSearchList = /*#__PURE__*/forwardRef(({
151
152
  onSelect: onSelect,
152
153
  key: item.objectId,
153
154
  tabIndex: getTabIndex(index),
154
- ref: el => itemRefCallback(el, item.objectId)
155
+ ref: el => itemRefCallback(el, item.objectId),
156
+ nameMaxLines: listItemNameMaxLines
155
157
  }))));
156
158
  }
157
159
  if (isLoading) {
@@ -7,9 +7,10 @@ import { forwardRef, Fragment } from 'react';
7
7
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
8
8
  import { jsx } from '@emotion/react';
9
9
  import { useIntl } from 'react-intl-next';
10
+ import { Text } from '@atlaskit/primitives';
10
11
  /* eslint-disable-next-line @atlassian/tangerine/import/no-parent-imports */
11
12
  import { transformTimeStamp } from '../../../transformTimeStamp';
12
- import { composeListItemStyles, imgStyles, itemIconStyles, itemNameStyles, listItemContainerInnerStyles, listItemContainerStyles, listItemContextStyles, listItemNameStyles } from './styled';
13
+ import { composeListItemStyles, imgStyles, itemIconStyles, itemNameStyles, listItemContainerInnerStyles, listItemContainerStyles, listItemContextStyles } from './styled';
13
14
  export const testIds = {
14
15
  searchResultItem: 'link-search-list-item',
15
16
  searchResultIcon: 'link-search-list-item-icon'
@@ -55,6 +56,37 @@ const ListItemIcon = props => {
55
56
  }))
56
57
  );
57
58
  };
59
+ const ListItemSubtitle = ({
60
+ items: [firstItem, secondItem]
61
+ }) => {
62
+ return /* eslint-disable @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766 */(
63
+ jsx("div", {
64
+ "data-testid": `${testIds.searchResultItem}-subtitle`,
65
+ css: listItemContextStyles
66
+ }, jsx("div", {
67
+ css: listItemContainerStyles
68
+ }, jsx("span", {
69
+ css: listItemContainerInnerStyles
70
+ }, firstItem)), secondItem && jsx("div", {
71
+ css: listItemContainerInnerStyles
72
+ }, jsx(Fragment, null, "\xA0 \u2022\xA0 "), jsx(Fragment, null, secondItem)))
73
+ );
74
+ /* eslint-enable @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766 */
75
+ };
76
+ const getDefaultSubtitleItems = (item, intl) => {
77
+ const container = item.container;
78
+ const date = transformTimeStamp(intl, item.lastViewedDate, item.lastUpdatedDate);
79
+ if (container) {
80
+ if (date) {
81
+ return [container, date];
82
+ }
83
+ return [container];
84
+ }
85
+ if (date) {
86
+ return [date];
87
+ }
88
+ return undefined;
89
+ };
58
90
  export const LinkSearchListItem = /*#__PURE__*/forwardRef(({
59
91
  item,
60
92
  selected,
@@ -63,12 +95,12 @@ export const LinkSearchListItem = /*#__PURE__*/forwardRef(({
63
95
  onSelect,
64
96
  tabIndex,
65
97
  onKeyDown,
66
- onFocus
98
+ onFocus,
99
+ nameMaxLines = 1
67
100
  }, ref) => {
68
101
  const intl = useIntl();
69
102
  const handleSelect = () => onSelect(item.objectId);
70
- const container = item.container || null;
71
- const date = transformTimeStamp(intl, item.lastViewedDate, item.lastUpdatedDate);
103
+ const subtitleItems = item.subtitleItems || getDefaultSubtitleItems(item, intl);
72
104
  return jsx("div", {
73
105
  // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
74
106
  css: composeListItemStyles(selected),
@@ -86,24 +118,12 @@ export const LinkSearchListItem = /*#__PURE__*/forwardRef(({
86
118
  intl: intl
87
119
  }), jsx("div", {
88
120
  css: itemNameStyles
89
- }, jsx("div", {
90
- "data-testid": `${testIds.searchResultItem}-title`
91
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
92
- ,
93
- css: listItemNameStyles,
94
- title: item.name
95
- }, item.name), jsx("div", {
96
- "data-testid": `${testIds.searchResultItem}-subtitle`,
97
- css: listItemContextStyles
98
- }, container &&
99
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
100
- jsx("div", {
101
- css: listItemContainerStyles
121
+ }, jsx(Text, {
122
+ maxLines: nameMaxLines
102
123
  }, jsx("span", {
103
- css: listItemContainerInnerStyles
104
- }, container)), date &&
105
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
106
- jsx("div", {
107
- css: listItemContainerInnerStyles
108
- }, container && jsx(Fragment, null, "\xA0 \u2022\xA0 "), jsx(Fragment, null, date)))));
124
+ "data-testid": `${testIds.searchResultItem}-title`,
125
+ title: item.name
126
+ }, item.name)), subtitleItems && jsx(ListItemSubtitle, {
127
+ items: subtitleItems
128
+ })));
109
129
  });
@@ -1,6 +1,6 @@
1
1
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
2
2
  import { css } from '@emotion/react';
3
- import { B100, B400, B50, N20, N200, N300, N800 } from '@atlaskit/theme/colors';
3
+ import { B100, B400, B50, N20, N200, N300 } from '@atlaskit/theme/colors';
4
4
  import { fontSize, fontSizeSmall } from '@atlaskit/theme/constants';
5
5
  // AFP-2532 TODO: Fix automatic suppressions below
6
6
  // eslint-disable-next-line @atlassian/tangerine/import/entry-points
@@ -60,16 +60,8 @@ export const composeListItemStyles = (selected = false) => {
60
60
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
61
61
  export const itemNameStyles = css({
62
62
  overflow: 'hidden',
63
- alignContent: 'center'
64
- });
65
-
66
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
67
- export const listItemNameStyles = css({
68
- color: `var(--ds-text, ${N800})`,
69
- overflow: 'hidden',
70
- textOverflow: 'ellipsis',
71
- whiteSpace: 'nowrap',
72
- lineHeight: '20px'
63
+ alignContent: 'center',
64
+ width: '100%'
73
65
  });
74
66
 
75
67
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
@@ -20,7 +20,7 @@ export const testIds = {
20
20
  };
21
21
  export const PACKAGE_DATA = {
22
22
  packageName: "@atlaskit/link-picker" || '',
23
- packageVersion: "1.43.0" || '',
23
+ packageVersion: "1.44.0" || '',
24
24
  componentName: COMPONENT_NAME,
25
25
  source: COMPONENT_NAME
26
26
  };
@@ -11,9 +11,10 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
11
11
  import { forwardRef, Fragment, useCallback, useRef } from 'react';
12
12
 
13
13
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
14
- import { css, jsx } from '@emotion/react';
14
+ import { jsx } from '@emotion/react';
15
15
  import { defineMessages, FormattedMessage } from 'react-intl-next';
16
16
  import { fg } from '@atlaskit/platform-feature-flags';
17
+ import { Box, xcss } from '@atlaskit/primitives';
17
18
  import Spinner from '@atlaskit/spinner';
18
19
  import VisuallyHidden from '@atlaskit/visually-hidden';
19
20
  import { MinHeightContainer } from '../../../../common/ui/min-height-container';
@@ -45,10 +46,11 @@ export var testIds = _objectSpread(_objectSpread(_objectSpread({}, noResultsTest
45
46
  searchResultLoadingIndicator: 'link-picker.results-loading-indicator',
46
47
  tabsLoadingIndicator: 'link-picker.tabs-loading-indicator'
47
48
  });
48
- var emptyStateNoResultsWrapper = css({
49
- minHeight: "var(--ds-space-200, 16px)"
49
+ var emptyStateNoResultsWrapper = xcss({
50
+ minHeight: 'space.200'
50
51
  });
51
52
  export var LinkSearchList = /*#__PURE__*/forwardRef(function (_ref, ref) {
53
+ var _activePlugin$uiOptio;
52
54
  var onChange = _ref.onChange,
53
55
  onSelect = _ref.onSelect,
54
56
  onKeyDown = _ref.onKeyDown,
@@ -104,20 +106,19 @@ export var LinkSearchList = /*#__PURE__*/forwardRef(function (_ref, ref) {
104
106
  }, [activeIndex, items, onKeyDown]);
105
107
  if ((items === null || items === void 0 ? void 0 : items.length) === 0) {
106
108
  if (fg('platform.linking-platform.link-picker.enable-empty-state')) {
107
- if (hasSearchTerm) {
108
- return jsx(NoResults, null);
109
- } else {
110
- return (
111
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
112
- jsx("div", {
113
- css: emptyStateNoResultsWrapper
114
- }, activePlugin !== null && activePlugin !== void 0 && activePlugin.emptyStateNoResults ? activePlugin.emptyStateNoResults() : null)
115
- );
109
+ if (!hasSearchTerm) {
110
+ var _activePlugin$emptySt;
111
+ var emptyState = activePlugin === null || activePlugin === void 0 || (_activePlugin$emptySt = activePlugin.emptyStateNoResults) === null || _activePlugin$emptySt === void 0 ? void 0 : _activePlugin$emptySt.call(activePlugin);
112
+ if (emptyState) {
113
+ return jsx(Box, {
114
+ xcss: emptyStateNoResultsWrapper
115
+ }, emptyState);
116
+ }
116
117
  }
117
- } else {
118
- return jsx(NoResults, null);
119
118
  }
119
+ return jsx(NoResults, null);
120
120
  }
121
+ var listItemNameMaxLines = activePlugin === null || activePlugin === void 0 || (_activePlugin$uiOptio = activePlugin.uiOptions) === null || _activePlugin$uiOptio === void 0 ? void 0 : _activePlugin$uiOptio.listItemNameMaxLines;
121
122
  if (items && items.length > 0) {
122
123
  itemsContent = jsx(Fragment, null, jsx("div", {
123
124
  // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
@@ -158,7 +159,8 @@ export var LinkSearchList = /*#__PURE__*/forwardRef(function (_ref, ref) {
158
159
  tabIndex: getTabIndex(index),
159
160
  ref: function ref(el) {
160
161
  return itemRefCallback(el, item.objectId);
161
- }
162
+ },
163
+ nameMaxLines: listItemNameMaxLines
162
164
  });
163
165
  })));
164
166
  }
@@ -1,3 +1,4 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
1
2
  /**
2
3
  * @jsxRuntime classic
3
4
  * @jsx jsx
@@ -7,9 +8,10 @@ import { forwardRef, Fragment } from 'react';
7
8
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
8
9
  import { jsx } from '@emotion/react';
9
10
  import { useIntl } from 'react-intl-next';
11
+ import { Text } from '@atlaskit/primitives';
10
12
  /* eslint-disable-next-line @atlassian/tangerine/import/no-parent-imports */
11
13
  import { transformTimeStamp } from '../../../transformTimeStamp';
12
- import { composeListItemStyles, imgStyles, itemIconStyles, itemNameStyles, listItemContainerInnerStyles, listItemContainerStyles, listItemContextStyles, listItemNameStyles } from './styled';
14
+ import { composeListItemStyles, imgStyles, itemIconStyles, itemNameStyles, listItemContainerInnerStyles, listItemContainerStyles, listItemContextStyles } from './styled';
13
15
  export var testIds = {
14
16
  searchResultItem: 'link-search-list-item',
15
17
  searchResultIcon: 'link-search-list-item-icon'
@@ -55,21 +57,54 @@ var ListItemIcon = function ListItemIcon(props) {
55
57
  }))
56
58
  );
57
59
  };
58
- export var LinkSearchListItem = /*#__PURE__*/forwardRef(function (_ref, ref) {
59
- var item = _ref.item,
60
- selected = _ref.selected,
61
- id = _ref.id,
62
- role = _ref.role,
63
- onSelect = _ref.onSelect,
64
- tabIndex = _ref.tabIndex,
65
- onKeyDown = _ref.onKeyDown,
66
- onFocus = _ref.onFocus;
60
+ var ListItemSubtitle = function ListItemSubtitle(_ref) {
61
+ var _ref$items = _slicedToArray(_ref.items, 2),
62
+ firstItem = _ref$items[0],
63
+ secondItem = _ref$items[1];
64
+ return /* eslint-disable @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766 */(
65
+ jsx("div", {
66
+ "data-testid": "".concat(testIds.searchResultItem, "-subtitle"),
67
+ css: listItemContextStyles
68
+ }, jsx("div", {
69
+ css: listItemContainerStyles
70
+ }, jsx("span", {
71
+ css: listItemContainerInnerStyles
72
+ }, firstItem)), secondItem && jsx("div", {
73
+ css: listItemContainerInnerStyles
74
+ }, jsx(Fragment, null, "\xA0 \u2022\xA0 "), jsx(Fragment, null, secondItem)))
75
+ );
76
+ /* eslint-enable @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766 */
77
+ };
78
+ var getDefaultSubtitleItems = function getDefaultSubtitleItems(item, intl) {
79
+ var container = item.container;
80
+ var date = transformTimeStamp(intl, item.lastViewedDate, item.lastUpdatedDate);
81
+ if (container) {
82
+ if (date) {
83
+ return [container, date];
84
+ }
85
+ return [container];
86
+ }
87
+ if (date) {
88
+ return [date];
89
+ }
90
+ return undefined;
91
+ };
92
+ export var LinkSearchListItem = /*#__PURE__*/forwardRef(function (_ref2, ref) {
93
+ var item = _ref2.item,
94
+ selected = _ref2.selected,
95
+ id = _ref2.id,
96
+ role = _ref2.role,
97
+ onSelect = _ref2.onSelect,
98
+ tabIndex = _ref2.tabIndex,
99
+ onKeyDown = _ref2.onKeyDown,
100
+ onFocus = _ref2.onFocus,
101
+ _ref2$nameMaxLines = _ref2.nameMaxLines,
102
+ nameMaxLines = _ref2$nameMaxLines === void 0 ? 1 : _ref2$nameMaxLines;
67
103
  var intl = useIntl();
68
104
  var handleSelect = function handleSelect() {
69
105
  return onSelect(item.objectId);
70
106
  };
71
- var container = item.container || null;
72
- var date = transformTimeStamp(intl, item.lastViewedDate, item.lastUpdatedDate);
107
+ var subtitleItems = item.subtitleItems || getDefaultSubtitleItems(item, intl);
73
108
  return jsx("div", {
74
109
  // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
75
110
  css: composeListItemStyles(selected),
@@ -87,24 +122,12 @@ export var LinkSearchListItem = /*#__PURE__*/forwardRef(function (_ref, ref) {
87
122
  intl: intl
88
123
  }), jsx("div", {
89
124
  css: itemNameStyles
90
- }, jsx("div", {
91
- "data-testid": "".concat(testIds.searchResultItem, "-title")
92
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
93
- ,
94
- css: listItemNameStyles,
95
- title: item.name
96
- }, item.name), jsx("div", {
97
- "data-testid": "".concat(testIds.searchResultItem, "-subtitle"),
98
- css: listItemContextStyles
99
- }, container &&
100
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
101
- jsx("div", {
102
- css: listItemContainerStyles
125
+ }, jsx(Text, {
126
+ maxLines: nameMaxLines
103
127
  }, jsx("span", {
104
- css: listItemContainerInnerStyles
105
- }, container)), date &&
106
- // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
107
- jsx("div", {
108
- css: listItemContainerInnerStyles
109
- }, container && jsx(Fragment, null, "\xA0 \u2022\xA0 "), jsx(Fragment, null, date)))));
128
+ "data-testid": "".concat(testIds.searchResultItem, "-title"),
129
+ title: item.name
130
+ }, item.name)), subtitleItems && jsx(ListItemSubtitle, {
131
+ items: subtitleItems
132
+ })));
110
133
  });
@@ -1,6 +1,6 @@
1
1
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
2
2
  import { css } from '@emotion/react';
3
- import { B100, B400, B50, N20, N200, N300, N800 } from '@atlaskit/theme/colors';
3
+ import { B100, B400, B50, N20, N200, N300 } from '@atlaskit/theme/colors';
4
4
  import { fontSize, fontSizeSmall } from '@atlaskit/theme/constants';
5
5
  // AFP-2532 TODO: Fix automatic suppressions below
6
6
  // eslint-disable-next-line @atlassian/tangerine/import/entry-points
@@ -61,16 +61,8 @@ export var composeListItemStyles = function composeListItemStyles() {
61
61
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
62
62
  export var itemNameStyles = css({
63
63
  overflow: 'hidden',
64
- alignContent: 'center'
65
- });
66
-
67
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
68
- export var listItemNameStyles = css({
69
- color: "var(--ds-text, ".concat(N800, ")"),
70
- overflow: 'hidden',
71
- textOverflow: 'ellipsis',
72
- whiteSpace: 'nowrap',
73
- lineHeight: '20px'
64
+ alignContent: 'center',
65
+ width: '100%'
74
66
  });
75
67
 
76
68
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-exported-styles -- Ignored via go/DSP-18766
@@ -21,7 +21,7 @@ export var testIds = {
21
21
  };
22
22
  export var PACKAGE_DATA = {
23
23
  packageName: "@atlaskit/link-picker" || '',
24
- packageVersion: "1.43.0" || '',
24
+ packageVersion: "1.44.0" || '',
25
25
  componentName: COMPONENT_NAME,
26
26
  source: COMPONENT_NAME
27
27
  };
@@ -28,6 +28,11 @@ export interface LinkSearchListItemData {
28
28
  /** The data source that provided the result */
29
29
  source?: string;
30
30
  };
31
+ /**
32
+ * Optionally override the strings shown in the link result's subtitle
33
+ * (by default, the subtitle is the container and date). Provide translated strings.
34
+ */
35
+ subtitleItems?: Readonly<[string, string?]>;
31
36
  }
32
37
  export interface LinkPickerState {
33
38
  /** Current query string / URL input field value */
@@ -36,6 +41,10 @@ export interface LinkPickerState {
36
41
  export interface ResolveResult {
37
42
  data: LinkSearchListItemData[];
38
43
  }
44
+ export interface LinkPickerUiOptions {
45
+ /** Maximum number of lines to display for the item name */
46
+ listItemNameMaxLines?: number;
47
+ }
39
48
  export interface LinkPickerPlugin {
40
49
  resolve: (state: LinkPickerState) => Promise<ResolveResult> | AsyncGenerator<ResolveResult, ResolveResult>;
41
50
  /** Uniquely identify the tab */
@@ -55,6 +64,8 @@ export interface LinkPickerPlugin {
55
64
  UNSAFE_onActivation?: () => void;
56
65
  /** Register Plugin Actions */
57
66
  action?: LinkPickerPluginAction;
67
+ /** Options to override certain configurable styles in the link picker */
68
+ uiOptions?: LinkPickerUiOptions;
58
69
  }
59
70
  export interface LinkPickerPluginAction {
60
71
  label: MessageDescriptor | string;
@@ -1,6 +1,6 @@
1
1
  export { default } from './ui';
2
2
  export { DeprecatedLazyLinkPickerExport as LinkPicker } from './ui';
3
3
  export type { LinkPickerProps } from './common/types';
4
- export type { LinkInputType, LinkPickerPluginAction, LinkPickerPlugin, LinkPickerState, LinkSearchListItemData, LinkPickerPluginErrorFallback, LinkPickerPluginEmptyStateNoResults, } from './common/types';
4
+ export type { LinkInputType, LinkPickerPluginAction, LinkPickerPlugin, LinkPickerState, LinkSearchListItemData, LinkPickerPluginErrorFallback, LinkPickerPluginEmptyStateNoResults, LinkPickerUiOptions, } from './common/types';
5
5
  export { UnauthenticatedError } from './common/utils/errors';
6
6
  export { LoaderFallback } from './ui/loader-fallback';
@@ -18,5 +18,6 @@ export interface LinkSearchListItemProps {
18
18
  onFocus: () => void;
19
19
  id?: string;
20
20
  role?: string;
21
+ nameMaxLines?: number;
21
22
  }
22
23
  export declare const LinkSearchListItem: import("react").ForwardRefExoticComponent<LinkSearchListItemProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -1,7 +1,6 @@
1
1
  export declare const relativeFontSizeToBase16: (px: number | string) => string;
2
2
  export declare const composeListItemStyles: (selected?: boolean) => import("@emotion/react").SerializedStyles;
3
3
  export declare const itemNameStyles: import("@emotion/react").SerializedStyles;
4
- export declare const listItemNameStyles: import("@emotion/react").SerializedStyles;
5
4
  export declare const listItemContextStyles: import("@emotion/react").SerializedStyles;
6
5
  export declare const listItemContainerStyles: import("@emotion/react").SerializedStyles;
7
6
  export declare const listItemContainerInnerStyles: import("@emotion/react").SerializedStyles;
@@ -28,6 +28,14 @@ export interface LinkSearchListItemData {
28
28
  /** The data source that provided the result */
29
29
  source?: string;
30
30
  };
31
+ /**
32
+ * Optionally override the strings shown in the link result's subtitle
33
+ * (by default, the subtitle is the container and date). Provide translated strings.
34
+ */
35
+ subtitleItems?: Readonly<[
36
+ string,
37
+ string?
38
+ ]>;
31
39
  }
32
40
  export interface LinkPickerState {
33
41
  /** Current query string / URL input field value */
@@ -36,6 +44,10 @@ export interface LinkPickerState {
36
44
  export interface ResolveResult {
37
45
  data: LinkSearchListItemData[];
38
46
  }
47
+ export interface LinkPickerUiOptions {
48
+ /** Maximum number of lines to display for the item name */
49
+ listItemNameMaxLines?: number;
50
+ }
39
51
  export interface LinkPickerPlugin {
40
52
  resolve: (state: LinkPickerState) => Promise<ResolveResult> | AsyncGenerator<ResolveResult, ResolveResult>;
41
53
  /** Uniquely identify the tab */
@@ -55,6 +67,8 @@ export interface LinkPickerPlugin {
55
67
  UNSAFE_onActivation?: () => void;
56
68
  /** Register Plugin Actions */
57
69
  action?: LinkPickerPluginAction;
70
+ /** Options to override certain configurable styles in the link picker */
71
+ uiOptions?: LinkPickerUiOptions;
58
72
  }
59
73
  export interface LinkPickerPluginAction {
60
74
  label: MessageDescriptor | string;
@@ -1,6 +1,6 @@
1
1
  export { default } from './ui';
2
2
  export { DeprecatedLazyLinkPickerExport as LinkPicker } from './ui';
3
3
  export type { LinkPickerProps } from './common/types';
4
- export type { LinkInputType, LinkPickerPluginAction, LinkPickerPlugin, LinkPickerState, LinkSearchListItemData, LinkPickerPluginErrorFallback, LinkPickerPluginEmptyStateNoResults, } from './common/types';
4
+ export type { LinkInputType, LinkPickerPluginAction, LinkPickerPlugin, LinkPickerState, LinkSearchListItemData, LinkPickerPluginErrorFallback, LinkPickerPluginEmptyStateNoResults, LinkPickerUiOptions, } from './common/types';
5
5
  export { UnauthenticatedError } from './common/utils/errors';
6
6
  export { LoaderFallback } from './ui/loader-fallback';
@@ -18,5 +18,6 @@ export interface LinkSearchListItemProps {
18
18
  onFocus: () => void;
19
19
  id?: string;
20
20
  role?: string;
21
+ nameMaxLines?: number;
21
22
  }
22
23
  export declare const LinkSearchListItem: import("react").ForwardRefExoticComponent<LinkSearchListItemProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -1,7 +1,6 @@
1
1
  export declare const relativeFontSizeToBase16: (px: number | string) => string;
2
2
  export declare const composeListItemStyles: (selected?: boolean) => import("@emotion/react").SerializedStyles;
3
3
  export declare const itemNameStyles: import("@emotion/react").SerializedStyles;
4
- export declare const listItemNameStyles: import("@emotion/react").SerializedStyles;
5
4
  export declare const listItemContextStyles: import("@emotion/react").SerializedStyles;
6
5
  export declare const listItemContainerStyles: import("@emotion/react").SerializedStyles;
7
6
  export declare const listItemContainerInnerStyles: import("@emotion/react").SerializedStyles;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/link-picker",
3
- "version": "1.43.0",
3
+ "version": "1.44.0",
4
4
  "description": "Standalone link picker",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "publishConfig": {
@@ -92,7 +92,7 @@
92
92
  "@af/visual-regression": "*",
93
93
  "@atlaskit/dropdown-menu": "^12.17.0",
94
94
  "@atlaskit/link-provider": "^1.14.0",
95
- "@atlaskit/link-test-helpers": "^7.4.0",
95
+ "@atlaskit/link-test-helpers": "^7.5.0",
96
96
  "@atlaskit/visual-regression": "*",
97
97
  "@atlassian/feature-flags-test-utils": "*",
98
98
  "@testing-library/dom": "^10.1.0",