summaryrefslogtreecommitdiffhomepage
path: root/packages/tui
diff options
context:
space:
mode:
authoradamdotdevin <[email protected]>2025-08-05 19:00:08 -0500
committeradamdotdevin <[email protected]>2025-08-05 19:05:44 -0500
commit6b25b7e95ea68321df73e22d62ad33e11154db85 (patch)
treed3d787f3ded38b9b359fb14897e35a8209b2022f /packages/tui
parent030a3a7446f0f151fd2fc4d3699cc4c712dc1170 (diff)
downloadopencode-6b25b7e95ea68321df73e22d62ad33e11154db85.tar.gz
opencode-6b25b7e95ea68321df73e22d62ad33e11154db85.zip
feat: better assistant message visual
Diffstat (limited to 'packages/tui')
-rw-r--r--packages/tui/internal/components/chat/message.go56
-rw-r--r--packages/tui/internal/util/text.go52
2 files changed, 32 insertions, 76 deletions
diff --git a/packages/tui/internal/components/chat/message.go b/packages/tui/internal/components/chat/message.go
index 8eb48c69f..ec908d5cf 100644
--- a/packages/tui/internal/components/chat/message.go
+++ b/packages/tui/internal/components/chat/message.go
@@ -23,17 +23,18 @@ import (
)
type blockRenderer struct {
- textColor compat.AdaptiveColor
- border bool
- borderColor *compat.AdaptiveColor
- borderLeft bool
- borderRight bool
- paddingTop int
- paddingBottom int
- paddingLeft int
- paddingRight int
- marginTop int
- marginBottom int
+ textColor compat.AdaptiveColor
+ backgroundColor compat.AdaptiveColor
+ border bool
+ borderColor *compat.AdaptiveColor
+ borderLeft bool
+ borderRight bool
+ paddingTop int
+ paddingBottom int
+ paddingLeft int
+ paddingRight int
+ marginTop int
+ marginBottom int
}
type renderingOption func(*blockRenderer)
@@ -44,6 +45,12 @@ func WithTextColor(color compat.AdaptiveColor) renderingOption {
}
}
+func WithBackgroundColor(color compat.AdaptiveColor) renderingOption {
+ return func(c *blockRenderer) {
+ c.backgroundColor = color
+ }
+}
+
func WithNoBorder() renderingOption {
return func(c *blockRenderer) {
c.border = false
@@ -132,14 +139,15 @@ func renderContentBlock(
) string {
t := theme.CurrentTheme()
renderer := &blockRenderer{
- textColor: t.TextMuted(),
- border: true,
- borderLeft: true,
- borderRight: false,
- paddingTop: 1,
- paddingBottom: 1,
- paddingLeft: 2,
- paddingRight: 2,
+ textColor: t.TextMuted(),
+ backgroundColor: t.BackgroundPanel(),
+ border: true,
+ borderLeft: true,
+ borderRight: false,
+ paddingTop: 1,
+ paddingBottom: 1,
+ paddingLeft: 2,
+ paddingRight: 2,
}
for _, option := range options {
option(renderer)
@@ -152,7 +160,7 @@ func renderContentBlock(
style := styles.NewStyle().
Foreground(renderer.textColor).
- Background(t.BackgroundPanel()).
+ Background(renderer.backgroundColor).
PaddingTop(renderer.paddingTop).
PaddingBottom(renderer.paddingBottom).
PaddingLeft(renderer.paddingLeft).
@@ -211,7 +219,7 @@ func renderText(
switch casted := message.(type) {
case opencode.AssistantMessage:
ts = time.UnixMilli(int64(casted.Time.Created))
- content = util.ToMarkdown(text, width, backgroundColor)
+ content = util.ToMarkdown(text, width+2, t.Background())
case opencode.UserMessage:
ts = time.UnixMilli(int64(casted.Time.Created))
base := styles.NewStyle().Foreground(t.Text()).Background(backgroundColor)
@@ -286,14 +294,14 @@ func renderText(
width,
WithTextColor(t.Text()),
WithBorderColor(t.Secondary()),
- WithBorderRight(),
)
case opencode.AssistantMessage:
return renderContentBlock(
app,
content,
- width,
- WithBorderColor(t.Accent()),
+ width+2,
+ WithNoBorder(),
+ WithBackgroundColor(t.Background()),
)
}
return ""
diff --git a/packages/tui/internal/util/text.go b/packages/tui/internal/util/text.go
deleted file mode 100644
index 8ac98ebc5..000000000
--- a/packages/tui/internal/util/text.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package util
-
-import (
- "regexp"
- "strings"
-
- "github.com/charmbracelet/lipgloss/v2"
-)
-
-// PreventHyphenBreaks replaces regular hyphens with non-breaking hyphens to prevent
-// sparse word breaks in hyphenated terms like "claude-code-action".
-// This improves readability by keeping hyphenated words together.
-// Only preserves hyphens within words, not markdown syntax like bullet points.
-func PreventHyphenBreaks(text string) string {
- // Use regex to match hyphens that are between word characters
- // This preserves hyphens in words like "claude-code-action" but not in "- [ ]"
- re := regexp.MustCompile(`(\w)-(\w)`)
- return re.ReplaceAllString(text, "$1\u2011$2")
-}
-
-// RestoreHyphens converts non-breaking hyphens back to regular hyphens.
-// This should be called after text processing (like word wrapping) is complete.
-func RestoreHyphens(text string) string {
- return strings.ReplaceAll(text, "\u2011", "-")
-}
-
-// ProcessTextWithHyphens applies hyphen preservation to text during processing.
-// It wraps the provided processFunc with hyphen handling.
-func ProcessTextWithHyphens(text string, processFunc func(string) string) string {
- preserved := PreventHyphenBreaks(text)
- processed := processFunc(preserved)
- return RestoreHyphens(processed)
-}
-
-// GetMessageContainerFrame calculates the actual horizontal frame size
-// (padding + borders) for message containers based on current theme.
-func GetMessageContainerFrame() int {
- style := lipgloss.NewStyle().
- BorderStyle(lipgloss.ThickBorder()).
- BorderLeft(true).
- BorderRight(true).
- PaddingLeft(2).
- PaddingRight(2)
- return style.GetHorizontalFrameSize()
-}
-
-// GetMarkdownContainerFrame calculates the actual horizontal frame size
-// for markdown containers based on current theme.
-func GetMarkdownContainerFrame() int {
- // Markdown containers use the same styling as message containers
- return GetMessageContainerFrame()
-}