on main help sign in
refactor: use clamp from /x/exp/ordered (#1236)
05457d5Christian Rocha
@@ -46,6 +46,8 @@ require (
46 mvdan.cc/sh/v3 v3.12.1-0.20250902163504-3cf4fd5717a5
46 mvdan.cc/sh/v3 v3.12.1-0.20250902163504-3cf4fd5717a5
47)
47)
48
48
49+require github.com/charmbracelet/x/exp/ordered v0.1.0
50+
49require (
51require (
50 cloud.google.com/go v0.116.0 // indirect
52 cloud.google.com/go v0.116.0 // indirect
51 cloud.google.com/go/auth v0.13.0 // indirect
53 cloud.google.com/go/auth v0.13.0 // indirect
go.sum+2
@@ -102,6 +102,8 @@ github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3 h1:1
102github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0=
102github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0=
103github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a h1:FsHEJ52OC4VuTzU8t+n5frMjLvpYWEznSr/u8tnkCYw=
103github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a h1:FsHEJ52OC4VuTzU8t+n5frMjLvpYWEznSr/u8tnkCYw=
104github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
104github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
105+github.com/charmbracelet/x/exp/ordered v0.1.0 h1:55/qLwjIh0gL0Vni+QAWk7T/qRVP6sBf+2agPBgnOFE=
106+github.com/charmbracelet/x/exp/ordered v0.1.0/go.mod h1:5UHwmG+is5THxMyCJHNPCn2/ecI07aKNrW+LcResjJ8=
105github.com/charmbracelet/x/exp/slice v0.0.0-20250829135019-44e44e21330d h1:H2oh4WlSsXy8qwLd7I3eAvPd/X3S40aM9l+h47WF1eA=
107github.com/charmbracelet/x/exp/slice v0.0.0-20250829135019-44e44e21330d h1:H2oh4WlSsXy8qwLd7I3eAvPd/X3S40aM9l+h47WF1eA=
106github.com/charmbracelet/x/exp/slice v0.0.0-20250829135019-44e44e21330d/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms=
108github.com/charmbracelet/x/exp/slice v0.0.0-20250829135019-44e44e21330d/go.mod h1:vI5nDVMWi6veaYH+0Fmvpbe/+cv/iJfMntdh+N0+Tms=
107github.com/charmbracelet/x/powernap v0.0.0-20250919153222-1038f7e6fef4 h1:ZhDGU688EHQXslD9KphRpXwK0pKP03egUoZAATUDlV0=
109github.com/charmbracelet/x/powernap v0.0.0-20250919153222-1038f7e6fef4 h1:ZhDGU688EHQXslD9KphRpXwK0pKP03egUoZAATUDlV0=
internal/tui/components/chat/messages/messages.go+3−2
@@ -12,6 +12,7 @@ import (
12 "github.com/charmbracelet/catwalk/pkg/catwalk"
12 "github.com/charmbracelet/catwalk/pkg/catwalk"
13 "github.com/charmbracelet/lipgloss/v2"
13 "github.com/charmbracelet/lipgloss/v2"
14 "github.com/charmbracelet/x/ansi"
14 "github.com/charmbracelet/x/ansi"
15+ "github.com/charmbracelet/x/exp/ordered"
15 "github.com/google/uuid"
16 "github.com/google/uuid"
16
17
17 "github.com/atotto/clipboard"
18 "github.com/atotto/clipboard"
@@ -271,7 +272,7 @@ func (m *messageCmp) renderThinkingContent() string {
271 }
272 }
272 }
273 }
273 fullContent := content.String()
274 fullContent := content.String()
274− height := util.Clamp(lipgloss.Height(fullContent), 1, 10)
275+ height := ordered.Clamp(lipgloss.Height(fullContent), 1, 10)
275 m.thinkingViewport.SetHeight(height)
276 m.thinkingViewport.SetHeight(height)
276 m.thinkingViewport.SetWidth(m.textWidth())
277 m.thinkingViewport.SetWidth(m.textWidth())
277 m.thinkingViewport.SetContent(fullContent)
278 m.thinkingViewport.SetContent(fullContent)
@@ -344,7 +345,7 @@ func (m *messageCmp) GetSize() (int, int) {
344
345
345// SetSize updates the width of the message component for text wrapping
346// SetSize updates the width of the message component for text wrapping
346func (m *messageCmp) SetSize(width int, height int) tea.Cmd {
347func (m *messageCmp) SetSize(width int, height int) tea.Cmd {
347− m.width = util.Clamp(width, 1, 120)
348+ m.width = ordered.Clamp(width, 1, 120)
348 m.thinkingViewport.SetWidth(m.width - 4)
349 m.thinkingViewport.SetWidth(m.width - 4)
349 return nil
350 return nil
350}
351}
internal/tui/exp/list/list.go+3−2
@@ -15,6 +15,7 @@ import (
15 "github.com/charmbracelet/lipgloss/v2"
15 "github.com/charmbracelet/lipgloss/v2"
16 uv "github.com/charmbracelet/ultraviolet"
16 uv "github.com/charmbracelet/ultraviolet"
17 "github.com/charmbracelet/x/ansi"
17 "github.com/charmbracelet/x/ansi"
18+ "github.com/charmbracelet/x/exp/ordered"
18 "github.com/rivo/uniseg"
19 "github.com/rivo/uniseg"
19)
20)
20
21
@@ -1283,14 +1284,14 @@ func (l *list[T]) UpdateItem(id string, item T) tea.Cmd {
1283 newItem, ok := l.renderedItems.Get(item.ID())
1284 newItem, ok := l.renderedItems.Get(item.ID())
1284 if ok {
1285 if ok {
1285 newLines := newItem.height - oldItem.height
1286 newLines := newItem.height - oldItem.height
1286− l.offset = util.Clamp(l.offset+newLines, 0, lipgloss.Height(l.rendered)-1)
1287+ l.offset = ordered.Clamp(l.offset+newLines, 0, lipgloss.Height(l.rendered)-1)
1287 }
1288 }
1288 }
1289 }
1289 } else if hasOldItem && l.offset > oldItem.start {
1290 } else if hasOldItem && l.offset > oldItem.start {
1290 newItem, ok := l.renderedItems.Get(item.ID())
1291 newItem, ok := l.renderedItems.Get(item.ID())
1291 if ok {
1292 if ok {
1292 newLines := newItem.height - oldItem.height
1293 newLines := newItem.height - oldItem.height
1293− l.offset = util.Clamp(l.offset+newLines, 0, lipgloss.Height(l.rendered)-1)
1294+ l.offset = ordered.Clamp(l.offset+newLines, 0, lipgloss.Height(l.rendered)-1)
1294 }
1295 }
1295 }
1296 }
1296 }
1297 }
internal/tui/util/util.go−7
@@ -60,10 +60,3 @@ type (
60 }
60 }
61 ClearStatusMsg struct{}
61 ClearStatusMsg struct{}
62)
62)
63−
64−func Clamp(v, low, high int) int {
65− if high < low {
66− low, high = high, low
67− }
68− return min(high, max(low, v))
69−}