diff --git a/go.sum b/go.sum index 73a85ed..48041bc 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ 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/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 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.3.5 h1:JAMNLTbqMOhSwoELIr0qyP4VidFq72/6E9j7HHmRKQc= @@ -12,6 +14,8 @@ github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2ll 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/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ= +github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= 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= diff --git a/main.go b/main.go index 72afb3f..bd3c95d 100644 --- a/main.go +++ b/main.go @@ -1,73 +1,86 @@ -// main.go package main -// A simple program demonstrating the spinner component from the Bubbles -// component library. - import ( "fmt" - "github.com/charmbracelet/bubbles/spinner" + "os" + tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" - "os" ) -type errMsg error +const ( + numRows = 5 + numCols = 7 + cellW = 10 + cellH = 1 +) + +var ( + cellStyle = lipgloss.NewStyle().Width(cellW).Height(cellH).Align(lipgloss.Center) + selectedStyle = cellStyle.Copy().Bold(true).Background(lipgloss.Color("12")).Foreground(lipgloss.Color("15")) + unselectedStyle = cellStyle.Copy().Background(lipgloss.Color("236")).Foreground(lipgloss.Color("250")) +) type model struct { - spinner spinner.Model - quitting bool - err error -} - -func initialModel() model { - s := spinner.New() - s.Spinner = spinner.Dot - s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205")) - return model{spinner: s} + cursorRow int + cursorCol int } func (m model) Init() tea.Cmd { - return m.spinner.Tick + return nil } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { - case "q", "esc", "ctrl+c": - m.quitting = true + case "ctrl+c", "q": return m, tea.Quit - default: - return m, nil + case "up": + if m.cursorRow > 0 { + m.cursorRow-- + } + case "down": + if m.cursorRow < numRows-1 { + m.cursorRow++ + } + case "left": + if m.cursorCol > 0 { + m.cursorCol-- + } + case "right": + if m.cursorCol < numCols-1 { + m.cursorCol++ + } } - - case errMsg: - m.err = msg - return m, nil - - default: - var cmd tea.Cmd - m.spinner, cmd = m.spinner.Update(msg) - return m, cmd } + return m, nil } func (m model) View() string { - if m.err != nil { - return m.err.Error() + var out string + count := 1 + for r := 0; r < numRows; r++ { + for c := 0; c < numCols; c++ { + label := fmt.Sprintf("Cell %02d", count) + if r == m.cursorRow && c == m.cursorCol { + out += selectedStyle.Render(label) + } else { + out += unselectedStyle.Render(label) + } + count++ + } + out += "\n" } - str := fmt.Sprintf("\n\n %s Loading forever...press q to quit\n\n", m.spinner.View()) - if m.quitting { - return str + "\n" - } - return str + out += "\nUse arrow keys to move, q to quit." + return out } func main() { - p := tea.NewProgram(initialModel()) - if _, err := p.Run(); err != nil { - fmt.Println(err) + p := tea.NewProgram(model{}) + if err := p.Start(); err != nil { + fmt.Fprintf(os.Stderr, "error: %v", err) os.Exit(1) } } +