splash.go

  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}