diff --git a/examples/ssh/go.mod b/examples/go.mod similarity index 70% rename from examples/ssh/go.mod rename to examples/go.mod index bb7e09e..5908799 100644 --- a/examples/ssh/go.mod +++ b/examples/go.mod @@ -1,8 +1,8 @@ -module ssh +module examples go 1.16 -replace github.com/charmbracelet/lipgloss => ../.. +replace github.com/charmbracelet/lipgloss => ../ require ( github.com/charmbracelet/bubbletea v0.20.0 @@ -12,4 +12,5 @@ require ( github.com/kr/pty v1.1.1 github.com/lucasb-eyer/go-colorful v1.2.0 github.com/muesli/termenv v0.13.0 + golang.org/x/term v0.0.0-20210422114643-f5beecf764ed ) diff --git a/examples/ssh/go.sum b/examples/go.sum similarity index 100% rename from examples/ssh/go.sum rename to examples/go.sum diff --git a/examples/layout/go.mod b/examples/layout/go.mod deleted file mode 100644 index 3ff788f..0000000 --- a/examples/layout/go.mod +++ /dev/null @@ -1,11 +0,0 @@ -module example - -go 1.16 - -require ( - github.com/charmbracelet/lipgloss v0.4.0 - github.com/lucasb-eyer/go-colorful v1.2.0 - golang.org/x/term v0.0.0-20210317153231-de623e64d2a6 -) - -replace github.com/charmbracelet/lipgloss => ../ diff --git a/examples/layout/go.sum b/examples/layout/go.sum deleted file mode 100644 index 366b13e..0000000 --- a/examples/layout/go.sum +++ /dev/null @@ -1,35 +0,0 @@ -github.com/aymanbagabas/go-osc52 v1.0.3 h1:DTwqENW7X9arYimJrPeGZcV0ln14sGMt3pHZspWD+Mg= -github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= -github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= -github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= -github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0= -github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20210317153231-de623e64d2a6 h1:EC6+IGYTjPpRfv9a2b/6Puw0W+hLtAhkV1tPsXhutqs= -golang.org/x/term v0.0.0-20210317153231-de623e64d2a6/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/layout/main.go b/examples/layout/main.go index c996dab..8ec832b 100644 --- a/examples/layout/main.go +++ b/examples/layout/main.go @@ -30,12 +30,12 @@ var ( special = lipgloss.AdaptiveColor{Light: "#43BF6D", Dark: "#73F59F"} divider = lipgloss.NewStyle(). + SetString("•"). Padding(0, 1). - Foreground(subtle).Render("•") + Foreground(subtle). + String() - url = func(s string) string { - return lipgloss.NewStyle().Foreground(special).Render(s) - } + url = lipgloss.NewStyle().Foreground(special).Render // Tabs. @@ -122,17 +122,14 @@ var ( Height(8). Width(columnWidth + 1) - listHeader = func(s string) string { - return lipgloss.NewStyle(). + listHeader = lipgloss.NewStyle(). BorderStyle(lipgloss.NormalBorder()). BorderBottom(true). BorderForeground(subtle). - MarginRight(2).Render(s) - } + MarginRight(2). + Render - listItem = func(s string) string { - return lipgloss.NewStyle().PaddingLeft(2).Render(s) - } + listItem = lipgloss.NewStyle().PaddingLeft(2).Render checkMark = lipgloss.NewStyle().SetString("✓"). Foreground(special). @@ -267,14 +264,15 @@ func main() { }() lists := lipgloss.JoinHorizontal(lipgloss.Top, - list.Render(lipgloss.JoinVertical(lipgloss.Left, - listHeader("Citrus Fruits to Try"), - listDone("Grapefruit"), - listDone("Yuzu"), - listItem("Citron"), - listItem("Kumquat"), - listItem("Pomelo"), - ), + list.Render( + lipgloss.JoinVertical(lipgloss.Left, + listHeader("Citrus Fruits to Try"), + listDone("Grapefruit"), + listDone("Yuzu"), + listItem("Citron"), + listItem("Kumquat"), + listItem("Pomelo"), + ), ), list.Copy().Width(columnWidth).Render( lipgloss.JoinVertical(lipgloss.Left, @@ -335,7 +333,7 @@ func main() { // Okay, let's print it fmt.Println(docStyle.Render(doc.String())) -} // +} func colorGrid(xSteps, ySteps int) [][]string { x0y0, _ := colorful.Hex("#F25D94") diff --git a/examples/ssh/main.go b/examples/ssh/main.go index ef2ef0f..ad00690 100644 --- a/examples/ssh/main.go +++ b/examples/ssh/main.go @@ -9,7 +9,6 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/wish" - bm "github.com/charmbracelet/wish/bubbletea" lm "github.com/charmbracelet/wish/logging" "github.com/gliderlabs/ssh" "github.com/kr/pty" @@ -71,14 +70,54 @@ func main() { wish.WithAddress(addr), wish.WithHostKeyPath("ssh_example"), wish.WithMiddleware( - bm.Middleware(func(s ssh.Session) (tea.Model, []tea.ProgramOption) { - output := outputFromSession(s) - renderer := lipgloss.NewRenderer(lipgloss.WithOutput(output)) - return model{ - detectedProfile: renderer.ColorProfile(), - renderer: renderer, - }, nil - }), + func(sh ssh.Handler) ssh.Handler { + return func(s ssh.Session) { + output := outputFromSession(s) + pty, _, active := s.Pty() + if !active { + sh(s) + return + } + w, _ := pty.Window.Width, pty.Window.Height + + renderer := lipgloss.NewRenderer(lipgloss.WithOutput(output)) + str := strings.Builder{} + fmt.Fprintf(&str, "\n%s %s %s %s %s", + renderer.NewStyle("bold").Bold(true), + renderer.NewStyle("faint").Faint(true), + renderer.NewStyle("italic").Italic(true), + renderer.NewStyle("underline").Underline(true), + renderer.NewStyle("crossout").Strikethrough(true), + ) + + fmt.Fprintf(&str, "\n%s %s %s %s %s %s %s", + renderer.NewStyle("red").Foreground(lipgloss.Color("#E88388")), + renderer.NewStyle("green").Foreground(lipgloss.Color("#A8CC8C")), + renderer.NewStyle("yellow").Foreground(lipgloss.Color("#DBAB79")), + renderer.NewStyle("blue").Foreground(lipgloss.Color("#71BEF2")), + renderer.NewStyle("magenta").Foreground(lipgloss.Color("#D290E4")), + renderer.NewStyle("cyan").Foreground(lipgloss.Color("#66C2CD")), + renderer.NewStyle("gray").Foreground(lipgloss.Color("#B9BFCA")), + ) + + fmt.Fprintf(&str, "\n%s %s %s %s %s %s %s\n\n", + renderer.NewStyle("red").Foreground(lipgloss.Color("0")).Background(lipgloss.Color("#E88388")), + renderer.NewStyle("green").Foreground(lipgloss.Color("0")).Background(lipgloss.Color("#A8CC8C")), + renderer.NewStyle("yellow").Foreground(lipgloss.Color("0")).Background(lipgloss.Color("#DBAB79")), + renderer.NewStyle("blue").Foreground(lipgloss.Color("0")).Background(lipgloss.Color("#71BEF2")), + renderer.NewStyle("magenta").Foreground(lipgloss.Color("0")).Background(lipgloss.Color("#D290E4")), + renderer.NewStyle("cyan").Foreground(lipgloss.Color("0")).Background(lipgloss.Color("#66C2CD")), + renderer.NewStyle("gray").Foreground(lipgloss.Color("0")).Background(lipgloss.Color("#B9BFCA")), + ) + + fmt.Fprintf(&str, "%s %t\n", renderer.NewStyle("Has dark background?").Bold(true), renderer.HasDarkBackground()) + fmt.Fprintln(&str) + + wish.WriteString(s, renderer.Place(w, lipgloss.Height(str.String()), lipgloss.Center, lipgloss.Center, str.String())) + + sh(s) + } + }, lm.Middleware(), ), ) @@ -189,10 +228,3 @@ func colorProfile(p termenv.Profile) string { return "Unknown" } } - -func max(a, b int) int { - if a > b { - return a - } - return b -}