@atlaskit/editor-plugin-quick-insert 29.0.4 → 30.0.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 (87) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/quickInsertPlugin.js +10 -5
  3. package/dist/cjs/ui/QuickInsertRecommendedSlot.js +11 -8
  4. package/dist/cjs/ui/RegistryElementBrowser/RegistryElementBrowser.js +31 -7
  5. package/dist/cjs/ui/RegistryElementBrowser/RegistryElementBrowserSearchResults.js +13 -7
  6. package/dist/cjs/ui/RegistryElementBrowser/model.js +14 -15
  7. package/dist/cjs/ui/getQuickInsertComponents.js +28 -16
  8. package/dist/cjs/ui/getRecommendedComponents.js +2 -2
  9. package/dist/cjs/ui/registered-menu/QuickInsertEmptyState.compiled.css +11 -0
  10. package/dist/cjs/ui/registered-menu/QuickInsertEmptyState.js +61 -0
  11. package/dist/cjs/ui/registered-menu/QuickInsertMenuRoot.js +220 -0
  12. package/dist/cjs/ui/registered-menu/QuickInsertMenuSection.js +23 -0
  13. package/dist/cjs/ui/registered-menu/QuickInsertSearchResultsSection.js +19 -0
  14. package/dist/cjs/ui/registered-menu/RegisteredQuickInsertMenuItem.js +42 -0
  15. package/dist/cjs/ui/registered-menu/ToolbarQuickInsertMenu.compiled.css +11 -0
  16. package/dist/cjs/ui/registered-menu/ToolbarQuickInsertMenu.js +128 -0
  17. package/dist/cjs/ui/registered-menu/TypeAheadQuickInsertMenu.compiled.css +3 -0
  18. package/dist/cjs/ui/registered-menu/TypeAheadQuickInsertMenu.js +90 -0
  19. package/dist/cjs/ui/registered-menu/assets/no-results.js +36 -0
  20. package/dist/cjs/ui/registered-menu/get-quick-insert-menu-model.js +237 -0
  21. package/dist/cjs/ui/registered-menu/getQuickInsertMenuItemId.js +9 -0
  22. package/dist/cjs/ui/registered-menu/selectQuickInsertCategoryItems.js +27 -0
  23. package/dist/cjs/ui/registered-menu/useQuickInsertSearchAnalytics.js +100 -0
  24. package/dist/es2019/quickInsertPlugin.js +10 -5
  25. package/dist/es2019/ui/QuickInsertRecommendedSlot.js +10 -5
  26. package/dist/es2019/ui/RegistryElementBrowser/RegistryElementBrowser.js +19 -2
  27. package/dist/es2019/ui/RegistryElementBrowser/RegistryElementBrowserSearchResults.js +12 -7
  28. package/dist/es2019/ui/RegistryElementBrowser/model.js +12 -13
  29. package/dist/es2019/ui/getQuickInsertComponents.js +24 -10
  30. package/dist/es2019/ui/getRecommendedComponents.js +2 -2
  31. package/dist/es2019/ui/registered-menu/QuickInsertEmptyState.compiled.css +11 -0
  32. package/dist/es2019/ui/registered-menu/QuickInsertEmptyState.js +47 -0
  33. package/dist/es2019/ui/registered-menu/QuickInsertMenuRoot.js +191 -0
  34. package/dist/es2019/ui/registered-menu/QuickInsertMenuSection.js +15 -0
  35. package/dist/es2019/ui/registered-menu/QuickInsertSearchResultsSection.js +14 -0
  36. package/dist/es2019/ui/registered-menu/RegisteredQuickInsertMenuItem.js +34 -0
  37. package/dist/es2019/ui/registered-menu/ToolbarQuickInsertMenu.compiled.css +11 -0
  38. package/dist/es2019/ui/registered-menu/ToolbarQuickInsertMenu.js +116 -0
  39. package/dist/es2019/ui/registered-menu/TypeAheadQuickInsertMenu.compiled.css +3 -0
  40. package/dist/es2019/ui/registered-menu/TypeAheadQuickInsertMenu.js +78 -0
  41. package/dist/es2019/ui/registered-menu/assets/no-results.js +30 -0
  42. package/dist/es2019/ui/registered-menu/get-quick-insert-menu-model.js +177 -0
  43. package/dist/es2019/ui/registered-menu/getQuickInsertMenuItemId.js +1 -0
  44. package/dist/es2019/ui/registered-menu/selectQuickInsertCategoryItems.js +19 -0
  45. package/dist/es2019/ui/registered-menu/useQuickInsertSearchAnalytics.js +91 -0
  46. package/dist/esm/quickInsertPlugin.js +10 -5
  47. package/dist/esm/ui/QuickInsertRecommendedSlot.js +11 -8
  48. package/dist/esm/ui/RegistryElementBrowser/RegistryElementBrowser.js +30 -6
  49. package/dist/esm/ui/RegistryElementBrowser/RegistryElementBrowserSearchResults.js +12 -7
  50. package/dist/esm/ui/RegistryElementBrowser/model.js +14 -15
  51. package/dist/esm/ui/getQuickInsertComponents.js +27 -15
  52. package/dist/esm/ui/getRecommendedComponents.js +2 -2
  53. package/dist/esm/ui/registered-menu/QuickInsertEmptyState.compiled.css +11 -0
  54. package/dist/esm/ui/registered-menu/QuickInsertEmptyState.js +50 -0
  55. package/dist/esm/ui/registered-menu/QuickInsertMenuRoot.js +211 -0
  56. package/dist/esm/ui/registered-menu/QuickInsertMenuSection.js +16 -0
  57. package/dist/esm/ui/registered-menu/QuickInsertSearchResultsSection.js +12 -0
  58. package/dist/esm/ui/registered-menu/RegisteredQuickInsertMenuItem.js +34 -0
  59. package/dist/esm/ui/registered-menu/ToolbarQuickInsertMenu.compiled.css +11 -0
  60. package/dist/esm/ui/registered-menu/ToolbarQuickInsertMenu.js +120 -0
  61. package/dist/esm/ui/registered-menu/TypeAheadQuickInsertMenu.compiled.css +3 -0
  62. package/dist/esm/ui/registered-menu/TypeAheadQuickInsertMenu.js +82 -0
  63. package/dist/esm/ui/registered-menu/assets/no-results.js +29 -0
  64. package/dist/esm/ui/registered-menu/get-quick-insert-menu-model.js +230 -0
  65. package/dist/esm/ui/registered-menu/getQuickInsertMenuItemId.js +3 -0
  66. package/dist/esm/ui/registered-menu/selectQuickInsertCategoryItems.js +21 -0
  67. package/dist/esm/ui/registered-menu/useQuickInsertSearchAnalytics.js +93 -0
  68. package/dist/types/quickInsertPluginType.d.ts +1 -1
  69. package/dist/types/ui/QuickInsertRecommendedSlot.d.ts +3 -3
  70. package/dist/types/ui/RegistryElementBrowser/RegistryElementBrowserSearchResults.d.ts +5 -2
  71. package/dist/types/ui/RegistryElementBrowser/model.d.ts +3 -2
  72. package/dist/types/ui/getQuickInsertComponents.d.ts +8 -2
  73. package/dist/types/ui/registered-menu/QuickInsertEmptyState.d.ts +7 -0
  74. package/dist/types/ui/registered-menu/QuickInsertMenuRoot.d.ts +11 -0
  75. package/dist/types/ui/registered-menu/QuickInsertMenuSection.d.ts +4 -0
  76. package/dist/types/ui/registered-menu/QuickInsertSearchResultsSection.d.ts +2 -0
  77. package/dist/types/ui/registered-menu/RegisteredQuickInsertMenuItem.d.ts +3 -0
  78. package/dist/types/ui/registered-menu/ToolbarQuickInsertMenu.d.ts +28 -0
  79. package/dist/types/ui/registered-menu/TypeAheadQuickInsertMenu.d.ts +27 -0
  80. package/dist/types/ui/registered-menu/assets/no-results.d.ts +7 -0
  81. package/dist/types/ui/registered-menu/get-quick-insert-menu-model.d.ts +19 -0
  82. package/dist/types/ui/registered-menu/getQuickInsertMenuItemId.d.ts +1 -0
  83. package/dist/types/ui/registered-menu/selectQuickInsertCategoryItems.d.ts +7 -0
  84. package/dist/types/ui/registered-menu/useQuickInsertSearchAnalytics.d.ts +12 -0
  85. package/package.json +14 -11
  86. package/registered-menu/model/package.json +10 -0
  87. package/registered-menu/search-analytics/package.json +10 -0
@@ -1,8 +1,6 @@
1
1
  import React from 'react';
2
2
  import { useIntl } from 'react-intl';
3
3
  import { BLOCK_TEMPLATES_SECTION, CREATE_SECTION, DATA_AND_CHARTS_SECTION, EMBED_SECTION, MEDIA_SECTION, MENU, OTHER_SECTION, RECOMMENDED_SECTION, ROVO_SECTION, STRUCTURE_SECTION, TEXT_FORMATTING_SECTION, VIEW_ALL_ELEMENTS_MENU_ITEM } from '@atlaskit/editor-common/quick-insert/keys';
4
- import { QuickInsertMenuRoot } from '@atlaskit/editor-common/quick-insert/menu-root';
5
- import { QuickInsertMenuSection } from '@atlaskit/editor-common/quick-insert/menu-section';
6
4
  import { messages } from '@atlaskit/editor-common/quick-insert/messages';
7
5
  import { CATEGORY_VIEW_MORE_RANK, QUICK_INSERT_MENU_RANK } from '@atlaskit/editor-common/quick-insert/rank';
8
6
  import { getMenuFooterSectionKey } from '@atlaskit/editor-common/type-ahead-get-menu-footer-section-key';
@@ -11,6 +9,8 @@ import { createRecommendedSnapshotCache, MAX_RECOMMENDED_ITEMS, RECOMMENDED_SLOT
11
9
  import { QuickInsertMenuFooterItem } from './QuickInsertMenuFooterItem';
12
10
  import { QuickInsertRecommendedSlot } from './QuickInsertRecommendedSlot';
13
11
  import { QuickInsertSectionOverflowMenuItem } from './QuickInsertSectionOverflowMenuItem';
12
+ import QuickInsertMenuRoot from './registered-menu/QuickInsertMenuRoot';
13
+ import { QuickInsertMenuSection } from './registered-menu/QuickInsertMenuSection';
14
14
  const categories = [{
15
15
  message: messages.categoryRecommended,
16
16
  section: RECOMMENDED_SECTION
@@ -59,7 +59,10 @@ export const getQuickInsertComponents = ({
59
59
  api,
60
60
  includeElementBrowserItems,
61
61
  isRecommendedItem,
62
- maxRecommendedItems
62
+ maxRecommendedItems,
63
+ getItemRank,
64
+ emptyStateHandler,
65
+ fireAnalyticsEvent
63
66
  }) => {
64
67
  const recommendedSnapshot = createRecommendedSnapshotCache({
65
68
  api,
@@ -80,16 +83,27 @@ export const getQuickInsertComponents = ({
80
83
  isHidden: ({
81
84
  surfaceContext
82
85
  } = {}) => !recommendedSnapshot.getSnapshot(surfaceContext)[index],
83
- component: props => /*#__PURE__*/React.createElement(QuickInsertRecommendedSlot, {
84
- ...props,
85
- index,
86
+ component: ({
87
+ children,
88
+ parents,
89
+ surfaceContext
90
+ }) => /*#__PURE__*/React.createElement(QuickInsertRecommendedSlot, {
91
+ parents: parents,
92
+ surfaceContext: surfaceContext,
93
+ index: index,
86
94
  getSnapshot: recommendedSnapshot.getSnapshot
87
- })
95
+ }, children)
88
96
  }));
89
97
  return [{
90
98
  key: MENU.key,
91
99
  type: MENU.type,
92
- component: QuickInsertMenuRoot
100
+ component: ({
101
+ children
102
+ }) => /*#__PURE__*/React.createElement(QuickInsertMenuRoot, {
103
+ getItemRank: getItemRank,
104
+ emptyStateHandler: emptyStateHandler,
105
+ fireAnalyticsEvent: fireAnalyticsEvent
106
+ }, children)
93
107
  }, ...recommendedSlots, ...categories.flatMap(({
94
108
  message,
95
109
  section
@@ -114,7 +128,7 @@ export const getQuickInsertComponents = ({
114
128
  rank: CATEGORY_VIEW_MORE_RANK
115
129
  }],
116
130
  component: () => /*#__PURE__*/React.createElement(QuickInsertSectionOverflowMenuItem, {
117
- api,
131
+ api: api,
118
132
  category: section.key
119
133
  })
120
134
  }] : [])]), ...(includeElementBrowserItems ? [{
@@ -134,7 +148,7 @@ export const getQuickInsertComponents = ({
134
148
  rank: 100
135
149
  }],
136
150
  component: () => /*#__PURE__*/React.createElement(QuickInsertMenuFooterItem, {
137
- api
151
+ api: api
138
152
  })
139
153
  }] : [])];
140
154
  };
@@ -2,9 +2,9 @@ import { logException } from '@atlaskit/editor-common/monitoring/error';
2
2
  import { quickInsertProviderMenuItemKey } from '@atlaskit/editor-common/quick-insert/get-provider-menu-item-key';
3
3
  import { defaultIsRecommendedItem } from '@atlaskit/editor-common/quick-insert/is-recommended-item';
4
4
  import { MENU } from '@atlaskit/editor-common/quick-insert/keys';
5
+ import { REGISTERED_MENU_SURFACE_CONTEXT } from '@atlaskit/editor-common/registered-menu/surface-context';
5
6
  import { isMenuFooterSectionKey } from '@atlaskit/editor-common/type-ahead-is-menu-footer-section-key';
6
7
  import { isSectionOverflowItemKey } from '@atlaskit/editor-common/type-ahead-is-section-overflow-item-key';
7
- import { TYPE_AHEAD_SURFACE_CONTEXT } from '@atlaskit/editor-common/type-ahead-surface-context';
8
8
  export const MAX_RECOMMENDED_ITEMS = 5;
9
9
  export const RECOMMENDED_SLOT_KEY_PREFIX = 'quick-insert-recommended-slot-';
10
10
  export const isRecommendedSlotKey = key => key.startsWith(RECOMMENDED_SLOT_KEY_PREFIX);
@@ -68,7 +68,7 @@ export const createRecommendedSnapshotCache = ({
68
68
  let snapshot;
69
69
  const getSnapshot = surfaceContext => {
70
70
  var _surfaceContext$get, _snapshot;
71
- const menuOpenId = surfaceContext === null || surfaceContext === void 0 ? void 0 : (_surfaceContext$get = surfaceContext.get(TYPE_AHEAD_SURFACE_CONTEXT)) === null || _surfaceContext$get === void 0 ? void 0 : _surfaceContext$get.menuOpenId;
71
+ const menuOpenId = surfaceContext === null || surfaceContext === void 0 ? void 0 : (_surfaceContext$get = surfaceContext.get(REGISTERED_MENU_SURFACE_CONTEXT)) === null || _surfaceContext$get === void 0 ? void 0 : _surfaceContext$get.menuOpenId;
72
72
  if (!surfaceContext || !menuOpenId) {
73
73
  return [];
74
74
  }
@@ -0,0 +1,11 @@
1
+ ._zulp1ejb{gap:var(--ds-space-300,24px)}
2
+ ._1rjcoahv{padding-block:var(--ds-space-600,3pc)}
3
+ ._1rjcxy5q{padding-block:var(--ds-space-400,2pc)}._1bah1h6o{justify-content:center}
4
+ ._1bsb1mcy{width:57px}
5
+ ._1bsb1osq{width:100%}
6
+ ._1bsbtudo{width:76px}
7
+ ._1e0c1txw{display:flex}
8
+ ._2lx21bp4{flex-direction:column}
9
+ ._4cvr1h6o{align-items:center}
10
+ ._4t3i1h39{height:63px}
11
+ ._4t3io7ol{height:84px}
@@ -0,0 +1,47 @@
1
+ /* QuickInsertEmptyState.tsx generated by @compiled/babel-plugin v3.0.2 */
2
+ import "./QuickInsertEmptyState.compiled.css";
3
+ import { ax, ix } from "@compiled/react/runtime";
4
+ import React from 'react';
5
+ import { useIntl } from 'react-intl';
6
+ import { lazy, LazySuspense } from 'react-loosely-lazy';
7
+ import { cx } from '@atlaskit/css';
8
+ import { messages } from '@atlaskit/editor-common/quick-insert/messages';
9
+ import { Box } from '@atlaskit/primitives/compiled/box';
10
+ import { Text } from '@atlaskit/primitives/compiled/text';
11
+ const NoResultsIllustration = lazy(() => import( /* webpackChunkName: "@atlaskit-internal_editor-quick-insert-no-results" */
12
+ './assets/no-results').then(module => module.default));
13
+ const styles = {
14
+ base: "_zulp1ejb _4cvr1h6o _1e0c1txw _2lx21bp4 _1bah1h6o _1bsb1osq",
15
+ compact: "_1rjcxy5q",
16
+ spacious: "_1rjcoahv",
17
+ inlineIllustration: "_4t3i1h39 _1bsb1mcy",
18
+ fullIllustration: "_4t3io7ol _1bsbtudo"
19
+ };
20
+ export const QuickInsertEmptyState = ({
21
+ mode,
22
+ spacing = mode === 'full' ? 'spacious' : 'compact'
23
+ }) => {
24
+ const {
25
+ formatMessage
26
+ } = useIntl();
27
+ const illustrationSize = mode === 'full' ? {
28
+ width: 76,
29
+ height: 84
30
+ } : {
31
+ width: 57,
32
+ height: 63
33
+ };
34
+ return /*#__PURE__*/React.createElement(Box, {
35
+ testId: "quick-insert-empty-state",
36
+ xcss: cx(styles.base, styles[spacing])
37
+ }, /*#__PURE__*/React.createElement(Box, {
38
+ xcss: mode === 'full' ? styles.fullIllustration : styles.inlineIllustration
39
+ }, /*#__PURE__*/React.createElement(LazySuspense, {
40
+ fallback: null
41
+ }, /*#__PURE__*/React.createElement(NoResultsIllustration, {
42
+ width: illustrationSize.width,
43
+ height: illustrationSize.height
44
+ }))), /*#__PURE__*/React.createElement(Text, {
45
+ align: "center"
46
+ }, formatMessage(messages.noSearchResults)));
47
+ };
@@ -0,0 +1,191 @@
1
+ import React, { useCallback, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import { INPUT_METHOD } from '@atlaskit/editor-common/analytics/types/enums';
4
+ import { toolbarInsertBlockMessages } from '@atlaskit/editor-common/messages/insert-block';
5
+ import { QuickInsertProvider } from '@atlaskit/editor-common/quick-insert/provider';
6
+ import { useRegisteredMenuContext } from '@atlaskit/editor-common/registered-menu/context';
7
+ import { REGISTERED_MENU_SURFACE_CONTEXT } from '@atlaskit/editor-common/registered-menu/surface-context';
8
+ import { useRegisteredMenu } from '@atlaskit/editor-common/registered-menu/use-registered-menu';
9
+ import { isSectionOverflowItemKey } from '@atlaskit/editor-common/type-ahead-is-section-overflow-item-key';
10
+ import { typeAheadListMessages } from '@atlaskit/editor-common/type-ahead/messages';
11
+ import MenuGroup from '@atlaskit/menu/menu-group';
12
+ import { getQuickInsertMenuModel } from './get-quick-insert-menu-model';
13
+ import { getQuickInsertMenuItemId } from './getQuickInsertMenuItemId';
14
+ import { RegisteredQuickInsertMenuItem } from './RegisteredQuickInsertMenuItem';
15
+ import { selectQuickInsertCategoryItems } from './selectQuickInsertCategoryItems';
16
+ import { ToolbarQuickInsertMenu } from './ToolbarQuickInsertMenu';
17
+ import { TypeAheadQuickInsertMenu } from './TypeAheadQuickInsertMenu';
18
+ import { useQuickInsertSearchAnalytics } from './useQuickInsertSearchAnalytics';
19
+ const DEFAULT_MENU_MAX_HEIGHT = 480;
20
+ const isImeEnter = event => event.isComposing || event.keyCode === 229;
21
+ const QuickInsertMenuRoot = ({
22
+ emptyStateHandler,
23
+ fireAnalyticsEvent,
24
+ getItemRank
25
+ }) => {
26
+ var _surfaceContext$get, _registeredMenu$maxHe;
27
+ const registeredMenu = useRegisteredMenuContext();
28
+ const {
29
+ query = '',
30
+ select: selectFromHost,
31
+ surfaceContext
32
+ } = registeredMenu;
33
+ const surface = (_surfaceContext$get = surfaceContext.get(REGISTERED_MENU_SURFACE_CONTEXT)) === null || _surfaceContext$get === void 0 ? void 0 : _surfaceContext$get.surface;
34
+ if (!selectFromHost || !surface || surface === 'element-browser') {
35
+ throw new Error('QuickInsertMenuRoot requires a selection action and registered menu surface');
36
+ }
37
+ const {
38
+ formatMessage
39
+ } = useIntl();
40
+ const {
41
+ components,
42
+ getItemRank: runtimeItemRank,
43
+ rootComponent
44
+ } = registeredMenu;
45
+ const model = useMemo(() => getQuickInsertMenuModel({
46
+ components,
47
+ formatMessage,
48
+ getItemRank: runtimeItemRank !== null && runtimeItemRank !== void 0 ? runtimeItemRank : getItemRank,
49
+ query,
50
+ rootComponent,
51
+ selectCategoryItems: components.some(({
52
+ key
53
+ }) => isSectionOverflowItemKey(key)) ? selectQuickInsertCategoryItems : undefined,
54
+ surfaceContext
55
+ }), [components, formatMessage, getItemRank, query, rootComponent, runtimeItemRank, surfaceContext]);
56
+ const resultCount = useMemo(() => model.sections.reduce((count, [, ...items]) => count + items.filter(({
57
+ key
58
+ }) => !isSectionOverflowItemKey(key)).length, 0), [model.sections]);
59
+ const flushSearchAnalytics = useQuickInsertSearchAnalytics({
60
+ surface,
61
+ fireAnalyticsEvent,
62
+ query,
63
+ resultCount
64
+ });
65
+ const selectItem = useCallback(selection => {
66
+ flushSearchAnalytics();
67
+ selectFromHost(insert => selection({
68
+ insert,
69
+ source: surface === 'toolbar' ? INPUT_METHOD.INSERT_MENU : INPUT_METHOD.QUICK_INSERT
70
+ }));
71
+ }, [flushSearchAnalytics, selectFromHost, surface]);
72
+ const menuContextValue = useMemo(() => ({
73
+ editorView: registeredMenu.editorView,
74
+ isOffline: registeredMenu.isOffline,
75
+ popupsMountPoint: registeredMenu.portalMountPoint,
76
+ select: selectItem,
77
+ surfaceContext: registeredMenu.surfaceContext
78
+ }), [registeredMenu.editorView, registeredMenu.isOffline, registeredMenu.portalMountPoint, registeredMenu.surfaceContext, selectItem]);
79
+ const listLabel = formatMessage(surface === 'typeahead' ? typeAheadListMessages.quickInsertInputLabel : toolbarInsertBlockMessages.insertMenu);
80
+ const {
81
+ rows,
82
+ selectableItems,
83
+ selectedItemIndex,
84
+ activeItemKey,
85
+ ...listEvents
86
+ } = useRegisteredMenu({
87
+ model,
88
+ resetKey: query
89
+ });
90
+ const listId = useId();
91
+ const [renderedItems, setRenderedItems] = useState({
92
+ startIndex: -1,
93
+ stopIndex: -1
94
+ });
95
+ const menuRef = useRef(null);
96
+ const maxHeight = (_registeredMenu$maxHe = registeredMenu.maxHeight) !== null && _registeredMenu$maxHe !== void 0 ? _registeredMenu$maxHe : DEFAULT_MENU_MAX_HEIGHT;
97
+ const itemCount = selectableItems.length + (model.footer ? 1 : 0);
98
+ const activeItemId = selectedItemIndex >= 0 && selectedItemIndex < itemCount ? getQuickInsertMenuItemId(listId, selectedItemIndex) : undefined;
99
+ const isActiveItemMounted = selectedItemIndex >= 0 && selectedItemIndex < itemCount && (selectedItemIndex >= renderedItems.startIndex && selectedItemIndex <= renderedItems.stopIndex || Boolean(model.footer) && selectedItemIndex === itemCount - 1);
100
+ const selectActiveItem = useCallback(() => {
101
+ if (isActiveItemMounted && activeItemId) {
102
+ var _menuRef$current, _menuRef$current$owne;
103
+ (_menuRef$current = menuRef.current) === null || _menuRef$current === void 0 ? void 0 : (_menuRef$current$owne = _menuRef$current.ownerDocument.getElementById(activeItemId)) === null || _menuRef$current$owne === void 0 ? void 0 : _menuRef$current$owne.click();
104
+ }
105
+ }, [activeItemId, isActiveItemMounted]);
106
+ const onMenuKeyDown = useCallback(event => {
107
+ if (event.key === 'ArrowDown') {
108
+ listEvents.selectNext();
109
+ return true;
110
+ }
111
+ if (event.key === 'ArrowUp') {
112
+ listEvents.selectPrevious();
113
+ return true;
114
+ }
115
+ if (event.key === 'Enter') {
116
+ if (isImeEnter(event)) {
117
+ return false;
118
+ }
119
+ selectActiveItem();
120
+ return true;
121
+ }
122
+ return false;
123
+ }, [listEvents.selectNext, listEvents.selectPrevious, selectActiveItem]);
124
+ const containsTarget = useCallback(target => {
125
+ var _menuRef$current2;
126
+ return Boolean((_menuRef$current2 = menuRef.current) === null || _menuRef$current2 === void 0 ? void 0 : _menuRef$current2.contains(target));
127
+ }, []);
128
+ const interaction = useMemo(() => ({
129
+ activeDescendantId: isActiveItemMounted ? activeItemId : undefined,
130
+ containsTarget,
131
+ expanded: itemCount > 0,
132
+ label: listLabel,
133
+ listId,
134
+ onKeyDown: onMenuKeyDown,
135
+ onClose: flushSearchAnalytics,
136
+ optionCount: itemCount,
137
+ selectNext: listEvents.selectNext,
138
+ selectPrevious: listEvents.selectPrevious
139
+ }), [activeItemId, containsTarget, flushSearchAnalytics, isActiveItemMounted, itemCount, listId, listLabel, listEvents.selectNext, listEvents.selectPrevious, onMenuKeyDown]);
140
+ useLayoutEffect(() => {
141
+ if (!model.root) {
142
+ return;
143
+ }
144
+ return registeredMenu.registerInteraction(interaction);
145
+ }, [model.root, interaction, registeredMenu.registerInteraction]);
146
+ if (!model.root) {
147
+ return null;
148
+ }
149
+ return /*#__PURE__*/React.createElement(QuickInsertProvider, {
150
+ value: menuContextValue
151
+ }, /*#__PURE__*/React.createElement("div", {
152
+ ref: menuRef
153
+ }, /*#__PURE__*/React.createElement(MenuGroup, null, surface === 'typeahead' ? /*#__PURE__*/React.createElement(TypeAheadQuickInsertMenu, {
154
+ Item: RegisteredQuickInsertMenuItem,
155
+ activeItemKey: activeItemKey,
156
+ hasScrollPadding: true,
157
+ itemCount: itemCount,
158
+ listId: listId,
159
+ listLabel: listLabel,
160
+ maxHeight: maxHeight,
161
+ model: model,
162
+ onItemBlur: listEvents.onItemBlur,
163
+ onItemFocus: listEvents.onItemFocus,
164
+ onItemHover: listEvents.onItemHover,
165
+ onItemLeave: listEvents.onItemLeave,
166
+ onItemVisibilityChange: listEvents.onItemVisibilityChange,
167
+ onRenderedItemsChange: setRenderedItems,
168
+ query: query,
169
+ rows: rows,
170
+ selectedItemIndex: selectedItemIndex
171
+ }) : /*#__PURE__*/React.createElement(ToolbarQuickInsertMenu, {
172
+ Item: RegisteredQuickInsertMenuItem,
173
+ activePreviewItemKey: activeItemKey,
174
+ emptyStateHandler: emptyStateHandler,
175
+ itemCount: itemCount,
176
+ listId: listId,
177
+ listLabel: listLabel,
178
+ maxHeight: maxHeight,
179
+ model: model,
180
+ onItemBlur: listEvents.onItemBlur,
181
+ onItemFocus: listEvents.onItemFocus,
182
+ onItemHover: listEvents.onItemHover,
183
+ onItemLeave: listEvents.onItemLeave,
184
+ onItemVisibilityChange: listEvents.onItemVisibilityChange,
185
+ onRenderedItemsChange: setRenderedItems,
186
+ query: query,
187
+ rows: rows,
188
+ selectedItemIndex: selectedItemIndex
189
+ }))));
190
+ };
191
+ export default QuickInsertMenuRoot;
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import HeadingItem from '@atlaskit/menu/heading-item';
3
+ import { Box } from '@atlaskit/primitives/compiled/box';
4
+ export const QuickInsertMenuSection = ({
5
+ children,
6
+ title
7
+ }) => /*#__PURE__*/React.createElement(Box, {
8
+ role: "group",
9
+ "aria-label": title
10
+ }, /*#__PURE__*/React.createElement(Box, {
11
+ paddingBlockStart: "space.150",
12
+ paddingBlockEnd: "space.050"
13
+ }, /*#__PURE__*/React.createElement(HeadingItem, {
14
+ "aria-hidden": true
15
+ }, title)), children);
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import { messages } from '@atlaskit/editor-common/quick-insert/messages';
4
+ import { QuickInsertMenuSection } from './QuickInsertMenuSection';
5
+ export const QuickInsertSearchResultsSection = ({
6
+ children
7
+ }) => {
8
+ const {
9
+ formatMessage
10
+ } = useIntl();
11
+ return /*#__PURE__*/React.createElement(QuickInsertMenuSection, {
12
+ title: formatMessage(messages.searchResults)
13
+ }, children);
14
+ };
@@ -0,0 +1,34 @@
1
+ import React, { useMemo } from 'react';
2
+ import { QuickInsertProvider } from '@atlaskit/editor-common/quick-insert/provider';
3
+ import { useQuickInsertContext } from '@atlaskit/editor-common/quick-insert/use-quick-insert-context';
4
+ export const RegisteredQuickInsertMenuItem = ({
5
+ id,
6
+ isSelected,
7
+ isActive,
8
+ registration
9
+ }) => {
10
+ var _registration$compone;
11
+ const {
12
+ editorView,
13
+ isOffline,
14
+ popupsMountPoint,
15
+ select,
16
+ surfaceContext
17
+ } = useQuickInsertContext();
18
+ const value = useMemo(() => ({
19
+ editorView,
20
+ isOffline,
21
+ item: {
22
+ id,
23
+ isSelected,
24
+ isPreviewActive: isActive
25
+ },
26
+ popupsMountPoint,
27
+ select,
28
+ surfaceContext
29
+ }), [editorView, isOffline, popupsMountPoint, select, surfaceContext, isActive, id, isSelected]);
30
+ const Component = (_registration$compone = registration.component) !== null && _registration$compone !== void 0 ? _registration$compone : React.Fragment;
31
+ return /*#__PURE__*/React.createElement(QuickInsertProvider, {
32
+ value: value
33
+ }, /*#__PURE__*/React.createElement(Component, null, null));
34
+ };
@@ -0,0 +1,11 @@
1
+ ._15a5nqa1{border-top-style:solid}
2
+ ._16jlkb7n{flex-grow:1}
3
+ ._18m91wug{overflow-y:auto}
4
+ ._1e0c1txw{display:flex}
5
+ ._1i531l7x{border-top-color:var(--ds-border,#0b120e24)}
6
+ ._1o9zidpf{flex-shrink:0}
7
+ ._1q51u2gc{padding-block-start:var(--ds-space-100,8px)}
8
+ ._1tkeidpf{min-height:0}
9
+ ._2lx21bp4{flex-direction:column}
10
+ ._85i5u2gc{padding-block-end:var(--ds-space-100,8px)}
11
+ ._uwhke4h9{border-top-width:var(--ds-border-width,1px)}
@@ -0,0 +1,116 @@
1
+ /* ToolbarQuickInsertMenu.tsx generated by @compiled/babel-plugin v3.0.2 */
2
+ import "./ToolbarQuickInsertMenu.compiled.css";
3
+ import { ax, ix } from "@compiled/react/runtime";
4
+ import React, { useCallback } from 'react';
5
+ import { RegisteredMenuList } from '@atlaskit/editor-common/registered-menu/list';
6
+ import { Box } from '@atlaskit/primitives/compiled/box';
7
+ import { getQuickInsertMenuItemId } from './getQuickInsertMenuItemId';
8
+ import { QuickInsertEmptyState } from './QuickInsertEmptyState';
9
+ const MENU_FOOTER_HEIGHT = 45;
10
+ const LIST_WIDTH = 350;
11
+ const styles = {
12
+ content: "_1e0c1txw _2lx21bp4 _1tkeidpf",
13
+ scrollable: "_16jlkb7n _1tkeidpf _18m91wug",
14
+ footer: "_1o9zidpf",
15
+ externalControls: "_1i531l7x _15a5nqa1 _uwhke4h9 _1q51u2gc _85i5u2gc",
16
+ footerDivider: "_1i531l7x _15a5nqa1 _uwhke4h9 _1o9zidpf"
17
+ };
18
+ export const ToolbarQuickInsertMenu = ({
19
+ Item,
20
+ model,
21
+ emptyStateHandler,
22
+ listLabel,
23
+ activePreviewItemKey,
24
+ itemCount,
25
+ listId,
26
+ maxHeight,
27
+ rows,
28
+ onItemBlur,
29
+ onItemFocus,
30
+ onItemHover,
31
+ onItemLeave,
32
+ onItemVisibilityChange,
33
+ onRenderedItemsChange,
34
+ query,
35
+ selectedItemIndex
36
+ }) => {
37
+ const footerItemIndex = itemCount - 1;
38
+ const footerItemId = getQuickInsertMenuItemId(listId, footerItemIndex);
39
+ const isEmptySearch = query !== '' && model.sections.length === 0;
40
+ const hasNoSearchResults = model.sections.length === 0 && model.fallbackItems.length === 0;
41
+ const externalControls = isEmptySearch ? emptyStateHandler === null || emptyStateHandler === void 0 ? void 0 : emptyStateHandler({
42
+ mode: 'inline',
43
+ searchTerm: query,
44
+ showNoResultsMessage: false
45
+ }) : null;
46
+ const onFooterItemFocus = useCallback(() => onItemFocus(footerItemIndex), [footerItemIndex, onItemFocus]);
47
+ const onFooterItemHover = useCallback(() => onItemHover(footerItemIndex), [footerItemIndex, onItemHover]);
48
+ const listMaxHeight = Math.max(0, maxHeight - (model.footer ? MENU_FOOTER_HEIGHT : 0));
49
+ const contentStyle = {
50
+ maxHeight: maxHeight
51
+ };
52
+ const getItemId = useCallback(({
53
+ itemIndex
54
+ }) => getQuickInsertMenuItemId(listId, itemIndex), [listId]);
55
+ const onScrollableContentScroll = useCallback(event => {
56
+ if (event.target === event.currentTarget && activePreviewItemKey) {
57
+ onItemVisibilityChange(activePreviewItemKey, false);
58
+ }
59
+ }, [activePreviewItemKey, onItemVisibilityChange]);
60
+ if (!model.root) {
61
+ return null;
62
+ }
63
+ return /*#__PURE__*/React.createElement(Box, {
64
+ xcss: styles.content,
65
+ style: contentStyle
66
+ }, /*#__PURE__*/React.createElement(Box, {
67
+ xcss: styles.scrollable,
68
+ onScroll: onScrollableContentScroll
69
+ }, /*#__PURE__*/React.createElement(Box, {
70
+ "aria-label": listLabel,
71
+ "aria-owns": model.footer ? footerItemId : undefined,
72
+ id: listId,
73
+ role: "listbox"
74
+ }, rows.length > 0 && /*#__PURE__*/React.createElement(RegisteredMenuList, {
75
+ rows: rows,
76
+ Item: Item,
77
+ width: LIST_WIDTH,
78
+ maxHeight: listMaxHeight,
79
+ getItemId: getItemId,
80
+ activeItemKey: activePreviewItemKey,
81
+ selectedItemIndex: selectedItemIndex,
82
+ scrollResetKey: query,
83
+ onItemHover: onItemHover,
84
+ onItemFocus: onItemFocus,
85
+ onItemBlur: onItemBlur,
86
+ onItemLeave: onItemLeave,
87
+ onItemVisibilityChange: onItemVisibilityChange,
88
+ onRenderedItemsChange: onRenderedItemsChange,
89
+ role: "group",
90
+ tabIndex: null,
91
+ omitAriaReadonly: true,
92
+ lastRowPadding: "space.100",
93
+ scrollTo: "top-on-reset"
94
+ })), query !== '' && hasNoSearchResults && /*#__PURE__*/React.createElement(QuickInsertEmptyState, {
95
+ mode: "inline"
96
+ }), externalControls && /*#__PURE__*/React.createElement(Box, {
97
+ testId: "registered-insert-menu-external-controls",
98
+ xcss: styles.externalControls
99
+ }, externalControls)), model.footer && /*#__PURE__*/React.createElement(Box, {
100
+ xcss: styles.footer
101
+ }, /*#__PURE__*/React.createElement(Box, {
102
+ testId: "registered-insert-menu-footer",
103
+ xcss: styles.footer
104
+ }, !isEmptySearch || !hasNoSearchResults || Boolean(externalControls) ? /*#__PURE__*/React.createElement(Box, {
105
+ "aria-hidden": "true",
106
+ xcss: styles.footerDivider
107
+ }) : null, /*#__PURE__*/React.createElement(Box, {
108
+ onFocus: onFooterItemFocus,
109
+ onMouseMove: onFooterItemHover
110
+ }, /*#__PURE__*/React.createElement(Item, {
111
+ id: footerItemId,
112
+ isSelected: selectedItemIndex === footerItemIndex,
113
+ isActive: false,
114
+ registration: model.footer
115
+ })))));
116
+ };
@@ -0,0 +1,3 @@
1
+ ._15a5nqa1{border-top-style:solid}
2
+ ._1i531l7x{border-top-color:var(--ds-border,#0b120e24)}
3
+ ._uwhke4h9{border-top-width:var(--ds-border-width,1px)}
@@ -0,0 +1,78 @@
1
+ /* TypeAheadQuickInsertMenu.tsx generated by @compiled/babel-plugin v3.0.2 */
2
+ import "./TypeAheadQuickInsertMenu.compiled.css";
3
+ import { ax, ix } from "@compiled/react/runtime";
4
+ import React, { useCallback } from 'react';
5
+ import { RegisteredMenuList } from '@atlaskit/editor-common/registered-menu/list';
6
+ import { Box } from '@atlaskit/primitives/compiled/box';
7
+ import { getQuickInsertMenuItemId } from './getQuickInsertMenuItemId';
8
+ import { QuickInsertEmptyState } from './QuickInsertEmptyState';
9
+ const LIST_WIDTH = 320;
10
+ const MENU_FOOTER_HEIGHT = 45;
11
+ const MENU_FOOTER_HEIGHT_WITH_SCROLL_PADDING = 51;
12
+ const styles = {
13
+ footer: "_1i531l7x _15a5nqa1 _uwhke4h9"
14
+ };
15
+ export const TypeAheadQuickInsertMenu = ({
16
+ Item,
17
+ rows,
18
+ activeItemKey,
19
+ itemCount,
20
+ listId,
21
+ listLabel,
22
+ maxHeight,
23
+ model,
24
+ onItemFocus,
25
+ onItemBlur,
26
+ onItemHover,
27
+ onItemLeave,
28
+ onItemVisibilityChange,
29
+ onRenderedItemsChange,
30
+ query = '',
31
+ selectedItemIndex,
32
+ hasScrollPadding = false
33
+ }) => {
34
+ const footerItemIndex = itemCount - 1;
35
+ const onFooterItemHover = useCallback(() => onItemHover(footerItemIndex), [footerItemIndex, onItemHover]);
36
+ const getItemId = useCallback(({
37
+ itemIndex
38
+ }) => getQuickInsertMenuItemId(listId, itemIndex), [listId]);
39
+ if (!model.root) {
40
+ return null;
41
+ }
42
+ const listMaxHeight = Math.max(0, maxHeight - (model.footer ? hasScrollPadding ? MENU_FOOTER_HEIGHT_WITH_SCROLL_PADDING : MENU_FOOTER_HEIGHT : 0));
43
+ const hasListboxContent = rows.length > 0 || model.footer !== undefined;
44
+ return /*#__PURE__*/React.createElement(Box, {
45
+ "aria-label": hasListboxContent ? listLabel : undefined,
46
+ id: listId,
47
+ role: hasListboxContent ? 'listbox' : undefined
48
+ }, rows.length > 0 ? /*#__PURE__*/React.createElement(RegisteredMenuList, {
49
+ rows: rows,
50
+ Item: Item,
51
+ width: LIST_WIDTH,
52
+ maxHeight: listMaxHeight,
53
+ getItemId: getItemId,
54
+ activeItemKey: activeItemKey,
55
+ selectedItemIndex: selectedItemIndex,
56
+ scrollResetKey: query,
57
+ hasScrollPadding: hasScrollPadding,
58
+ scrollTo: "top-on-reset",
59
+ onItemFocus: onItemFocus,
60
+ onItemBlur: onItemBlur,
61
+ onItemHover: onItemHover,
62
+ onItemLeave: onItemLeave,
63
+ onItemVisibilityChange: onItemVisibilityChange,
64
+ onRenderedItemsChange: onRenderedItemsChange
65
+ }) : query !== '' && /*#__PURE__*/React.createElement(QuickInsertEmptyState, {
66
+ mode: "inline",
67
+ spacing: "spacious"
68
+ }), model.footer && /*#__PURE__*/React.createElement(Box, {
69
+ onMouseMove: onFooterItemHover,
70
+ paddingBlockEnd: hasScrollPadding ? 'space.075' : undefined,
71
+ xcss: styles.footer
72
+ }, /*#__PURE__*/React.createElement(Item, {
73
+ id: getQuickInsertMenuItemId(listId, footerItemIndex),
74
+ isSelected: selectedItemIndex === footerItemIndex,
75
+ isActive: false,
76
+ registration: model.footer
77
+ })));
78
+ };
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ export default function NoResultsIllustration({
3
+ height,
4
+ width
5
+ }) {
6
+ return /*#__PURE__*/React.createElement("svg", {
7
+ width: width,
8
+ height: height,
9
+ viewBox: "0 0 57 63",
10
+ fill: "none",
11
+ xmlns: "http://www.w3.org/2000/svg",
12
+ "aria-hidden": "true",
13
+ focusable: "false"
14
+ }, /*#__PURE__*/React.createElement("path", {
15
+ fill: "#dddee1",
16
+ d: "M23.5 49.223c-5.196 0-10.166-1.955-14.442-5.814a30 30 0 0 1-3.545-3.85 29.6 29.6 0 0 1-2.868-4.456c-4.56-8.775-3.179-18.124 3.79-25.647a32.6 32.6 0 0 1 3.942-3.593 32 32 0 0 1 4.287-2.81c9.017-4.89 18.424-3.869 25.803 2.8a30.3 30.3 0 0 1 3.59 3.897 29.7 29.7 0 0 1 2.837 4.396C51.5 22.96 50.12 32.324 43.106 39.83a31.5 31.5 0 0 1-3.797 3.442 33 33 0 0 1-4.468 2.912c-3.777 2.03-7.62 3.036-11.341 3.036zm2.478-44.539c-2.957 0-6.02.824-9.082 2.489a28 28 0 0 0-3.658 2.396 27.5 27.5 0 0 0-3.37 3.07C4.24 18.711 3.15 25.92 6.798 32.941a25 25 0 0 0 2.42 3.75 25 25 0 0 0 2.981 3.24c5.866 5.299 13.119 6.054 20.427 2.13a27.4 27.4 0 0 0 3.818-2.492 27.5 27.5 0 0 0 3.24-2.936c5.658-6.054 6.741-13.27 3.06-20.318a25 25 0 0 0-2.39-3.698 25.3 25.3 0 0 0-3.021-3.289c-3.418-3.086-7.288-4.645-11.348-4.645z"
17
+ }), /*#__PURE__*/React.createElement("path", {
18
+ fill: "#dddee1",
19
+ d: "M42.822 42.291c-1.21-1.685-2.509-1.675-3.777-.694-1.19.92-1.507 2.164-.24 3.801l1.45 1.873 4.017-3.107z"
20
+ }), /*#__PURE__*/React.createElement("path", {
21
+ fill: "#dddee1",
22
+ d: "m45.28 43.385-6.03 4.663 11.332 14.657 6.03-4.663z"
23
+ }), /*#__PURE__*/React.createElement("path", {
24
+ fill: "#b7b9be",
25
+ d: "m44.31 44.134-4.091 3.163 3.843 4.97 4.091-3.163z"
26
+ }), /*#__PURE__*/React.createElement("path", {
27
+ fill: "#dddee1",
28
+ d: "M26.834 30.328h-3.42v-.217c-.116-2.432 1.264-5.066 3.227-6.143l.037-.02q.08-.042.154-.093c1.071-.69 1.68-1.88 1.643-3.189-.037-1.298-.707-2.439-1.791-3.052a4.5 4.5 0 0 0-2.21-.592c-2.315 0-4.198 1.897-4.198 4.229h-3.42c0-4.23 3.417-7.672 7.618-7.672a7.9 7.9 0 0 1 3.884 1.033c2.14 1.211 3.462 3.437 3.534 5.955.073 2.53-1.125 4.84-3.203 6.18q-.211.139-.424.251c-.815.458-1.497 1.868-1.434 2.97zM24.795 32.303a3.4 3.4 0 0 1 1.096-.004c1.115.183 2.021.965 2.241 2.182l.002.01.002.009a3.4 3.4 0 0 1-.002 1.103v.004c-.216 1.23-1.136 2.009-2.247 2.19a3.417 3.417 0 0 1-1.085-.003c-1.117-.18-2.027-.961-2.249-2.179l-.002-.01-.001-.01a3.3 3.3 0 0 1 0-1.095l.002-.01.001-.01c.223-1.223 1.137-1.992 2.24-2.177z"
29
+ }));
30
+ }