package main import ( "fmt" "os" "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/glamour" "github.com/charmbracelet/lipgloss" ) const content = ` Today’s Menu | Name | Price | Notes | | --- | --- | --- | | Tsukemono | $2 | Just an appetizer | | Tomato Soup | $4 | Made with San Marzano tomatoes | | Okonomiyaki | $4 | Takes a few minutes to make | | Curry | $3 | We can add squash if you’d like | Seasonal Dishes | Name | Price | Notes | | --- | --- | --- | | Steamed bitter melon | $2 | Not so bitter | | Takoyaki | $3 | Fun to eat | | Winter squash | $3 | Today it's pumpkin | Desserts | Name | Price | Notes | | --- | --- | --- | | Dorayaki | $4 | Looks good on rabbits | | Banana Split | $5 | A classic | | Cream Puff | $3 | Pretty creamy! | All our dishes are made in-house by Karen, our chef. Most of our ingredients are from our garden or the fish market down the street. Some famous people that have eaten here lately: * [x] René Redzepi * [x] David Chang * [ ] Jiro Ono (maybe some day) Bon appétit! ` var helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("241")).Render type example struct { viewport viewport.Model } func newExample() (*example, error) { const width = 78 vp := viewport.New(width, 20) vp.Style = lipgloss.NewStyle(). BorderStyle(lipgloss.RoundedBorder()). BorderForeground(lipgloss.Color("62")). PaddingRight(2) renderer, err := glamour.NewTermRenderer( glamour.WithStylePath("notty"), glamour.WithWordWrap(width), ) if err != nil { return nil, err } str, err := renderer.Render(content) if err != nil { return nil, err } vp.SetContent(str) return &example{ viewport: vp, }, nil } func (e example) Init() tea.Cmd { return nil } func (e example) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "q", "ctrl+c", "esc": return e, tea.Quit default: var cmd tea.Cmd e.viewport, cmd = e.viewport.Update(msg) return e, cmd } default: return e, nil } } func (e example) View() string { return e.viewport.View() + e.helpView() } func (e example) helpView() string { return helpStyle("\n ↑/↓: Navigate • q: Quit\n") } func main() { model, err := newExample() if err != nil { fmt.Println("Could not initialize Bubble Tea model:", err) os.Exit(1) } if err := tea.NewProgram(model).Start(); err != nil { fmt.Println("Bummer, there's been an error:", err) os.Exit(1) } }