1package splash
2
3import (
4 "github.com/charmbracelet/bubbles/v2/key"
5 tea "github.com/charmbracelet/bubbletea/v2"
6 "github.com/charmbracelet/crush/internal/tui/components/core/layout"
7 "github.com/charmbracelet/crush/internal/tui/components/logo"
8 "github.com/charmbracelet/crush/internal/tui/styles"
9 "github.com/charmbracelet/crush/internal/tui/util"
10 "github.com/charmbracelet/crush/internal/version"
11 "github.com/charmbracelet/lipgloss/v2"
12)
13
14type Splash interface {
15 util.Model
16 layout.Sizeable
17 layout.Help
18}
19
20const (
21 SplashScreenPaddingX = 2 // Padding X for the splash screen
22 SplashScreenPaddingY = 1 // Padding Y for the splash screen
23)
24
25type splashCmp struct {
26 width, height int
27 keyMap KeyMap
28 logoRendered string
29}
30
31func New() Splash {
32 return &splashCmp{
33 width: 0,
34 height: 0,
35 keyMap: DefaultKeyMap(),
36 logoRendered: "",
37 }
38}
39
40// GetSize implements SplashPage.
41func (s *splashCmp) GetSize() (int, int) {
42 return s.width, s.height
43}
44
45// Init implements SplashPage.
46func (s *splashCmp) Init() tea.Cmd {
47 return nil
48}
49
50// SetSize implements SplashPage.
51func (s *splashCmp) SetSize(width int, height int) tea.Cmd {
52 s.width = width
53 s.height = height
54 s.logoRendered = s.logoBlock()
55 return nil
56}
57
58// Update implements SplashPage.
59func (s *splashCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
60 switch msg := msg.(type) {
61 case tea.WindowSizeMsg:
62 return s, s.SetSize(msg.Width, msg.Height)
63 }
64 return s, nil
65}
66
67// View implements SplashPage.
68func (s *splashCmp) View() tea.View {
69 t := styles.CurrentTheme()
70 content := lipgloss.JoinVertical(lipgloss.Left, s.logoRendered)
71 return tea.NewView(
72 t.S().Base.
73 Width(s.width).
74 Height(s.height).
75 PaddingTop(SplashScreenPaddingY).
76 PaddingLeft(SplashScreenPaddingX).
77 PaddingRight(SplashScreenPaddingX).
78 PaddingBottom(SplashScreenPaddingY).
79 Render(
80 content,
81 ),
82 )
83}
84
85func (s *splashCmp) logoBlock() string {
86 t := styles.CurrentTheme()
87 const padding = 2
88 return logo.Render(version.Version, false, logo.Opts{
89 FieldColor: t.Primary,
90 TitleColorA: t.Secondary,
91 TitleColorB: t.Primary,
92 CharmColor: t.Secondary,
93 VersionColor: t.Primary,
94 Width: s.width - (SplashScreenPaddingX * 2),
95 })
96}
97
98// Bindings implements SplashPage.
99func (s *splashCmp) Bindings() []key.Binding {
100 return []key.Binding{
101 s.keyMap.Cancel,
102 }
103}