diff --git a/packages/twenty-front/src/modules/ui/input/editor/components/CustomSlashMenu.tsx b/packages/twenty-front/src/modules/ui/input/editor/components/CustomSlashMenu.tsx index c0b909d03146b..093c08f6b402d 100644 --- a/packages/twenty-front/src/modules/ui/input/editor/components/CustomSlashMenu.tsx +++ b/packages/twenty-front/src/modules/ui/input/editor/components/CustomSlashMenu.tsx @@ -1,5 +1,6 @@ +import { useBlockNoteEditor } from '@blocknote/react'; import styled from '@emotion/styled'; -import { autoUpdate, useFloating } from '@floating-ui/react'; +import { autoUpdate, flip, offset, useFloating } from '@floating-ui/react'; import { motion } from 'framer-motion'; import { useEffect } from 'react'; import { createPortal } from 'react-dom'; @@ -7,9 +8,9 @@ import { createPortal } from 'react-dom'; import { SLASH_MENU_DROPDOWN_CLICK_OUTSIDE_ID } from '@/ui/input/constants/SlashMenuDropdownClickOutsideId'; import { SLASH_MENU_LIST_ID } from '@/ui/input/constants/SlashMenuListId'; import { CustomSlashMenuListItem } from '@/ui/input/editor/components/CustomSlashMenuListItem'; -import { - type CustomSlashMenuProps, - type SuggestionItem, +import type { + CustomSlashMenuProps, + SuggestionItem, } from '@/ui/input/editor/components/types'; import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; @@ -29,9 +30,32 @@ export const CustomSlashMenu = ({ items, selectedIndex, }: CustomSlashMenuProps) => { + const editor = useBlockNoteEditor(); + + const currentBlock = editor?.getTextCursorPosition()?.block; + const blockType = currentBlock?.type; + const headingLevel = + blockType === 'heading' ? (currentBlock?.props?.level as number) : null; + + const getOffsetValue = (placement: string) => { + if (!placement.startsWith('top')) return 0; + + switch (headingLevel) { + case 1: + return 65; + case 2: + return 50; + case 3: + return 45; + default: + return 40; + } + }; + const { refs, floatingStyles } = useFloating({ placement: 'bottom-start', whileElementsMounted: autoUpdate, + middleware: [flip(), offset(({ placement }) => getOffsetValue(placement))], }); const { setSelectedItemId } = useSelectableList(SLASH_MENU_LIST_ID);