@atlaskit/editor-plugin-block-menu 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/afm-cc/tsconfig.json +3 -0
  3. package/afm-passionfruit/tsconfig.json +51 -0
  4. package/dist/cjs/blockMenuPlugin.js +12 -0
  5. package/dist/cjs/editor-actions/index.js +65 -0
  6. package/dist/cjs/ui/block-menu-components.js +131 -0
  7. package/dist/cjs/ui/block-menu-renderer.js +54 -0
  8. package/dist/cjs/ui/block-menu.js +32 -69
  9. package/dist/cjs/ui/consts.js +7 -0
  10. package/dist/es2019/blockMenuPlugin.js +37 -23
  11. package/dist/es2019/editor-actions/index.js +57 -0
  12. package/dist/es2019/ui/block-menu-components.js +127 -0
  13. package/dist/es2019/ui/block-menu-renderer.js +35 -0
  14. package/dist/es2019/ui/block-menu.js +27 -67
  15. package/dist/es2019/ui/consts.js +1 -0
  16. package/dist/esm/blockMenuPlugin.js +12 -0
  17. package/dist/esm/editor-actions/index.js +58 -0
  18. package/dist/esm/ui/block-menu-components.js +124 -0
  19. package/dist/esm/ui/block-menu-renderer.js +45 -0
  20. package/dist/esm/ui/block-menu.js +32 -68
  21. package/dist/esm/ui/consts.js +1 -0
  22. package/dist/types/blockMenuPluginType.d.ts +41 -0
  23. package/dist/types/editor-actions/index.d.ts +52 -0
  24. package/dist/types/index.d.ts +1 -1
  25. package/dist/types/ui/block-menu-components.d.ts +2 -0
  26. package/dist/types/ui/block-menu-renderer.d.ts +18 -0
  27. package/dist/types/ui/consts.d.ts +1 -0
  28. package/dist/types-ts4.5/blockMenuPluginType.d.ts +41 -0
  29. package/dist/types-ts4.5/editor-actions/index.d.ts +52 -0
  30. package/dist/types-ts4.5/index.d.ts +1 -1
  31. package/dist/types-ts4.5/ui/block-menu-components.d.ts +2 -0
  32. package/dist/types-ts4.5/ui/block-menu-renderer.d.ts +18 -0
  33. package/dist/types-ts4.5/ui/consts.d.ts +1 -0
  34. package/package.json +6 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @atlaskit/editor-plugin-block-menu
2
2
 
3
+ ## 0.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [`c930aab37d2a6`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/c930aab37d2a6) -
8
+ ED-28563: Block menu API to register menu items
9
+ - Updated dependencies
10
+
11
+ ## 0.0.2
12
+
13
+ ### Patch Changes
14
+
15
+ - [#199487](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/199487)
16
+ [`53b66ca466092`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/53b66ca466092) -
17
+ ED-28963 Update block menu to be aligned with drag handle
18
+ - Updated dependencies
19
+
3
20
  ## 0.0.1
4
21
 
5
22
  ### Patch Changes
@@ -32,6 +32,9 @@
32
32
  {
33
33
  "path": "../../editor-shared-styles/afm-cc/tsconfig.json"
34
34
  },
35
+ {
36
+ "path": "../../editor-toolbar/afm-cc/tsconfig.json"
37
+ },
35
38
  {
36
39
  "path": "../../../design-system/icon/afm-cc/tsconfig.json"
37
40
  },
@@ -0,0 +1,51 @@
1
+ {
2
+ "extends": "../../../../tsconfig.entry-points.passionfruit.json",
3
+ "compilerOptions": {
4
+ "target": "es5",
5
+ "outDir": "../../../../../passionfruit/tsDist/@atlaskit__editor-plugin-block-menu/app",
6
+ "rootDir": "../",
7
+ "composite": true
8
+ },
9
+ "include": [
10
+ "../src/**/*.ts",
11
+ "../src/**/*.tsx"
12
+ ],
13
+ "exclude": [
14
+ "../src/**/__tests__/*",
15
+ "../src/**/*.test.*",
16
+ "../src/**/test.*",
17
+ "../src/**/examples.*"
18
+ ],
19
+ "references": [
20
+ {
21
+ "path": "../../../design-system/css/afm-passionfruit/tsconfig.json"
22
+ },
23
+ {
24
+ "path": "../../../design-system/dropdown-menu/afm-passionfruit/tsconfig.json"
25
+ },
26
+ {
27
+ "path": "../../editor-plugin-block-controls/afm-passionfruit/tsconfig.json"
28
+ },
29
+ {
30
+ "path": "../../editor-plugin-user-intent/afm-passionfruit/tsconfig.json"
31
+ },
32
+ {
33
+ "path": "../../editor-shared-styles/afm-passionfruit/tsconfig.json"
34
+ },
35
+ {
36
+ "path": "../../../design-system/icon/afm-passionfruit/tsconfig.json"
37
+ },
38
+ {
39
+ "path": "../../../design-system/icon-lab/afm-passionfruit/tsconfig.json"
40
+ },
41
+ {
42
+ "path": "../../../design-system/primitives/afm-passionfruit/tsconfig.json"
43
+ },
44
+ {
45
+ "path": "../../../design-system/tokens/afm-passionfruit/tsconfig.json"
46
+ },
47
+ {
48
+ "path": "../../editor-common/afm-passionfruit/tsconfig.json"
49
+ }
50
+ ]
51
+ }
@@ -6,10 +6,14 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.blockMenuPlugin = void 0;
8
8
  var _react = _interopRequireDefault(require("react"));
9
+ var _editorActions = require("./editor-actions");
9
10
  var _main = require("./pm-plugins/main");
10
11
  var _blockMenu = _interopRequireDefault(require("./ui/block-menu"));
12
+ var _blockMenuComponents = require("./ui/block-menu-components");
11
13
  var blockMenuPlugin = exports.blockMenuPlugin = function blockMenuPlugin(_ref) {
12
14
  var api = _ref.api;
15
+ var registry = (0, _editorActions.createBlockMenuRegistry)();
16
+ registry.register((0, _blockMenuComponents.getBlockMenuComponents)());
13
17
  return {
14
18
  name: 'blockMenu',
15
19
  pmPlugins: function pmPlugins() {
@@ -18,6 +22,14 @@ var blockMenuPlugin = exports.blockMenuPlugin = function blockMenuPlugin(_ref) {
18
22
  plugin: _main.createPlugin
19
23
  }];
20
24
  },
25
+ actions: {
26
+ registerBlockMenuComponents: function registerBlockMenuComponents(blockMenuComponents) {
27
+ registry.register(blockMenuComponents);
28
+ },
29
+ getBlockMenuComponents: function getBlockMenuComponents() {
30
+ return registry.components;
31
+ }
32
+ },
21
33
  contentComponent: function contentComponent(_ref2) {
22
34
  var editorView = _ref2.editorView,
23
35
  popupsMountPoint = _ref2.popupsMountPoint,
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createBlockMenuRegistry = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ /**
10
+ * Create a simple registry for block menu components.
11
+ *
12
+ * @returns A registry object with a `register` method and a `components` array.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const registry = createBlockMenuRegistry();
17
+ * registry.register(
18
+ * [{
19
+ * type: 'block-menu-section' as const,
20
+ * key: 'block-menu-section-format',
21
+ * rank: 100,
22
+ * component: ({ children }: { children: React.ReactNode }) => {
23
+ * return <ToolbarDropdownItemSection>{children}</ToolbarDropdownItemSection>;
24
+ * },
25
+ * },
26
+ * {
27
+ * type: 'block-menu-nested' as const,
28
+ * key: 'nested-menu',
29
+ * parent: {
30
+ * type: 'block-menu-section' as const,
31
+ * key: 'block-menu-section-format',
32
+ * rank: 100,
33
+ * },
34
+ * component: () => {
35
+ * return (
36
+ * <ToolbarNestedDropdownMenu>{...}</ToolbarNestedDropdownMenu>
37
+ * );
38
+ * },
39
+ * },
40
+ * {
41
+ * type: 'block-menu-item' as const,
42
+ * key: 'block-menu-item-create-jira',
43
+ * parent: {
44
+ * type: 'block-menu-section' as const,
45
+ * key: 'block-menu-section-format',
46
+ * rank: 200,
47
+ * },
48
+ * component: () => {
49
+ * return <ToolbarDropdownItem elemBefore={<JiraIcon label="" />}>Create Jira work item</ToolbarDropdownItem>;
50
+ * },
51
+ * },
52
+ * ]);
53
+ * ```
54
+ *
55
+ */
56
+ var createBlockMenuRegistry = exports.createBlockMenuRegistry = function createBlockMenuRegistry() {
57
+ var components = [];
58
+ var register = function register(blockMenuComponents) {
59
+ components.push.apply(components, (0, _toConsumableArray2.default)(blockMenuComponents));
60
+ };
61
+ return {
62
+ register: register,
63
+ components: components
64
+ };
65
+ };
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getBlockMenuComponents = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _editorToolbar = require("@atlaskit/editor-toolbar");
10
+ var _jira = _interopRequireDefault(require("@atlaskit/icon-lab/core/jira"));
11
+ var _arrowDown = _interopRequireDefault(require("@atlaskit/icon/core/arrow-down"));
12
+ var _arrowUp = _interopRequireDefault(require("@atlaskit/icon/core/arrow-up"));
13
+ var _changes = _interopRequireDefault(require("@atlaskit/icon/core/changes"));
14
+ var _chevronRight = _interopRequireDefault(require("@atlaskit/icon/core/chevron-right"));
15
+ var _delete = _interopRequireDefault(require("@atlaskit/icon/core/delete"));
16
+ var _listBulleted = _interopRequireDefault(require("@atlaskit/icon/core/list-bulleted"));
17
+ var _task = _interopRequireDefault(require("@atlaskit/icon/core/task"));
18
+ var getBlockMenuComponents = exports.getBlockMenuComponents = function getBlockMenuComponents() {
19
+ return [{
20
+ type: 'block-menu-section',
21
+ key: 'block-menu-section-format',
22
+ rank: 100,
23
+ component: function component(_ref) {
24
+ var children = _ref.children;
25
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, null, children);
26
+ }
27
+ }, {
28
+ type: 'block-menu-section',
29
+ key: 'block-menu-section-move-up-down',
30
+ rank: 200,
31
+ component: function component(_ref2) {
32
+ var children = _ref2.children;
33
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, null, children);
34
+ }
35
+ }, {
36
+ type: 'block-menu-section',
37
+ key: 'block-menu-section-delete',
38
+ rank: 300,
39
+ component: function component(_ref3) {
40
+ var children = _ref3.children;
41
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, null, children);
42
+ }
43
+ }, {
44
+ type: 'block-menu-nested',
45
+ key: 'nested-menu',
46
+ parent: {
47
+ type: 'block-menu-section',
48
+ key: 'block-menu-section-format',
49
+ rank: 100
50
+ },
51
+ component: function component() {
52
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarNestedDropdownMenu, {
53
+ text: "Format",
54
+ elemBefore: /*#__PURE__*/_react.default.createElement(_changes.default, {
55
+ label: ""
56
+ }),
57
+ elemAfter: /*#__PURE__*/_react.default.createElement(_chevronRight.default, {
58
+ label: 'example nested menu'
59
+ })
60
+ }, /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, null, /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
61
+ elemBefore: /*#__PURE__*/_react.default.createElement(_task.default, {
62
+ label: ""
63
+ })
64
+ }, "Action item"), /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
65
+ elemBefore: /*#__PURE__*/_react.default.createElement(_listBulleted.default, {
66
+ label: ""
67
+ })
68
+ }, "Bullet list")));
69
+ }
70
+ }, {
71
+ type: 'block-menu-item',
72
+ key: 'block-menu-item-create-jira',
73
+ parent: {
74
+ type: 'block-menu-section',
75
+ key: 'block-menu-section-format',
76
+ rank: 200
77
+ },
78
+ component: function component() {
79
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
80
+ elemBefore: /*#__PURE__*/_react.default.createElement(_jira.default, {
81
+ label: ""
82
+ })
83
+ }, "Create Jira work item");
84
+ }
85
+ }, {
86
+ type: 'block-menu-item',
87
+ key: 'block-menu-item-move-up',
88
+ parent: {
89
+ type: 'block-menu-section',
90
+ key: 'block-menu-section-move-up-down',
91
+ rank: 100
92
+ },
93
+ component: function component() {
94
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
95
+ elemBefore: /*#__PURE__*/_react.default.createElement(_arrowUp.default, {
96
+ label: ""
97
+ })
98
+ }, "Move up");
99
+ }
100
+ }, {
101
+ type: 'block-menu-item',
102
+ key: 'block-menu-item-move-down',
103
+ parent: {
104
+ type: 'block-menu-section',
105
+ key: 'block-menu-section-move-up-down',
106
+ rank: 200
107
+ },
108
+ component: function component() {
109
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
110
+ elemBefore: /*#__PURE__*/_react.default.createElement(_arrowDown.default, {
111
+ label: ""
112
+ })
113
+ }, "Move down");
114
+ }
115
+ }, {
116
+ type: 'block-menu-item',
117
+ key: 'block-menu-item-delete',
118
+ parent: {
119
+ type: 'block-menu-section',
120
+ key: 'block-menu-section-delete',
121
+ rank: 100
122
+ },
123
+ component: function component() {
124
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
125
+ elemBefore: /*#__PURE__*/_react.default.createElement(_delete.default, {
126
+ label: ""
127
+ })
128
+ }, "Delete");
129
+ }
130
+ }];
131
+ };
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.BlockMenuRenderer = void 0;
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
12
+ var NoOp = function NoOp(props) {
13
+ return null;
14
+ };
15
+ var isMenuSection = function isMenuSection(component) {
16
+ return component.type === 'block-menu-section';
17
+ };
18
+ var isMenuItem = function isMenuItem(component) {
19
+ return component.type === 'block-menu-item';
20
+ };
21
+ var isNestedMenu = function isNestedMenu(component) {
22
+ return component.type === 'block-menu-nested';
23
+ };
24
+ var getSortedChildren = function getSortedChildren(components, parentKey) {
25
+ return components.filter(function (component) {
26
+ return component.parent.key === parentKey;
27
+ }).sort(function (a, b) {
28
+ return (a.parent.rank || 0) - (b.parent.rank || 0);
29
+ });
30
+ };
31
+ var getSortedSections = function getSortedSections(components) {
32
+ return components.filter(isMenuSection).sort(function (a, b) {
33
+ return (a.rank || 0) - (b.rank || 0);
34
+ });
35
+ };
36
+ var BlockMenuRenderer = exports.BlockMenuRenderer = function BlockMenuRenderer(_ref) {
37
+ var components = _ref.components,
38
+ fallbacks = _ref.fallbacks;
39
+ var menuSections = getSortedSections(components);
40
+ var menuItems = components.filter(isMenuItem);
41
+ var nestedMenus = components.filter(isNestedMenu);
42
+ return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, menuSections.map(function (section) {
43
+ var children = getSortedChildren([].concat((0, _toConsumableArray2.default)(menuItems), (0, _toConsumableArray2.default)(nestedMenus)), section.key).map(function (item) {
44
+ var ItemComponent = item.component || fallbacks.item || NoOp;
45
+ return /*#__PURE__*/_react.default.createElement(ItemComponent, {
46
+ key: item.key
47
+ });
48
+ });
49
+ var SectionComponent = section.component || fallbacks.section || NoOp;
50
+ return /*#__PURE__*/_react.default.createElement(SectionComponent, {
51
+ key: section.key
52
+ }, children);
53
+ }));
54
+ };
@@ -1,7 +1,6 @@
1
1
  /* block-menu.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  "use strict";
3
3
 
4
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
4
  var _typeof = require("@babel/runtime/helpers/typeof");
6
5
  Object.defineProperty(exports, "__esModule", {
7
6
  value: true
@@ -12,87 +11,50 @@ var _runtime = require("@compiled/react/runtime");
12
11
  var _react = _interopRequireWildcard(require("react"));
13
12
  var _reactIntlNext = require("react-intl-next");
14
13
  var _css = require("@atlaskit/css");
15
- var _dropdownMenu = _interopRequireWildcard(require("@atlaskit/dropdown-menu"));
16
14
  var _hooks = require("@atlaskit/editor-common/hooks");
17
15
  var _ui = require("@atlaskit/editor-common/ui");
18
16
  var _uiReact = require("@atlaskit/editor-common/ui-react");
19
17
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
20
- var _jira = _interopRequireDefault(require("@atlaskit/icon-lab/core/jira"));
21
- var _arrowDown = _interopRequireDefault(require("@atlaskit/icon/core/arrow-down"));
22
- var _arrowUp = _interopRequireDefault(require("@atlaskit/icon/core/arrow-up"));
23
- var _changes = _interopRequireDefault(require("@atlaskit/icon/core/changes"));
24
- var _chevronRight = _interopRequireDefault(require("@atlaskit/icon/core/chevron-right"));
25
- var _delete = _interopRequireDefault(require("@atlaskit/icon/core/delete"));
26
- var _listBulleted = _interopRequireDefault(require("@atlaskit/icon/core/list-bulleted"));
27
- var _task = _interopRequireDefault(require("@atlaskit/icon/core/task"));
18
+ var _editorToolbar = require("@atlaskit/editor-toolbar");
28
19
  var _compiled = require("@atlaskit/primitives/compiled");
20
+ var _blockMenuRenderer = require("./block-menu-renderer");
29
21
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
30
22
  var styles = {
31
23
  base: "_2rkoglpi _bfhk1bhr _16qs1cd0"
32
24
  };
25
+ var DRAG_HANDLE_SELECTOR = '[data-editor-block-ctrl-drag-handle=true]';
26
+ var DRAG_HANDLE_WIDTH = 12;
27
+ var DRAG_HANDLE_PADDING = 5;
33
28
  var PopupWithListeners = (0, _uiReact.withReactEditorViewOuterListeners)(_ui.Popup);
34
- var FormatDropdown = function FormatDropdown() {
35
- return /*#__PURE__*/_react.default.createElement(_dropdownMenu.default, {
36
- placement: "right-start",
37
- shouldFitContainer: true,
38
- trigger: function trigger(_ref) {
39
- var triggerRef = _ref.triggerRef,
40
- ariaControls = _ref['aria-controls'],
41
- ariaHasPopup = _ref['aria-haspopup'],
42
- ariaExpanded = _ref['aria-expanded'];
43
- return /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItem, {
44
- "aria-controls": ariaControls,
45
- "aria-haspopup": ariaHasPopup,
46
- "aria-expanded": ariaExpanded,
47
- ref: triggerRef,
48
- elemBefore: /*#__PURE__*/_react.default.createElement(_changes.default, {
49
- label: ""
50
- }),
51
- elemAfter: /*#__PURE__*/_react.default.createElement(_chevronRight.default, {
52
- label: ""
53
- })
54
- }, "Format");
55
- }
56
- }, /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItemGroup, null, /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItem, {
57
- elemBefore: /*#__PURE__*/_react.default.createElement(_task.default, {
58
- label: ""
59
- })
60
- }, "Action item"), /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItem, {
61
- elemBefore: /*#__PURE__*/_react.default.createElement(_listBulleted.default, {
62
- label: ""
63
- })
64
- }, "Bullet list")));
65
- };
66
- var BlockMenuContent = function BlockMenuContent() {
29
+ var BlockMenuContent = function BlockMenuContent(_ref) {
30
+ var _api$blockMenu;
31
+ var api = _ref.api;
67
32
  var setOutsideClickTargetRef = (0, _react.useContext)(_uiReact.OutsideClickTargetRefContext);
33
+ var blockMenuComponents = api === null || api === void 0 || (_api$blockMenu = api.blockMenu) === null || _api$blockMenu === void 0 ? void 0 : _api$blockMenu.actions.getBlockMenuComponents();
68
34
  return /*#__PURE__*/_react.default.createElement(_compiled.Box, {
69
35
  testId: "editor-block-menu",
70
36
  ref: setOutsideClickTargetRef,
71
37
  xcss: (0, _css.cx)(styles.base)
72
- }, /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItemGroup, null, /*#__PURE__*/_react.default.createElement(FormatDropdown, null), /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItem, {
73
- elemBefore: /*#__PURE__*/_react.default.createElement(_jira.default, {
74
- label: ""
75
- })
76
- }, "Create Jira work item")), /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItemGroup, {
77
- hasSeparator: true
78
- }, /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItem, {
79
- elemBefore: /*#__PURE__*/_react.default.createElement(_arrowUp.default, {
80
- label: ""
81
- })
82
- }, "Move up"), /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItem, {
83
- elemBefore: /*#__PURE__*/_react.default.createElement(_arrowDown.default, {
84
- label: ""
85
- })
86
- }, "Move down")), /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItemGroup, {
87
- hasSeparator: true
88
- }, /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItem, {
89
- elemBefore: /*#__PURE__*/_react.default.createElement(_delete.default, {
90
- label: ""
91
- })
92
- }, "Delete")));
38
+ }, /*#__PURE__*/_react.default.createElement(_blockMenuRenderer.BlockMenuRenderer, {
39
+ components: blockMenuComponents || [],
40
+ fallbacks: {
41
+ nestedMenu: function nestedMenu() {
42
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarNestedDropdownMenu, {
43
+ elemBefore: undefined,
44
+ elemAfter: undefined
45
+ }, /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, null, /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, null, "Block Menu Item")));
46
+ },
47
+ section: function section() {
48
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItemSection, null, /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, null, "Block Menu Item"));
49
+ },
50
+ item: function item() {
51
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, null, "Block Menu Item");
52
+ }
53
+ }
54
+ }));
93
55
  };
94
56
  var BlockMenu = function BlockMenu(_ref2) {
95
- var _editorView$hasFocus;
57
+ var _editorView$hasFocus, _editorView$dom;
96
58
  var editorView = _ref2.editorView,
97
59
  api = _ref2.api,
98
60
  mountTo = _ref2.mountTo,
@@ -126,8 +88,7 @@ var BlockMenu = function BlockMenu(_ref2) {
126
88
  closeMenu();
127
89
  return null;
128
90
  }
129
- var activeNodeSelector = menuTriggerBy && "[data-drag-handler-anchor-name=".concat(menuTriggerBy, "]");
130
- var targetHandleRef = activeNodeSelector ? document.querySelector(activeNodeSelector) : null;
91
+ var targetHandleRef = (_editorView$dom = editorView.dom) === null || _editorView$dom === void 0 ? void 0 : _editorView$dom.querySelector(DRAG_HANDLE_SELECTOR);
131
92
  if (targetHandleRef instanceof HTMLElement) {
132
93
  return /*#__PURE__*/_react.default.createElement(PopupWithListeners, {
133
94
  alignX: 'left',
@@ -141,8 +102,10 @@ var BlockMenu = function BlockMenu(_ref2) {
141
102
  zIndex: _editorSharedStyles.akEditorFloatingOverlapPanelZIndex,
142
103
  forcePlacement: true,
143
104
  stick: true,
144
- offset: [-6, 8]
145
- }, /*#__PURE__*/_react.default.createElement(BlockMenuContent, null));
105
+ offset: [DRAG_HANDLE_WIDTH + DRAG_HANDLE_PADDING, 0]
106
+ }, /*#__PURE__*/_react.default.createElement(BlockMenuContent, {
107
+ api: api
108
+ }));
146
109
  } else {
147
110
  return null;
148
111
  }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BLOCK_MENU_LABEL = void 0;
7
+ var BLOCK_MENU_LABEL = exports.BLOCK_MENU_LABEL = 'Editor Block Menu';
@@ -1,28 +1,42 @@
1
1
  import React from 'react';
2
+ import { createBlockMenuRegistry } from './editor-actions';
2
3
  import { createPlugin } from './pm-plugins/main';
3
4
  import BlockMenu from './ui/block-menu';
5
+ import { getBlockMenuComponents } from './ui/block-menu-components';
4
6
  export const blockMenuPlugin = ({
5
7
  api
6
- }) => ({
7
- name: 'blockMenu',
8
- pmPlugins() {
9
- return [{
10
- name: 'blockMenuPlugin',
11
- plugin: createPlugin
12
- }];
13
- },
14
- contentComponent({
15
- editorView,
16
- popupsMountPoint,
17
- popupsBoundariesElement,
18
- popupsScrollableElement
19
- }) {
20
- return /*#__PURE__*/React.createElement(BlockMenu, {
21
- editorView: editorView,
22
- api: api,
23
- mountTo: popupsMountPoint,
24
- boundariesElement: popupsBoundariesElement,
25
- scrollableElement: popupsScrollableElement
26
- });
27
- }
28
- });
8
+ }) => {
9
+ const registry = createBlockMenuRegistry();
10
+ registry.register(getBlockMenuComponents());
11
+ return {
12
+ name: 'blockMenu',
13
+ pmPlugins() {
14
+ return [{
15
+ name: 'blockMenuPlugin',
16
+ plugin: createPlugin
17
+ }];
18
+ },
19
+ actions: {
20
+ registerBlockMenuComponents: blockMenuComponents => {
21
+ registry.register(blockMenuComponents);
22
+ },
23
+ getBlockMenuComponents: () => {
24
+ return registry.components;
25
+ }
26
+ },
27
+ contentComponent({
28
+ editorView,
29
+ popupsMountPoint,
30
+ popupsBoundariesElement,
31
+ popupsScrollableElement
32
+ }) {
33
+ return /*#__PURE__*/React.createElement(BlockMenu, {
34
+ editorView: editorView,
35
+ api: api,
36
+ mountTo: popupsMountPoint,
37
+ boundariesElement: popupsBoundariesElement,
38
+ scrollableElement: popupsScrollableElement
39
+ });
40
+ }
41
+ };
42
+ };
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Create a simple registry for block menu components.
3
+ *
4
+ * @returns A registry object with a `register` method and a `components` array.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const registry = createBlockMenuRegistry();
9
+ * registry.register(
10
+ * [{
11
+ * type: 'block-menu-section' as const,
12
+ * key: 'block-menu-section-format',
13
+ * rank: 100,
14
+ * component: ({ children }: { children: React.ReactNode }) => {
15
+ * return <ToolbarDropdownItemSection>{children}</ToolbarDropdownItemSection>;
16
+ * },
17
+ * },
18
+ * {
19
+ * type: 'block-menu-nested' as const,
20
+ * key: 'nested-menu',
21
+ * parent: {
22
+ * type: 'block-menu-section' as const,
23
+ * key: 'block-menu-section-format',
24
+ * rank: 100,
25
+ * },
26
+ * component: () => {
27
+ * return (
28
+ * <ToolbarNestedDropdownMenu>{...}</ToolbarNestedDropdownMenu>
29
+ * );
30
+ * },
31
+ * },
32
+ * {
33
+ * type: 'block-menu-item' as const,
34
+ * key: 'block-menu-item-create-jira',
35
+ * parent: {
36
+ * type: 'block-menu-section' as const,
37
+ * key: 'block-menu-section-format',
38
+ * rank: 200,
39
+ * },
40
+ * component: () => {
41
+ * return <ToolbarDropdownItem elemBefore={<JiraIcon label="" />}>Create Jira work item</ToolbarDropdownItem>;
42
+ * },
43
+ * },
44
+ * ]);
45
+ * ```
46
+ *
47
+ */
48
+ export const createBlockMenuRegistry = () => {
49
+ const components = [];
50
+ const register = blockMenuComponents => {
51
+ components.push(...blockMenuComponents);
52
+ };
53
+ return {
54
+ register,
55
+ components
56
+ };
57
+ };