@@ -9,6 +9,7 @@ import (
99 "fmt"
1010 "io"
1111 "log/slog"
12+ "os"
1213 "sync"
1314 "time"
1415
@@ -27,7 +28,11 @@ import (
2728 "github.com/charmbracelet/crush/internal/permission"
2829 "github.com/charmbracelet/crush/internal/pubsub"
2930 "github.com/charmbracelet/crush/internal/session"
31+ "github.com/charmbracelet/crush/internal/tui/components/anim"
32+ "github.com/charmbracelet/crush/internal/tui/styles"
33+ "github.com/charmbracelet/lipgloss/v2"
3034 "github.com/charmbracelet/x/ansi"
35+ "github.com/charmbracelet/x/exp/charmtone"
3136)
3237
3338type App struct {
@@ -114,7 +119,25 @@ func (app *App) RunNonInteractive(ctx context.Context, output io.Writer, prompt
114119
115120 var spinner *format.Spinner
116121 if !quiet {
117− spinner = format.NewSpinner(ctx, cancel, "Generating")
122+ t := styles.CurrentTheme()
123+
124+ // Detect background color to set the appropriate color for the
125+ // spinner's 'Generating...' text. Without this, that text would be
126+ // unreadable in light terminals.
127+ hasDarkBG := true
128+ if f, ok := output.(*os.File); ok {
129+ hasDarkBG = lipgloss.HasDarkBackground(os.Stdin, f)
130+ }
131+ defaultFG := lipgloss.LightDark(hasDarkBG)(charmtone.Pepper, t.FgBase)
132+
133+ spinner = format.NewSpinner(ctx, cancel, anim.Settings{
134+ Size: 10,
135+ Label: "Generating",
136+ LabelColor: defaultFG,
137+ GradColorA: t.Primary,
138+ GradColorB: t.Secondary,
139+ CycleColors: true,
140+ })
118141 spinner.Start()
119142 }
120143