@atlaskit/editor-common 74.57.0 → 74.58.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.
- package/CHANGELOG.md +7 -0
- package/dist/cjs/element-browser/ElementBrowser.js +152 -0
- package/dist/cjs/element-browser/ViewMore.js +39 -0
- package/dist/cjs/element-browser/components/CategoryList.js +115 -0
- package/dist/cjs/element-browser/components/ElementBrowserLoader.js +36 -0
- package/dist/cjs/element-browser/components/ElementList/ElementList.js +256 -0
- package/dist/cjs/element-browser/components/ElementList/EmptyState.js +47 -0
- package/dist/cjs/element-browser/components/ElementList/NotFoundIllustration.js +70 -0
- package/dist/cjs/element-browser/components/ElementList/cellSizeAndPositionGetter.js +42 -0
- package/dist/cjs/element-browser/components/ElementList/utils.js +54 -0
- package/dist/cjs/element-browser/components/ElementSearch.js +88 -0
- package/dist/cjs/element-browser/components/StatelessElementBrowser.js +269 -0
- package/dist/cjs/element-browser/constants.js +41 -0
- package/dist/cjs/element-browser/hooks/use-container-width.js +70 -0
- package/dist/cjs/element-browser/hooks/use-focus.js +51 -0
- package/dist/cjs/element-browser/hooks/use-select-and-focus-on-arrow-navigation.js +286 -0
- package/dist/cjs/element-browser/index.js +20 -0
- package/dist/cjs/element-browser/types.js +12 -0
- package/dist/cjs/monitoring/error.js +1 -1
- package/dist/cjs/ui/DropList/index.js +1 -1
- package/dist/cjs/utils/performance/measure-render.js +4 -3
- package/dist/cjs/utils/performance/measure-tti.js +9 -3
- package/dist/es2019/element-browser/ElementBrowser.js +117 -0
- package/dist/es2019/element-browser/ViewMore.js +40 -0
- package/dist/es2019/element-browser/components/CategoryList.js +106 -0
- package/dist/es2019/element-browser/components/ElementBrowserLoader.js +21 -0
- package/dist/es2019/element-browser/components/ElementList/ElementList.js +320 -0
- package/dist/es2019/element-browser/components/ElementList/EmptyState.js +58 -0
- package/dist/es2019/element-browser/components/ElementList/NotFoundIllustration.js +65 -0
- package/dist/es2019/element-browser/components/ElementList/cellSizeAndPositionGetter.js +39 -0
- package/dist/es2019/element-browser/components/ElementList/utils.js +50 -0
- package/dist/es2019/element-browser/components/ElementSearch.js +117 -0
- package/dist/es2019/element-browser/components/StatelessElementBrowser.js +339 -0
- package/dist/es2019/element-browser/constants.js +23 -0
- package/dist/es2019/element-browser/hooks/use-container-width.js +59 -0
- package/dist/es2019/element-browser/hooks/use-focus.js +48 -0
- package/dist/es2019/element-browser/hooks/use-select-and-focus-on-arrow-navigation.js +284 -0
- package/dist/es2019/element-browser/index.js +2 -0
- package/dist/es2019/element-browser/types.js +5 -0
- package/dist/es2019/monitoring/error.js +1 -1
- package/dist/es2019/ui/DropList/index.js +1 -1
- package/dist/es2019/utils/performance/measure-render.js +2 -3
- package/dist/es2019/utils/performance/measure-tti.js +9 -3
- package/dist/esm/element-browser/ElementBrowser.js +142 -0
- package/dist/esm/element-browser/ViewMore.js +31 -0
- package/dist/esm/element-browser/components/CategoryList.js +105 -0
- package/dist/esm/element-browser/components/ElementBrowserLoader.js +23 -0
- package/dist/esm/element-browser/components/ElementList/ElementList.js +241 -0
- package/dist/esm/element-browser/components/ElementList/EmptyState.js +40 -0
- package/dist/esm/element-browser/components/ElementList/NotFoundIllustration.js +63 -0
- package/dist/esm/element-browser/components/ElementList/cellSizeAndPositionGetter.js +37 -0
- package/dist/esm/element-browser/components/ElementList/utils.js +46 -0
- package/dist/esm/element-browser/components/ElementSearch.js +77 -0
- package/dist/esm/element-browser/components/StatelessElementBrowser.js +258 -0
- package/dist/esm/element-browser/constants.js +23 -0
- package/dist/esm/element-browser/hooks/use-container-width.js +61 -0
- package/dist/esm/element-browser/hooks/use-focus.js +46 -0
- package/dist/esm/element-browser/hooks/use-select-and-focus-on-arrow-navigation.js +278 -0
- package/dist/esm/element-browser/index.js +2 -0
- package/dist/esm/element-browser/types.js +5 -0
- package/dist/esm/monitoring/error.js +1 -1
- package/dist/esm/ui/DropList/index.js +1 -1
- package/dist/esm/utils/performance/measure-render.js +2 -3
- package/dist/esm/utils/performance/measure-tti.js +9 -3
- package/dist/types/analytics/types/general-events.d.ts +2 -1
- package/dist/types/element-browser/ElementBrowser.d.ts +37 -0
- package/dist/types/element-browser/ViewMore.d.ts +6 -0
- package/dist/types/element-browser/components/CategoryList.d.ts +10 -0
- package/dist/types/element-browser/components/ElementBrowserLoader.d.ts +6 -0
- package/dist/types/element-browser/components/ElementList/ElementList.d.ts +33 -0
- package/dist/types/element-browser/components/ElementList/EmptyState.d.ts +6 -0
- package/dist/types/element-browser/components/ElementList/NotFoundIllustration.d.ts +2 -0
- package/dist/types/element-browser/components/ElementList/cellSizeAndPositionGetter.d.ts +7 -0
- package/dist/types/element-browser/components/ElementList/utils.d.ts +12 -0
- package/dist/types/element-browser/components/ElementSearch.d.ts +18 -0
- package/dist/types/element-browser/components/StatelessElementBrowser.d.ts +23 -0
- package/dist/types/element-browser/constants.d.ts +19 -0
- package/dist/types/element-browser/hooks/use-container-width.d.ts +33 -0
- package/dist/types/element-browser/hooks/use-focus.d.ts +35 -0
- package/dist/types/element-browser/hooks/use-select-and-focus-on-arrow-navigation.d.ts +72 -0
- package/dist/types/element-browser/index.d.ts +2 -0
- package/dist/types/element-browser/types.d.ts +12 -0
- package/dist/types/types/quick-insert.d.ts +1 -0
- package/dist/types/utils/performance/measure-render.d.ts +6 -4
- package/dist/types/utils/performance/measure-tti.d.ts +1 -1
- package/dist/types-ts4.5/analytics/types/general-events.d.ts +2 -1
- package/dist/types-ts4.5/element-browser/ElementBrowser.d.ts +37 -0
- package/dist/types-ts4.5/element-browser/ViewMore.d.ts +6 -0
- package/dist/types-ts4.5/element-browser/components/CategoryList.d.ts +10 -0
- package/dist/types-ts4.5/element-browser/components/ElementBrowserLoader.d.ts +6 -0
- package/dist/types-ts4.5/element-browser/components/ElementList/ElementList.d.ts +33 -0
- package/dist/types-ts4.5/element-browser/components/ElementList/EmptyState.d.ts +6 -0
- package/dist/types-ts4.5/element-browser/components/ElementList/NotFoundIllustration.d.ts +2 -0
- package/dist/types-ts4.5/element-browser/components/ElementList/cellSizeAndPositionGetter.d.ts +7 -0
- package/dist/types-ts4.5/element-browser/components/ElementList/utils.d.ts +12 -0
- package/dist/types-ts4.5/element-browser/components/ElementSearch.d.ts +18 -0
- package/dist/types-ts4.5/element-browser/components/StatelessElementBrowser.d.ts +23 -0
- package/dist/types-ts4.5/element-browser/constants.d.ts +19 -0
- package/dist/types-ts4.5/element-browser/hooks/use-container-width.d.ts +33 -0
- package/dist/types-ts4.5/element-browser/hooks/use-focus.d.ts +35 -0
- package/dist/types-ts4.5/element-browser/hooks/use-select-and-focus-on-arrow-navigation.d.ts +72 -0
- package/dist/types-ts4.5/element-browser/index.d.ts +2 -0
- package/dist/types-ts4.5/element-browser/types.d.ts +12 -0
- package/dist/types-ts4.5/types/quick-insert.d.ts +1 -0
- package/dist/types-ts4.5/utils/performance/measure-render.d.ts +6 -4
- package/dist/types-ts4.5/utils/performance/measure-tti.d.ts +1 -1
- package/element-browser/package.json +15 -0
- 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
|
+
}
|