diff --git a/go.mod b/go.mod index ceb197b7624c43519b5df8d61e6c113b476c3b67..23a0d5e9284d2bf04189b9f5b597cefba769d40b 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,9 @@ go 1.25.0 require ( charm.land/bubbles/v2 v2.0.0-beta.1.0.20251104200223-da0b892d1759 - charm.land/bubbletea/v2 v2.0.0-rc.1.0.20251106164730-d9f7210a9efd + charm.land/bubbletea/v2 v2.0.0-rc.1.0.20251106195925-579e174cd7fa charm.land/fantasy v0.1.6 - charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251104200114-3aae28661422 + charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251106193318-19329a3e8410 github.com/JohannesKaufmann/html-to-markdown v1.6.0 github.com/MakeNowJust/heredoc v1.0.0 github.com/PuerkitoBio/goquery v1.10.3 @@ -17,11 +17,11 @@ require ( github.com/charlievieth/fastwalk v1.0.14 github.com/charmbracelet/catwalk v0.8.2 github.com/charmbracelet/colorprofile v0.3.3 - github.com/charmbracelet/fang v0.4.3 - github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018 - github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 - github.com/charmbracelet/ultraviolet v0.0.0-20251105181648-75d1e37ff1bb - github.com/charmbracelet/x/ansi v0.10.3 + github.com/charmbracelet/fang v0.4.4 + github.com/charmbracelet/glamour/v2 v2.0.0-20251106195642-800eb8175930 + github.com/charmbracelet/log/v2 v2.0.0-20251106192421-eb64aaa963a0 + github.com/charmbracelet/ultraviolet v0.0.0-20251106193841-7889546fc720 + github.com/charmbracelet/x/ansi v0.11.0 github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3 github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f github.com/charmbracelet/x/exp/ordered v0.1.0 @@ -88,8 +88,6 @@ require ( github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/charmbracelet/anthropic-sdk-go v0.0.0-20251024181547-21d6f3d9a904 // indirect - github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20251103214348-d3032608aa74 // indirect - github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a // indirect github.com/charmbracelet/x/json v0.2.0 // indirect github.com/charmbracelet/x/termios v0.1.1 // indirect github.com/charmbracelet/x/windows v0.2.2 // indirect diff --git a/go.sum b/go.sum index b11bd472da80e99ec70863a9a645c32bc5e7c128..a28775f4a5750035243ffc857d009ecad516c508 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,11 @@ charm.land/bubbles/v2 v2.0.0-beta.1.0.20251104200223-da0b892d1759 h1:P1MxkVl8ZeI9tHmmrn9UzV/5Mz7heoiTgqECHRFsUcs= charm.land/bubbles/v2 v2.0.0-beta.1.0.20251104200223-da0b892d1759/go.mod h1:G7JWaj3kDT0BDB+h5BLDUhhBLpDoRLKrpOp5QrA2SQs= -charm.land/bubbletea/v2 v2.0.0-rc.1.0.20251106164730-d9f7210a9efd h1:eyiUO6fojEdTbEq70qd8S5NXiRzvvIt5YaZsEa/vsfE= -charm.land/bubbletea/v2 v2.0.0-rc.1.0.20251106164730-d9f7210a9efd/go.mod h1:oR2A+f83vzDY0hALwW4eh90fKXdranRWnH/vfwJL1lU= +charm.land/bubbletea/v2 v2.0.0-rc.1.0.20251106195925-579e174cd7fa h1:J30WneaxF2CV3f2ofamxlr+RwyF6LKSJ3UesrtHfU9I= +charm.land/bubbletea/v2 v2.0.0-rc.1.0.20251106195925-579e174cd7fa/go.mod h1:lUNldRH4wRBZ9SGFqlss1Pep7QXzgV/Fp+V9BsAhOPc= charm.land/fantasy v0.1.6 h1:laomMUqUaniQoLx7UOb+MLUpIGJPoNwsXvw1PbzgnB8= charm.land/fantasy v0.1.6/go.mod h1:JpFcJ5zs/1CjmYYGAZ7GaFmeBv0mPaTzEPRG6Eic5pc= -charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251104200114-3aae28661422 h1:LcW3SSv1EZvlb9pfaVZIZyHrPVRJdb0adgX+tWPYl0k= -charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251104200114-3aae28661422/go.mod h1:0EJAlA1PDGb+2RyyC02yDSPDwvpegDefu74HC9Blg5o= +charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251106193318-19329a3e8410 h1:D9PbaszZYpB4nj+d6HTWr1onlmlyuGVNfL9gAi8iB3k= +charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251106193318-19329a3e8410/go.mod h1:1qZyvvVCenJO2M1ac2mX0yyiIZJoZmDM4DG4s0udJkU= cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4= @@ -88,20 +88,16 @@ github.com/charmbracelet/catwalk v0.8.2 h1:J7xq/ft/ZByJCHl3JpgvxlCd59bzZPugy66Xu github.com/charmbracelet/catwalk v0.8.2/go.mod h1:ReU4SdrLfe63jkEjWMdX2wlZMV3k9r11oQAmzN0m+KY= github.com/charmbracelet/colorprofile v0.3.3 h1:DjJzJtLP6/NZ8p7Cgjno0CKGr7wwRJGxWUwh2IyhfAI= github.com/charmbracelet/colorprofile v0.3.3/go.mod h1:nB1FugsAbzq284eJcjfah2nhdSLppN2NqvfotkfRYP4= -github.com/charmbracelet/fang v0.4.3 h1:qXeMxnL4H6mSKBUhDefHu8NfikFbP/MBNTfqTrXvzmY= -github.com/charmbracelet/fang v0.4.3/go.mod h1:wHJKQYO5ReYsxx+yZl+skDtrlKO/4LLEQ6EXsdHhRhg= -github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018 h1:PU4Zvpagsk5sgaDxn5W4sxHuLp9QRMBZB3bFSk40A4w= -github.com/charmbracelet/glamour/v2 v2.0.0-20250811143442-a27abb32f018/go.mod h1:Z/GLmp9fzaqX4ze3nXG7StgWez5uBM5XtlLHK8V/qSk= -github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20251103214348-d3032608aa74 h1:2N+CxpUFM6Rrx+xT7XaqM9pp/psOFlxKWa5R7rP/lck= -github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3.0.20251103214348-d3032608aa74/go.mod h1:RfXmCdNs2F4MVJjBVQp5RZYXR05MiRAHN4GHwWmsNIA= -github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 h1:WkwO6Ks3mSIGnGuSdKl9qDSyfbYK50z2wc2gGMggegE= -github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706/go.mod h1:mjJGp00cxcfvD5xdCa+bso251Jt4owrQvuimJtVmEmM= -github.com/charmbracelet/ultraviolet v0.0.0-20251105181648-75d1e37ff1bb h1:KZnKSrGjarKScpekDuPAVnlMSMtA7mdzmoUD0AhAZC0= -github.com/charmbracelet/ultraviolet v0.0.0-20251105181648-75d1e37ff1bb/go.mod h1:G7cNuWgmuugx6ApJv4kDGfnFanoDAz8AWazH9lSoWdw= -github.com/charmbracelet/x/ansi v0.10.3 h1:3WoV9XN8uMEnFRZZ+vBPRy59TaIWa+gJodS4Vg5Fut0= -github.com/charmbracelet/x/ansi v0.10.3/go.mod h1:uQt8bOrq/xgXjlGcFMc8U2WYbnxyjrKhnvTQluvfCaE= -github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a h1:zYSNtEJM9jwHbJts2k+Hroj+xQwsW1yxc4Wopdv7KaI= -github.com/charmbracelet/x/cellbuf v0.0.14-0.20250811133356-e0c5dbe5ea4a/go.mod h1:rc2bsPC6MWae3LdOxNO1mOb443NlMrrDL0xEya48NNc= +github.com/charmbracelet/fang v0.4.4 h1:G4qKxF6or/eTPgmAolwPuRNyuci3hTUGGX1rj1YkHJY= +github.com/charmbracelet/fang v0.4.4/go.mod h1:P5/DNb9DddQ0Z0dbc0P3ol4/ix5Po7Ofr2KMBfAqoCo= +github.com/charmbracelet/glamour/v2 v2.0.0-20251106195642-800eb8175930 h1:+47Z2jVAWPSLGjPRbfZizW3OpcAYsu7EUk2DR+66FyM= +github.com/charmbracelet/glamour/v2 v2.0.0-20251106195642-800eb8175930/go.mod h1:izs11tnkYaT3DTEH2E0V/lCb18VGZ7k9HLYEGuvgXGA= +github.com/charmbracelet/log/v2 v2.0.0-20251106192421-eb64aaa963a0 h1:lxHzxsHd4P7o7+5D5OcEItYkQ1xY3ovNg8Dc5ftd3rI= +github.com/charmbracelet/log/v2 v2.0.0-20251106192421-eb64aaa963a0/go.mod h1:Q7oMtlboDPnnrYiJDXNwdWmJblOmuOnycPKczlVju6I= +github.com/charmbracelet/ultraviolet v0.0.0-20251106193841-7889546fc720 h1:Pny/vp+ySKst82CWEME1oP6YEFs/17tlH+QOjqW7VUY= +github.com/charmbracelet/ultraviolet v0.0.0-20251106193841-7889546fc720/go.mod h1:Y8B4DzWeTb0ama8l3+KyopZtkE8fZjwRQ3aEAPEXHE0= +github.com/charmbracelet/x/ansi v0.11.0 h1:uuIVK7GIplwX6UBIz8S2TF8nkr7xRlygSsBRjSJqIvA= +github.com/charmbracelet/x/ansi v0.11.0/go.mod h1:uQt8bOrq/xgXjlGcFMc8U2WYbnxyjrKhnvTQluvfCaE= github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3 h1:1xwHZg6eMZ9Wv5TE1UGub6ARubyOd1Lo5kPUI/6VL50= github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0= github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f h1:pk6gmGpCE7F3FcjaOEKYriCvpmIN4+6OS/RD0vm4uIA= diff --git a/internal/tui/exp/list/list.go b/internal/tui/exp/list/list.go index 19848719b284e9982752fa450441d4011d92d551..63c8d806573a7a86e11a4496771e0fe62d8eb9e5 100644 --- a/internal/tui/exp/list/list.go +++ b/internal/tui/exp/list/list.go @@ -475,7 +475,8 @@ func (l *list[T]) selectionView(view string, textOnly bool) string { ts := t.TextSelection cell = cell.Clone() - cell.Style = cell.Style.Background(ts.GetBackground()).Foreground(ts.GetForeground()) + cell.Style.Bg = ts.GetBackground() + cell.Style.Fg = ts.GetForeground() scr.SetCell(x, y, cell) } } diff --git a/internal/tui/page/chat/chat.go b/internal/tui/page/chat/chat.go index 966bd9f230466f22da8d203f7562b39158c31c5b..3d9d550097635380ba9e5f7a9002a8cf69a61d91 100644 --- a/internal/tui/page/chat/chat.go +++ b/internal/tui/page/chat/chat.go @@ -946,7 +946,8 @@ func (p *chatPage) Help() help.KeyMap { key.WithKeys("ctrl+m", "ctrl+l"), key.WithHelp("ctrl+l", "models"), ) - if p.keyboardEnhancements.SupportsKeyDisambiguation() { + if p.keyboardEnhancements.Flags > 0 { + // non-zero flags mean we have at least key disambiguation modelsBinding.SetHelp("ctrl+m", "models") } helpBinding := key.NewBinding( diff --git a/internal/tui/tui.go b/internal/tui/tui.go index ecc66ee03ac35b468088f9e3d910cbd330c94df8..a80af22ef3365021175164f512b741a8b20de3f1 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -127,7 +127,8 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } return a, nil case tea.KeyboardEnhancementsMsg: - if msg.SupportsKeyDisambiguation() { + // A non-zero value means we have key disambiguation support. + if msg.Flags > 0 { a.keyMap.Models.SetHelp("ctrl+m", "models") } for id, page := range a.pages { @@ -558,22 +559,25 @@ func (a *appModel) moveToPage(pageID page.PageID) tea.Cmd { // View renders the complete application interface including pages, dialogs, and overlays. func (a *appModel) View() tea.View { var view tea.View - view.AltScreen = true t := styles.CurrentTheme() + view.AltScreen = true + view.MouseMode = tea.MouseModeCellMotion view.BackgroundColor = t.BgBase if a.wWidth < 25 || a.wHeight < 15 { - view.Layer = lipgloss.NewCanvas( - lipgloss.NewLayer( - t.S().Base.Width(a.wWidth).Height(a.wHeight). - Align(lipgloss.Center, lipgloss.Center). - Render( - t.S().Base. - Padding(1, 4). - Foreground(t.White). - BorderStyle(lipgloss.RoundedBorder()). - BorderForeground(t.Primary). - Render("Window too small!"), - ), + view.SetContent( + lipgloss.NewCanvas( + lipgloss.NewLayer( + t.S().Base.Width(a.wWidth).Height(a.wHeight). + Align(lipgloss.Center, lipgloss.Center). + Render( + t.S().Base. + Padding(1, 4). + Foreground(t.White). + BorderStyle(lipgloss.RoundedBorder()). + BorderForeground(t.Primary). + Render("Window too small!"), + ), + ), ), ) return view @@ -630,9 +634,8 @@ func (a *appModel) View() tea.View { layers..., ) - view.Layer = canvas + view.Content = canvas view.Cursor = cursor - view.MouseMode = tea.MouseModeCellMotion if a.sendProgressBar && a.app != nil && a.app.AgentCoordinator != nil && a.app.AgentCoordinator.IsBusy() { // HACK: use a random percentage to prevent ghostty from hiding it