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
20type splashCmp struct {
21 width, height int
22 keyMap KeyMap
23 logoRendered string
24}
25
26func New() Splash {
27 return &splashCmp{
28 width: 0,
29 height: 0,
30 keyMap: DefaultKeyMap(),
31 logoRendered: "",
32 }
33}
34
35// GetSize implements SplashPage.
36func (s *splashCmp) GetSize() (int, int) {
37 return s.width, s.height
38}
39
40// Init implements SplashPage.
41func (s *splashCmp) Init() tea.Cmd {
42 return nil
43}
44
45// SetSize implements SplashPage.
46func (s *splashCmp) SetSize(width int, height int) tea.Cmd {
47 s.width = width
48 s.height = height
49 s.logoRendered = s.logoBlock()
50 return nil
51}
52
53// Update implements SplashPage.
54func (s *splashCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
55 switch msg := msg.(type) {
56 case tea.WindowSizeMsg:
57 return s, s.SetSize(msg.Width, msg.Height)
58 }
59 return s, nil
60}
61
62// View implements SplashPage.
63func (s *splashCmp) View() string {
64 content := lipgloss.JoinVertical(lipgloss.Left, s.logoRendered)
65 return content
66}
67
68func (s *splashCmp) logoBlock() string {
69 t := styles.CurrentTheme()
70 const padding = 2
71 return logo.Render(version.Version, false, logo.Opts{
72 FieldColor: t.Primary,
73 TitleColorA: t.Secondary,
74 TitleColorB: t.Primary,
75 CharmColor: t.Secondary,
76 VersionColor: t.Primary,
77 Width: s.width - padding,
78 })
79}
80
81// Bindings implements SplashPage.
82func (s *splashCmp) Bindings() []key.Binding {
83 return []key.Binding{
84 s.keyMap.Cancel,
85 }
86}