2020-10-21 15:49:04 -04:00
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"os"
|
|
|
|
|
|
|
|
|
|
"github.com/charmbracelet/bubbles/viewport"
|
|
|
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
|
|
|
"github.com/charmbracelet/glamour"
|
2021-05-14 22:25:51 -04:00
|
|
|
|
"github.com/charmbracelet/lipgloss"
|
2020-10-21 15:49:04 -04:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
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
|
2021-03-18 13:04:27 -04:00
|
|
|
|
are from our garden or the fish market down the street.
|
2020-10-21 15:49:04 -04:00
|
|
|
|
|
|
|
|
|
Some famous people that have eaten here lately:
|
|
|
|
|
|
|
|
|
|
* [x] René Redzepi
|
|
|
|
|
* [x] David Chang
|
|
|
|
|
* [ ] Jiro Ono (maybe some day)
|
|
|
|
|
|
|
|
|
|
Bon appétit!
|
|
|
|
|
`
|
|
|
|
|
|
2021-05-14 22:25:51 -04:00
|
|
|
|
var helpStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("241")).Render
|
2020-10-21 15:49:04 -04:00
|
|
|
|
|
|
|
|
|
type example struct {
|
|
|
|
|
viewport viewport.Model
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newExample() (*example, error) {
|
|
|
|
|
vp := viewport.Model{Width: 78, Height: 20}
|
|
|
|
|
|
|
|
|
|
renderer, err := glamour.NewTermRenderer(glamour.WithStylePath("notty"))
|
|
|
|
|
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.WindowSizeMsg:
|
|
|
|
|
e.viewport.Width = msg.Width
|
|
|
|
|
return e, nil
|
|
|
|
|
|
|
|
|
|
case tea.KeyMsg:
|
|
|
|
|
switch msg.String() {
|
2021-05-01 09:28:58 -04:00
|
|
|
|
case "q", "ctrl+c", "esc":
|
2020-10-21 15:49:04 -04:00
|
|
|
|
return e, tea.Quit
|
|
|
|
|
default:
|
2020-10-31 20:58:24 -04:00
|
|
|
|
vp, cmd := e.viewport.Update(msg)
|
2020-10-21 15:49:04 -04:00
|
|
|
|
e.viewport = vp
|
2020-10-31 20:58:24 -04:00
|
|
|
|
return e, cmd
|
2020-10-21 15:49:04 -04:00
|
|
|
|
}
|
2020-10-31 20:58:24 -04:00
|
|
|
|
default:
|
|
|
|
|
return e, nil
|
2020-10-21 15:49:04 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (e example) View() string {
|
2020-10-31 20:58:24 -04:00
|
|
|
|
return e.viewport.View() + e.helpView()
|
2020-10-21 15:49:04 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (e example) helpView() string {
|
2021-05-14 22:25:51 -04:00
|
|
|
|
return helpStyle("\n ↑/↓: Navigate • q: Quit\n")
|
2020-10-21 15:49:04 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
model, err := newExample()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("Could not intialize 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)
|
|
|
|
|
}
|
|
|
|
|
}
|