Skip to content

Commit 350a10d

Browse files
committed
Fix dropdown positioning to be more stable
1 parent 5d0fd77 commit 350a10d

File tree

2 files changed

+4
-18
lines changed

2 files changed

+4
-18
lines changed

web/src/components/common/MentionDropdown.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export interface MentionDropdownProps {
1212
selectedIndex: number
1313
onSelect: (item: MentionItem) => void
1414
onClose: () => void
15-
position: { top: number; left: number }
15+
position: { top?: number; bottom?: number; left: number }
1616
visible: boolean
1717
}
1818

@@ -36,7 +36,8 @@ export const MentionDropdown: React.FC<MentionDropdownProps> = ({
3636
return (
3737
<Box
3838
position="absolute"
39-
top={`${position.top}px`}
39+
bottom={position.bottom ? `${position.bottom}px` : undefined}
40+
top={position.top ? `${position.top}px` : undefined}
4041
left={`${position.left}px`}
4142
zIndex={1000}
4243
bg={bgColor}

web/src/components/common/MentionTextarea.tsx

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const MentionTextarea = forwardRef<HTMLDivElement, MentionTextareaProps>(
2222
const [showDropdown, setShowDropdown] = useState(false)
2323
const [filteredItems, setFilteredItems] = useState<MentionItem[]>([])
2424
const [selectedIndex, setSelectedIndex] = useState(0)
25-
const [dropdownPosition, setDropdownPosition] = useState({ top: 0, left: 0 })
25+
const [dropdownPosition] = useState({ bottom: 100, left: 0 })
2626
const [mentionQuery, setMentionQuery] = useState('')
2727
const [mentionStart, setMentionStart] = useState(-1)
2828
const typingTimerRef = useRef<NodeJS.Timeout>()
@@ -35,21 +35,6 @@ export const MentionTextarea = forwardRef<HTMLDivElement, MentionTextareaProps>(
3535
() => debounce((query: string) => {
3636
const filtered = filterMentionItems(mentionItems, query)
3737
setFilteredItems(filtered)
38-
39-
// Calculate dropdown position after filtering
40-
setTimeout(() => {
41-
const itemHeight = 80 // Updated for 4-line items (name + type + description + schema/collection)
42-
const maxItems = 6
43-
const actualItems = Math.min(filtered.length, maxItems)
44-
const dropdownHeight = actualItems * itemHeight + 10
45-
46-
const position = {
47-
top: -(dropdownHeight + 5),
48-
left: 0
49-
}
50-
51-
setDropdownPosition(position)
52-
}, 0)
5338
}, 150),
5439
[mentionItems]
5540
)

0 commit comments

Comments
 (0)