diff --git a/blocksuite/affine/widget-toolbar/src/utils.ts b/blocksuite/affine/widget-toolbar/src/utils.ts index bc93f8cac..9978e9dc0 100644 --- a/blocksuite/affine/widget-toolbar/src/utils.ts +++ b/blocksuite/affine/widget-toolbar/src/utils.ts @@ -21,7 +21,9 @@ import { autoUpdate, computePosition, flip, + hide, inline, + limitShift, offset, shift, } from '@floating-ui/dom'; @@ -62,7 +64,22 @@ export function autoUpdatePosition( const { x, y } = await computePosition(referenceElement, toolbar, { placement, - middleware: [offset(10), inline(), shift({ padding: 6 }), flip()], + middleware: [ + offset(10), + inline(), + shift(state => ({ + padding: { + top: 10, + right: 10, + bottom: 150, + left: 10, + }, + crossAxis: state.placement.includes('bottom'), + limiter: limitShift(), + })), + flip({ padding: 10 }), + hide(), + ], }); toolbar.style.transform = `translate3d(${x}px, ${y}px, 0)`; diff --git a/blocksuite/tests-legacy/e2e/format-bar.spec.ts b/blocksuite/tests-legacy/e2e/format-bar.spec.ts index 498b4403d..7d996272d 100644 --- a/blocksuite/tests-legacy/e2e/format-bar.spec.ts +++ b/blocksuite/tests-legacy/e2e/format-bar.spec.ts @@ -123,7 +123,7 @@ test('should format quick bar show when select text by keyboard', async ({ throw new Error("formatBar doesn't exist"); } let selectionRect = await getSelectionRect(page); - assertAlmostEqual(formatBarBox.x - selectionRect.x, -107, 3); + assertAlmostEqual(formatBarBox.x - selectionRect.x, -103, 3); assertAlmostEqual( formatBarBox.y + formatBarBox.height - selectionRect.top, -10, @@ -150,7 +150,7 @@ test('should format quick bar show when select text by keyboard', async ({ // The x position of the format quick bar depends on the font size // so there are slight differences in different environments selectionRect = await getSelectionRect(page); - assertAlmostEqual(formatBarBox.x - selectionRect.x, -107, 3); + assertAlmostEqual(formatBarBox.x - selectionRect.x, -103, 3); assertAlmostEqual( formatBarBox.y + formatBarBox.height - selectionRect.top, -10,