diff --git a/blocksuite/affine/block-attachment/package.json b/blocksuite/affine/block-attachment/package.json
index 4c33833d7c..686c48a8ba 100644
--- a/blocksuite/affine/block-attachment/package.json
+++ b/blocksuite/affine/block-attachment/package.json
@@ -18,6 +18,7 @@
"@blocksuite/affine-components": "workspace:*",
"@blocksuite/affine-model": "workspace:*",
"@blocksuite/affine-shared": "workspace:*",
+ "@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/block-std": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.1",
diff --git a/blocksuite/affine/block-attachment/src/attachment-spec.ts b/blocksuite/affine/block-attachment/src/attachment-spec.ts
index 40df90ab0a..9cbeb5333e 100644
--- a/blocksuite/affine/block-attachment/src/attachment-spec.ts
+++ b/blocksuite/affine/block-attachment/src/attachment-spec.ts
@@ -1,5 +1,6 @@
import { AttachmentBlockSchema } from '@blocksuite/affine-model';
import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services';
+import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
import {
BlockFlavourIdentifier,
BlockViewExtension,
@@ -10,6 +11,7 @@ import { literal } from 'lit/static-html.js';
import { AttachmentBlockNotionHtmlAdapterExtension } from './adapters/notion-html.js';
import { AttachmentDropOption } from './attachment-service.js';
+import { attachmentSlashMenuConfig } from './configs/slash-menu.js';
import { builtinToolbarConfig } from './configs/toolbar';
import {
AttachmentEmbedConfigExtension,
@@ -33,4 +35,5 @@ export const AttachmentBlockSpec: ExtensionType[] = [
id: BlockFlavourIdentifier(flavour),
config: builtinToolbarConfig,
}),
+ SlashMenuConfigExtension(flavour, attachmentSlashMenuConfig),
];
diff --git a/blocksuite/affine/block-attachment/src/configs/slash-menu.ts b/blocksuite/affine/block-attachment/src/configs/slash-menu.ts
new file mode 100644
index 0000000000..09bdb6ba2c
--- /dev/null
+++ b/blocksuite/affine/block-attachment/src/configs/slash-menu.ts
@@ -0,0 +1,73 @@
+import { FileSizeLimitService } from '@blocksuite/affine-shared/services';
+import { openFileOrFiles } from '@blocksuite/affine-shared/utils';
+import { type SlashMenuConfig } from '@blocksuite/affine-widget-slash-menu';
+import { ExportToPdfIcon, FileIcon } from '@blocksuite/icons/lit';
+
+import { addSiblingAttachmentBlocks } from '../utils';
+import { AttachmentTooltip, PDFTooltip } from './tooltips';
+
+export const attachmentSlashMenuConfig: SlashMenuConfig = {
+ items: [
+ {
+ name: 'Attachment',
+ description: 'Attach a file to document.',
+ icon: FileIcon(),
+ tooltip: {
+ figure: AttachmentTooltip,
+ caption: 'Attachment',
+ },
+ searchAlias: ['file'],
+ group: '4_Content & Media@3',
+ when: ({ model }) =>
+ model.doc.schema.flavourSchemaMap.has('affine:attachment'),
+ action: ({ std, model }) => {
+ (async () => {
+ const file = await openFileOrFiles();
+ if (!file) return;
+ const maxFileSize = std.store.get(FileSizeLimitService).maxFileSize;
+ await addSiblingAttachmentBlocks(
+ std.host,
+ [file],
+ maxFileSize,
+ model
+ );
+ if (model.text?.length === 0) {
+ std.store.deleteBlock(model);
+ }
+ })().catch(console.error);
+ },
+ },
+ {
+ name: 'PDF',
+ description: 'Upload a PDF to document.',
+ icon: ExportToPdfIcon(),
+ tooltip: {
+ figure: PDFTooltip,
+ caption: 'PDF',
+ },
+ group: '4_Content & Media@4',
+ when: ({ model }) =>
+ model.doc.schema.flavourSchemaMap.has('affine:attachment'),
+ action: ({ std, model }) => {
+ (async () => {
+ const file = await openFileOrFiles();
+ if (!file) return;
+
+ const maxFileSize = std.store.get(FileSizeLimitService).maxFileSize;
+
+ await addSiblingAttachmentBlocks(
+ std.host,
+ [file],
+ maxFileSize,
+ model,
+ 'after',
+ true
+ );
+ if (model.text?.length === 0) {
+ std.store.deleteBlock(model);
+ }
+ })().catch(console.error);
+ },
+ },
+ ],
+};
diff --git a/blocksuite/affine/widget-slash-menu/src/tooltips/pdf.ts b/blocksuite/affine/block-attachment/src/configs/tooltips.ts
similarity index 54%
rename from blocksuite/affine/widget-slash-menu/src/tooltips/pdf.ts
rename to blocksuite/affine/block-attachment/src/configs/tooltips.ts
index 3f37191846..77b4c2074a 100644
--- a/blocksuite/affine/widget-slash-menu/src/tooltips/pdf.ts
+++ b/blocksuite/affine/block-attachment/src/configs/tooltips.ts
@@ -1,4 +1,45 @@
import { html } from 'lit';
+// prettier-ignore
+export const AttachmentTooltip = html`
+`;
+
// prettier-ignore
export const PDFTooltip = html`