mirror of
https://github.com/fosrl/pangolin.git
synced 2026-02-26 14:56:39 +00:00
Instead of relying on stdin and stdout by default, using the huh package from charmbracelet allows us to handle user input more gracefully such as y/n instead of typing 'yes' or 'no'. If a user makes a mistake whilst typing in any text fields they cannot use left or right to edit a single character when using huh it can. This adds a dependancy and may increase the size of installer but overall improves user experience.
52 lines
2.4 KiB
Go
52 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"github.com/charmbracelet/huh"
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
// Pangolin brand colors (converted from oklch to hex)
|
|
var (
|
|
// Primary orange/amber - oklch(0.6717 0.1946 41.93)
|
|
primaryColor = lipgloss.AdaptiveColor{Light: "#D97706", Dark: "#F59E0B"}
|
|
// Muted foreground
|
|
mutedColor = lipgloss.AdaptiveColor{Light: "#737373", Dark: "#A3A3A3"}
|
|
// Success green
|
|
successColor = lipgloss.AdaptiveColor{Light: "#16A34A", Dark: "#22C55E"}
|
|
// Error red - oklch(0.577 0.245 27.325)
|
|
errorColor = lipgloss.AdaptiveColor{Light: "#DC2626", Dark: "#EF4444"}
|
|
// Normal text
|
|
normalFg = lipgloss.AdaptiveColor{Light: "#171717", Dark: "#FAFAFA"}
|
|
)
|
|
|
|
// ThemePangolin returns a huh theme using Pangolin brand colors
|
|
func ThemePangolin() *huh.Theme {
|
|
t := huh.ThemeBase()
|
|
|
|
// Focused state styles
|
|
t.Focused.Base = t.Focused.Base.BorderForeground(primaryColor)
|
|
t.Focused.Title = t.Focused.Title.Foreground(primaryColor).Bold(true)
|
|
t.Focused.Description = t.Focused.Description.Foreground(mutedColor)
|
|
t.Focused.ErrorIndicator = t.Focused.ErrorIndicator.Foreground(errorColor)
|
|
t.Focused.ErrorMessage = t.Focused.ErrorMessage.Foreground(errorColor)
|
|
t.Focused.SelectSelector = t.Focused.SelectSelector.Foreground(primaryColor)
|
|
t.Focused.NextIndicator = t.Focused.NextIndicator.Foreground(primaryColor)
|
|
t.Focused.PrevIndicator = t.Focused.PrevIndicator.Foreground(primaryColor)
|
|
t.Focused.Option = t.Focused.Option.Foreground(normalFg)
|
|
t.Focused.SelectedOption = t.Focused.SelectedOption.Foreground(primaryColor)
|
|
t.Focused.SelectedPrefix = lipgloss.NewStyle().Foreground(successColor).SetString("✓ ")
|
|
t.Focused.UnselectedPrefix = lipgloss.NewStyle().Foreground(mutedColor).SetString(" ")
|
|
t.Focused.FocusedButton = t.Focused.FocusedButton.Foreground(lipgloss.Color("#FFFFFF")).Background(primaryColor)
|
|
t.Focused.BlurredButton = t.Focused.BlurredButton.Foreground(normalFg).Background(lipgloss.AdaptiveColor{Light: "#E5E5E5", Dark: "#404040"})
|
|
t.Focused.TextInput.Cursor = t.Focused.TextInput.Cursor.Foreground(primaryColor)
|
|
t.Focused.TextInput.Prompt = t.Focused.TextInput.Prompt.Foreground(primaryColor)
|
|
|
|
// Blurred state inherits from focused but with hidden border
|
|
t.Blurred = t.Focused
|
|
t.Blurred.Base = t.Focused.Base.BorderStyle(lipgloss.HiddenBorder())
|
|
t.Blurred.Title = t.Blurred.Title.Foreground(mutedColor).Bold(false)
|
|
t.Blurred.TextInput.Prompt = t.Blurred.TextInput.Prompt.Foreground(mutedColor)
|
|
|
|
return t
|
|
}
|