diff --git a/internal/tui/components/chat/messages/messages.go b/internal/tui/components/chat/messages/messages.go index feb8c223e519b7aa428dcd11410db8f41bb3d894..c7b69756d4e631ed4eb230cad4c5d001f06e4e38 100644 --- a/internal/tui/components/chat/messages/messages.go +++ b/internal/tui/components/chat/messages/messages.go @@ -207,18 +207,27 @@ func (m *messageCmp) renderUserMessage() string { attachments := make([]string, len(m.message.BinaryContent())) for i, attachment := range m.message.BinaryContent() { - file := filepath.Base(attachment.Path) - var filename string - runes := []rune(file) - - const truncatePathAt = 7 - if len(runes) > truncatePathAt { - filename = fmt.Sprintf(" %s %s... ", styles.DocumentIcon, string(runes[0:truncatePathAt])) + filename := filepath.Base(attachment.Path) + var displayFilename string + runes := []rune(filename) + + const truncateAtChars = 7 + const truncateSuffix = "..." + + // If the filename is too long, truncate it to fit within the maximum + // width we’ve chosen. + if lipgloss.Width(filename) > truncateAtChars+lipgloss.Width(truncateSuffix) { + displayFilename = fmt.Sprintf( + " %s %s%s ", + styles.DocumentIcon, + string(runes[0:truncateAtChars]), + truncateSuffix, + ) } else { - filename = fmt.Sprintf(" %s %s ", styles.DocumentIcon, file) + displayFilename = fmt.Sprintf(" %s %s ", styles.DocumentIcon, filename) } - attachments[i] = attachmentStyles.Render(filename) + attachments[i] = attachmentStyles.Render(displayFilename) } if len(attachments) > 0 {