diff --git a/Makefile b/Makefile index 22f8cd0..8a99196 100644 --- a/Makefile +++ b/Makefile @@ -10,8 +10,8 @@ up: cd examples && go get -u ./... && go mod tidy test: - go test -v ./... - cd examples && go test -v ./... + GORACE="exitcode=1 halt_on_error=1" go test -v -race -timeout 3m -count 3 -cpu 1,4 ./... + cd examples && GORACE="exitcode=1 halt_on_error=1" go test -v -race -timeout 3m -count 3 -cpu 1,4 ./... fuzz: go test -fuzz=FuzzScan -timeout=1m diff --git a/examples/full-lipgloss/dialog.go b/examples/full-lipgloss/dialog.go index aa30e51..ecb4216 100644 --- a/examples/full-lipgloss/dialog.go +++ b/examples/full-lipgloss/dialog.go @@ -5,9 +5,9 @@ package main import ( - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - zone "github.com/lrstanley/bubblezone" + tea "github.com/charmbracelet/bubbletea/v2" + "github.com/charmbracelet/lipgloss/v2" + zone "github.com/lrstanley/bubblezone/v2" ) var ( @@ -23,7 +23,7 @@ var ( MarginTop(1). MarginRight(2) - activeButtonStyle = buttonStyle.Copy(). + activeButtonStyle = buttonStyle. Foreground(lipgloss.Color("#FFF7DB")). Background(lipgloss.Color("#F25D94")). MarginRight(2). @@ -31,25 +31,24 @@ var ( ) type dialog struct { - id string - height int - width int - + id string active string question string } -func (m dialog) Init() tea.Cmd { +func (m *dialog) Init() tea.Cmd { return nil } -func (m dialog) Update(msg tea.Msg) (tea.Model, tea.Cmd) { +func (m *dialog) GetHeight() int { + return lipgloss.Height(m.View()) +} + +func (m *dialog) Update(msg tea.Msg) tea.Cmd { //nolint:unparam switch msg := msg.(type) { - case tea.WindowSizeMsg: - m.width = msg.Width - case tea.MouseMsg: - if msg.Action != tea.MouseActionRelease || msg.Button != tea.MouseButtonLeft { - return m, nil + case tea.MouseReleaseMsg: + if msg.Button != tea.MouseLeft { + return nil } if zone.Get(m.id + "confirm").InBounds(msg) { @@ -58,12 +57,12 @@ func (m dialog) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.active = "cancel" } - return m, nil + return nil } - return m, nil + return nil } -func (m dialog) View() string { +func (m *dialog) View() string { var okButton, cancelButton string if m.active == "confirm" { @@ -74,7 +73,7 @@ func (m dialog) View() string { cancelButton = activeButtonStyle.Render("Maybe") } - question := lipgloss.NewStyle().Width(27).Align(lipgloss.Center).Render("Are you sure you want to eat marmalade?") + question := lipgloss.NewStyle().Width(27).Align(lipgloss.Center).Render(m.question) buttons := lipgloss.JoinHorizontal( lipgloss.Top, zone.Mark(m.id+"confirm", okButton), diff --git a/examples/full-lipgloss/history.go b/examples/full-lipgloss/history.go index 1f6c44d..62ad3a5 100644 --- a/examples/full-lipgloss/history.go +++ b/examples/full-lipgloss/history.go @@ -5,32 +5,35 @@ package main import ( - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - zone "github.com/lrstanley/bubblezone" + tea "github.com/charmbracelet/bubbletea/v2" + "github.com/charmbracelet/lipgloss/v2" + zone "github.com/lrstanley/bubblezone/v2" ) type history struct { id string height int width int + dark bool active string items []string } -func (m history) Init() tea.Cmd { +func (m *history) Init() tea.Cmd { return nil } -func (m history) Update(msg tea.Msg) (tea.Model, tea.Cmd) { +func (m *history) Update(msg tea.Msg) tea.Cmd { //nolint:unparam switch msg := msg.(type) { case tea.WindowSizeMsg: m.height = msg.Height m.width = msg.Width - case tea.MouseMsg: - if msg.Action != tea.MouseActionRelease || msg.Button != tea.MouseButtonLeft { - return m, nil + case tea.BackgroundColorMsg: + m.dark = msg.IsDark() + case tea.MouseReleaseMsg: + if msg.Button != tea.MouseLeft { + return nil } for _, item := range m.items { @@ -41,18 +44,18 @@ func (m history) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } } } - return m, nil + return nil } -func (m history) View() string { +func (m *history) View() string { historyStyle := lipgloss.NewStyle(). Align(lipgloss.Left). Foreground(lipgloss.Color("#FAFAFA")). - Background(subtle). - Margin(1). + Background(subtle.Adapt(m.dark)). + Margin(0, 1). Padding(1, 2). Width((m.width / len(m.items)) - 2). - Height(m.height - 2). + Height(m.height). MaxHeight(m.height) out := []string{} @@ -60,7 +63,7 @@ func (m history) View() string { for _, item := range m.items { if item == m.active { // Customize the active item. - out = append(out, zone.Mark(m.id+item, historyStyle.Background(highlight).Render(item))) + out = append(out, zone.Mark(m.id+item, historyStyle.Background(highlight.Adapt(m.dark)).Render(item))) } else { // Make sure to mark all zones. out = append(out, zone.Mark(m.id+item, historyStyle.Render(item))) diff --git a/examples/full-lipgloss/list.go b/examples/full-lipgloss/list.go index 89e2dba..4c8de8f 100644 --- a/examples/full-lipgloss/list.go +++ b/examples/full-lipgloss/list.go @@ -5,37 +5,30 @@ package main import ( - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - zone "github.com/lrstanley/bubblezone" + tea "github.com/charmbracelet/bubbletea/v2" + "github.com/charmbracelet/lipgloss/v2" + zone "github.com/lrstanley/bubblezone/v2" ) var ( listStyle = lipgloss.NewStyle(). Border(lipgloss.NormalBorder(), false, true, false, false). - BorderForeground(subtle). MarginRight(2) listHeader = lipgloss.NewStyle(). BorderStyle(lipgloss.NormalBorder()). BorderBottom(true). - BorderForeground(subtle). - MarginRight(2). - Render - - listItemStyle = lipgloss.NewStyle().PaddingLeft(2).Render - - checkMark = lipgloss.NewStyle().SetString("✓"). - Foreground(special). - PaddingRight(1). - String() - - listDoneStyle = func(s string) string { - return checkMark + lipgloss.NewStyle(). - Strikethrough(true). - Foreground(lipgloss.AdaptiveColor{Light: "#969B86", Dark: "#696969"}). - Render(s) - } + MarginRight(2) + + listItemStyle = lipgloss.NewStyle(). + PaddingLeft(2) + + checkMark = lipgloss.NewStyle(). + SetString("✓"). + PaddingRight(1) + + listDoneStyle = lipgloss.NewStyle(). + Strikethrough(true) ) type listItem struct { @@ -44,25 +37,27 @@ type listItem struct { } type list struct { - id string - height int - width int - + id string + dark bool title string items []listItem } -func (m list) Init() tea.Cmd { +func (m *list) Init() tea.Cmd { return nil } -func (m list) Update(msg tea.Msg) (tea.Model, tea.Cmd) { +func (m *list) GetHeight() int { + return lipgloss.Height(m.View()) +} + +func (m *list) Update(msg tea.Msg) tea.Cmd { //nolint:unparam switch msg := msg.(type) { - case tea.WindowSizeMsg: - m.width = msg.Width - case tea.MouseMsg: - if msg.Action != tea.MouseActionRelease || msg.Button != tea.MouseButtonLeft { - return m, nil + case tea.BackgroundColorMsg: + m.dark = msg.IsDark() + case tea.MouseReleaseMsg: + if msg.Button != tea.MouseLeft { + return nil } for i, item := range m.items { @@ -73,24 +68,28 @@ func (m list) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } } - return m, nil + return nil } - return m, nil + return nil } -func (m list) View() string { - out := []string{listHeader(m.title)} +func (m *list) View() string { + out := []string{listHeader.BorderForeground(subtle.Adapt(m.dark)).Render(m.title)} for _, item := range m.items { if item.done { - out = append(out, zone.Mark(m.id+item.name, listDoneStyle(item.name))) + out = append(out, zone.Mark( + m.id+item.name, + checkMark.Foreground(special.Adapt(m.dark)).String()+ + listDoneStyle.Foreground(completed.Adapt(m.dark)).Render(item.name), + )) continue } - out = append(out, zone.Mark(m.id+item.name, listItemStyle(item.name))) + out = append(out, zone.Mark(m.id+item.name, listItemStyle.Render(item.name))) } - return listStyle.Render( + return listStyle.BorderForeground(subtle.Adapt(m.dark)).Render( lipgloss.JoinVertical(lipgloss.Left, out...), ) } diff --git a/examples/full-lipgloss/main.go b/examples/full-lipgloss/main.go index c2c3f08..98085e4 100644 --- a/examples/full-lipgloss/main.go +++ b/examples/full-lipgloss/main.go @@ -6,36 +6,51 @@ package main import ( "fmt" + "image/color" "os" - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - zone "github.com/lrstanley/bubblezone" + tea "github.com/charmbracelet/bubbletea/v2" + "github.com/charmbracelet/lipgloss/v2" + zone "github.com/lrstanley/bubblezone/v2" ) // This is a modified version of this example, supporting full screen, dynamic // resizing, and clickable models (tabs, lists, dialogs, etc). // https://github.com/charmbracelet/lipgloss/blob/master/example +type AdaptiveColor struct { + Light color.Color + Dark color.Color +} + +func (c AdaptiveColor) Adapt(dark bool) color.Color { + if dark { + return c.Dark + } + return c.Light +} + var ( - subtle = lipgloss.AdaptiveColor{Light: "#D9DCCF", Dark: "#383838"} - highlight = lipgloss.AdaptiveColor{Light: "#874BFD", Dark: "#7D56F4"} - special = lipgloss.AdaptiveColor{Light: "#43BF6D", Dark: "#73F59F"} + subtle = AdaptiveColor{Light: lipgloss.Color("#D9DCCF"), Dark: lipgloss.Color("#383838")} + highlight = AdaptiveColor{Light: lipgloss.Color("#874BFD"), Dark: lipgloss.Color("#7D56F4")} + special = AdaptiveColor{Light: lipgloss.Color("#43BF6D"), Dark: lipgloss.Color("#73F59F")} + completed = AdaptiveColor{Light: lipgloss.Color("#969B86"), Dark: lipgloss.Color("#696969")} ) type model struct { height int width int + dark bool - tabs tea.Model - dialog tea.Model - list1 tea.Model - list2 tea.Model - history tea.Model + tabs *tabs + dialog *dialog + list1 *list + list2 *list + history *history } func (m model) Init() tea.Cmd { - return nil + return tea.RequestBackgroundColor } func (m model) isInitialized() bool { @@ -43,13 +58,9 @@ func (m model) isInitialized() bool { } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - if !m.isInitialized() { - if _, ok := msg.(tea.WindowSizeMsg); !ok { - return m, nil - } - } - switch msg := msg.(type) { + case tea.BackgroundColorMsg: + m.dark = msg.IsDark() case tea.KeyMsg: // Example of toggling mouse event tracking on/off. if msg.String() == "ctrl+e" { @@ -63,29 +74,29 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.WindowSizeMsg: m.height = msg.Height m.width = msg.Width - msg.Height -= 2 - msg.Width -= 4 - return m.propagate(msg), nil } - return m.propagate(msg), nil + return m, m.propagate(msg) //nolint:gocritic } -func (m *model) propagate(msg tea.Msg) tea.Model { +func (m model) propagate(msg tea.Msg) tea.Cmd { // Propagate to all children. - m.tabs, _ = m.tabs.Update(msg) - m.dialog, _ = m.dialog.Update(msg) - m.list1, _ = m.list1.Update(msg) - m.list2, _ = m.list2.Update(msg) + cmds := []tea.Cmd{ + m.tabs.Update(msg), + m.dialog.Update(msg), + m.list1.Update(msg), + m.list2.Update(msg), + } if msg, ok := msg.(tea.WindowSizeMsg); ok { - msg.Height -= m.tabs.(tabs).height + m.list1.(list).height - m.history, _ = m.history.Update(msg) - return m - } + msg.Height -= m.tabs.GetHeight() + + max(m.list1.GetHeight(), m.list2.GetHeight(), m.dialog.GetHeight()) + + 2 // +1 for bottom margin on tabs, +1 for top margin on history. - m.history, _ = m.history.Update(msg) - return m + cmds = append(cmds, m.history.Update(msg)) + return tea.Batch(cmds...) + } + return tea.Batch(append(cmds, m.history.Update(msg))...) } func (m model) View() string { @@ -93,20 +104,22 @@ func (m model) View() string { return "" } - s := lipgloss.NewStyle().MaxHeight(m.height).MaxWidth(m.width).Padding(1, 2, 1, 2) - - return zone.Scan(s.Render(lipgloss.JoinVertical(lipgloss.Top, - m.tabs.View(), "", - lipgloss.PlaceHorizontal( - m.width, lipgloss.Center, - lipgloss.JoinHorizontal( - lipgloss.Top, - m.list1.View(), m.list2.View(), m.dialog.View(), + s := lipgloss.NewStyle().MaxHeight(m.height).MaxWidth(m.width) + + return zone.Scan(s.Render( + lipgloss.JoinVertical(lipgloss.Top, + lipgloss.NewStyle().MarginBottom(1).Render(m.tabs.View()), + lipgloss.PlaceHorizontal( + m.width, lipgloss.Center, + lipgloss.JoinHorizontal( + lipgloss.Top, + m.list1.View(), m.list2.View(), m.dialog.View(), + ), + lipgloss.WithWhitespaceChars(" "), ), - lipgloss.WithWhitespaceChars(" "), + lipgloss.NewStyle().MarginTop(1).Render(m.history.View()), ), - m.history.View(), - ))) + )) } func main() { @@ -117,20 +130,17 @@ func main() { m := &model{ tabs: &tabs{ id: zone.NewPrefix(), // Give each type an ID, so no zones will conflict. - height: 3, active: "Lip Gloss", items: []string{"Lip Gloss", "Blush", "Eye Shadow", "Mascara", "Foundation"}, }, dialog: &dialog{ id: zone.NewPrefix(), - height: 8, active: "confirm", question: "Are you sure you want to eat marmalade?", }, list1: &list{ - id: zone.NewPrefix(), - height: 8, - title: "Citrus Fruits to Try", + id: zone.NewPrefix(), + title: "Citrus Fruits to Try", items: []listItem{ {name: "Grapefruit", done: true}, {name: "Yuzu", done: false}, @@ -140,9 +150,8 @@ func main() { }, }, list2: &list{ - id: zone.NewPrefix(), - height: 8, - title: "Actual Lip Gloss Vendors", + id: zone.NewPrefix(), + title: "Actual Lip Gloss Vendors", items: []listItem{ {name: "Glossier", done: true}, {name: "Claire's Boutique", done: true}, @@ -164,7 +173,7 @@ func main() { p := tea.NewProgram(m, tea.WithAltScreen(), tea.WithMouseCellMotion()) if _, err := p.Run(); err != nil { - fmt.Println("error running program:", err) + fmt.Println("error running program:", err) //nolint:forbidigo os.Exit(1) } } diff --git a/examples/full-lipgloss/tabs.go b/examples/full-lipgloss/tabs.go index 2b44948..2346c29 100644 --- a/examples/full-lipgloss/tabs.go +++ b/examples/full-lipgloss/tabs.go @@ -7,9 +7,9 @@ package main import ( "strings" - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - zone "github.com/lrstanley/bubblezone" + tea "github.com/charmbracelet/bubbletea/v2" + "github.com/charmbracelet/lipgloss/v2" + zone "github.com/lrstanley/bubblezone/v2" ) var ( @@ -37,7 +37,6 @@ var ( tab = lipgloss.NewStyle(). Border(tabBorder, true). - BorderForeground(highlight). Padding(0, 1) activeTab = tab.Border(activeTabBorder, true) @@ -49,25 +48,31 @@ var ( ) type tabs struct { - id string - height int - width int + id string + width int + dark bool active string items []string } -func (m tabs) Init() tea.Cmd { +func (m *tabs) Init() tea.Cmd { return nil } -func (m tabs) Update(msg tea.Msg) (tea.Model, tea.Cmd) { +func (m *tabs) GetHeight() int { + return lipgloss.Height(m.View()) +} + +func (m *tabs) Update(msg tea.Msg) tea.Cmd { //nolint:unparam switch msg := msg.(type) { + case tea.BackgroundColorMsg: + m.dark = msg.IsDark() case tea.WindowSizeMsg: m.width = msg.Width - case tea.MouseMsg: - if msg.Action != tea.MouseActionRelease || msg.Button != tea.MouseButtonLeft { - return m, nil + case tea.MouseReleaseMsg: + if msg.Button != tea.MouseLeft { + return nil } for _, item := range m.items { @@ -78,24 +83,29 @@ func (m tabs) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } } - return m, nil + return nil } - return m, nil + return nil } -func (m tabs) View() string { +func (m *tabs) View() string { out := []string{} + color := highlight.Adapt(m.dark) + for _, item := range m.items { // Make sure to mark each tab when rendering. if item == m.active { - out = append(out, zone.Mark(m.id+item, activeTab.Render(item))) + out = append(out, zone.Mark(m.id+item, activeTab.BorderForeground(color).Render(item))) } else { - out = append(out, zone.Mark(m.id+item, tab.Render(item))) + out = append(out, zone.Mark( + m.id+item, + tab.BorderForeground(color).Render(item)), + ) } } row := lipgloss.JoinHorizontal(lipgloss.Top, out...) - gap := tabGap.Render(strings.Repeat(" ", max(0, m.width-lipgloss.Width(row)-2))) + gap := tabGap.BorderForeground(color).Render(strings.Repeat(" ", max(0, m.width-lipgloss.Width(row)-2))) row = lipgloss.JoinHorizontal(lipgloss.Bottom, row, gap) return row } diff --git a/examples/full-lipgloss/util.go b/examples/full-lipgloss/util.go deleted file mode 100644 index 686e3c1..0000000 --- a/examples/full-lipgloss/util.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Liam Stanley . All rights reserved. Use of -// this source code is governed by the MIT license that can be found in -// the LICENSE file. - -package main - -func max(a, b int) int { - if a > b { - return a - } - return b -} diff --git a/examples/go.mod b/examples/go.mod index f214bd5..26cdcb3 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -1,35 +1,32 @@ -module github.com/lrstanley/bubblezone/examples +module github.com/lrstanley/bubblezone/v2/examples go 1.23.0 toolchain go1.24.2 +replace github.com/lrstanley/bubblezone/v2 => ../ + require ( - github.com/charmbracelet/bubbles v0.21.0 - github.com/charmbracelet/bubbletea v1.3.4 - github.com/charmbracelet/lipgloss v1.1.0 - github.com/lrstanley/bubblezone v0.0.0-20250404061050-e13639e27357 + github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1 + github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.3 + github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1 + github.com/lrstanley/bubblezone/v2 v2.0.0-alpha.1 ) require ( github.com/atotto/clipboard v0.1.4 // indirect - github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/charmbracelet/colorprofile v0.3.1 // indirect github.com/charmbracelet/x/ansi v0.8.0 // indirect - github.com/charmbracelet/x/cellbuf v0.0.13 // indirect + github.com/charmbracelet/x/cellbuf v0.0.14-0.20250501183327-ad3bc78c6a81 // indirect + github.com/charmbracelet/x/input v0.3.5-0.20250424101541-abb4d9a9b197 // indirect github.com/charmbracelet/x/term v0.2.1 // indirect - github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect + github.com/charmbracelet/x/windows v0.2.1 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect - github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect - github.com/muesli/termenv v0.16.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/sahilm/fuzzy v0.1.1 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - golang.org/x/sync v0.13.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/text v0.24.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect ) diff --git a/examples/go.sum b/examples/go.sum index 8359600..36dbd26 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -1,62 +1,35 @@ github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= -github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= -github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= -github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= -github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= -github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= -github.com/charmbracelet/bubbletea v1.1.0 h1:FjAl9eAL3HBCHenhz/ZPjkKdScmaS5SK69JAK2YJK9c= -github.com/charmbracelet/bubbletea v1.1.0/go.mod h1:9Ogk0HrdbHolIKHdjfFpyXJmiCzGwy+FesYkZr7hYU4= -github.com/charmbracelet/bubbletea v1.2.4 h1:KN8aCViA0eps9SCOThb2/XPIlea3ANJLUkv3KnQRNCE= -github.com/charmbracelet/bubbletea v1.2.4/go.mod h1:Qr6fVQw+wX7JkWWkVyXYk/ZUQ92a6XNekLXa3rR18MM= -github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= -github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= +github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= +github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= +github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1 h1:swACzss0FjnyPz1enfX56GKkLiuKg5FlyVmOLIlU2kE= +github.com/charmbracelet/bubbles/v2 v2.0.0-beta.1/go.mod h1:6HamsBKWqEC/FVHuQMHgQL+knPyvHH55HwJDHl/adMw= +github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.3 h1:5A2e3myxXMpCES+kjEWgGsaf9VgZXjZbLi5iMTH7j40= +github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.3/go.mod h1:ZFDg5oPjyRYrPAa3iFrtP1DO8xy+LUQxd9JFHEcuwJY= github.com/charmbracelet/colorprofile v0.3.1 h1:k8dTHMd7fgw4bnFd7jXTLZrSU/CQrKnL3m+AxCzDz40= github.com/charmbracelet/colorprofile v0.3.1/go.mod h1:/GkGusxNs8VB/RSOh3fu0TJmQ4ICMMPApIIVn0KszZ0= -github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw= -github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY= -github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg= -github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo= -github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= -github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= -github.com/charmbracelet/x/ansi v0.2.3 h1:VfFN0NUpcjBRd4DnKfRaIRo53KRgey/nhOoEqosGDEY= -github.com/charmbracelet/x/ansi v0.2.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= -github.com/charmbracelet/x/ansi v0.6.0 h1:qOznutrb93gx9oMiGf7caF7bqqubh6YIM0SWKyA08pA= -github.com/charmbracelet/x/ansi v0.6.0/go.mod h1:KBUFw1la39nl0dLl10l5ORDAqGXaeurTQmwyyVKse/Q= +github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1 h1:D9AJJuYTN5pvz6mpIGO1ijLKpfTYSHOtKGgwoTQ4Gog= +github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1/go.mod h1:tRlx/Hu0lo/j9viunCN2H+Ze6JrmdjQlXUQvvArgaOc= github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= -github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= -github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= -github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0= -github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0= +github.com/charmbracelet/x/cellbuf v0.0.14-0.20250501183327-ad3bc78c6a81 h1:iGrflaL5jQW6crML+pZx/ulWAVZQR3CQoRGvFsr2Tyg= +github.com/charmbracelet/x/cellbuf v0.0.14-0.20250501183327-ad3bc78c6a81/go.mod h1:poPFOXFTsJsnLbkV3H2KxAAXT7pdjxxLujLocWjkyzM= +github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a h1:FsHEJ52OC4VuTzU8t+n5frMjLvpYWEznSr/u8tnkCYw= +github.com/charmbracelet/x/exp/golden v0.0.0-20250207160936-21c02780d27a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/input v0.3.5-0.20250424101541-abb4d9a9b197 h1:fsWj8NF5njyMVzELc7++HsvRDvgz3VcgGAUgWBDWWWM= +github.com/charmbracelet/x/input v0.3.5-0.20250424101541-abb4d9a9b197/go.mod h1:xseGeVftoP9rVI+/8WKYrJFH6ior6iERGvklwwHz5+s= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= -github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= -github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= +github.com/charmbracelet/x/windows v0.2.1 h1:3x7vnbpQrjpuq/4L+I4gNsG5htYoCiA5oe9hLjAij5I= +github.com/charmbracelet/x/windows v0.2.1/go.mod h1:ptZp16h40gDYqs5TSawSVW+yiLB13j4kSMA0lSCHL0M= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/lrstanley/bubblezone v0.0.0-20240820044643-3964e2111228 h1:XYsJHGSdg54uDr465T4Ta1yDIE9TfxPHE9GXN52zmfw= -github.com/lrstanley/bubblezone v0.0.0-20240820044643-3964e2111228/go.mod h1:zfTU1cXexU7r0A0YgjxjoT6ZXPFHQeD4EebE2Nb0uq0= -github.com/lrstanley/bubblezone v0.0.0-20250110053520-f6bbaede0a2e h1:dE2QiiFufUtV6tXgILorvVWNimKFC/2XJfG7rnA4DOE= -github.com/lrstanley/bubblezone v0.0.0-20250110053520-f6bbaede0a2e/go.mod h1:QZLe3Y/LB173QM9NMcGzSCtcaTmNcjPwOdYaqi+RO1A= -github.com/lrstanley/bubblezone v0.0.0-20250404061050-e13639e27357 h1:DxFncLGTrDh5v0z+DE7h+qjD5tPCGR+3knGVVfT3YLI= -github.com/lrstanley/bubblezone v0.0.0-20250404061050-e13639e27357/go.mod h1:S5etECMx+sZnW0Gm100Ma9J1PgVCTgNyFaqGu2b08b4= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= -github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= -github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= -github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= -github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= -github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= -github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -64,23 +37,9 @@ github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA= github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= diff --git a/examples/list-default/main.go b/examples/list-default/main.go index 863e000..af571ae 100644 --- a/examples/list-default/main.go +++ b/examples/list-default/main.go @@ -8,10 +8,10 @@ import ( "fmt" "os" - "github.com/charmbracelet/bubbles/list" - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - zone "github.com/lrstanley/bubblezone" + "github.com/charmbracelet/bubbles/v2/list" + tea "github.com/charmbracelet/bubbletea/v2" + "github.com/charmbracelet/lipgloss/v2" + zone "github.com/lrstanley/bubblezone/v2" ) // This is a modified version of this example, to support mouse click zones and @@ -48,17 +48,20 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { h, v := docStyle.GetFrameSize() m.list.SetSize(msg.Width-h, msg.Height-v) case tea.MouseMsg: - if msg.Button == tea.MouseButtonWheelUp { - m.list.CursorUp() - return m, nil - } - - if msg.Button == tea.MouseButtonWheelDown { - m.list.CursorDown() - return m, nil - } - - if msg.Action == tea.MouseActionRelease && msg.Button == tea.MouseButtonLeft { + switch msg := msg.(type) { + case tea.MouseWheelMsg: + switch msg.Button { + case tea.MouseWheelUp: + m.list.CursorUp() + return m, nil + case tea.MouseWheelDown: + m.list.CursorDown() + return m, nil + } + case tea.MouseReleaseMsg: + if msg.Button != tea.MouseLeft { + break + } for i, listItem := range m.list.VisibleItems() { v, _ := listItem.(item) // Check each item to see if it's in bounds. @@ -122,7 +125,7 @@ func main() { p := tea.NewProgram(m, tea.WithAltScreen(), tea.WithMouseCellMotion()) if _, err := p.Run(); err != nil { - fmt.Println("error running program:", err) + fmt.Println("error running program:", err) //nolint:forbidigo os.Exit(1) } } diff --git a/go.mod b/go.mod index a918bcc..aac2484 100644 --- a/go.mod +++ b/go.mod @@ -1,31 +1,26 @@ -module github.com/lrstanley/bubblezone +module github.com/lrstanley/bubblezone/v2 go 1.23.0 toolchain go1.24.2 require ( - github.com/charmbracelet/bubbletea v1.3.4 - github.com/charmbracelet/lipgloss v1.1.0 - github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 + github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.3 + github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1 + github.com/mattn/go-runewidth v0.0.16 ) require ( - github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/charmbracelet/colorprofile v0.3.1 // indirect github.com/charmbracelet/x/ansi v0.8.0 // indirect - github.com/charmbracelet/x/cellbuf v0.0.13 // indirect + github.com/charmbracelet/x/cellbuf v0.0.14-0.20250501183327-ad3bc78c6a81 // indirect + github.com/charmbracelet/x/input v0.3.5-0.20250424101541-abb4d9a9b197 // indirect github.com/charmbracelet/x/term v0.2.1 // indirect - github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect + github.com/charmbracelet/x/windows v0.2.1 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-localereader v0.0.1 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect github.com/muesli/cancelreader v0.2.2 // indirect - github.com/muesli/termenv v0.16.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - golang.org/x/sync v0.13.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/text v0.24.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect ) diff --git a/go.sum b/go.sum index 2306dae..0e6fd9d 100644 --- a/go.sum +++ b/go.sum @@ -1,54 +1,37 @@ -github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= -github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= -github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= -github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo= -github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= -github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= +github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= +github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= +github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.3 h1:5A2e3myxXMpCES+kjEWgGsaf9VgZXjZbLi5iMTH7j40= +github.com/charmbracelet/bubbletea/v2 v2.0.0-beta.3/go.mod h1:ZFDg5oPjyRYrPAa3iFrtP1DO8xy+LUQxd9JFHEcuwJY= github.com/charmbracelet/colorprofile v0.3.1 h1:k8dTHMd7fgw4bnFd7jXTLZrSU/CQrKnL3m+AxCzDz40= github.com/charmbracelet/colorprofile v0.3.1/go.mod h1:/GkGusxNs8VB/RSOh3fu0TJmQ4ICMMPApIIVn0KszZ0= -github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= -github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= +github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1 h1:D9AJJuYTN5pvz6mpIGO1ijLKpfTYSHOtKGgwoTQ4Gog= +github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1/go.mod h1:tRlx/Hu0lo/j9viunCN2H+Ze6JrmdjQlXUQvvArgaOc= github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= -github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= -github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= -github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= -github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= +github.com/charmbracelet/x/cellbuf v0.0.14-0.20250501183327-ad3bc78c6a81 h1:iGrflaL5jQW6crML+pZx/ulWAVZQR3CQoRGvFsr2Tyg= +github.com/charmbracelet/x/cellbuf v0.0.14-0.20250501183327-ad3bc78c6a81/go.mod h1:poPFOXFTsJsnLbkV3H2KxAAXT7pdjxxLujLocWjkyzM= +github.com/charmbracelet/x/exp/golden v0.0.0-20241212170349-ad4b7ae0f25f h1:UytXHv0UxnsDFmL/7Z9Q5SBYPwSuRLXHbwx+6LycZ2w= +github.com/charmbracelet/x/exp/golden v0.0.0-20241212170349-ad4b7ae0f25f/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/input v0.3.5-0.20250424101541-abb4d9a9b197 h1:fsWj8NF5njyMVzELc7++HsvRDvgz3VcgGAUgWBDWWWM= +github.com/charmbracelet/x/input v0.3.5-0.20250424101541-abb4d9a9b197/go.mod h1:xseGeVftoP9rVI+/8WKYrJFH6ior6iERGvklwwHz5+s= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= -github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= -github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= +github.com/charmbracelet/x/windows v0.2.1 h1:3x7vnbpQrjpuq/4L+I4gNsG5htYoCiA5oe9hLjAij5I= +github.com/charmbracelet/x/windows v0.2.1/go.mod h1:ptZp16h40gDYqs5TSawSVW+yiLB13j4kSMA0lSCHL0M= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= -github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= -github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= -github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= -github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= diff --git a/manager_global.go b/manager_global.go index 4634016..4b2acb8 100644 --- a/manager_global.go +++ b/manager_global.go @@ -4,7 +4,7 @@ package zone -import tea "github.com/charmbracelet/bubbletea" +import tea "github.com/charmbracelet/bubbletea/v2" // DefaultManager is an app-wide manager. To initialize it, call NewGlobal(). var DefaultManager *Manager diff --git a/manager_test.go b/manager_test.go index d9b3c1c..fe16532 100644 --- a/manager_test.go +++ b/manager_test.go @@ -9,7 +9,7 @@ import ( "testing" "time" - "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/lipgloss/v2" ) func TestMain(m *testing.M) { @@ -91,7 +91,7 @@ var ( func BenchmarkScan(b *testing.B) { for _, test := range testsScan { b.Run(test.name, func(b *testing.B) { - for i := 0; i < b.N; i++ { + for range b.N { _ = Scan(test.in) } }) @@ -162,7 +162,7 @@ func TestMark(_ *testing.T) { func BenchmarkMark(b *testing.B) { for _, test := range testsScan { b.Run(test.name, func(b *testing.B) { - for i := 0; i < b.N; i++ { + for range b.N { _ = Mark(test.name, test.in) } }) diff --git a/messages.go b/messages.go index 9d7faa4..a9c23e5 100644 --- a/messages.go +++ b/messages.go @@ -7,7 +7,7 @@ package zone import ( "sort" - tea "github.com/charmbracelet/bubbletea" + tea "github.com/charmbracelet/bubbletea/v2" ) // MsgZoneInBounds is a message sent when the manager detects that a zone is within diff --git a/messages_test.go b/messages_test.go index b49dd48..53e7b44 100644 --- a/messages_test.go +++ b/messages_test.go @@ -5,13 +5,20 @@ package zone import ( + "sync" "testing" "time" - tea "github.com/charmbracelet/bubbletea" + tea "github.com/charmbracelet/bubbletea/v2" +) + +var ( + _ tea.Model = (*testModel)(nil) + _ tea.ViewModel = (*testModel)(nil) ) type testModel struct { + mu sync.RWMutex received []tea.Msg } @@ -29,7 +36,9 @@ func (m *testModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { go AnyInBounds(m, msg) return m, nil case MsgZoneInBounds: + m.mu.Lock() m.received = append(m.received, msg) + m.mu.Unlock() } return m, nil } @@ -48,10 +57,12 @@ func TestAnyInBounds(t *testing.T) { t.Error("id not found") } - _, _ = m.Update(tea.MouseMsg{X: 4, Y: 2}) + _, _ = m.Update(tea.MouseMotionMsg{X: 4, Y: 2}) time.Sleep(100 * time.Millisecond) var contains bool + m.mu.RLock() + defer m.mu.RUnlock() for _, msg := range m.received { if evt, ok := msg.(MsgZoneInBounds); ok { if evt.Zone.id == xy.id { @@ -66,7 +77,13 @@ func TestAnyInBounds(t *testing.T) { } } +var ( + _ tea.Model = (*testModelValue)(nil) + _ tea.ViewModel = (*testModelValue)(nil) +) + type testModelValue struct { + mu sync.RWMutex received []tea.Msg } @@ -79,7 +96,9 @@ func (m testModelValue) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.MouseMsg: return AnyInBoundsAndUpdate(m, msg) case MsgZoneInBounds: + m.mu.Lock() m.received = append(m.received, msg) + m.mu.Unlock() } return m, nil } @@ -90,7 +109,8 @@ func (m testModelValue) View() string { } func TestAnyInBoundsAndUpdate(t *testing.T) { - var m tea.Model = testModelValue{} + m := testModelValue{} + _ = Scan(m.View()) time.Sleep(100 * time.Millisecond) xy := Get("foo") @@ -98,11 +118,14 @@ func TestAnyInBoundsAndUpdate(t *testing.T) { t.Error("id not found") } - m, _ = m.Update(tea.MouseMsg{X: 4, Y: 2}) + newModel, _ := m.Update(tea.MouseMotionMsg{X: 4, Y: 2}) + m = newModel.(testModelValue) time.Sleep(100 * time.Millisecond) var contains bool - for _, msg := range m.(testModelValue).received { + m.mu.RLock() + defer m.mu.RUnlock() + for _, msg := range m.received { if evt, ok := msg.(MsgZoneInBounds); ok { if evt.Zone.id == xy.id { contains = true diff --git a/scanner.go b/scanner.go index c094f91..76604f1 100644 --- a/scanner.go +++ b/scanner.go @@ -7,7 +7,7 @@ package zone import ( "unicode/utf8" - "github.com/muesli/ansi" + "github.com/mattn/go-runewidth" ) const ( @@ -66,7 +66,7 @@ func (s *scanner) emit() { if item, ok := s.tracked[rid]; ok { // The end should be - 1, because it's the end of the encapsulation of the // zone, and isn't actually taking up another space. - item.EndX = ansi.PrintableRuneWidth(s.input[s.lastNewline:s.start]) - 1 + item.EndX = printableRuneWidth(s.input[s.lastNewline:s.start]) - 1 item.EndY = s.newlines s.manager.setChan <- item @@ -76,7 +76,7 @@ func (s *scanner) emit() { s.tracked[rid] = &ZoneInfo{ id: rid, iteration: s.iteration, - StartX: ansi.PrintableRuneWidth(s.input[s.lastNewline:s.start]), + StartX: printableRuneWidth(s.input[s.lastNewline:s.start]), StartY: s.newlines, } } @@ -112,14 +112,14 @@ func (s *scanner) peek() rune { // scanMain is the entrypoint into the state machine. func scanMain(s *scanner) stateFn { - switch r := s.next(); { - case r == eof: + switch r := s.next(); r { + case eof: return nil - case r == '\n': + case '\n': s.newlines++ s.lastNewline = s.pos return scanMain - case r == identStart: + case identStart: s.start = s.pos - 1 return scanID default: @@ -158,3 +158,24 @@ func isNumber(r rune) bool { } return true } + +// printableRuneWidth returns the printable cell width of the given string. +func printableRuneWidth(s string) int { + var n int + var ansi bool + + for _, c := range s { + if c == identStart { // Start of ANSI escape sequence. + ansi = true + } else if ansi { + // Check if at the end of an ANSI escape sequence (terminator). + if (c >= 0x40 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a) { + ansi = false + } + } else { + n += runewidth.RuneWidth(c) + } + } + + return n +} diff --git a/zoneinfo.go b/zoneinfo.go index 09355fd..0b80fad 100644 --- a/zoneinfo.go +++ b/zoneinfo.go @@ -4,7 +4,7 @@ package zone -import tea "github.com/charmbracelet/bubbletea" +import tea "github.com/charmbracelet/bubbletea/v2" // ZoneInfo holds information about the start and end positions of a zone. type ZoneInfo struct { // nolint:revive @@ -31,7 +31,7 @@ func (z *ZoneInfo) IsZero() bool { // using a box between the start and end coordinates. If you're looking to check // for abnormal shapes (e.g. something that might wrap a line, but can't be // determined using a box), you'll likely have to implement this yourself. -func (z *ZoneInfo) InBounds(e tea.MouseMsg) bool { +func (z *ZoneInfo) InBounds(msg tea.MouseMsg) bool { if z.IsZero() { return false } @@ -40,14 +40,14 @@ func (z *ZoneInfo) InBounds(e tea.MouseMsg) bool { return false } - if e.X < z.StartX || e.Y < z.StartY { + event := msg.Mouse() + + if event.X < z.StartX || event.Y < z.StartY { return false } - - if e.X > z.EndX || e.Y > z.EndY { + if event.X > z.EndX || event.Y > z.EndY { return false } - return true } @@ -59,5 +59,7 @@ func (z *ZoneInfo) Pos(msg tea.MouseMsg) (x, y int) { return -1, -1 } - return msg.X - z.StartX, msg.Y - z.StartY + event := msg.Mouse() + + return event.X - z.StartX, event.Y - z.StartY } diff --git a/zoneinfo_test.go b/zoneinfo_test.go index 8365a72..8a37ae0 100644 --- a/zoneinfo_test.go +++ b/zoneinfo_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - tea "github.com/charmbracelet/bubbletea" + tea "github.com/charmbracelet/bubbletea/v2" ) func TestValidPosition(t *testing.T) { @@ -42,42 +42,42 @@ func TestInBounds(t *testing.T) { } // Outside left. - if xy.InBounds(tea.MouseMsg{X: 0, Y: 0}) { + if xy.InBounds(tea.MouseMotionMsg{X: 0, Y: 0}) { t.Error("expected false") } // Outside directly left. - if xy.InBounds(tea.MouseMsg{X: 3, Y: 3}) { + if xy.InBounds(tea.MouseMotionMsg{X: 3, Y: 3}) { t.Error("expected false") } // Outside right. - if xy.InBounds(tea.MouseMsg{X: 99, Y: 99}) { + if xy.InBounds(tea.MouseMotionMsg{X: 99, Y: 99}) { t.Error("expected false") } // Outside directly right. - if xy.InBounds(tea.MouseMsg{X: 13, Y: 3}) { + if xy.InBounds(tea.MouseMotionMsg{X: 13, Y: 3}) { t.Error("expected false") } // Outside top. - if xy.InBounds(tea.MouseMsg{X: 4, Y: 1}) { + if xy.InBounds(tea.MouseMotionMsg{X: 4, Y: 1}) { t.Error("expected false") } // Outside bottom. - if xy.InBounds(tea.MouseMsg{X: 4, Y: 4}) { + if xy.InBounds(tea.MouseMotionMsg{X: 4, Y: 4}) { t.Error("expected false") } // Inside left top. - if !xy.InBounds(tea.MouseMsg{X: 4, Y: 2}) { + if !xy.InBounds(tea.MouseMotionMsg{X: 4, Y: 2}) { t.Error("expected true") } // Inside right bottom. - if !xy.InBounds(tea.MouseMsg{X: 12, Y: 3}) { + if !xy.InBounds(tea.MouseMotionMsg{X: 12, Y: 3}) { t.Error("expected true") } @@ -85,19 +85,19 @@ func TestInBounds(t *testing.T) { time.Sleep(100 * time.Millisecond) xy = Get("foo") - if xy.InBounds(tea.MouseMsg{X: 2, Y: 1}) { + if xy.InBounds(tea.MouseMotionMsg{X: 2, Y: 1}) { t.Error("expected false") } } func TestInBoundsZero(t *testing.T) { xy := &ZoneInfo{} - if xy.InBounds(tea.MouseMsg{X: 0, Y: 0}) { + if xy.InBounds(tea.MouseMotionMsg{X: 0, Y: 0}) { t.Error("expected false") } xy = Get("non-existent") - if xy.InBounds(tea.MouseMsg{X: 0, Y: 0}) { + if xy.InBounds(tea.MouseMotionMsg{X: 0, Y: 0}) { t.Error("expected false") } } @@ -111,21 +111,21 @@ func TestPos(t *testing.T) { t.Error("id not found") } - if x, y := xy.Pos(tea.MouseMsg{X: 4, Y: 2}); x != 0 || y != 0 { + if x, y := xy.Pos(tea.MouseMotionMsg{X: 4, Y: 2}); x != 0 || y != 0 { t.Error("expected 0, 0") } - if x, y := xy.Pos(tea.MouseMsg{X: 5, Y: 2}); x != 1 || y != 0 { + if x, y := xy.Pos(tea.MouseMotionMsg{X: 5, Y: 2}); x != 1 || y != 0 { t.Error("expected 1, 0") } xy = &ZoneInfo{} - if x, y := xy.Pos(tea.MouseMsg{X: 0, Y: 0}); x != -1 || y != -1 { + if x, y := xy.Pos(tea.MouseMotionMsg{X: 0, Y: 0}); x != -1 || y != -1 { t.Error("expected -1, -1") } xy = Get("non-existent") - if x, y := xy.Pos(tea.MouseMsg{X: 0, Y: 0}); x != -1 || y != -1 { + if x, y := xy.Pos(tea.MouseMotionMsg{X: 0, Y: 0}); x != -1 || y != -1 { t.Error("expected -1, -1") } }