From 11d5d2a67b4c81619fa467c99bc9d4a605b78e4d Mon Sep 17 00:00:00 2001 From: kirillk Date: Tue, 26 May 2026 17:05:58 -0400 Subject: [PATCH] fix(jetbrains): resize prompt editor with content --- .changeset/jetbrains-resizing-prompt.md | 5 +++ .../client/session/ui/prompt/PromptPanel.kt | 23 +++++++++--- .../client/session/ui/style/SessionUiStyle.kt | 2 + .../client/session/ui/PromptPanelTest.kt | 37 +++++++++++++++++++ 4 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 .changeset/jetbrains-resizing-prompt.md diff --git a/.changeset/jetbrains-resizing-prompt.md b/.changeset/jetbrains-resizing-prompt.md new file mode 100644 index 00000000000..858eccf6a96 --- /dev/null +++ b/.changeset/jetbrains-resizing-prompt.md @@ -0,0 +1,5 @@ +--- +"@kilocode/kilo-jetbrains": patch +--- + +Resize the JetBrains prompt editor as prompt lines are added or removed. diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt index 8c6e08d9224..6cf8b3852ee 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt @@ -160,6 +160,7 @@ class PromptPanel( editor.text = "" editor.addDocumentListener(object : DocumentListener { override fun documentChanged(e: DocumentEvent) { + syncEditorHeight() onChange() } }) @@ -235,17 +236,13 @@ class PromptPanel( editor.font = style.transcriptFont editor.getEditor(false)?.let(style::applyToEditor) editor.background = style.editorScheme.defaultBackground - val height = style.transcriptFont.size * SessionUiStyle.View.Prompt.EDITOR_LINES + JBUI.scale( - SessionUiStyle.View.Prompt.EDITOR_CHROME) - editor.preferredSize = JBDimension(0, height) - editor.minimumSize = JBDimension(0, height) - revalidate() - repaint() + syncEditorHeight() } @RequiresEdt fun clear() { editor.text = "" + syncEditorHeight() } @RequiresEdt @@ -328,6 +325,20 @@ class PromptPanel( return KiloBundle.message("prompt.placeholder") } + @RequiresEdt + private fun syncEditorHeight() { + val lines = (editor.document.lineCount + SessionUiStyle.View.Prompt.EDITOR_SPARE_LINES).coerceIn( + SessionUiStyle.View.Prompt.EDITOR_LINES, + SessionUiStyle.View.Prompt.EDITOR_MAX_LINES, + ) + val height = style.transcriptFont.size * lines + JBUI.scale(SessionUiStyle.View.Prompt.EDITOR_CHROME) + if (editor.preferredSize.height == height && editor.minimumSize.height == height) return + editor.preferredSize = JBDimension(0, height) + editor.minimumSize = JBDimension(0, height) + revalidate() + repaint() + } + private inner class SendButton : JButton(), UiDataProvider { private var over = false diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt index df7f84ec064..023756b3071 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt @@ -47,6 +47,8 @@ object SessionUiStyle { /** Prompt input dimensions and chrome inside the session view. */ object Prompt { const val EDITOR_LINES = 3 + const val EDITOR_MAX_LINES = 8 + const val EDITOR_SPARE_LINES = 1 const val EDITOR_CHROME = 16 const val SEND_BUTTON_SIZE = 24 const val CORNER_ARC = 6 diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/PromptPanelTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/PromptPanelTest.kt index 1b210456b57..25b898aa655 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/PromptPanelTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/PromptPanelTest.kt @@ -8,6 +8,7 @@ import com.intellij.openapi.actionSystem.DataSink import com.intellij.openapi.actionSystem.UiDataProvider import com.intellij.openapi.keymap.KeymapUtil import com.intellij.testFramework.fixtures.BasePlatformTestCase +import com.intellij.ui.EditorTextField import com.intellij.util.ui.EmptyIcon import javax.swing.SwingUtilities @@ -41,6 +42,42 @@ class PromptPanelTest : BasePlatformTestCase() { assertTrue(panel.preferredSize.height >= 26) } + fun `test prompt editor grows when lines are added`() { + val panel = PromptPanel(project, {}, {}) + val editor = panel.defaultFocusedComponent as EditorTextField + val min = editor.preferredSize.height + + editor.text = "one\ntwo\nthree\nfour\nfive" + + assertTrue(editor.preferredSize.height > min) + } + + fun `test prompt editor shrinks when lines are removed`() { + val panel = PromptPanel(project, {}, {}) + val editor = panel.defaultFocusedComponent as EditorTextField + val min = editor.preferredSize.height + + editor.text = "one\ntwo\nthree\nfour\nfive" + assertTrue(editor.preferredSize.height > min) + + editor.text = "one" + + assertEquals(min, editor.preferredSize.height) + } + + fun `test prompt editor shrinks after clear`() { + val panel = PromptPanel(project, {}, {}) + val editor = panel.defaultFocusedComponent as EditorTextField + val min = editor.preferredSize.height + + editor.text = "one\ntwo\nthree\nfour\nfive" + assertTrue(editor.preferredSize.height > min) + + panel.clear() + + assertEquals(min, editor.preferredSize.height) + } + fun `test reasoning picker hides when variants are empty`() { val panel = PromptPanel(project, {}, {})