1package app23import (4 "github.com/FelineStateMachine/puzzletea/theme"5 "github.com/FelineStateMachine/puzzletea/ui"67 "charm.land/bubbles/v2/list"8 tea "charm.land/bubbletea/v2"9)1011func (m model) handleThemeEnter() (tea.Model, tea.Cmd) {12 m.theme.previous = m.cfg.Theme1314 names := theme.ThemeNames()15 items := make([]list.Item, len(names))16 for i, n := range names {17 desc := "dark theme"18 if n == theme.DefaultThemeName {19 desc = "built-in earth-tone palette"20 } else if t := theme.LookupTheme(n); t != nil && !t.Meta.IsDark {21 desc = "light theme"22 }23 items[i] = ui.MenuItem{ItemTitle: n, Desc: desc}24 }2526 const maxVisibleItems = 827 listH := min(m.height, maxVisibleItems*3)28 listW := min(m.width, theme.MaxNameLen+4)2930 m.theme.list = ui.InitThemeList(items, listW, listH)31 for i, item := range items {32 if mi, ok := item.(ui.MenuItem); ok && mi.ItemTitle == m.theme.previous {33 m.theme.list.Select(i)34 break35 }36 }37 if m.theme.previous == "" {38 m.theme.list.Select(0)39 }4041 m.state = themeSelectView42 m = m.clearNotice()43 return m, nil44}4546func (m model) handleThemeConfirm() (tea.Model, tea.Cmd) {47 item, ok := m.theme.list.SelectedItem().(ui.MenuItem)48 if !ok {49 return m, nil50 }5152 themeName := item.ItemTitle53 if themeName == theme.DefaultThemeName {54 themeName = ""55 }5657 _ = theme.Apply(item.ItemTitle)58 m.cfg.Theme = themeName59 if err := m.cfg.Save(m.configPath); err != nil {60 m = m.setErrorf("Theme changed, but saving config failed: %v", err)61 }6263 m.state = mainMenuView64 return m, nil65}