From 46b0ea1a17b8afedd52ce43b40fabb45b097d766 Mon Sep 17 00:00:00 2001 From: kirillk Date: Thu, 21 May 2026 10:35:23 -0400 Subject: [PATCH] fix(jetbrains): tune question panel typography --- .../ui/shared/BaseSessionQuestionPanel.kt | 10 ++++++++-- .../session/views/question/QuestionView.kt | 2 -- .../ui/shared/BaseSessionQuestionPanelTest.kt | 18 +++++++++++++++--- .../session/views/LoginRequiredViewTest.kt | 4 ++-- .../client/session/views/PermissionViewTest.kt | 2 +- .../client/session/views/QuestionViewTest.kt | 6 ++++-- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/shared/BaseSessionQuestionPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/shared/BaseSessionQuestionPanel.kt index ed36d799f32..e16d917dffa 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/shared/BaseSessionQuestionPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/shared/BaseSessionQuestionPanel.kt @@ -13,6 +13,7 @@ import java.awt.BorderLayout import java.awt.Color import java.awt.Component import java.awt.Dimension +import java.awt.Font import javax.swing.Box import javax.swing.BoxLayout import javax.swing.Icon @@ -48,7 +49,9 @@ class BaseSessionQuestionPanel : RoundedContentPanel( val headerText: JBTextArea = makeText("", UiStyle.Colors.fg(), bold = true) // ---- description text ---- - val descriptionText: JBTextArea = makeText("", UiStyle.Colors.weak(), bold = false) + val descriptionText: JBTextArea = makeText("", UiStyle.Colors.weak(), bold = false).apply { + border = JBUI.Borders.emptyTop(UiStyle.Gap.sm()) + } private val icon = JBLabel().apply { border = JBUI.Borders.emptyRight(UiStyle.Gap.sm()) @@ -215,7 +218,10 @@ class BaseSessionQuestionPanel : RoundedContentPanel( } private fun applyFont(area: JBTextArea, bold: Boolean) { - val font = if (bold) style.boldUiFont else style.uiFont + val base = if (bold) style.boldUiFont else style.uiFont + val font = larger(base) if (area.font != font) area.font = font } + + private fun larger(font: Font): Font = font.deriveFont((font.size + 1).toFloat()) } diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/question/QuestionView.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/question/QuestionView.kt index 2ccb0b74d12..db2bc0f423f 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/question/QuestionView.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/question/QuestionView.kt @@ -151,11 +151,9 @@ class QuestionView( } else { val item = q.items[idx] card.headerText.text = item.question - card.headerText.border = JBUI.Borders.emptyBottom(UiStyle.Gap.xs()) card.descriptionText.text = KiloBundle.message( if (item.multiple) "session.question.hint.multi" else "session.question.hint.single" ) - card.descriptionText.border = JBUI.Borders.empty() card.descriptionText.isVisible = true addContent(item, selections[idx]) } diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/shared/BaseSessionQuestionPanelTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/shared/BaseSessionQuestionPanelTest.kt index b6acff41f82..58e56b2da45 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/shared/BaseSessionQuestionPanelTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/shared/BaseSessionQuestionPanelTest.kt @@ -1,6 +1,7 @@ package ai.kilocode.client.session.ui.shared import ai.kilocode.client.session.ui.style.SessionEditorStyle +import ai.kilocode.client.ui.UiStyle import com.intellij.icons.AllIcons import com.intellij.openapi.application.ApplicationManager import com.intellij.testFramework.fixtures.BasePlatformTestCase @@ -280,14 +281,25 @@ class BaseSessionQuestionPanelTest : BasePlatformTestCase() { // ------ applyStyle: UI fonts ------ - fun `test applyStyle applies boldUiFont to header and uiFont to description`() { + fun `test applyStyle applies enlarged boldUiFont to header and enlarged uiFont to description`() { edt { val panel = BaseSessionQuestionPanel() val style = SessionEditorStyle.create(family = "Courier New", size = 20) panel.applyStyle(style) - assertEquals("headerText should use boldUiFont", style.boldUiFont, panel.headerText.font) - assertEquals("descriptionText should use uiFont", style.uiFont, panel.descriptionText.font) + assertEquals("headerText should keep boldUiFont family", style.boldUiFont.name, panel.headerText.font.name) + assertEquals("descriptionText should keep uiFont family", style.uiFont.name, panel.descriptionText.font.name) + assertEquals("headerText should use next font size", style.boldUiFont.size + 1, panel.headerText.font.size) + assertEquals("descriptionText should use next font size", style.uiFont.size + 1, panel.descriptionText.font.size) + } + } + + fun `test description uses next standard top padding`() { + edt { + val panel = BaseSessionQuestionPanel() + val ins = panel.descriptionText.border.getBorderInsets(panel.descriptionText) + + assertEquals("description top padding should use next standard gap", UiStyle.Gap.sm(), ins.top) } } diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/LoginRequiredViewTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/LoginRequiredViewTest.kt index b7972df3a08..b291b4bd25d 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/LoginRequiredViewTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/LoginRequiredViewTest.kt @@ -189,7 +189,7 @@ class LoginRequiredViewTest : BasePlatformTestCase() { "Title font should not use editor font family", title!!.font.name == "Courier New", ) - assertEquals("Title font size should match editor size", 20, title.font.size) + assertEquals("Title font size should use next size", 21, title.font.size) } } @@ -206,7 +206,7 @@ class LoginRequiredViewTest : BasePlatformTestCase() { "Description font should not use editor font family", desc!!.font.name == "Courier New", ) - assertEquals("Description font size should match editor size", 20, desc.font.size) + assertEquals("Description font size should use next size", 21, desc.font.size) } } diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/PermissionViewTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/PermissionViewTest.kt index d7153b0c90f..03fa4825d48 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/PermissionViewTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/PermissionViewTest.kt @@ -387,7 +387,7 @@ class PermissionViewTest : BasePlatformTestCase() { val header = view.headerFontForTest() assertFalse("Permission header should not use editor font family", header.name == "Courier New") assertTrue("Permission header should be bold", header.isBold) - assertEquals("Permission header size should match editor size", 18, header.size) + assertEquals("Permission header size should use next size", 19, header.size) } fun `test command code block retains editor font family`() { diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/QuestionViewTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/QuestionViewTest.kt index 6932aad49e2..61e8f7b1540 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/QuestionViewTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/QuestionViewTest.kt @@ -195,8 +195,10 @@ class QuestionViewTest : BasePlatformTestCase() { val title = text(view, "Choose approach") val hint = text(view, "Select one answer") - assertEquals(style.boldUiFont, title.font) - assertEquals(style.uiFont, hint.font) + assertEquals(style.boldUiFont.name, title.font.name) + assertEquals(style.uiFont.name, hint.font.name) + assertEquals(style.boldUiFont.size + 1, title.font.size) + assertEquals(style.uiFont.size + 1, hint.font.size) } // ------ multi-question navigation ------