Coverage for /Users/antonigmitruk/golf/src/golf/cli/branding.py: 0%
85 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-08-16 18:46 +0200
« prev ^ index » next coverage.py v7.6.12, created at 2025-08-16 18:46 +0200
1"""Golf CLI branding and visual utilities."""
3from rich.console import Console
4from rich.panel import Panel
5from rich.text import Text
6from rich.align import Align
8# Golf brand colors (official brand colors)
9GOLF_BLUE = "#2969FD" # Primary blue from brand: rgb(41, 105, 253)
10GOLF_ORANGE = "#F97728" # Secondary orange from brand: rgb(249, 119, 40)
11GOLF_GREEN = "#10B981" # Success green
12GOLF_WHITE = "#FFFFFF"
14# Simple GolfMCP text logo
15GOLF_LOGO = """
16 ██████╗ ██████╗ ██╗ ███████╗███╗ ███╗ ██████╗██████╗
17██╔════╝ ██╔═══██╗██║ ██╔════╝████╗ ████║██╔════╝██╔══██╗
18██║ ███╗██║ ██║██║ █████╗ ██╔████╔██║██║ ██████╔╝
19██║ ██║██║ ██║██║ ██╔══╝ ██║╚██╔╝██║██║ ██╔═══╝
20╚██████╔╝╚██████╔╝███████╗██║ ██║ ╚═╝ ██║╚██████╗██║
21 ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝
22"""
24# Simplified version for smaller spaces
25GOLF_LOGO_SMALL = "Golf"
27# Status icons with consistent styling
28STATUS_ICONS = {
29 "success": "✓",
30 "error": "✗",
31 "warning": "⚠",
32 "info": "ℹ",
33 "building": "🔨",
34 "generating": "⚙️",
35 "packaging": "📦",
36 "platform": "⛳",
37 "server": "🚀",
38 "loading": "⭕",
39}
42def create_welcome_banner(version: str, console: Console) -> None:
43 """Create the main Golf welcome banner."""
44 # Create the logo with Golf in blue and MCP in orange
45 logo_lines = GOLF_LOGO.strip().split("\n")
46 logo_content = Text()
48 for line in logo_lines:
49 if line.strip(): # Only process non-empty lines
50 # Find where "MCP" starts (roughly at position 32 in the ASCII art)
51 golf_part = line[:32] # First part is "Golf"
52 mcp_part = line[32:] # Last part is "MCP"
54 logo_content.append(golf_part, style=f"bold {GOLF_BLUE}")
55 logo_content.append(mcp_part, style=f"bold {GOLF_ORANGE}")
56 logo_content.append("\n")
58 # Create version line
59 version_text = Text()
60 version_text.append("🚀 ", style=f"bold {GOLF_ORANGE}")
61 version_text.append(f"Golf v{version}", style=f"bold {GOLF_BLUE}")
62 version_text.append(" 🚀", style=f"bold {GOLF_ORANGE}")
64 # Create tagline
65 tagline_text = Text("✨ Easiest way to build production-ready MCP servers ✨", style="bold white")
67 # Create the full content using a renderable group approach
68 from rich.console import Group
70 content_group = Group(
71 Align.center(logo_content),
72 "", # Empty line for spacing
73 Align.center(version_text),
74 Align.center(tagline_text),
75 )
77 panel = Panel(
78 content_group,
79 border_style=GOLF_BLUE,
80 padding=(1, 2),
81 title="[bold]🏌️ Welcome to Golf 🏌️[/bold]",
82 title_align="center",
83 )
85 console.print(panel)
88def create_command_header(title: str, subtitle: str = "", console: Console | None = None) -> None:
89 """Create a styled command header."""
90 if console is None:
91 console = Console()
93 header = Text()
94 header.append("🏌️ ", style=f"bold {GOLF_ORANGE}")
95 header.append(title, style=f"bold {GOLF_BLUE}")
97 if subtitle:
98 header.append(f" → {subtitle}", style=f"bold {GOLF_ORANGE}")
100 # Create a stylish panel for the header
101 panel = Panel(
102 Align.center(header),
103 border_style=GOLF_BLUE,
104 padding=(0, 2),
105 )
107 console.print(panel)
110def create_success_message(message: str, console: Console | None = None) -> None:
111 """Create a styled success message."""
112 if console is None:
113 console = Console()
115 success_content = Text()
116 success_content.append("🎉 ", style=f"bold {GOLF_ORANGE}")
117 success_content.append(f"{STATUS_ICONS['success']} {message}", style=f"bold {GOLF_GREEN}")
118 success_content.append(" 🎉", style=f"bold {GOLF_ORANGE}")
120 success_panel = Panel(
121 Align.center(success_content),
122 border_style=GOLF_GREEN,
123 padding=(0, 2),
124 title="[bold green]SUCCESS[/bold green]",
125 title_align="center",
126 )
127 console.print(success_panel)
130def create_info_panel(title: str, content: str, console: Console | None = None) -> None:
131 """Create a styled info panel."""
132 if console is None:
133 console = Console()
135 # Add some visual flair to the content
136 styled_content = Text()
137 for line in content.split("\n"):
138 if line.strip():
139 styled_content.append("▶ ", style=f"bold {GOLF_ORANGE}")
140 styled_content.append(line, style="bold white")
141 styled_content.append("\n")
143 panel = Panel(
144 styled_content,
145 title=f"[bold {GOLF_BLUE}]🔧 {title} 🔧[/bold {GOLF_BLUE}]",
146 border_style=GOLF_BLUE,
147 padding=(1, 2),
148 )
149 console.print(panel)
152def get_status_text(status: str, message: str, style: str = "") -> Text:
153 """Get formatted status text with icon."""
154 icon = STATUS_ICONS.get(status, "•")
155 text = Text()
157 if status == "success":
158 text.append("🎉 ", style=f"bold {GOLF_ORANGE}")
159 text.append(f"{icon} {message}", style=f"bold {GOLF_GREEN}")
160 elif status == "error":
161 text.append("💥 ", style=f"bold {GOLF_ORANGE}")
162 text.append(f"{icon} {message}", style="bold red")
163 elif status == "warning":
164 text.append("⚡ ", style=f"bold {GOLF_ORANGE}")
165 text.append(f"{icon} {message}", style=f"bold {GOLF_ORANGE}")
166 elif status in ["building", "generating", "packaging", "platform"]:
167 text.append("🔥 ", style=f"bold {GOLF_ORANGE}")
168 text.append(f"{icon} {message}", style=f"bold {GOLF_BLUE}")
169 else:
170 text.append("💡 ", style=f"bold {GOLF_ORANGE}")
171 text.append(f"{icon} {message}", style=f"bold {GOLF_BLUE}")
173 return text
176def create_build_header(project_name: str, environment: str, console: Console) -> None:
177 """Create a styled build process header."""
178 title = Text()
179 title.append("🔨 Building ", style=f"bold {GOLF_ORANGE}")
180 title.append(project_name, style=f"bold {GOLF_BLUE}")
181 title.append(f" ({environment} environment)", style=f"bold {GOLF_GREEN}")
183 # Create a flashy build panel
184 panel = Panel(
185 Align.center(title),
186 border_style=GOLF_ORANGE,
187 padding=(0, 2),
188 title="[bold]🚧 BUILD IN PROGRESS 🚧[/bold]",
189 title_align="center",
190 )
192 console.print(panel)