From 2ebbad656134b339f73a2d22f2c85be7032486ce Mon Sep 17 00:00:00 2001 From: dotta Date: Wed, 8 Apr 2026 16:41:13 -0500 Subject: [PATCH] Add breathing room when focusing comment composer Co-Authored-By: Paperclip --- ui/src/components/IssueChatThread.test.tsx | 3 +++ ui/src/components/IssueChatThread.tsx | 2 ++ 2 files changed, 5 insertions(+) diff --git a/ui/src/components/IssueChatThread.test.tsx b/ui/src/components/IssueChatThread.test.tsx index a4b6f9b2..85884184 100644 --- a/ui/src/components/IssueChatThread.test.tsx +++ b/ui/src/components/IssueChatThread.test.tsx @@ -293,6 +293,7 @@ describe("IssueChatThread", () => { it("exposes a composer focus handle that forwards to the editor", () => { const root = createRoot(container); const composerRef = createRef<{ focus: () => void }>(); + const scrollByMock = vi.spyOn(window, "scrollBy").mockImplementation(() => {}); const requestAnimationFrameMock = vi .spyOn(window, "requestAnimationFrame") .mockImplementation((callback: FrameRequestCallback) => { @@ -328,7 +329,9 @@ describe("IssueChatThread", () => { }); expect(scrollIntoViewMock).toHaveBeenCalledWith({ behavior: "smooth", block: "end" }); + expect(scrollByMock).toHaveBeenCalledWith({ top: 96, behavior: "smooth" }); expect(markdownEditorFocusMock).toHaveBeenCalledTimes(1); + scrollByMock.mockRestore(); requestAnimationFrameMock.mockRestore(); act(() => { diff --git a/ui/src/components/IssueChatThread.tsx b/ui/src/components/IssueChatThread.tsx index cc0fb09c..c126fe08 100644 --- a/ui/src/components/IssueChatThread.tsx +++ b/ui/src/components/IssueChatThread.tsx @@ -219,6 +219,7 @@ interface IssueChatThreadProps { } const DRAFT_DEBOUNCE_MS = 800; +const COMPOSER_FOCUS_SCROLL_PADDING_PX = 96; function toIsoString(value: string | Date | null | undefined): string | null { if (!value) return null; @@ -1443,6 +1444,7 @@ const IssueChatComposer = forwardRef { composerContainerRef.current?.scrollIntoView({ behavior: "smooth", block: "end" }); requestAnimationFrame(() => { + window.scrollBy({ top: COMPOSER_FOCUS_SCROLL_PADDING_PX, behavior: "smooth" }); editorRef.current?.focus(); }); },