From 5f00bae2cf44e096d2327b57b2ba5b10ef0bc2ef Mon Sep 17 00:00:00 2001 From: lucaronin Date: Fri, 8 May 2026 11:01:44 +0200 Subject: [PATCH] fix: preserve slash menu mouse selection --- src/components/SingleEditorView.tsx | 2 + .../smoke/blocknote-slash-menu-mouse.spec.ts | 58 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 tests/smoke/blocknote-slash-menu-mouse.spec.ts diff --git a/src/components/SingleEditorView.tsx b/src/components/SingleEditorView.tsx index 1f977bd1..c60a5021 100644 --- a/src/components/SingleEditorView.tsx +++ b/src/components/SingleEditorView.tsx @@ -70,6 +70,8 @@ const CONTAINER_CLICK_IGNORE_SELECTOR = [ '.bn-formatting-toolbar', '.bn-link-toolbar', '.bn-side-menu', + '.bn-suggestion-menu', + '.bn-grid-suggestion-menu', '.bn-form-popover', '[data-editor-code-copy]', '[role="menu"]', diff --git a/tests/smoke/blocknote-slash-menu-mouse.spec.ts b/tests/smoke/blocknote-slash-menu-mouse.spec.ts new file mode 100644 index 00000000..92aa9534 --- /dev/null +++ b/tests/smoke/blocknote-slash-menu-mouse.spec.ts @@ -0,0 +1,58 @@ +import { test, expect, type Page } from '@playwright/test' +import { createFixtureVaultCopy, openFixtureVault, removeFixtureVaultCopy } from '../helpers/fixtureVault' + +let tempVaultDir: string + +test.beforeEach(async ({ page }, testInfo) => { + testInfo.setTimeout(90_000) + tempVaultDir = createFixtureVaultCopy() + await openFixtureVault(page, tempVaultDir) +}) + +test.afterEach(() => { + removeFixtureVaultCopy(tempVaultDir) +}) + +async function openSlashMenuOnNewLine(page: Page) { + await page.locator('[data-testid="note-list-container"]').getByText('Alpha Project', { exact: true }).click() + await expect(page.locator('.bn-editor')).toBeVisible({ timeout: 5_000 }) + await page.locator('.bn-block-content').last().click() + await page.keyboard.press('Enter') + await page.keyboard.type('/') + + const menu = page.locator('.bn-suggestion-menu') + await expect(menu).toBeVisible({ timeout: 5_000 }) + return menu +} + +async function openFilteredSlashMenuOnNewLine(page: Page) { + await openSlashMenuOnNewLine(page) + await page.keyboard.type('bul') + + const menu = page.locator('.bn-suggestion-menu') + await expect(menu).toBeVisible({ timeout: 5_000 }) + return menu +} + +test('filtered slash-menu commands can be selected with the mouse', async ({ page }) => { + await openFilteredSlashMenuOnNewLine(page) + + await page.getByRole('option', { name: /Bullet List/i }).click() + await page.keyboard.type('Mouse selected bullet') + + await expect( + page.locator('.bn-block-content[data-content-type="bulletListItem"]').filter({ + hasText: 'Mouse selected bullet', + }), + ).toBeVisible() + await expect(page.locator('.bn-suggestion-menu')).not.toBeVisible() +}) + +test('plain slash-menu mouse selection opens follow-up pickers', async ({ page }) => { + await openSlashMenuOnNewLine(page) + + await page.getByRole('option', { name: /Emoji/i }).click() + + await expect(page.locator('.bn-grid-suggestion-menu')).toBeVisible({ timeout: 5_000 }) + await expect(page.locator('.bn-suggestion-menu')).not.toBeVisible() +})