@@ -1,16 +1,15 @@
1package layout
1package layout
7 "github.com/charmbracelet/lipgloss"
6 "github.com/charmbracelet/lipgloss"
8− "github.com/opencode-ai/opencode/internal/tui/styles"
7+ chAnsi "github.com/charmbracelet/x/ansi"
9− "github.com/opencode-ai/opencode/internal/tui/util"
10− "github.com/mattn/go-runewidth"
11 "github.com/muesli/ansi"
8 "github.com/muesli/ansi"
12 "github.com/muesli/reflow/truncate"
9 "github.com/muesli/reflow/truncate"
13 "github.com/muesli/termenv"
10 "github.com/muesli/termenv"
11+ "github.com/opencode-ai/opencode/internal/tui/styles"
12+ "github.com/opencode-ai/opencode/internal/tui/util"
16// Most of this code is borrowed from
15// Most of this code is borrowed from
@@ -117,42 +116,7 @@ func PlaceOverlay(
117// cutLeft cuts printable characters from the left.
116// cutLeft cuts printable characters from the left.
118// This function is heavily based on muesli's ansi and truncate packages.
117// This function is heavily based on muesli's ansi and truncate packages.
119func cutLeft(s string, cutWidth int) string {
118func cutLeft(s string, cutWidth int) string {
120− var (
119+ return chAnsi.Cut(s, cutWidth, lipgloss.Width(s))
126− for _, c := range s {
128− if c == ansi.Marker || isAnsi {
131− if ansi.IsTerminator(c) {
133− if bytes.HasSuffix(ab.Bytes(), []byte("[0m")) {
138− w = runewidth.RuneWidth(c)
141− if pos >= cutWidth {
146− if pos-cutWidth > 1 {
158func max(a, b int) int {
122func max(a, b int) int {