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

54
main.go
View File

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

12
nav.go
View File

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