From f837a7eed39314d57763f34838ca6db6b84bb472 Mon Sep 17 00:00:00 2001 From: kirillk Date: Tue, 7 Jul 2026 11:21:46 -0400 Subject: [PATCH] fix(jetbrains): hide focused prompt separator --- .../jetbrains-prompt-focus-separator.md | 5 ++++ .../client/session/ui/prompt/PromptPanel.kt | 26 ++++++++++++++++--- .../client/session/ui/PromptPanelTest.kt | 6 +++++ 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 .changeset/jetbrains-prompt-focus-separator.md diff --git a/.changeset/jetbrains-prompt-focus-separator.md b/.changeset/jetbrains-prompt-focus-separator.md new file mode 100644 index 00000000000..35a014a4d57 --- /dev/null +++ b/.changeset/jetbrains-prompt-focus-separator.md @@ -0,0 +1,5 @@ +--- +"@kilocode/kilo-jetbrains": patch +--- + +Hide the JetBrains prompt separator while the prompt is focused. 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 19db08ab224..617313ed8ce 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 @@ -133,6 +133,7 @@ class PromptPanel( var onAutoApproveToggle: (Boolean) -> Unit = {} var onFileDrag: (Boolean) -> Unit = {} private var style = SessionEditorStyle.current() + private var focused = false private val shell = BorderLayoutPanel().apply { isOpaque = true border = JBUI.Borders.empty( @@ -198,11 +199,11 @@ class PromptPanel( }) ed.contentComponent.addFocusListener(object : FocusAdapter() { override fun focusGained(e: FocusEvent) { - repaint() + syncFocus(true) } override fun focusLost(e: FocusEvent) { - repaint() + syncFocus(false) } }) } @@ -301,8 +302,27 @@ class PromptPanel( override fun updateUI() { super.updateUI() + syncBorder() + } + + private fun syncFocus(value: Boolean) { + if (focused == value) { + repaint() + return + } + focused = value + syncBorder() + revalidate() + repaint() + } + + private fun syncBorder() { border = JBUI.Borders.compound( - JBUI.Borders.customLineTop(SessionUiStyle.View.Prompt.separator()), + if (focused) { + JBUI.Borders.emptyTop(JBUI.scale(1)) + } else { + JBUI.Borders.customLineTop(SessionUiStyle.View.Prompt.separator()) + }, JBUI.Borders.empty(), ) } 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 a4838926a4f..08cf19e6b39 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 @@ -80,6 +80,7 @@ import java.awt.KeyboardFocusManager import java.awt.datatransfer.DataFlavor import java.awt.datatransfer.StringSelection import java.awt.datatransfer.Transferable +import java.awt.event.FocusEvent import java.awt.event.MouseEvent import java.awt.image.BufferedImage import java.io.ByteArrayOutputStream @@ -161,10 +162,15 @@ class PromptPanelTest : BasePlatformTestCase() { val focus = TestFocusManager() KeyboardFocusManager.setCurrentKeyboardFocusManager(focus) try { + assertEquals(SessionUiStyle.View.Prompt.separator().rgb, paint(panel, panel.width / 2, 0).rgb) assertTrue(JBUI.CurrentTheme.Focus.focusColor().rgb != paint(panel, panel.width / 2, 1).rgb) focus.focus(editor.contentComponent) + editor.contentComponent.focusListeners.forEach { + it.focusGained(FocusEvent(editor.contentComponent, FocusEvent.FOCUS_GAINED)) + } + assertTrue(SessionUiStyle.View.Prompt.separator().rgb != paint(panel, panel.width / 2, 0).rgb) assertEquals(JBUI.CurrentTheme.Focus.focusColor().rgb, paint(panel, panel.width / 2, 1).rgb) } finally { KeyboardFocusManager.setCurrentKeyboardFocusManager(current)