diff --git a/blocksuite/affine/block-bookmark/src/bookmark-spec.ts b/blocksuite/affine/block-bookmark/src/bookmark-spec.ts
index dd3a8d7353..d30f872ecd 100644
--- a/blocksuite/affine/block-bookmark/src/bookmark-spec.ts
+++ b/blocksuite/affine/block-bookmark/src/bookmark-spec.ts
@@ -1,6 +1,5 @@
import { BookmarkBlockSchema } from '@blocksuite/affine-model';
import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services';
-import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
import {
BlockFlavourIdentifier,
BlockViewExtension,
@@ -10,7 +9,7 @@ import type { ExtensionType } from '@blocksuite/store';
import { literal } from 'lit/static-html.js';
import { BookmarkBlockAdapterExtensions } from './adapters/extension';
-import { bookmarkSlashMenuConfig } from './configs/slash-menu';
+import { BookmarkSlashMenuConfigExtension } from './configs/slash-menu';
import { builtinToolbarConfig } from './configs/toolbar';
const flavour = BookmarkBlockSchema.model.flavour;
@@ -27,5 +26,5 @@ export const BookmarkBlockSpec: ExtensionType[] = [
id: BlockFlavourIdentifier(flavour),
config: builtinToolbarConfig,
}),
- SlashMenuConfigExtension(flavour, bookmarkSlashMenuConfig),
+ BookmarkSlashMenuConfigExtension,
].flat();
diff --git a/blocksuite/affine/block-bookmark/src/configs/slash-menu.ts b/blocksuite/affine/block-bookmark/src/configs/slash-menu.ts
index c683e621e9..d1ba6c17fa 100644
--- a/blocksuite/affine/block-bookmark/src/configs/slash-menu.ts
+++ b/blocksuite/affine/block-bookmark/src/configs/slash-menu.ts
@@ -1,10 +1,15 @@
import { toggleEmbedCardCreateModal } from '@blocksuite/affine-components/embed-card-modal';
-import { type SlashMenuConfig } from '@blocksuite/affine-widget-slash-menu';
+import { BookmarkBlockSchema } from '@blocksuite/affine-model';
+import {
+ type SlashMenuConfig,
+ SlashMenuConfigIdentifier,
+} from '@blocksuite/affine-widget-slash-menu';
import { LinkIcon } from '@blocksuite/icons/lit';
+import type { ExtensionType } from '@blocksuite/store';
import { LinkTooltip } from './tooltips';
-export const bookmarkSlashMenuConfig: SlashMenuConfig = {
+const bookmarkSlashMenuConfig: SlashMenuConfig = {
items: [
{
name: 'Link',
@@ -40,3 +45,13 @@ export const bookmarkSlashMenuConfig: SlashMenuConfig = {
},
],
};
+
+export const BookmarkSlashMenuConfigIdentifier = SlashMenuConfigIdentifier(
+ BookmarkBlockSchema.model.flavour
+);
+
+export const BookmarkSlashMenuConfigExtension: ExtensionType = {
+ setup: di => {
+ di.addImpl(BookmarkSlashMenuConfigIdentifier, bookmarkSlashMenuConfig);
+ },
+};
diff --git a/blocksuite/affine/block-bookmark/src/index.ts b/blocksuite/affine/block-bookmark/src/index.ts
index f6f0991e69..bedb29e092 100644
--- a/blocksuite/affine/block-bookmark/src/index.ts
+++ b/blocksuite/affine/block-bookmark/src/index.ts
@@ -3,3 +3,4 @@ export * from './bookmark-block';
export * from './bookmark-spec';
export * from './commands';
export * from './components';
+export { BookmarkSlashMenuConfigIdentifier } from './configs/slash-menu';
diff --git a/blocksuite/affine/block-embed/src/embed-linked-doc-block/configs/slash-menu.ts b/blocksuite/affine/block-embed/src/embed-linked-doc-block/configs/slash-menu.ts
new file mode 100644
index 0000000000..d510396256
--- /dev/null
+++ b/blocksuite/affine/block-embed/src/embed-linked-doc-block/configs/slash-menu.ts
@@ -0,0 +1,95 @@
+import { EmbedLinkedDocBlockSchema } from '@blocksuite/affine-model';
+import {
+ getInlineEditorByModel,
+ insertContent,
+} from '@blocksuite/affine-rich-text';
+import { REFERENCE_NODE } from '@blocksuite/affine-shared/consts';
+import { createDefaultDoc } from '@blocksuite/affine-shared/utils';
+import {
+ type SlashMenuConfig,
+ SlashMenuConfigIdentifier,
+} from '@blocksuite/affine-widget-slash-menu';
+import { LinkedPageIcon, PlusIcon } from '@blocksuite/icons/lit';
+import { type ExtensionType } from '@blocksuite/store';
+
+import { LinkDocTooltip, NewDocTooltip } from './tooltips';
+
+const linkedDocSlashMenuConfig: SlashMenuConfig = {
+ items: [
+ {
+ name: 'New Doc',
+ description: 'Start a new document.',
+ icon: PlusIcon(),
+ tooltip: {
+ figure: NewDocTooltip,
+ caption: 'New Doc',
+ },
+ group: '3_Page@0',
+ when: ({ model }) =>
+ model.doc.schema.flavourSchemaMap.has('affine:embed-linked-doc'),
+ action: ({ std, model }) => {
+ const newDoc = createDefaultDoc(std.host.doc.workspace);
+ insertContent(std.host, model, REFERENCE_NODE, {
+ reference: {
+ type: 'LinkedPage',
+ pageId: newDoc.id,
+ },
+ });
+ },
+ },
+ {
+ name: 'Linked Doc',
+ description: 'Link to another document.',
+ icon: LinkedPageIcon(),
+ tooltip: {
+ figure: LinkDocTooltip,
+ caption: 'Link Doc',
+ },
+ searchAlias: ['dual link'],
+ group: '3_Page@1',
+ when: ({ std, model }) => {
+ const root = model.doc.root;
+ if (!root) return false;
+ const linkedDocWidget = std.view.getWidget(
+ 'affine-linked-doc-widget',
+ root.id
+ );
+ if (!linkedDocWidget) return false;
+
+ return model.doc.schema.flavourSchemaMap.has('affine:embed-linked-doc');
+ },
+ action: ({ model, std }) => {
+ const root = model.doc.root;
+ if (!root) return;
+ const linkedDocWidget = std.view.getWidget(
+ 'affine-linked-doc-widget',
+ root.id
+ );
+ if (!linkedDocWidget) return;
+ // TODO(@L-Sun): make linked-doc-widget as extension
+ // @ts-expect-error same as above
+ const triggerKey = linkedDocWidget.config.triggerKeys[0];
+
+ insertContent(std.host, model, triggerKey);
+
+ const inlineEditor = getInlineEditorByModel(std.host, model);
+ // Wait for range to be updated
+ inlineEditor?.slots.inlineRangeSync.once(() => {
+ // TODO(@L-Sun): make linked-doc-widget as extension
+ // @ts-expect-error same as above
+ linkedDocWidget.show({ addTriggerKey: true });
+ });
+ },
+ },
+ ],
+};
+
+export const LinkedDocSlashMenuConfigIdentifier = SlashMenuConfigIdentifier(
+ EmbedLinkedDocBlockSchema.model.flavour
+);
+
+export const LinkedDocSlashMenuConfigExtension: ExtensionType = {
+ setup: di => {
+ di.addImpl(LinkedDocSlashMenuConfigIdentifier, linkedDocSlashMenuConfig);
+ },
+};
diff --git a/blocksuite/affine/widget-slash-menu/src/tooltips/link-doc.ts b/blocksuite/affine/block-embed/src/embed-linked-doc-block/configs/tooltips.ts
similarity index 80%
rename from blocksuite/affine/widget-slash-menu/src/tooltips/link-doc.ts
rename to blocksuite/affine/block-embed/src/embed-linked-doc-block/configs/tooltips.ts
index 75d3e46b9b..8d7470aedf 100644
--- a/blocksuite/affine/widget-slash-menu/src/tooltips/link-doc.ts
+++ b/blocksuite/affine/block-embed/src/embed-linked-doc-block/configs/tooltips.ts
@@ -1,4 +1,17 @@
import { html } from 'lit';
+// prettier-ignore
+export const NewDocTooltip = html`
+`;
+
// prettier-ignore
export const LinkDocTooltip = html`