1package tui
2
3import (
4 "fmt"
5
6 "charm.land/bubbles/v2/spinner"
7 tea "charm.land/bubbletea/v2"
8 "charm.land/lipgloss/v2"
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 TipStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("214")).Italic(true)
32 SuccessStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("42")).Bold(true)
33 InfoStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("42")).Bold(true)
34
35 H1Style = lipgloss.NewStyle().
36 Foreground(lipgloss.Color("42")).
37 Bold(true).
38 Align(lipgloss.Center)
39
40 H2Style = lipgloss.NewStyle().
41 Foreground(lipgloss.Color("42")).
42 Bold(false). // Less bold
43 Align(lipgloss.Center)
44
45 BodyStyle = lipgloss.NewStyle().
46 Bold(true) // A bit bold
47)
48
49var DocStyle = lipgloss.NewStyle().Margin(1, 2)
50
51// A simple model for showing a status message
52type Status struct {
53 spinner spinner.Model
54 message string
55}
56
57func NewStatus(msg string) Status {
58 s := spinner.New()
59 s.Spinner = spinner.Dot
60 s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("42"))
61 return Status{spinner: s, message: msg}
62}
63
64func (m Status) Init() tea.Cmd { return m.spinner.Tick }
65
66func (m Status) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
67 var cmd tea.Cmd
68 m.spinner, cmd = m.spinner.Update(msg)
69 return m, cmd
70}
71
72func (m Status) View() tea.View {
73 logoStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("42"))
74 styledLogo := logoStyle.Render(asciiLogo)
75
76 spinnerLine := fmt.Sprintf(" %s %s", m.spinner.View(), m.message)
77
78 return tea.NewView(fmt.Sprintf("%s\n%s\n\n", styledLogo, spinnerLine))
79}