feat: using renderer

This commit is contained in:
2025-06-01 16:52:45 +01:00
parent 8b29b35764
commit 3bceadd724
2 changed files with 34 additions and 38 deletions

56
main.go
View File

@ -7,6 +7,7 @@ import (
"net" "net"
"os" "os"
"os/signal" "os/signal"
"path/filepath"
"slices" "slices"
"strings" "strings"
"syscall" "syscall"
@ -26,8 +27,6 @@ import (
"github.com/charmbracelet/x/term" "github.com/charmbracelet/x/term"
) )
var docStyle = lipgloss.NewStyle().Margin(1, 2)
type errMsg error type errMsg error
type item struct { type item struct {
@ -61,6 +60,9 @@ const (
) )
type model struct { type model struct {
renderer *lipgloss.Renderer
termRenderer *glamour.TermRenderer
list list.Model list list.Model
allPosts []string allPosts []string
@ -75,15 +77,14 @@ type model struct {
page Page page Page
viewport viewport.Model viewport viewport.Model
termRenderer *glamour.TermRenderer
err error err error
} }
func getViewPort(width int, height int) viewport.Model { func getViewPort(renderer *lipgloss.Renderer, width int, height int) viewport.Model {
vp := viewport.New(width, height) vp := viewport.New(width, height)
vp.Style = lipgloss.NewStyle(). vp.Style = renderer.NewStyle().
BorderStyle(lipgloss.RoundedBorder()). BorderStyle(lipgloss.RoundedBorder()).
BorderForeground(lipgloss.Color("62")). BorderForeground(lipgloss.Color("62")).
PaddingRight(2) PaddingRight(2)
@ -91,8 +92,8 @@ func getViewPort(width int, height int) viewport.Model {
return vp return vp
} }
func initialModel(w int, h int) model { func initialModel(renderer *lipgloss.Renderer, w int, h int) model {
posts, err := getAllPosts("/home/johnc/Code/JohnTech/content/blog") posts, err := getAllPosts(filepath.Join(os.Getenv("BLOG_PATH"), "content/blog"))
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -111,7 +112,7 @@ func initialModel(w int, h int) model {
list.SetShowTitle(false) list.SetShowTitle(false)
// -1 to allow for the initial height of the nav model // -1 to allow for the initial height of the nav model
vp := getViewPort(w, h-3) vp := getViewPort(renderer, w, h-3)
// We need to adjust the width of the glamour render from our main width // We need to adjust the width of the glamour render from our main width
// to account for a few things: // to account for a few things:
@ -124,7 +125,7 @@ func initialModel(w int, h int) model {
const glamourGutter = 2 const glamourGutter = 2
glamourRenderWidth := w - vp.Style.GetHorizontalFrameSize() - glamourGutter glamourRenderWidth := w - vp.Style.GetHorizontalFrameSize() - glamourGutter
renderer, err := glamour.NewTermRenderer( termRenderer, err := glamour.NewTermRenderer(
glamour.WithAutoStyle(), glamour.WithAutoStyle(),
glamour.WithWordWrap(glamourRenderWidth), glamour.WithWordWrap(glamourRenderWidth),
) )
@ -132,7 +133,7 @@ func initialModel(w int, h int) model {
panic(err) panic(err)
} }
frontPageContent, err := os.ReadFile("/home/johnc/Code/JohnTech/content/_index.md") frontPageContent, err := os.ReadFile(filepath.Join(os.Getenv("BLOG_PATH"), "content/_index.md"))
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -142,7 +143,7 @@ func initialModel(w int, h int) model {
panic(err) panic(err)
} }
frontPageModel, err := createMarkdownPostModel(processedFrontPage, renderer, vp) frontPageModel, err := createMarkdownPostModel(processedFrontPage, termRenderer, vp)
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -151,13 +152,13 @@ func initialModel(w int, h int) model {
list: list, list: list,
allPosts: posts, allPosts: posts,
page: FRONT, page: FRONT,
termRenderer: renderer, termRenderer: termRenderer,
viewport: vp, viewport: vp,
frontPageModel: frontPageModel, frontPageModel: frontPageModel,
frontPageContent: processedFrontPage, frontPageContent: processedFrontPage,
width: w, width: w,
height: h, height: h,
navModel: createNavModel(w), navModel: createNavModel(renderer, w),
} }
} }
@ -212,11 +213,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, nil return m, nil
} }
case tea.WindowSizeMsg: case tea.WindowSizeMsg:
h, v := docStyle.GetFrameSize() // h, v := m.termRenderer.GetFrameSize()
m.list.SetSize(msg.Width-h, msg.Height-v) // m.list.SetSize(msg.Width-h, msg.Height-v)
//
m.height = msg.Height // m.height = msg.Height
m.width = msg.Width // m.width = msg.Width
} }
list, cmd := m.list.Update(msg) list, cmd := m.list.Update(msg)
@ -245,7 +246,7 @@ func (m model) View() string {
case FRONT: case FRONT:
return m.navModel.View() + "\n" + m.frontPageModel.View() return m.navModel.View() + "\n" + m.frontPageModel.View()
case POST_LIST: case POST_LIST:
return m.navModel.View() + docStyle.Render(m.list.View()) return m.navModel.View() + m.renderer.NewStyle().Margin(1, 2).Render(m.list.View())
case POST: case POST:
return m.navModel.View() + "\n" + m.postModel.View() return m.navModel.View() + "\n" + m.postModel.View()
default: default:
@ -261,7 +262,7 @@ const (
func initServer() { func initServer() {
s, err := wish.NewServer( s, err := wish.NewServer(
wish.WithAddress(net.JoinHostPort(host, port)), wish.WithAddress(net.JoinHostPort(host, port)),
wish.WithHostKeyPath(".ssh/id_rsa"), wish.WithHostKeyPath("./.ssh/id_rsa"),
wish.WithMiddleware( wish.WithMiddleware(
bubbletea.Middleware(teaHandler), bubbletea.Middleware(teaHandler),
activeterm.Middleware(), // Bubble Tea apps usually require a PTY. activeterm.Middleware(), // Bubble Tea apps usually require a PTY.
@ -305,7 +306,7 @@ func main() {
panic(err) panic(err)
} }
p := tea.NewProgram(initialModel(w, h)) p := tea.NewProgram(initialModel(lipgloss.DefaultRenderer(), w, h))
if _, err := p.Run(); err != nil { if _, err := p.Run(); err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -329,15 +330,8 @@ func teaHandler(s ssh.Session) (tea.Model, []tea.ProgramOption) {
// use it to create the styles. // use it to create the styles.
// The recommended way to use these styles is to then pass them down to // The recommended way to use these styles is to then pass them down to
// your Bubble Tea model. // your Bubble Tea model.
// renderer := bubbletea.MakeRenderer(s) renderer := bubbletea.MakeRenderer(s)
// txtStyle := renderer.NewStyle().Foreground(lipgloss.Color("10"))
// quitStyle := renderer.NewStyle().Foreground(lipgloss.Color("8"))
//
// bg := "light"
// if renderer.HasDarkBackground() {
// bg = "dark"
// }
m := initialModel(pty.Window.Width, pty.Window.Height) m := initialModel(renderer, pty.Window.Width, pty.Window.Height)
return m, []tea.ProgramOption{tea.WithAltScreen()} return m, []tea.ProgramOption{tea.WithAltScreen()}
} }

16
nav.go
View File

@ -6,7 +6,8 @@ import (
) )
type navModel struct { type navModel struct {
style lipgloss.Style renderer *lipgloss.Renderer
style lipgloss.Style
} }
func (m navModel) Init() tea.Cmd { func (m navModel) Init() tea.Cmd {
@ -18,13 +19,13 @@ func (m navModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
} }
func (m navModel) View() string { func (m navModel) View() string {
nameStyle := lipgloss.NewStyle().Bold(true) nameStyle := m.renderer.NewStyle().Bold(true)
blogStyle := lipgloss.NewStyle(). blogStyle := m.renderer.NewStyle().
Bold(true). Bold(true).
Underline(true) Underline(true)
shortcutStyle := lipgloss.NewStyle(). shortcutStyle := m.renderer.NewStyle().
Faint(true) Faint(true)
name := nameStyle.Render("John Costa") name := nameStyle.Render("John Costa")
@ -47,14 +48,15 @@ func (m navModel) View() string {
return m.style.Render(rightSide) return m.style.Render(rightSide)
} }
func createNavModel(width int) navModel { func createNavModel(renderer *lipgloss.Renderer, width int) navModel {
style := lipgloss.NewStyle(). style := renderer.NewStyle().
BorderStyle(lipgloss.RoundedBorder()). BorderStyle(lipgloss.RoundedBorder()).
BorderForeground(lipgloss.Color("62")) BorderForeground(lipgloss.Color("62"))
style = style.Width(width - style.GetHorizontalFrameSize()) style = style.Width(width - style.GetHorizontalFrameSize())
return navModel{ return navModel{
style: style, renderer: renderer,
style: style,
} }
} }