@atlaskit/editor-common 74.57.0 → 74.58.1

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 (111) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/element-browser/ElementBrowser.js +152 -0
  3. package/dist/cjs/element-browser/ViewMore.js +39 -0
  4. package/dist/cjs/element-browser/components/CategoryList.js +115 -0
  5. package/dist/cjs/element-browser/components/ElementBrowserLoader.js +36 -0
  6. package/dist/cjs/element-browser/components/ElementList/ElementList.js +256 -0
  7. package/dist/cjs/element-browser/components/ElementList/EmptyState.js +47 -0
  8. package/dist/cjs/element-browser/components/ElementList/NotFoundIllustration.js +70 -0
  9. package/dist/cjs/element-browser/components/ElementList/cellSizeAndPositionGetter.js +42 -0
  10. package/dist/cjs/element-browser/components/ElementList/utils.js +54 -0
  11. package/dist/cjs/element-browser/components/ElementSearch.js +88 -0
  12. package/dist/cjs/element-browser/components/StatelessElementBrowser.js +269 -0
  13. package/dist/cjs/element-browser/constants.js +41 -0
  14. package/dist/cjs/element-browser/hooks/use-container-width.js +70 -0
  15. package/dist/cjs/element-browser/hooks/use-focus.js +51 -0
  16. package/dist/cjs/element-browser/hooks/use-select-and-focus-on-arrow-navigation.js +286 -0
  17. package/dist/cjs/element-browser/index.js +20 -0
  18. package/dist/cjs/element-browser/types.js +12 -0
  19. package/dist/cjs/monitoring/error.js +1 -1
  20. package/dist/cjs/ui/DropList/index.js +1 -1
  21. package/dist/cjs/utils/performance/measure-render.js +4 -3
  22. package/dist/cjs/utils/performance/measure-tti.js +9 -3
  23. package/dist/cjs/utils/validator.js +7 -0
  24. package/dist/es2019/element-browser/ElementBrowser.js +117 -0
  25. package/dist/es2019/element-browser/ViewMore.js +40 -0
  26. package/dist/es2019/element-browser/components/CategoryList.js +106 -0
  27. package/dist/es2019/element-browser/components/ElementBrowserLoader.js +21 -0
  28. package/dist/es2019/element-browser/components/ElementList/ElementList.js +320 -0
  29. package/dist/es2019/element-browser/components/ElementList/EmptyState.js +58 -0
  30. package/dist/es2019/element-browser/components/ElementList/NotFoundIllustration.js +65 -0
  31. package/dist/es2019/element-browser/components/ElementList/cellSizeAndPositionGetter.js +39 -0
  32. package/dist/es2019/element-browser/components/ElementList/utils.js +50 -0
  33. package/dist/es2019/element-browser/components/ElementSearch.js +117 -0
  34. package/dist/es2019/element-browser/components/StatelessElementBrowser.js +339 -0
  35. package/dist/es2019/element-browser/constants.js +23 -0
  36. package/dist/es2019/element-browser/hooks/use-container-width.js +59 -0
  37. package/dist/es2019/element-browser/hooks/use-focus.js +48 -0
  38. package/dist/es2019/element-browser/hooks/use-select-and-focus-on-arrow-navigation.js +284 -0
  39. package/dist/es2019/element-browser/index.js +2 -0
  40. package/dist/es2019/element-browser/types.js +5 -0
  41. package/dist/es2019/monitoring/error.js +1 -1
  42. package/dist/es2019/ui/DropList/index.js +1 -1
  43. package/dist/es2019/utils/performance/measure-render.js +2 -3
  44. package/dist/es2019/utils/performance/measure-tti.js +9 -3
  45. package/dist/es2019/utils/validator.js +7 -0
  46. package/dist/esm/element-browser/ElementBrowser.js +142 -0
  47. package/dist/esm/element-browser/ViewMore.js +31 -0
  48. package/dist/esm/element-browser/components/CategoryList.js +105 -0
  49. package/dist/esm/element-browser/components/ElementBrowserLoader.js +23 -0
  50. package/dist/esm/element-browser/components/ElementList/ElementList.js +241 -0
  51. package/dist/esm/element-browser/components/ElementList/EmptyState.js +40 -0
  52. package/dist/esm/element-browser/components/ElementList/NotFoundIllustration.js +63 -0
  53. package/dist/esm/element-browser/components/ElementList/cellSizeAndPositionGetter.js +37 -0
  54. package/dist/esm/element-browser/components/ElementList/utils.js +46 -0
  55. package/dist/esm/element-browser/components/ElementSearch.js +77 -0
  56. package/dist/esm/element-browser/components/StatelessElementBrowser.js +258 -0
  57. package/dist/esm/element-browser/constants.js +23 -0
  58. package/dist/esm/element-browser/hooks/use-container-width.js +61 -0
  59. package/dist/esm/element-browser/hooks/use-focus.js +46 -0
  60. package/dist/esm/element-browser/hooks/use-select-and-focus-on-arrow-navigation.js +278 -0
  61. package/dist/esm/element-browser/index.js +2 -0
  62. package/dist/esm/element-browser/types.js +5 -0
  63. package/dist/esm/monitoring/error.js +1 -1
  64. package/dist/esm/ui/DropList/index.js +1 -1
  65. package/dist/esm/utils/performance/measure-render.js +2 -3
  66. package/dist/esm/utils/performance/measure-tti.js +9 -3
  67. package/dist/esm/utils/validator.js +7 -0
  68. package/dist/types/analytics/types/general-events.d.ts +2 -1
  69. package/dist/types/element-browser/ElementBrowser.d.ts +37 -0
  70. package/dist/types/element-browser/ViewMore.d.ts +6 -0
  71. package/dist/types/element-browser/components/CategoryList.d.ts +10 -0
  72. package/dist/types/element-browser/components/ElementBrowserLoader.d.ts +6 -0
  73. package/dist/types/element-browser/components/ElementList/ElementList.d.ts +33 -0
  74. package/dist/types/element-browser/components/ElementList/EmptyState.d.ts +6 -0
  75. package/dist/types/element-browser/components/ElementList/NotFoundIllustration.d.ts +2 -0
  76. package/dist/types/element-browser/components/ElementList/cellSizeAndPositionGetter.d.ts +7 -0
  77. package/dist/types/element-browser/components/ElementList/utils.d.ts +12 -0
  78. package/dist/types/element-browser/components/ElementSearch.d.ts +18 -0
  79. package/dist/types/element-browser/components/StatelessElementBrowser.d.ts +23 -0
  80. package/dist/types/element-browser/constants.d.ts +19 -0
  81. package/dist/types/element-browser/hooks/use-container-width.d.ts +33 -0
  82. package/dist/types/element-browser/hooks/use-focus.d.ts +35 -0
  83. package/dist/types/element-browser/hooks/use-select-and-focus-on-arrow-navigation.d.ts +72 -0
  84. package/dist/types/element-browser/index.d.ts +2 -0
  85. package/dist/types/element-browser/types.d.ts +12 -0
  86. package/dist/types/types/quick-insert.d.ts +1 -0
  87. package/dist/types/utils/performance/measure-render.d.ts +6 -4
  88. package/dist/types/utils/performance/measure-tti.d.ts +1 -1
  89. package/dist/types-ts4.5/analytics/types/general-events.d.ts +2 -1
  90. package/dist/types-ts4.5/element-browser/ElementBrowser.d.ts +37 -0
  91. package/dist/types-ts4.5/element-browser/ViewMore.d.ts +6 -0
  92. package/dist/types-ts4.5/element-browser/components/CategoryList.d.ts +10 -0
  93. package/dist/types-ts4.5/element-browser/components/ElementBrowserLoader.d.ts +6 -0
  94. package/dist/types-ts4.5/element-browser/components/ElementList/ElementList.d.ts +33 -0
  95. package/dist/types-ts4.5/element-browser/components/ElementList/EmptyState.d.ts +6 -0
  96. package/dist/types-ts4.5/element-browser/components/ElementList/NotFoundIllustration.d.ts +2 -0
  97. package/dist/types-ts4.5/element-browser/components/ElementList/cellSizeAndPositionGetter.d.ts +7 -0
  98. package/dist/types-ts4.5/element-browser/components/ElementList/utils.d.ts +12 -0
  99. package/dist/types-ts4.5/element-browser/components/ElementSearch.d.ts +18 -0
  100. package/dist/types-ts4.5/element-browser/components/StatelessElementBrowser.d.ts +23 -0
  101. package/dist/types-ts4.5/element-browser/constants.d.ts +19 -0
  102. package/dist/types-ts4.5/element-browser/hooks/use-container-width.d.ts +33 -0
  103. package/dist/types-ts4.5/element-browser/hooks/use-focus.d.ts +35 -0
  104. package/dist/types-ts4.5/element-browser/hooks/use-select-and-focus-on-arrow-navigation.d.ts +72 -0
  105. package/dist/types-ts4.5/element-browser/index.d.ts +2 -0
  106. package/dist/types-ts4.5/element-browser/types.d.ts +12 -0
  107. package/dist/types-ts4.5/types/quick-insert.d.ts +1 -0
  108. package/dist/types-ts4.5/utils/performance/measure-render.d.ts +6 -4
  109. package/dist/types-ts4.5/utils/performance/measure-tti.d.ts +1 -1
  110. package/element-browser/package.json +15 -0
  111. package/package.json +6 -2
@@ -0,0 +1,40 @@
1
+ /** @jsx jsx */
2
+ import { useEffect, useRef } from 'react';
3
+ import { css, jsx } from '@emotion/react';
4
+ import { ButtonItem, Section } from '@atlaskit/menu';
5
+ const itemBefore = css`
6
+ width: 40px;
7
+ height: 40px;
8
+ box-sizing: border-box;
9
+ display: flex;
10
+ justify-content: center;
11
+ align-items: center;
12
+ margin-right: ${"var(--ds-space-050, 4px)"};
13
+ `;
14
+ export const ViewMore = ({
15
+ item,
16
+ focus
17
+ }) => {
18
+ const ref = useRef(null);
19
+ useEffect(() => {
20
+ if (ref.current && focus) {
21
+ ref.current.focus();
22
+ }
23
+ }, [focus]);
24
+ return jsx(Section, {
25
+ hasSeparator: true
26
+ }, jsx(ButtonItem, {
27
+ onClick: item.action,
28
+ iconBefore: jsx("div", {
29
+ css: itemBefore
30
+ }, item.icon()),
31
+ "aria-describedby": item.title,
32
+ "data-testid": "view-more-elements-item"
33
+ // @ts-ignore Overriding Menu styles is not supported
34
+ ,
35
+ css: css`
36
+ padding: 0px ${"var(--ds-space-150, 12px)"};
37
+ `,
38
+ ref: ref
39
+ }, item.title));
40
+ };
@@ -0,0 +1,106 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ /** @jsx jsx */
3
+
4
+ import React, { Fragment, memo, useCallback } from 'react';
5
+ import { css, jsx } from '@emotion/react';
6
+ import { withAnalyticsContext } from '@atlaskit/analytics-next';
7
+ import Button from '@atlaskit/button/custom-theme-button';
8
+ import { B400, B50, N800 } from '@atlaskit/theme/colors';
9
+ import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE, fireAnalyticsEvent } from '../../analytics';
10
+ import { DEVICE_BREAKPOINT_NUMBERS, GRID_SIZE } from '../constants';
11
+ import useFocus from '../hooks/use-focus';
12
+ function CategoryList({
13
+ categories = [],
14
+ ...props
15
+ }) {
16
+ const [focusedCategoryIndex, setFocusedCategoryIndex] = React.useState(null);
17
+ return jsx(Fragment, null, categories.map((category, index) => jsx(CategoryListItem, _extends({
18
+ key: category.title,
19
+ index: index,
20
+ category: category,
21
+ focus: focusedCategoryIndex === index,
22
+ setFocusedCategoryIndex: setFocusedCategoryIndex
23
+ }, props))));
24
+ }
25
+ function CategoryListItem({
26
+ category,
27
+ onSelectCategory,
28
+ selectedCategory,
29
+ index,
30
+ focus,
31
+ setFocusedCategoryIndex,
32
+ createAnalyticsEvent
33
+ }) {
34
+ const ref = useFocus(focus);
35
+ const onClick = useCallback(() => {
36
+ onSelectCategory(category);
37
+
38
+ /**
39
+ * When user double clicks on same category, focus on first item.
40
+ */
41
+ if (selectedCategory === category.name) {
42
+ setFocusedCategoryIndex(0);
43
+ } else {
44
+ setFocusedCategoryIndex(index);
45
+ }
46
+ fireAnalyticsEvent(createAnalyticsEvent)({
47
+ payload: {
48
+ action: ACTION.CLICKED,
49
+ actionSubject: ACTION_SUBJECT.BUTTON,
50
+ actionSubjectId: ACTION_SUBJECT_ID.BUTTON_CATEGORY,
51
+ eventType: EVENT_TYPE.TRACK
52
+ }
53
+ });
54
+ }, [onSelectCategory, category, index, selectedCategory, setFocusedCategoryIndex, createAnalyticsEvent]);
55
+ const onFocus = useCallback(() => {
56
+ if (!focus) {
57
+ setFocusedCategoryIndex(index);
58
+ }
59
+ }, [focus, index, setFocusedCategoryIndex]);
60
+ const getTheme = useCallback((currentTheme, themeProps) => {
61
+ const {
62
+ buttonStyles,
63
+ ...rest
64
+ } = currentTheme(themeProps);
65
+ return {
66
+ buttonStyles: {
67
+ ...buttonStyles,
68
+ textAlign: 'start',
69
+ marginLeft: "var(--ds-space-025, 2px)",
70
+ height: '100%',
71
+ width: '100%',
72
+ color: category.name !== selectedCategory ? `var(--ds-text, ${N800})` : `var(--ds-text-selected, ${B400})`,
73
+ ...(category.name === selectedCategory && {
74
+ background: `var(--ds-background-selected, ${B50})`
75
+ })
76
+ },
77
+ ...rest
78
+ };
79
+ }, [category.name, selectedCategory]);
80
+ return jsx("div", {
81
+ css: buttonWrapper
82
+ }, jsx(Button, {
83
+ appearance: "subtle",
84
+ isSelected: selectedCategory === category.name,
85
+ onClick: onClick,
86
+ onFocus: onFocus,
87
+ theme: getTheme,
88
+ ref: ref,
89
+ testId: "element-browser-category-item"
90
+ }, category.title));
91
+ }
92
+ const buttonWrapper = css`
93
+ height: ${GRID_SIZE * 4}px;
94
+ margin: ${"var(--ds-space-050, 4px)"} ${"var(--ds-space-050, 4px)"}
95
+ ${"var(--ds-space-050, 4px)"} 0;
96
+
97
+ @media (min-width: ${DEVICE_BREAKPOINT_NUMBERS.medium}px) {
98
+ :not(:last-child) {
99
+ margin-bottom: 0;
100
+ }
101
+ }
102
+ `;
103
+ const MemoizedCategoryListWithAnalytics = /*#__PURE__*/memo(withAnalyticsContext({
104
+ component: 'CategoryList'
105
+ })(CategoryList));
106
+ export default MemoizedCategoryListWithAnalytics;
@@ -0,0 +1,21 @@
1
+ /** @jsx jsx */
2
+ import React from 'react';
3
+ import { css, jsx } from '@emotion/react';
4
+ import Loadable from 'react-loadable';
5
+ import Spinner from '@atlaskit/spinner';
6
+ const spinnerContainer = css`
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ height: 100%;
11
+ width: 100%;
12
+ `;
13
+ const ElementBrowserLoader = Loadable({
14
+ loader: () => import( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser').then(module => module.default),
15
+ loading: () => jsx("div", {
16
+ css: spinnerContainer
17
+ }, jsx(Spinner, {
18
+ size: "medium"
19
+ }))
20
+ });
21
+ export default ElementBrowserLoader;
@@ -0,0 +1,320 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ /** @jsx jsx */
3
+ import React, { Fragment, memo, useCallback, useEffect, useMemo, useState } from 'react';
4
+ import { css, jsx } from '@emotion/react';
5
+ import { AutoSizer } from 'react-virtualized/dist/commonjs/AutoSizer';
6
+ import { Collection } from 'react-virtualized/dist/commonjs/Collection';
7
+ import { withAnalyticsContext } from '@atlaskit/analytics-next';
8
+ import { relativeFontSizeToBase16 } from '@atlaskit/editor-shared-styles';
9
+ import { shortcutStyle } from '@atlaskit/editor-shared-styles/shortcut';
10
+ import { ButtonItem } from '@atlaskit/menu';
11
+ import { B100, N200 } from '@atlaskit/theme/colors';
12
+ import { borderRadius } from '@atlaskit/theme/constants';
13
+ import Tooltip from '@atlaskit/tooltip';
14
+ import { ACTION, ACTION_SUBJECT, EVENT_TYPE, fireAnalyticsEvent } from '../../../analytics';
15
+ import { IconFallback } from '../../../quick-insert';
16
+ import { ELEMENT_LIST_PADDING, SCROLLBAR_WIDTH } from '../../constants';
17
+ import useContainerWidth from '../../hooks/use-container-width';
18
+ import useFocus from '../../hooks/use-focus';
19
+ import { Modes } from '../../types';
20
+ import cellSizeAndPositionGetter from './cellSizeAndPositionGetter';
21
+ import EmptyState from './EmptyState';
22
+ import { getColumnCount, getScrollbarWidth } from './utils';
23
+ export const ICON_HEIGHT = 40;
24
+ export const ICON_WIDTH = 40;
25
+ export const itemIcon = css`
26
+ width: ${ICON_WIDTH}px;
27
+ height: ${ICON_HEIGHT}px;
28
+ overflow: hidden;
29
+ border: 1px solid ${"var(--ds-border, rgba(223, 225, 229, 0.5))"}; /* N60 at 50% */
30
+ border-radius: ${borderRadius()}px;
31
+ box-sizing: border-box;
32
+
33
+ display: flex;
34
+ justify-content: center;
35
+ align-items: center;
36
+
37
+ div {
38
+ width: ${ICON_WIDTH}px;
39
+ height: ${ICON_HEIGHT}px;
40
+ }
41
+ `;
42
+ function ElementList({
43
+ items,
44
+ mode,
45
+ selectedItemIndex,
46
+ focusedItemIndex,
47
+ setColumnCount,
48
+ createAnalyticsEvent,
49
+ emptyStateHandler,
50
+ selectedCategory,
51
+ searchTerm,
52
+ ...props
53
+ }) {
54
+ const {
55
+ containerWidth,
56
+ ContainerWidthMonitor
57
+ } = useContainerWidth();
58
+ const [scrollbarWidth, setScrollbarWidth] = useState(SCROLLBAR_WIDTH);
59
+ const fullMode = mode === Modes.full;
60
+ useEffect(() => {
61
+ /**
62
+ * More of an optimization condition.
63
+ * Initially the containerWidths are reported 0 twice.
64
+ **/
65
+ if (fullMode && containerWidth > 0) {
66
+ setColumnCount(getColumnCount(containerWidth));
67
+ const updatedScrollbarWidth = getScrollbarWidth();
68
+ if (updatedScrollbarWidth > 0) {
69
+ setScrollbarWidth(updatedScrollbarWidth);
70
+ }
71
+ }
72
+ }, [fullMode, containerWidth, setColumnCount, scrollbarWidth]);
73
+ const onExternalLinkClick = useCallback(() => {
74
+ fireAnalyticsEvent(createAnalyticsEvent)({
75
+ payload: {
76
+ action: ACTION.VISITED,
77
+ actionSubject: ACTION_SUBJECT.SMART_LINK,
78
+ eventType: EVENT_TYPE.TRACK
79
+ }
80
+ });
81
+ }, [createAnalyticsEvent]);
82
+ const cellRenderer = useMemo(() => ({
83
+ index,
84
+ key,
85
+ style
86
+ }) => {
87
+ if (items[index] == null) {
88
+ return;
89
+ }
90
+ return jsx("div", {
91
+ style: style,
92
+ key: key,
93
+ className: "element-item-wrapper",
94
+ css: elementItemWrapper
95
+ }, jsx(MemoizedElementItem, _extends({
96
+ inlineMode: !fullMode,
97
+ index: index,
98
+ item: items[index],
99
+ selected: selectedItemIndex === index,
100
+ focus: focusedItemIndex === index
101
+ }, props)));
102
+ }, [items, fullMode, selectedItemIndex, focusedItemIndex, props]);
103
+ return jsx(Fragment, null, jsx(ContainerWidthMonitor, null), !items.length ? emptyStateHandler ? emptyStateHandler({
104
+ mode,
105
+ selectedCategory,
106
+ searchTerm
107
+ }) : jsx(EmptyState, {
108
+ onExternalLinkClick: onExternalLinkClick
109
+ }) : jsx("div", {
110
+ css: elementItemsWrapper,
111
+ "data-testid": "element-items"
112
+ }, jsx(Fragment, null, containerWidth > 0 && jsx(AutoSizer, {
113
+ disableWidth: true
114
+ }, ({
115
+ height
116
+ }) => jsx(Collection, {
117
+ cellCount: items.length,
118
+ cellRenderer: cellRenderer,
119
+ cellSizeAndPositionGetter: cellSizeAndPositionGetter(containerWidth - ELEMENT_LIST_PADDING * 2, scrollbarWidth),
120
+ height: height,
121
+ width: containerWidth - ELEMENT_LIST_PADDING * 2 // containerWidth - padding on Left/Right (for focus outline)
122
+ /**
123
+ * Refresh Collection on WidthObserver value change.
124
+ * Length of the items used to force re-render to solve Firefox bug with react-virtualized retaining
125
+ * scroll position after updating the data. If new data has different number of cells, a re-render
126
+ * is forced to prevent the scroll position render bug.
127
+ */,
128
+ key: containerWidth + items.length,
129
+ scrollToCell: selectedItemIndex
130
+ })))));
131
+ }
132
+ const MemoizedElementItem = /*#__PURE__*/memo(ElementItem);
133
+ MemoizedElementItem.displayName = 'MemoizedElementItem';
134
+ export function ElementItem({
135
+ inlineMode,
136
+ selected,
137
+ item,
138
+ index,
139
+ onInsertItem,
140
+ focus,
141
+ setFocusedItemIndex
142
+ }) {
143
+ const ref = useFocus(focus);
144
+
145
+ /**
146
+ * Note: props.onSelectItem(item) is not called here as the StatelessElementBrowser's
147
+ * useEffect would trigger it on selectedItemIndex change. (Line 106-110)
148
+ * This implementation was changed for keyboard/click selection to work with `onInsertItem`.
149
+ */
150
+ const onClick = useCallback(e => {
151
+ e.preventDefault();
152
+ e.stopPropagation();
153
+ setFocusedItemIndex(index);
154
+ switch (e.nativeEvent.detail) {
155
+ case 0:
156
+ onInsertItem(item);
157
+ break;
158
+ case 1:
159
+ if (inlineMode) {
160
+ onInsertItem(item);
161
+ }
162
+ break;
163
+ case 2:
164
+ if (!inlineMode) {
165
+ onInsertItem(item);
166
+ }
167
+ break;
168
+ default:
169
+ return;
170
+ }
171
+ }, [index, inlineMode, item, onInsertItem, setFocusedItemIndex]);
172
+ const {
173
+ icon,
174
+ title,
175
+ description,
176
+ keyshortcut
177
+ } = item;
178
+ return jsx(Tooltip, {
179
+ content: description,
180
+ testId: `element-item-tooltip-${index}`
181
+ }, jsx(ButtonItem, {
182
+ onClick: onClick,
183
+ iconBefore: jsx(ElementBefore, {
184
+ icon: icon,
185
+ title: title
186
+ }),
187
+ isSelected: selected,
188
+ "aria-describedby": title,
189
+ ref: ref,
190
+ testId: `element-item-${index}`
191
+ }, jsx(ItemContent, {
192
+ style: inlineMode ? null : itemStyleOverrides,
193
+ tabIndex: 0,
194
+ title: title,
195
+ description: description,
196
+ keyshortcut: keyshortcut
197
+ })));
198
+ }
199
+
200
+ /**
201
+ * Inline mode should use the existing Align-items:center value.
202
+ */
203
+ const itemStyleOverrides = {
204
+ alignItems: 'flex-start'
205
+ };
206
+ const ElementBefore = /*#__PURE__*/memo(({
207
+ icon,
208
+ title
209
+ }) => jsx("div", {
210
+ css: [itemIcon, itemIconStyle]
211
+ }, icon ? icon() : jsx(IconFallback, null)));
212
+ const ItemContent = /*#__PURE__*/memo(({
213
+ title,
214
+ description,
215
+ keyshortcut
216
+ }) => jsx("div", {
217
+ css: itemBody,
218
+ className: "item-body"
219
+ }, jsx("div", {
220
+ css: itemText
221
+ }, jsx("div", {
222
+ css: itemTitleWrapper
223
+ }, jsx("p", {
224
+ css: itemTitle
225
+ }, title), jsx("div", {
226
+ css: itemAfter
227
+ }, keyshortcut && jsx("div", {
228
+ css: shortcutStyle
229
+ }, keyshortcut))), description && jsx("p", {
230
+ css: itemDescription
231
+ }, description))));
232
+ const elementItemsWrapper = css`
233
+ flex: 1;
234
+ flex-flow: row wrap;
235
+ align-items: flex-start;
236
+ justify-content: flex-start;
237
+ overflow: hidden;
238
+ padding: ${ELEMENT_LIST_PADDING}px; // For Focus outline
239
+
240
+ .ReactVirtualized__Collection {
241
+ border-radius: 3px; // Standard border-radius across other components like Search or Item.
242
+ outline: none;
243
+
244
+ :focus {
245
+ box-shadow: 0 0 0 ${ELEMENT_LIST_PADDING}px
246
+ ${`var(--ds-border-focused, ${B100})`};
247
+ }
248
+ }
249
+ .ReactVirtualized__Collection__innerScrollContainer {
250
+ div[class='element-item-wrapper']:last-child {
251
+ padding-bottom: ${"var(--ds-space-050, 4px)"};
252
+ }
253
+ }
254
+ `;
255
+ const elementItemWrapper = css`
256
+ div {
257
+ button {
258
+ height: 75px;
259
+ align-items: flex-start;
260
+ padding: ${"var(--ds-space-150, 12px)"} ${"var(--ds-space-150, 12px)"} 11px;
261
+ }
262
+ }
263
+ `;
264
+ const itemBody = css`
265
+ display: flex;
266
+ flex-direction: row;
267
+ flex-wrap: nowrap;
268
+ justify-content: space-between;
269
+ line-height: 1.4;
270
+ width: 100%;
271
+
272
+ margin-top: -2px; // Fixes the Item Icon and text's alignment issue
273
+ `;
274
+
275
+ /*
276
+ * -webkit-line-clamp is also supported by firefox 🎉
277
+ * https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/68#CSS
278
+ */
279
+ const multilineStyle = css`
280
+ display: -webkit-box;
281
+ -webkit-line-clamp: 2;
282
+ -webkit-box-orient: vertical;
283
+ `;
284
+ const itemDescription = css`
285
+ ${multilineStyle};
286
+
287
+ overflow: hidden;
288
+ font-size: ${relativeFontSizeToBase16(11.67)};
289
+ color: ${`var(--ds-text-subtle, ${N200})`};
290
+ margin-top: ${"var(--ds-space-025, 2px)"};
291
+ `;
292
+ const itemText = css`
293
+ width: inherit;
294
+ white-space: initial;
295
+ `;
296
+ const itemTitleWrapper = css`
297
+ display: flex;
298
+ justify-content: space-between; // Title and keyboardshortcut are rendered in the same block
299
+ `;
300
+ const itemTitle = css`
301
+ width: 100%;
302
+ overflow: hidden;
303
+
304
+ white-space: nowrap;
305
+ text-overflow: ellipsis;
306
+ `;
307
+ const itemAfter = css`
308
+ flex: 0 0 auto;
309
+ `;
310
+ const itemIconStyle = css`
311
+ img {
312
+ height: 40px;
313
+ width: 40px;
314
+ object-fit: cover;
315
+ }
316
+ `;
317
+ const MemoizedElementListWithAnalytics = /*#__PURE__*/memo(withAnalyticsContext({
318
+ component: 'ElementList'
319
+ })(ElementList));
320
+ export default MemoizedElementListWithAnalytics;
@@ -0,0 +1,58 @@
1
+ /** @jsx jsx */
2
+ import { css, jsx } from '@emotion/react';
3
+ import { FormattedMessage } from 'react-intl-next';
4
+ import Button from '@atlaskit/button';
5
+ import NotFoundIllustration from './NotFoundIllustration';
6
+ export default function EmptyState({
7
+ onExternalLinkClick
8
+ }) {
9
+ return jsx("div", {
10
+ css: emptyStateWrapper
11
+ }, jsx(NotFoundIllustration, null), jsx("div", {
12
+ css: emptyStateHeading
13
+ }, jsx(FormattedMessage, {
14
+ id: "fabric.editor.elementbrowser.search.empty-state.heading",
15
+ defaultMessage: "Nothing matches your search",
16
+ description: "Empty state heading"
17
+ })), jsx("div", {
18
+ css: emptyStateSubHeading
19
+ }, jsx("p", null, jsx(FormattedMessage, {
20
+ id: "fabric.editor.elementbrowser.search.empty-state.sub-heading",
21
+ defaultMessage: "Try searching with a different term or discover new apps for Atlassian products.",
22
+ description: "Empty state sub-heading"
23
+ })), jsx("div", {
24
+ css: externalLinkWrapper
25
+ }, jsx(Button, {
26
+ appearance: "primary",
27
+ target: "_blank",
28
+ href: "https://marketplace.atlassian.com/search?category=Macros&hosting=cloud&product=confluence",
29
+ onClick: onExternalLinkClick
30
+ }, jsx(FormattedMessage, {
31
+ id: "fabric.editor.elementbrowser.search.empty-state.sub-heading.link",
32
+ defaultMessage: "Explore Atlassian Marketplace",
33
+ description: "Empty state sub-heading external link"
34
+ })))));
35
+ }
36
+ const emptyStateHeading = css`
37
+ font-size: 1.42857em;
38
+ line-height: 1.2;
39
+ color: ${"var(--ds-text, rgb(23, 43, 77))"};
40
+ font-weight: 500;
41
+ letter-spacing: -0.008em;
42
+ margin-top: 28px;
43
+ `;
44
+ const emptyStateSubHeading = css`
45
+ margin-top: ${"var(--ds-space-200, 16px)"};
46
+ max-width: 400px;
47
+ text-align: center;
48
+ `;
49
+ const emptyStateWrapper = css`
50
+ display: flex;
51
+ flex-direction: column;
52
+ justify-content: center;
53
+ align-items: center;
54
+ width: 100%;
55
+ `;
56
+ const externalLinkWrapper = css`
57
+ margin-top: 14px;
58
+ `;
@@ -0,0 +1,65 @@
1
+ /** @jsx jsx */
2
+ import { css, jsx } from '@emotion/react';
3
+ const imageContainer = css`
4
+ width: 120px;
5
+ height: 111px;
6
+ margin-top: ${"var(--ds-space-600, 48px)"};
7
+ `;
8
+
9
+ /* eslint-disable @atlaskit/design-system/ensure-design-token-usage */
10
+ export default function NotFoundIllustration() {
11
+ return jsx("div", {
12
+ css: imageContainer
13
+ }, jsx("svg", {
14
+ width: "120",
15
+ height: "111",
16
+ fill: "none",
17
+ xmlns: "http://www.w3.org/2000/svg"
18
+ }, jsx("g", {
19
+ clipPath: "url(#clip0)"
20
+ }, jsx("path", {
21
+ fill: "#fff",
22
+ fillOpacity: ".01",
23
+ d: "M0 0h120v110.365H0z"
24
+ }), jsx("path", {
25
+ opacity: ".3",
26
+ d: "M60.985 110.336c-.539.017-1.078.029-1.616.035a1.359 1.359 0 01-1.367-1.36 1.361 1.361 0 011.314-1.372h.041a50.876 50.876 0 0010.276-1.105 1.367 1.367 0 01.568 2.674 54.422 54.422 0 01-9.216 1.128zM52 109.877c-.075 0-.156 0-.237-.012a52.688 52.688 0 01-10.583-2.61 1.368 1.368 0 01.92-2.575c3.245 1.169 6.616 2 10.034 2.471.747.104 1.268.79 1.164 1.54A1.36 1.36 0 0152 109.877zM77.088 107.162a1.364 1.364 0 01-1.326-.895 1.366 1.366 0 01.805-1.755 50.423 50.423 0 009.274-4.575 1.358 1.358 0 011.877.43c.4.64.208 1.482-.429 1.884a53.25 53.25 0 01-9.772 4.824 1.26 1.26 0 01-.429.087zM34.9 104.32a1.359 1.359 0 01-.683-.157 53.29 53.29 0 01-9.042-6.092 1.369 1.369 0 01-.18-1.924 1.357 1.357 0 011.918-.18 50.483 50.483 0 008.578 5.778c.667.354.916 1.18.562 1.848a1.337 1.337 0 01-1.152.727zM20.732 93.23a1.372 1.372 0 01-1.06-.448 53.223 53.223 0 01-6.436-8.818 1.37 1.37 0 01.487-1.872 1.36 1.36 0 011.865.489 50.724 50.724 0 006.105 8.364 1.366 1.366 0 01-.098 1.93c-.25.226-.556.343-.863.354zM104.093 84.196a1.367 1.367 0 01-1.228-2.046 50.41 50.41 0 004.183-9.48 1.358 1.358 0 011.714-.878 1.365 1.365 0 01.875 1.72 53.17 53.17 0 01-4.414 9.993 1.34 1.34 0 01-1.13.691zM11.18 77.965a1.365 1.365 0 01-1.31-.854 52.827 52.827 0 01-3.029-10.498 1.362 1.362 0 112.682-.483 50.732 50.732 0 002.873 9.958 1.363 1.363 0 01-1.216 1.877zM110.17 67.218a1.362 1.362 0 01-1.39-1.593c.579-3.395.805-6.876.683-10.347l-.006-.116a1.36 1.36 0 011.315-1.412 1.359 1.359 0 011.408 1.32l.006.115a54.054 54.054 0 01-.724 10.905 1.36 1.36 0 01-1.292 1.128zM7.426 60.3c-.753.03-1.384-.534-1.407-1.29v-.058a53.82 53.82 0 01.712-10.846 1.368 1.368 0 011.57-1.122c.741.128 1.24.83 1.118 1.575a51.307 51.307 0 00-.678 10.288c.029.762-.562 1.425-1.315 1.453zM110.06 49.076a1.363 1.363 0 01-1.385-1.122 50.567 50.567 0 00-2.884-9.95c-.284-.698.052-1.5.747-1.785a1.365 1.365 0 011.778.75 53.085 53.085 0 013.041 10.497 1.37 1.37 0 01-1.094 1.593l-.203.017zM9.888 42.462a1.452 1.452 0 01-.47-.065 1.365 1.365 0 01-.874-1.72 53.157 53.157 0 014.402-9.998 1.362 1.362 0 011.86-.511c.655.372.88 1.209.51 1.866a50.68 50.68 0 00-4.177 9.486 1.37 1.37 0 01-1.251.941zM103.815 32.179a1.355 1.355 0 01-1.222-.674 50.958 50.958 0 00-6.117-8.359 1.366 1.366 0 01.099-1.93 1.355 1.355 0 011.923.099 53.449 53.449 0 016.447 8.806 1.37 1.37 0 01-.487 1.872 1.432 1.432 0 01-.643.186zM18.31 26.529a1.372 1.372 0 01-1.124-2.209 53.551 53.551 0 017.537-7.888 1.363 1.363 0 011.923.157 1.375 1.375 0 01-.156 1.93 51.072 51.072 0 00-7.154 7.487 1.343 1.343 0 01-1.025.523zM92.172 18.444a1.352 1.352 0 01-.915-.314 50.861 50.861 0 00-8.59-5.772 1.368 1.368 0 01-.568-1.849 1.364 1.364 0 011.842-.57 53.153 53.153 0 019.048 6.08c.58.483.66 1.343.18 1.925a1.366 1.366 0 01-.997.5zM31.64 14.433a1.368 1.368 0 01-.776-2.523 53.107 53.107 0 019.771-4.836 1.359 1.359 0 011.75.808c.26.71-.099 1.494-.805 1.755a50.203 50.203 0 00-9.269 4.587c-.208.133-.44.203-.672.209zM76.555 9.51a1.257 1.257 0 01-.504-.082A50.06 50.06 0 0066.013 6.97a1.364 1.364 0 01-1.165-1.54 1.364 1.364 0 011.535-1.168 52.623 52.623 0 0110.584 2.592 1.369 1.369 0 01-.412 2.657zM48.287 7.65a1.367 1.367 0 01-.33-2.703 54.261 54.261 0 0110.827-1.18 1.367 1.367 0 011.372 1.36 1.367 1.367 0 01-1.314 1.377H58.8A50.85 50.85 0 0048.525 7.62c-.081.018-.162.024-.238.03z",
27
+ fill: "#B3BAC5"
28
+ }), jsx("path", {
29
+ opacity: ".3",
30
+ d: "M110.523 19.873a.304.304 0 01-.226-.325l.035-.262c.029-.168.064-.348.11-.534a4.423 4.423 0 01.95-1.796c.458-.53 1.118-.971 1.97-1.314l1.436-.587c.858-.343 1.385-.913 1.593-1.697a2.48 2.48 0 00.07-.878 1.998 1.998 0 00-.273-.849c-.156-.261-.37-.5-.654-.709a3.07 3.07 0 00-1.049-.477c-.451-.116-.851-.133-1.21-.052a2.56 2.56 0 00-.956.43c-.278.204-.51.465-.695.78-.191.313-.33.65-.423.999-.029.104-.052.21-.07.302a.459.459 0 01-.59.355l-2.219-.68a.464.464 0 01-.33-.483c.006-.07.017-.14.029-.21.035-.197.075-.383.121-.569.174-.668.47-1.29.887-1.866a5.14 5.14 0 011.546-1.412c.614-.366 1.31-.605 2.097-.72.788-.117 1.645-.047 2.578.197.967.256 1.778.622 2.433 1.098.66.477 1.176 1.012 1.552 1.599.377.593.614 1.22.707 1.889.093.668.058 1.32-.11 1.953-.261 1-.712 1.796-1.344 2.389a6.773 6.773 0 01-2.288 1.39l-1.211.458c-.341.11-.851.338-1.274.803-.041.046-.214.238-.388.534-.128.221-.22.436-.284.622a.303.303 0 01-.365.192l-2.155-.57zm-1.772 3.412c.145-.552.457-.97.944-1.26a1.942 1.942 0 011.552-.222c.551.146.968.465 1.257.96.29.493.359 1.017.215 1.569a1.966 1.966 0 01-.956 1.25 2.005 2.005 0 01-1.558.203 1.957 1.957 0 01-1.246-.942 1.98 1.98 0 01-.208-1.558zM10.722 12.393a.301.301 0 01-.203-.338l.053-.261c.04-.169.086-.343.15-.523a4.334 4.334 0 011.072-1.727c.492-.5 1.176-.889 2.056-1.18l1.472-.488c.874-.285 1.442-.814 1.703-1.587.092-.279.139-.57.127-.872a2.052 2.052 0 00-.214-.866 2.285 2.285 0 00-.609-.75c-.266-.226-.608-.406-1.013-.546-.44-.151-.846-.192-1.205-.134a2.518 2.518 0 00-1.726 1.099 3.583 3.583 0 00-.585 1.267.461.461 0 01-.615.314L9.02 4.976a.467.467 0 01-.295-.506c.011-.07.029-.14.046-.21a5.65 5.65 0 01.162-.557A5.505 5.505 0 019.946 1.9 5.246 5.246 0 0111.579.593a5.545 5.545 0 012.138-.576c.793-.058 1.645.064 2.554.372.945.32 1.732.739 2.358 1.262.626.523 1.106 1.087 1.442 1.703.336.616.533 1.255.58 1.93a4.97 4.97 0 01-.244 1.941c-.33.982-.828 1.744-1.506 2.29a6.844 6.844 0 01-2.375 1.233l-1.24.372a2.94 2.94 0 00-1.326.715c-.046.046-.232.226-.423.505-.145.215-.249.419-.324.599a.3.3 0 01-.377.168l-2.114-.714zm-1.998 3.284a2 2 0 011.025-1.198 1.957 1.957 0 011.564-.116c.539.18.933.529 1.188 1.04.254.512.29 1.041.11 1.582-.18.54-.528.935-1.037 1.18a2.019 2.019 0 01-1.57.098 1.96 1.96 0 01-1.182-1.029 1.99 1.99 0 01-.098-1.557zM7.177 104.849a.298.298 0 01-.37-.134c-.041-.076-.082-.157-.122-.238a8.207 8.207 0 01-.215-.5 4.405 4.405 0 01-.249-2.017c.076-.698.36-1.436.863-2.215l.84-1.308c.504-.773.614-1.546.33-2.307a2.6 2.6 0 00-.446-.762 2.019 2.019 0 00-.706-.54 2.421 2.421 0 00-.944-.204 3.05 3.05 0 00-1.13.215c-.434.163-.776.378-1.025.657-.25.273-.423.576-.533.901-.11.326-.15.674-.128 1.04.024.367.099.721.226 1.064.04.105.076.198.116.285a.466.466 0 01-.278.634l-2.201.72a.455.455 0 01-.545-.209c-.034-.064-.063-.128-.098-.192a5.595 5.595 0 01-.568-2.575 5.09 5.09 0 01.458-2.046c.29-.65.724-1.25 1.303-1.796.58-.546 1.32-.988 2.225-1.32.938-.348 1.807-.517 2.618-.505.81.012 1.54.151 2.19.413a4.62 4.62 0 011.656 1.139c.458.494.8 1.046 1.025 1.662.36.971.446 1.884.267 2.732-.18.85-.539 1.669-1.078 2.46l-.73 1.075c-.214.29-.503.767-.585 1.389-.005.064-.04.319-.011.657.023.255.07.482.127.668a.309.309 0 01-.19.372l-2.092.785zm.504 3.813a2.026 2.026 0 01.052-1.581 1.958 1.958 0 011.147-1.076 1.986 1.986 0 011.576.064c.521.239.88.628 1.077 1.163a1.947 1.947 0 01-.07 1.569 2.028 2.028 0 01-1.158 1.064 1.977 1.977 0 01-1.564-.052 1.96 1.96 0 01-1.06-1.151z",
31
+ fill: "#C1C7D0"
32
+ }), jsx("path", {
33
+ d: "M86.519 77.651l-4.142-4.028-5.578 5.784 4.141 4.028a7.812 7.812 0 012.15 3.772 7.858 7.858 0 002.148 3.773l16.816 16.333a6.405 6.405 0 009.077-.145 6.46 6.46 0 00-.144-9.108L94.171 81.726a7.786 7.786 0 00-3.83-2.034 7.9 7.9 0 01-3.822-2.04z",
34
+ fill: "#CFD4DB"
35
+ }), jsx("path", {
36
+ d: "M90.18 79.64a7.756 7.756 0 01-3.656-1.995l-1.262-1.226a4 4 0 00-5.671.093 4.032 4.032 0 00.092 5.69l1.263 1.227a7.853 7.853 0 012.103 3.598 33.606 33.606 0 003.858-3.435 33.629 33.629 0 003.273-3.953z",
37
+ fill: "#B3BAC5"
38
+ }), jsx("path", {
39
+ d: "M59.056 90.677c-8.961.146-17.442-3.22-23.877-9.474-13.295-12.91-13.636-34.266-.77-47.606C40.64 27.14 49.01 23.501 57.966 23.35c8.961-.145 17.441 3.22 23.877 9.475 6.441 6.255 10.062 14.654 10.212 23.64.145 8.992-3.209 17.502-9.442 23.96-6.227 6.47-14.597 10.108-23.558 10.253zM58.1 31.388c-6.824.11-13.19 2.883-17.94 7.801-9.795 10.155-9.534 26.413.585 36.242 4.9 4.76 11.36 7.324 18.183 7.213 6.824-.11 13.19-2.883 17.94-7.8 4.744-4.918 7.299-11.399 7.189-18.246-.11-6.847-2.873-13.236-7.774-18.002-4.906-4.755-11.36-7.318-18.183-7.208z",
40
+ fill: "url(#paint0_linear)"
41
+ }), jsx("path", {
42
+ d: "M68.886 49.535l-3.093-3.051a1.158 1.158 0 00-1.64.017l-5.67 5.796-5.776-5.691a1.158 1.158 0 00-1.64.017l-3.04 3.104c-.446.46-.44 1.192.017 1.645l5.775 5.69-5.67 5.796c-.447.46-.44 1.192.017 1.645l3.093 3.052a1.158 1.158 0 001.64-.018l5.67-5.795 5.775 5.69a1.158 1.158 0 001.64-.017l3.04-3.104c.447-.459.441-1.191-.017-1.645l-5.775-5.69 5.671-5.795c.446-.46.44-1.198-.017-1.645z",
43
+ fill: "#C1C7D0"
44
+ })), jsx("defs", null, jsx("linearGradient", {
45
+ id: "paint0_linear",
46
+ x1: "34.792",
47
+ y1: "80.822",
48
+ x2: "82.401",
49
+ y2: "33.377",
50
+ gradientUnits: "userSpaceOnUse"
51
+ }, jsx("stop", {
52
+ offset: ".557",
53
+ stopColor: "#C1C7D0"
54
+ }), jsx("stop", {
55
+ offset: ".966",
56
+ stopColor: "#E9EBEF",
57
+ stopOpacity: ".5"
58
+ })), jsx("clipPath", {
59
+ id: "clip0"
60
+ }, jsx("path", {
61
+ fill: "#fff",
62
+ d: "M0 0h120v110.365H0z"
63
+ })))));
64
+ }
65
+ /* eslint-enable @atlaskit/design-system/ensure-design-token-usage */
@@ -0,0 +1,39 @@
1
+ import { ELEMENT_ITEM_HEIGHT } from '../../constants';
2
+ import { generateVirtualizedContainerDatum } from './utils';
3
+
4
+ /**
5
+ * Callback responsible for returning size and offset/position information
6
+ * for a given cell.
7
+ * https://github.com/bvaughn/react-virtualized/blob/master/docs/Collection.md
8
+ **/
9
+ export default function cellSizeAndPositionGetter(containerWidth, scrollbarWidth) {
10
+ const GUTTER_SIZE = 4;
11
+ /**
12
+ * Save the currently rendered columnY positions.
13
+ * Have to be within the current render scope.
14
+ */
15
+ let columnYMap = [];
16
+ return ({
17
+ index
18
+ }) => {
19
+ const {
20
+ columnCount,
21
+ availableWidth
22
+ } = generateVirtualizedContainerDatum(containerWidth, {
23
+ gutterSize: GUTTER_SIZE,
24
+ scrollbarWidth
25
+ });
26
+ const width = Math.floor(availableWidth / columnCount);
27
+ const height = ELEMENT_ITEM_HEIGHT;
28
+ const columnPosition = index % (columnCount || 1);
29
+ const x = columnPosition * width;
30
+ const y = columnYMap[columnPosition] || 0;
31
+ columnYMap[columnPosition] = y + height;
32
+ return {
33
+ height,
34
+ width,
35
+ x,
36
+ y
37
+ };
38
+ };
39
+ }