From 61e40c7523eb8b689531c3413b44224aca53a113 Mon Sep 17 00:00:00 2001 From: zzj3720 Date: Fri, 19 Sep 2025 20:16:08 +0800 Subject: [PATCH] fix(callout): adjust callout styling and slash menu behavior update callout block margins and spacing add debug logs for slash menu disableWhen checks remove slash menu disable test and update paragraph count assertions --- .../blocks/callout/src/callout-block.ts | 35 +++++++++++++++++-- packages/frontend/native/index.d.ts | 4 +-- .../e2e/blocksuite/callout/callout.spec.ts | 21 ++--------- 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/blocksuite/affine/blocks/callout/src/callout-block.ts b/blocksuite/affine/blocks/callout/src/callout-block.ts index 7ec58595e8..f79ee03bc5 100644 --- a/blocksuite/affine/blocks/callout/src/callout-block.ts +++ b/blocksuite/affine/blocks/callout/src/callout-block.ts @@ -2,6 +2,7 @@ import { CaptionedBlockComponent } from '@blocksuite/affine-components/caption'; import { createLitPortal } from '@blocksuite/affine-components/portal'; import { DefaultInlineManagerExtension } from '@blocksuite/affine-inline-preset'; import { type CalloutBlockModel } from '@blocksuite/affine-model'; +import { focusTextModel } from '@blocksuite/affine-rich-text'; import { EDGELESS_TOP_CONTENTEDITABLE_SELECTOR } from '@blocksuite/affine-shared/consts'; import { DocModeProvider, @@ -29,7 +30,6 @@ export class CalloutBlockComponent extends CaptionedBlockComponent { + .onEmojiSelect=${(data: { native: string }) => { this.model.props.emoji = data.native; }} >`, @@ -83,6 +84,31 @@ export class CalloutBlockComponent extends CaptionedBlockComponent { + // Check if the click target is emoji related element + const target = event.target as HTMLElement; + if ( + target.closest('.affine-callout-emoji-container') || + target.classList.contains('affine-callout-emoji') + ) { + return; + } + + // Only handle clicks when there are no children + if (this.model.children.length > 0) { + return; + } + + // Prevent event bubbling + event.stopPropagation(); + + // Create a new paragraph block + const paragraphId = this.store.addBlock('affine:paragraph', {}, this.model); + + // Focus the new paragraph + focusTextModel(this.std, paragraphId); + }; + get attributeRenderer() { return this.inlineManager.getRenderer(); } @@ -114,7 +140,10 @@ export class CalloutBlockComponent extends CaptionedBlockComponent +
static applicationWithProcessId(processId: number): ApplicationInfo | null + static isUsingMicrophone(processId: number): boolean static tapAudio(processId: number, audioStreamCallback: ((err: Error | null, arg: Float32Array) => void)): AudioCaptureSession static tapGlobalAudio(excludedProcesses: Array | undefined | null, audioStreamCallback: ((err: Error | null, arg: Float32Array) => void)): AudioCaptureSession - static isUsingMicrophone(processId: number): boolean } export declare function decodeAudio(buf: Uint8Array, destSampleRate?: number | undefined | null, filename?: string | undefined | null, signal?: AbortSignal | undefined | null): Promise diff --git a/tests/affine-local/e2e/blocksuite/callout/callout.spec.ts b/tests/affine-local/e2e/blocksuite/callout/callout.spec.ts index 87400b8629..0b7cbd23d4 100644 --- a/tests/affine-local/e2e/blocksuite/callout/callout.spec.ts +++ b/tests/affine-local/e2e/blocksuite/callout/callout.spec.ts @@ -3,7 +3,6 @@ import { pressArrowUp, pressBackspace, pressEnter, - undoByKeyboard, } from '@affine-test/kit/utils/keyboard'; import { openHomePage } from '@affine-test/kit/utils/load-page'; import { @@ -30,7 +29,7 @@ test('add callout block using slash menu and change emoji', async ({ await expect(emoji).toContainText('😀'); const paragraph = page.locator('affine-callout affine-paragraph'); - await expect(paragraph).toHaveCount(1); + await expect(paragraph).toHaveCount(2); const vLine = page.locator('affine-callout v-line'); await expect(vLine).toHaveCount(2); @@ -50,22 +49,6 @@ test('add callout block using slash menu and change emoji', async ({ await expect(emoji).toContainText('😆'); }); -test('disable slash menu in callout block', async ({ page }) => { - await type(page, '/callout\n'); - const callout = page.locator('affine-callout'); - const emoji = page.locator('affine-callout .affine-callout-emoji'); - await expect(callout).toBeVisible(); - await expect(emoji).toContainText('😀'); - - await type(page, '/'); - const slashMenu = page.locator('.slash-menu'); - await expect(slashMenu).not.toBeVisible(); - await undoByKeyboard(page); - await undoByKeyboard(page); - await type(page, '/'); - await expect(slashMenu).toBeVisible(); -}); - test('press backspace after callout block', async ({ page }) => { await pressEnter(page); await pressArrowUp(page); @@ -96,7 +79,7 @@ test('press backspace in callout block', async ({ page }) => { expect(await callout.count()).toBe(1); await pressBackspace(page); - await expect(paragraph).toHaveCount(2); + await expect(paragraph).toHaveCount(1); await expect(callout).toHaveCount(1); await pressBackspace(page);