Skip to content

Commit f60a660

Browse files
committed
feat(ui): add better ui for the cli tool
1 parent efdab6a commit f60a660

File tree

1 file changed

+79
-28
lines changed

1 file changed

+79
-28
lines changed

internal/ui/ui.go

+79-28
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,60 @@ import (
1010
)
1111

1212
var (
13+
primaryColor = lipgloss.Color("#8BE9FD")
14+
successColor = lipgloss.Color("#50FA7B")
15+
errorColor = lipgloss.Color("#FF5555")
16+
warningColor = lipgloss.Color("#FFB86C")
17+
secondaryColor = lipgloss.Color("#BD93F9")
18+
textColor = lipgloss.Color("#F8F8F2")
19+
1320
styleTitle = lipgloss.NewStyle().
1421
Bold(true).
15-
Foreground(lipgloss.Color("#FF6B6B")).
16-
MarginBottom(1)
22+
Foreground(primaryColor).
23+
MarginBottom(1).
24+
BorderStyle(lipgloss.RoundedBorder()).
25+
Padding(0, 1).
26+
Align(lipgloss.Center)
1727

1828
styleSuccess = lipgloss.NewStyle().
19-
Foreground(lipgloss.Color("#59CD90"))
29+
Foreground(successColor).
30+
Bold(true).
31+
PaddingLeft(2)
2032

2133
styleError = lipgloss.NewStyle().
22-
Foreground(lipgloss.Color("#FF6B6B"))
34+
Foreground(errorColor).
35+
Bold(true).
36+
PaddingLeft(2)
2337

2438
styleProgress = lipgloss.NewStyle().
25-
Foreground(lipgloss.Color("#4ECDC4"))
39+
Foreground(secondaryColor).
40+
PaddingLeft(2)
2641

2742
styleCompleted = lipgloss.NewStyle().
28-
Foreground(lipgloss.Color("#59CD90")).
29-
SetString("✓")
43+
Foreground(successColor).
44+
SetString("✓").
45+
PaddingRight(1)
3046

3147
stylePending = lipgloss.NewStyle().
32-
Foreground(lipgloss.Color("#FFD93D")).
33-
SetString("•")
48+
Foreground(warningColor).
49+
SetString("•").
50+
PaddingRight(1)
51+
52+
styleCurrentStep = lipgloss.NewStyle().
53+
Foreground(primaryColor).
54+
Bold(true)
55+
56+
styleCompletedStep = lipgloss.NewStyle().
57+
Foreground(textColor).
58+
Faint(true)
59+
60+
stylePendingStep = lipgloss.NewStyle().
61+
Foreground(textColor).
62+
Faint(true)
63+
64+
styleStepMessage = lipgloss.NewStyle().
65+
Foreground(secondaryColor).
66+
Italic(true)
3467
)
3568

3669
type InstallationStep struct {
@@ -163,7 +196,10 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
163196
case tea.KeyMsg:
164197
if msg.Type == tea.KeyCtrlC {
165198
m.cancelled = true
166-
return m, tea.Quit
199+
return m, tea.Sequence(
200+
tea.Println(styleError.Render("Installation cancelled by user")),
201+
tea.Quit,
202+
)
167203
}
168204

169205
case spinner.TickMsg:
@@ -178,67 +214,82 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
178214
return m, m.runNextStep()
179215
}
180216
m.completed = true
181-
return m, tea.Quit
217+
return m, tea.Sequence(
218+
tea.Println(styleSuccess.Render("✨ Cursor installation completed successfully! ✨")),
219+
tea.Quit,
220+
)
182221

183222
case errMsg:
184223
m.err = msg
185-
return m, tea.Quit
224+
return m, tea.Sequence(
225+
tea.Println(styleError.Render(fmt.Sprintf("Error: %v", m.err))),
226+
tea.Quit,
227+
)
186228

187229
case upToDateMsg:
188230
m.upToDate = true
189231
m.currentVersion = msg.version
190-
return m, tea.Quit
232+
return m, tea.Sequence(
233+
tea.Println(styleSuccess.Render("✨ Cursor "+m.currentVersion+" is already installed and up to date! ✨")),
234+
tea.Quit,
235+
)
191236

192237
case doneMsg:
193238
m.completed = true
194-
return m, tea.Quit
239+
return m, tea.Sequence(
240+
tea.Println(styleSuccess.Render("✨ Cursor installation completed successfully! ✨")),
241+
tea.Quit,
242+
)
195243
}
196244

197245
return m, nil
198246
}
199247

200248
func (m model) View() string {
201249
if m.cancelled {
202-
return styleError.Render("Installation cancelled by user.\n")
250+
return styleError.Render("Installation cancelled by user")
203251
}
204252

205253
if m.upToDate {
206-
return styleSuccess.Render(fmt.Sprintf("✨ Cursor is already up to date (version %s)!\n", m.currentVersion))
254+
return styleSuccess.Render(fmt.Sprintf("✨ Cursor is already up to date (version %s)!", m.currentVersion))
207255
}
208256

209257
if m.completed {
210-
return styleSuccess.Render("✨ Cursor installation completed successfully!\n")
258+
return styleSuccess.Render("✨ Cursor installation completed successfully!")
211259
}
212260

213261
if m.err != nil {
214-
return styleError.Render(fmt.Sprintf("Error: %v\n", m.err))
262+
return styleError.Render(fmt.Sprintf("Error: %v", m.err))
215263
}
216264

217265
var s string
218-
s += styleTitle.Render("Cursor Installer") + "\n"
219-
s += styleProgress.Render(fmt.Sprintf("Progress: %d/%d", m.currentStep, len(m.steps))) + "\n"
266+
267+
s += styleTitle.Render("Cursor Installer") + "\n\n"
268+
269+
progress := fmt.Sprintf("Step %d of %d", m.currentStep+1, len(m.steps))
270+
s += styleProgress.Render(progress) + "\n\n"
220271

221272
for i, step := range m.steps {
222273
var stepPrefix string
274+
var stepStyle lipgloss.Style
275+
223276
if i < m.currentStep {
224277
stepPrefix = styleCompleted.String()
278+
stepStyle = styleCompletedStep
225279
} else if i == m.currentStep {
226280
stepPrefix = m.spinner.View()
281+
stepStyle = styleCurrentStep
227282
} else {
228283
stepPrefix = stylePending.String()
284+
stepStyle = stylePendingStep
229285
}
230286

231-
stepStyle := lipgloss.NewStyle()
232-
if i == m.currentStep {
233-
stepStyle = stepStyle.Foreground(lipgloss.Color("#4ECDC4"))
234-
} else if i < m.currentStep {
235-
stepStyle = stepStyle.Foreground(lipgloss.Color("#59CD90"))
236-
}
287+
s += fmt.Sprintf("%s%s", stepPrefix, stepStyle.Render(step.name))
237288

238-
s += fmt.Sprintf("%s %s", stepPrefix, stepStyle.Render(step.name))
239289
if i == m.currentStep {
240-
s += fmt.Sprintf(": %s", step.message)
290+
s += styleStepMessage.Render(fmt.Sprintf(": %s", step.message))
241291
}
292+
242293
s += "\n"
243294
}
244295

0 commit comments

Comments
 (0)