phase 0.3

This commit is contained in:
portakal 2026-06-04 20:51:20 +03:00
commit 4a94bfc4e7
52 changed files with 11653 additions and 0 deletions

182
internal/style/style.go Normal file
View file

@ -0,0 +1,182 @@
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
}