Tutorials

Spinners

Add loading spinners to your Bubble Tea applications.

Add visual pizzazz with loading spinners from Bubbles!

The Complete Code

package main

import (
    "fmt"
    "os"

    "github.com/charmbracelet/bubbles/v2/spinner"
    tea "github.com/charmbracelet/bubbletea/v2"
    "github.com/charmbracelet/lipgloss/v2"
)

type model struct {
    spinner  spinner.Model
    quitting bool
}

func initialModel() model {
    s := spinner.New()
    s.Spinner = spinner.Dot
    s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("205"))
    return model{spinner: s}
}

func (m model) Init() tea.Cmd {
    return m.spinner.Tick
}

func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
    switch msg := msg.(type) {
    case tea.KeyPressMsg:
        if msg.String() == "q" {
            m.quitting = true
            return m, tea.Quit
        }
    default:
        var cmd tea.Cmd
        m.spinner, cmd = m.spinner.Update(msg)
        return m, cmd
    }
    return m, nil
}

func (m model) View() string {
    return fmt.Sprintf("\n   %s Loading...\n\n", m.spinner.View())
}

func main() {
    p := tea.NewProgram(initialModel())
    if _, err := p.Run(); err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
}

Spinner Styles

spinner.Line     spinner.Dot      spinner.MiniDot
spinner.Jump     spinner.Pulse    spinner.Points
spinner.Globe    spinner.Moon     spinner.Monkey