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() tea.View {
64	content := lipgloss.JoinVertical(lipgloss.Left, s.logoRendered)
65	return tea.NewView(content)
66}
67
68func (s *splashCmp) logoBlock() string {
69	t := styles.CurrentTheme()
70	return logo.Render(version.Version, false, logo.Opts{
71		FieldColor:   t.Primary,
72		TitleColorA:  t.Secondary,
73		TitleColorB:  t.Primary,
74		CharmColor:   t.Secondary,
75		VersionColor: t.Primary,
76		Width:        s.width - 2, // -2 for padding
77	})
78}
79
80// Bindings implements SplashPage.
81func (s *splashCmp) Bindings() []key.Binding {
82	return []key.Binding{
83		s.keyMap.Cancel,
84	}
85}