skyrama_tui/internal/style/style.go
2026-06-04 20:51:20 +03:00

182 lines
4.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package style
import "github.com/charmbracelet/lipgloss"
// Palette
const (
ColorSky = lipgloss.Color("#00BFFF")
ColorRunway = lipgloss.Color("#4A4A4A")
ColorGold = lipgloss.Color("#FFD700")
ColorGreen = lipgloss.Color("#39D353")
ColorRed = lipgloss.Color("#FF4444")
ColorMuted = lipgloss.Color("#626262")
ColorWhite = lipgloss.Color("#F5F5F5")
ColorDark = lipgloss.Color("#1A1A2E")
ColorPanel = lipgloss.Color("#16213E")
ColorHighlight = lipgloss.Color("#0F3460")
ColorAccent = lipgloss.Color("#E94560")
ColorFuel = lipgloss.Color("#FF8C00")
ColorPassenger = lipgloss.Color("#7EC8E3")
ColorCash = lipgloss.Color("#FFD700")
)
// Base Styles
var (
Bold = lipgloss.NewStyle().Bold(true)
Title = lipgloss.NewStyle().
Bold(true).
Foreground(ColorSky).
BorderStyle(lipgloss.DoubleBorder()).
BorderForeground(ColorSky).
Padding(0, 2).
Align(lipgloss.Center)
Subtitle = lipgloss.NewStyle().
Foreground(ColorMuted).
Italic(true)
// Panels
Panel = lipgloss.NewStyle().
Border(lipgloss.RoundedBorder()).
BorderForeground(ColorHighlight).
Padding(0, 1)
PanelFocused = lipgloss.NewStyle().
Border(lipgloss.RoundedBorder()).
BorderForeground(ColorSky).
Padding(0, 1)
PanelHeader = lipgloss.NewStyle().
Bold(true).
Foreground(ColorSky).
BorderStyle(lipgloss.NormalBorder()).
BorderBottom(true).
BorderForeground(ColorHighlight).
MarginBottom(1)
// Status bar
StatusBar = lipgloss.NewStyle().
Background(ColorHighlight).
Foreground(ColorWhite).
Padding(0, 1)
StatusBarKey = lipgloss.NewStyle().
Background(ColorAccent).
Foreground(ColorWhite).
Padding(0, 1).
Bold(true)
// Resource chips
FuelChip = lipgloss.NewStyle().
Foreground(ColorFuel).
Bold(true)
PassengerChip = lipgloss.NewStyle().
Foreground(ColorPassenger).
Bold(true)
CashChip = lipgloss.NewStyle().
Foreground(ColorCash).
Bold(true)
// Menu / list items
MenuItem = lipgloss.NewStyle().
Foreground(ColorWhite).
PaddingLeft(2)
MenuItemSelected = lipgloss.NewStyle().
Foreground(ColorSky).
Bold(true).
PaddingLeft(1).
SetString("> ")
// Plane status colors
StatusIdle = lipgloss.NewStyle().Foreground(ColorGreen)
StatusFly = lipgloss.NewStyle().Foreground(ColorSky)
StatusMaint = lipgloss.NewStyle().Foreground(ColorGold)
StatusBoard = lipgloss.NewStyle().Foreground(ColorPassenger)
StatusTaxi = lipgloss.NewStyle().Foreground(ColorFuel)
// Table
TableHeader = lipgloss.NewStyle().
Bold(true).
Foreground(ColorSky).
BorderStyle(lipgloss.NormalBorder()).
BorderBottom(true).
BorderForeground(ColorMuted)
TableRow = lipgloss.NewStyle().Foreground(ColorWhite)
TableRowAlt = lipgloss.NewStyle().
Foreground(ColorWhite).
Background(lipgloss.Color("#0D1B2A"))
// Alerts
Success = lipgloss.NewStyle().
Foreground(ColorGreen).
Bold(true).
SetString("✓ ")
Error = lipgloss.NewStyle().
Foreground(ColorRed).
Bold(true).
SetString("✗ ")
Warning = lipgloss.NewStyle().
Foreground(ColorGold).
Bold(true).
SetString("⚠ ")
Info = lipgloss.NewStyle().
Foreground(ColorSky).
Bold(true).
SetString(" ")
// Help text
HelpKey = lipgloss.NewStyle().Foreground(ColorSky).Bold(true)
HelpDesc = lipgloss.NewStyle().Foreground(ColorMuted)
// Muted / dimmed
Muted = lipgloss.NewStyle().Foreground(ColorMuted)
)
// Plane status badge
func PlaneStatusStyle(status string) lipgloss.Style {
switch status {
case "idle":
return StatusIdle
case "flying":
return StatusFly
case "maintenance":
return StatusMaint
case "boarding":
return StatusBoard
case "taxiing":
return StatusTaxi
default:
return Muted
}
}
// Resource bar (e.g. fuel/passenger capacity)
func ResourceBar(current, max int, width int, color lipgloss.Color) string {
if max == 0 {
return ""
}
filled := (current * width) / max
if filled > width {
filled = width
}
bar := lipgloss.NewStyle().Foreground(color).Render(repeat("█", filled)) +
lipgloss.NewStyle().Foreground(ColorMuted).Render(repeat("░", width-filled))
return bar
}
func repeat(s string, n int) string {
result := ""
for i := 0; i < n; i++ {
result += s
}
return result
}