1package tui
2
3import (
4 "fmt"
5
6 "github.com/charmbracelet/bubbles/spinner"
7 tea "github.com/charmbracelet/bubbletea"
8 "github.com/charmbracelet/lipgloss"
9)
10
11// ASCII logo for Matcha displayed during loading screens
12const asciiLogo = `
13 __ __
14 ____ ___ ____ _/ /______/ /_ ____ _
15 / __ '__ \/ __ '/ __/ ___/ __ \/ __ '/
16 / / / / / / /_/ / /_/ /__/ / / / /_/ /
17/_/ /_/ /_/\__,_/\__/\___/_/ /_/\__,_/
18`
19
20var (
21 DialogBoxStyle = lipgloss.NewStyle().
22 Border(lipgloss.RoundedBorder()).
23 BorderForeground(lipgloss.Color("#25A065")).
24 Padding(1, 0).
25 BorderTop(true).
26 BorderLeft(true).
27 BorderRight(true).
28 BorderBottom(true)
29
30 HelpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("240"))
31 SuccessStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("42")).Bold(true)
32 InfoStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("42")).Bold(true)
33
34 H1Style = lipgloss.NewStyle().
35 Foreground(lipgloss.Color("42")).
36 Bold(true).
37 Align(lipgloss.Center)
38
39 H2Style = lipgloss.NewStyle().
40 Foreground(lipgloss.Color("42")).
41 Bold(false). // Less bold
42 Align(lipgloss.Center)
43
44 BodyStyle = lipgloss.NewStyle().
45 Bold(true) // A bit bold
46)
47
48var DocStyle = lipgloss.NewStyle().Margin(1, 2)
49
50// A simple model for showing a status message
51type Status struct {
52 spinner spinner.Model
53 message string
54}
55
56func NewStatus(msg string) Status {
57 s := spinner.New()
58 s.Spinner = spinner.Dot
59 s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("42"))
60 return Status{spinner: s, message: msg}
61}
62
63func (m Status) Init() tea.Cmd { return m.spinner.Tick }
64
65func (m Status) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
66 var cmd tea.Cmd
67 m.spinner, cmd = m.spinner.Update(msg)
68 return m, cmd
69}
70
71func (m Status) View() string {
72 logoStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("42"))
73 styledLogo := logoStyle.Render(asciiLogo)
74
75 spinnerLine := fmt.Sprintf(" %s %s", m.spinner.View(), m.message)
76
77 return fmt.Sprintf("%s\n%s\n\n", styledLogo, spinnerLine)
78}