From 9c9b3e6087221bef885601ce61c60939cab85b18 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Mon, 14 Jun 2021 16:52:00 -0400 Subject: [PATCH] Bump Bubble Tea, Bubbles, Glamour, Lip Gloss, and Termenv and do related updates This update also removes any usage of the charm/common package Co-authored-by: Christian Rocha Signed-off-by: Carlos A Becker --- config_cmd.go | 5 +- formatting.go | 15 ------ go.mod | 16 +++---- go.sum | 88 +++++++++++++++++++---------------- main.go | 22 +++------ stash_cmd.go | 11 ++--- style.go | 16 +++++++ ui/config.go | 1 + ui/pager.go | 104 +++++++++++++++++++++++++++++------------ ui/stash.go | 54 +++++++++++++--------- ui/stashhelp.go | 3 +- ui/stashitem.go | 23 +++++----- ui/styles.go | 120 ++++++++++++++++++++++++++++-------------------- ui/ui.go | 63 +++++++++++++------------ 14 files changed, 311 insertions(+), 230 deletions(-) delete mode 100644 formatting.go create mode 100644 style.go diff --git a/config_cmd.go b/config_cmd.go index 8ec0c4b..9601ea6 100644 --- a/config_cmd.go +++ b/config_cmd.go @@ -9,7 +9,6 @@ import ( "strings" "path/filepath" - "github.com/charmbracelet/charm/ui/common" gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" ) @@ -29,8 +28,8 @@ var configCmd = &cobra.Command{ Use: "config", Hidden: false, Short: "Edit the glow config file", - Long: formatBlock(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", common.Keyword("Edit"))), - Example: formatBlock("glow config\nglow config --config path/to/config.yml"), + Long: paragraph(fmt.Sprintf("\n%s the glow config file. We’ll use EDITOR to determine which editor to use. If the config file doesn't exist, it will be created.", keyword("Edit"))), + Example: paragraph("glow config\nglow config --config path/to/config.yml"), Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { editor := strings.Fields(os.Getenv("EDITOR")) diff --git a/formatting.go b/formatting.go deleted file mode 100644 index 6e3dffa..0000000 --- a/formatting.go +++ /dev/null @@ -1,15 +0,0 @@ -package main - -import ( - "github.com/muesli/reflow/indent" - "github.com/muesli/reflow/wordwrap" -) - -const ( - wrapAt = 78 - indentAmount = 2 -) - -func formatBlock(s string) string { - return indent.String(wordwrap.String(s, wrapAt-indentAmount), indentAmount) -} diff --git a/go.mod b/go.mod index e4b9fb0..cbe7820 100644 --- a/go.mod +++ b/go.mod @@ -3,24 +3,24 @@ module github.com/charmbracelet/glow go 1.16 require ( - github.com/charmbracelet/bubbles v0.7.6 - github.com/charmbracelet/bubbletea v0.13.2 + github.com/charmbracelet/bubbles v0.14.0 + github.com/charmbracelet/bubbletea v0.23.0 github.com/charmbracelet/charm v0.8.6 - github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba + github.com/charmbracelet/glamour v0.6.0 + github.com/charmbracelet/lipgloss v0.6.0 github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac - github.com/kylelemons/godebug v1.1.0 // indirect - github.com/mattn/go-runewidth v0.0.12 + github.com/mattn/go-runewidth v0.0.14 github.com/meowgorithm/babyenv v1.3.1 github.com/mitchellh/go-homedir v1.1.0 github.com/muesli/gitcha v0.2.0 github.com/muesli/go-app-paths v0.2.1 - github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 - github.com/muesli/termenv v0.8.1 + github.com/muesli/reflow v0.3.0 + github.com/muesli/termenv v0.13.0 github.com/sahilm/fuzzy v0.1.0 github.com/segmentio/ksuid v1.0.3 github.com/spf13/cobra v1.5.0 github.com/spf13/viper v1.13.0 - golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a + golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 golang.org/x/text v0.3.7 ) diff --git a/go.sum b/go.sum index 2142522..0d36d23 100644 --- a/go.sum +++ b/go.sum @@ -58,15 +58,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= -github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= -github.com/alecthomas/chroma v0.8.2 h1:x3zkuE2lUk/RIekyAJ3XRqSCP4zwWDfcw/YJCuCAACg= -github.com/alecthomas/chroma v0.8.2/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= -github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= -github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= -github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= -github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= -github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= +github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= +github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -79,8 +72,11 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +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/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -93,17 +89,20 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/bubbles v0.7.5/go.mod h1:IRTORFvhEI6OUH7WhN2Ks8Z8miNGimk1BE6cmHijOkM= -github.com/charmbracelet/bubbles v0.7.6 h1:SCAp4ZEUf2tBNEsufo+Xxxu2dvbFhYSDPrX45toQZrM= -github.com/charmbracelet/bubbles v0.7.6/go.mod h1:0D4XRYK0tjo8JMvflz1obpVcOikNZSG46SFauoZj22s= +github.com/charmbracelet/bubbles v0.14.0 h1:DJfCwnARfWjZLvMglhSQzo76UZ2gucuHPy9jLWX45Og= +github.com/charmbracelet/bubbles v0.14.0/go.mod h1:bbeTiXwPww4M031aGi8UK2HT9RDWoiNibae+1yCMtcc= github.com/charmbracelet/bubbletea v0.12.2/go.mod h1:3gZkYELUOiEUOp0bTInkxguucy/xRbGSOcbMs1geLxg= -github.com/charmbracelet/bubbletea v0.13.2 h1:fSOx3q0/VbA3ChWeiNcUsNeNysD9FFWD1tZypShBuCQ= -github.com/charmbracelet/bubbletea v0.13.2/go.mod h1:okqaA5VF0aSpEZ2HB+L/cxVw2HthIDZ1dmWoRZs8/4g= +github.com/charmbracelet/bubbletea v0.21.0/go.mod h1:GgmJMec61d08zXsOhqRC/AiOx4K4pmz+VIcRIm1FKr4= +github.com/charmbracelet/bubbletea v0.23.0 h1:oGChhsNcm7kltiTdjxJbVlyh93N5fycluO7MsA2JEeg= +github.com/charmbracelet/bubbletea v0.23.0/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= github.com/charmbracelet/charm v0.8.6 h1:/U6rxGj4J6zZ1Ex8+wTr4hNMr4ESBzNZbC1UyrJPVbg= github.com/charmbracelet/charm v0.8.6/go.mod h1:8dE3uX+TYSpa7Q6e/CmjN6WSd7koSAKNQTGWugFREx4= -github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba h1:smKYYwwVPZyMK2LCirIi2WY25tZZW0IU7GYe1ASGCe4= -github.com/charmbracelet/glamour v0.2.1-0.20210402234443-abe9cda419ba/go.mod h1:nHP5wEbsv2eOJ7XfiScQV3p5dpZSM051R0VkxnOIPgg= -github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU= -github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= +github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= +github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc= +github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= +github.com/charmbracelet/lipgloss v0.5.0/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs= +github.com/charmbracelet/lipgloss v0.6.0 h1:1StyZB9vBSOyuZxQUcUwGr17JmojPNm87inij9N3wJY= +github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -119,8 +118,9 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/containerd/console v1.0.1 h1:u7SFAJyRqWcG6ogaMAx3KjSTy1e3hT9QxqX7Jco7dRc= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -131,16 +131,14 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= -github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= 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/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= -github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= +github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac h1:opbrjaN/L8gg6Xh5D04Tem+8xVcz6ajZlGCs49mQgyg= github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -344,19 +342,24 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +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-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +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/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/meowgorithm/babyenv v1.3.0/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= github.com/meowgorithm/babyenv v1.3.1 h1:18ZEYIgbzoFQfRLF9+lxjRfk/ui6w8U0FWl07CgWvvc= github.com/meowgorithm/babyenv v1.3.1/go.mod h1:lwNX+J6AGBFqNrMZ2PTLkM6SO+W4X8DOg9zBDO4j3Ig= -github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg= -github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w= +github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= +github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE= @@ -375,20 +378,27 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= +github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= +github.com/muesli/cancelreader v0.2.0/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/gitcha v0.2.0 h1:+wOgT2dI9s2Tznj1t1rb/qkK5e0cb6qD8c4IX2TR/YY= github.com/muesli/gitcha v0.2.0/go.mod h1:Ri8m9TZS4+ORG4JVmVKUQcWZuxDvUW3UKxMdQfzG2zI= github.com/muesli/go-app-paths v0.2.1 h1:Qi+2igkDX2aPqyRddp7P0sMQIBwBqhkfQfNcjdGjL6Y= github.com/muesli/go-app-paths v0.2.1/go.mod h1:SxS3Umca63pcFcLtbjVb+J0oD7cl4ixQWoBKhGEtEho= github.com/muesli/reflow v0.1.0/go.mod h1:I9bWAt7QTg/que/qmUCJBGlj7wEq8OAFBjPNjc6xK4I= -github.com/muesli/reflow v0.2.0/go.mod h1:qT22vjVmM9MIUeLgsVYe/Ye7eZlbv9dZjL3dVhUqLX8= -github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68 h1:y1p/ycavWjGT9FnmSjdbWUlLGvcxrY0Rw3ATltrxOhk= github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= +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/sasquatch v0.0.0-20200811221207-66979d92330a h1:Hw/15RYEOUD6T9UCRkUmNBa33kJkH33Fui6hE4sRLKU= github.com/muesli/sasquatch v0.0.0-20200811221207-66979d92330a/go.mod h1:+XG0ne5zXWBTSbbe7Z3/RWxaT8PZY6zaZ1dX6KjprYY= github.com/muesli/termenv v0.7.2/go.mod h1:ct2L5N2lmix82RaY3bMWwVu/jUFc9Ule0KGDCiKYPh8= github.com/muesli/termenv v0.7.4/go.mod h1:pZ7qY9l3F7e5xsAOS0zCew2tME+p7bWeBkotCEcIIcc= -github.com/muesli/termenv v0.8.1 h1:9q230czSP3DHVpkaPDXGp0TOfAwyjyYwXlUCQxQSaBk= -github.com/muesli/termenv v0.8.1/go.mod h1:kzt/D/4a88RoheZmwfqorY3A+tnsSMA9HJC/fQSFKo0= +github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= +github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= +github.com/muesli/termenv v0.13.0 h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0= +github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -403,7 +413,6 @@ github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwb github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -452,8 +461,6 @@ github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/ksuid v1.0.3 h1:FoResxvleQwYiPAVKe1tMUlEirodZqlqglIuFsdDntY= github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= -github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -502,9 +509,9 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.3.5 h1:dPmz1Snjq0kmkz159iL7S6WzdahUTHnHB5M56WFVifs= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.5.2 h1:ALmeCk/px5FSm1MAcFBAsVKZjDuMVj8Tm7FFIlMJnqU= +github.com/yuin/goldmark v1.5.2/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -623,8 +630,9 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y= golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20221002022538-bcab6841153b h1:6e93nYa3hNqAvLr0pD4PN1fFS+gKzp2zAXqrnTCstqU= +golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -690,7 +698,6 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -734,13 +741,16 @@ golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/main.go b/main.go index 5c605b2..2e42ade 100644 --- a/main.go +++ b/main.go @@ -12,17 +12,15 @@ import ( "path/filepath" "strings" + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/glamour" + "github.com/charmbracelet/glow/ui" + "github.com/charmbracelet/glow/utils" "github.com/meowgorithm/babyenv" gap "github.com/muesli/go-app-paths" "github.com/spf13/cobra" "github.com/spf13/viper" "golang.org/x/term" - - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/charm/ui/common" - "github.com/charmbracelet/glamour" - "github.com/charmbracelet/glow/ui" - "github.com/charmbracelet/glow/utils" ) var ( @@ -41,7 +39,7 @@ var ( rootCmd = &cobra.Command{ Use: "glow [SOURCE|DIR]", Short: "Render markdown on the CLI, with pizzazz!", - Long: formatBlock(fmt.Sprintf("\nRender markdown on the CLI, %s!", common.Keyword("with pizzazz"))), + Long: paragraph(fmt.Sprintf("\nRender markdown on the CLI, %s!", keyword("with pizzazz"))), SilenceErrors: false, SilenceUsage: false, TraverseChildren: true, @@ -334,6 +332,7 @@ func runTUI(workingDirectory string, stashedOnly bool) error { cfg.ShowAllFiles = showAllFiles cfg.GlamourMaxWidth = width cfg.GlamourStyle = style + cfg.EnableMouse = mouse if stashedOnly { cfg.DocumentTypes.Add(ui.StashedDoc, ui.NewsDoc) @@ -342,14 +341,7 @@ func runTUI(workingDirectory string, stashedOnly bool) error { } // Run Bubble Tea program - p := ui.NewProgram(cfg) - p.EnterAltScreen() - defer p.ExitAltScreen() - if mouse { - p.EnableMouseCellMotion() - defer p.DisableMouseCellMotion() - } - if err := p.Start(); err != nil { + if _, err := ui.NewProgram(cfg).Run(); err != nil { return err } diff --git a/stash_cmd.go b/stash_cmd.go index e6b3ea4..f4bcdcb 100644 --- a/stash_cmd.go +++ b/stash_cmd.go @@ -9,20 +9,20 @@ import ( "strings" "github.com/charmbracelet/charm" - "github.com/charmbracelet/charm/ui/common" - "github.com/muesli/termenv" + "github.com/charmbracelet/lipgloss" "github.com/spf13/cobra" ) var ( memo string + dot = lipgloss.NewStyle().Foreground(lipgloss.Color("#04B575")).Render("•") stashCmd = &cobra.Command{ Use: "stash [SOURCE]", Hidden: false, Short: "Stash a markdown", - Long: formatBlock(fmt.Sprintf("\nDo %s stuff. Run with no arguments to browse your stash or pass a path to a markdown file to stash it.", common.Keyword("stash"))), - Example: formatBlock("glow stash\nglow stash README.md\nglow stash -m \"secret notes\" path/to/notes.md"), + Long: paragraph(fmt.Sprintf("\nDo %s stuff. Run with no arguments to browse your stash or pass a path to a markdown file to stash it.", keyword("stash"))), + Example: paragraph("glow stash\nglow stash README.md\nglow stash -m \"secret notes\" path/to/notes.md"), Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { initConfig() @@ -53,7 +53,6 @@ var ( return fmt.Errorf("error stashing markdown") } - dot := termenv.String("•").Foreground(common.Green.Color()).String() fmt.Println(dot + " Stashed!") return nil }, @@ -73,7 +72,7 @@ func initCharmClient() *charm.Client { cfg := getCharmConfig() cc, err := charm.NewClient(cfg) if err == charm.ErrMissingSSHAuth { - fmt.Println(formatBlock("We had some trouble authenticating via SSH. If this continues to happen the Charm tool may be able to help you. More info at https://github.com/charmbracelet/charm.")) + fmt.Println(paragraph("We had some trouble authenticating via SSH. If this continues to happen the Charm tool may be able to help you. More info at https://github.com/charmbracelet/charm.")) os.Exit(1) } else if err != nil { fmt.Println(err) diff --git a/style.go b/style.go new file mode 100644 index 0000000..7737dd2 --- /dev/null +++ b/style.go @@ -0,0 +1,16 @@ +package main + +import ( + . "github.com/charmbracelet/lipgloss" +) + +var ( + keyword = NewStyle(). + Foreground(AdaptiveColor{Light: "#04B575", Dark: "#04B575"}). + Render + + paragraph = NewStyle(). + Width(78). + Padding(0, 0, 0, 2). + Render +) diff --git a/ui/config.go b/ui/config.go index 67d94d6..b046795 100644 --- a/ui/config.go +++ b/ui/config.go @@ -7,6 +7,7 @@ type Config struct { HomeDir string `env:"HOME"` GlamourMaxWidth uint GlamourStyle string + EnableMouse bool // Which directory should we start from? WorkingDirectory string diff --git a/ui/pager.go b/ui/pager.go index 7f43019..ff3dcd6 100644 --- a/ui/pager.go +++ b/ui/pager.go @@ -12,12 +12,11 @@ import ( "github.com/charmbracelet/bubbles/viewport" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" - lib "github.com/charmbracelet/charm/ui/common" "github.com/charmbracelet/glamour" + "github.com/charmbracelet/lipgloss" runewidth "github.com/mattn/go-runewidth" "github.com/muesli/reflow/ansi" "github.com/muesli/reflow/truncate" - te "github.com/muesli/termenv" ) const statusBarHeight = 1 @@ -25,27 +24,78 @@ const statusBarHeight = 1 var ( pagerHelpHeight int - mintGreen = lib.NewColorPair("#89F0CB", "#89F0CB") - darkGreen = lib.NewColorPair("#1C8760", "#1C8760") + mintGreen = lipgloss.AdaptiveColor{Light: "#89F0CB", Dark: "#89F0CB"} + darkGreen = lipgloss.AdaptiveColor{Light: "#1C8760", Dark: "#1C8760"} - noteHeading = te.String(" Set Memo "). - Foreground(lib.Cream.Color()). - Background(lib.Green.Color()). - String() + noteHeading = lipgloss.NewStyle(). + Foreground(cream). + Background(green). + Padding(0, 1). + Render("Set Memo") - statusBarNoteFg = lib.NewColorPair("#7D7D7D", "#656565") - statusBarBg = lib.NewColorPair("#242424", "#E6E6E6") + statusBarNoteFg = lipgloss.AdaptiveColor{Light: "#656565", Dark: "#7D7D7D"} + statusBarBg = lipgloss.AdaptiveColor{Light: "#E6E6E6", Dark: "#242424"} - // Styling funcs. - statusBarScrollPosStyle = newStyle(lib.NewColorPair("#5A5A5A", "#949494"), statusBarBg, false) - statusBarNoteStyle = newStyle(statusBarNoteFg, statusBarBg, false) - statusBarHelpStyle = newStyle(statusBarNoteFg, lib.NewColorPair("#323232", "#DCDCDC"), false) - statusBarStashDotStyle = newStyle(lib.Green, statusBarBg, false) - statusBarMessageStyle = newStyle(mintGreen, darkGreen, false) - statusBarMessageStashIconStyle = newStyle(mintGreen, darkGreen, false) - statusBarMessageScrollPosStyle = newStyle(mintGreen, darkGreen, false) - statusBarMessageHelpStyle = newStyle(lib.NewColorPair("#B6FFE4", "#B6FFE4"), lib.Green, false) - helpViewStyle = newStyle(statusBarNoteFg, lib.NewColorPair("#1B1B1B", "#f2f2f2"), false) + statusBarScrollPosStyle = lipgloss.NewStyle(). + Foreground(lipgloss.AdaptiveColor{Light: "#949494", Dark: "#5A5A5A"}). + Background(statusBarBg). + Render + + statusBarNoteStyle = lipgloss.NewStyle(). + Foreground(statusBarNoteFg). + Background(statusBarBg). + Render + + statusBarHelpStyle = lipgloss.NewStyle(). + Foreground(statusBarNoteFg). + Background(lipgloss.AdaptiveColor{Light: "#DCDCDC", Dark: "#323232"}). + Render + + statusBarStashDotStyle = lipgloss.NewStyle(). + Foreground(green). + Background(statusBarBg). + Render + + statusBarMessageStyle = lipgloss.NewStyle(). + Foreground(mintGreen). + Background(darkGreen). + Render + + statusBarMessageStashIconStyle = lipgloss.NewStyle(). + Foreground(mintGreen). + Background(darkGreen). + Render + + statusBarMessageScrollPosStyle = lipgloss.NewStyle(). + Foreground(mintGreen). + Background(darkGreen). + Render + + statusBarMessageHelpStyle = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#B6FFE4")). + Background(green). + Render + + helpViewStyle = lipgloss.NewStyle(). + Foreground(statusBarNoteFg). + Background(lipgloss.AdaptiveColor{Light: "#f2f2f2", Dark: "#1B1B1B"}). + Render + + spinnerStyle = lipgloss.NewStyle(). + Foreground(statusBarNoteFg). + Background(statusBarBg) + + pagerNoteInputPromptStyle = lipgloss.NewStyle(). + Foreground(darkGray). + Background(yellowGreen). + Padding(0, 1) + + pagerNoteInputStyle = lipgloss.NewStyle(). + Foreground(darkGray). + Background(yellowGreen) + + pagerNoteInputCursorStyle = lipgloss.NewStyle(). + Foreground(fuschia) ) type contentRenderedMsg string @@ -89,20 +139,16 @@ func newPagerModel(common *commonModel) pagerModel { // Text input for notes/memos ti := textinput.NewModel() - ti.Prompt = te.String(" > "). - Foreground(lib.Color(darkGray)). - Background(lib.YellowGreen.Color()). - String() - ti.TextColor = darkGray - ti.BackgroundColor = lib.YellowGreen.String() - ti.CursorColor = lib.Fuschia.String() + ti.Prompt = " > " + ti.PromptStyle = pagerNoteInputPromptStyle + ti.TextStyle = pagerNoteInputStyle + ti.CursorStyle = pagerNoteInputCursorStyle ti.CharLimit = noteCharacterLimit ti.Focus() // Text input for search sp := spinner.NewModel() - sp.ForegroundColor = statusBarNoteFg.String() - sp.BackgroundColor = statusBarBg.String() + sp.Style = spinnerStyle sp.HideFor = time.Millisecond * 50 sp.MinimumLifetime = time.Millisecond * 180 diff --git a/ui/stash.go b/ui/stash.go index 6e85d58..5098581 100644 --- a/ui/stash.go +++ b/ui/stash.go @@ -14,10 +14,9 @@ import ( "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" - lib "github.com/charmbracelet/charm/ui/common" + "github.com/charmbracelet/lipgloss" "github.com/muesli/reflow/ansi" "github.com/muesli/reflow/truncate" - te "github.com/muesli/termenv" "github.com/sahilm/fuzzy" ) @@ -35,10 +34,23 @@ var ( ) var ( - stashTextInputPromptStyle styleFunc = newFgStyle(lib.YellowGreen) - dividerDot string = darkGrayFg(" • ") - dividerBar string = darkGrayFg(" │ ") - offlineHeaderNote string = darkGrayFg("(Offline)") + dividerDot = darkGrayFg(" • ") + dividerBar = darkGrayFg(" │ ") + offlineHeaderNote = darkGrayFg("(Offline)") + + logoStyle = lipgloss.NewStyle(). + Foreground(lipgloss.Color("#ECFD65")). + Background(fuschia). + Bold(true) + + stashSpinnerStyle = lipgloss.NewStyle(). + Foreground(gray) + stashInputPromptStyle = lipgloss.NewStyle(). + Foreground(yellowGreen). + MarginRight(1) + stashInputCursorStyle = lipgloss.NewStyle(). + Foreground(fuschia). + MarginRight(1) ) // MSG @@ -499,20 +511,22 @@ func (m *stashModel) moveCursorDown() { func newStashModel(common *commonModel) stashModel { sp := spinner.NewModel() sp.Spinner = spinner.Line - sp.ForegroundColor = lib.SpinnerColor.String() + sp.Style = stashSpinnerStyle sp.HideFor = time.Millisecond * 100 sp.MinimumLifetime = time.Millisecond * 180 sp.Start() ni := textinput.NewModel() - ni.Prompt = stashTextInputPromptStyle("Memo: ") - ni.CursorColor = lib.Fuschia.String() + ni.Prompt = "Memo:" + ni.PromptStyle = stashInputPromptStyle + ni.CursorStyle = stashInputCursorStyle ni.CharLimit = noteCharacterLimit ni.Focus() si := textinput.NewModel() - si.Prompt = stashTextInputPromptStyle("Find: ") - si.CursorColor = lib.Fuschia.String() + si.Prompt = "Find:" + si.PromptStyle = stashInputPromptStyle + si.CursorStyle = stashInputCursorStyle si.CharLimit = noteCharacterLimit si.Focus() @@ -1195,7 +1209,7 @@ func (m stashModel) view() string { // pointers in our model should be refactored away. var p paginator.Model = *(m.paginator()) p.Type = paginator.Arabic - pagination = lib.Subtle(p.View()) + pagination = paginationStyle.Render(p.View()) } // We could also look at m.stashFullyLoaded and add an indicator @@ -1218,11 +1232,7 @@ func (m stashModel) view() string { } func glowLogoView(text string) string { - return te.String(text). - Bold(). - Foreground(glowLogoTextColor). - Background(lib.Fuschia.Color()). - String() + return logoStyle.Render(text) } func (m stashModel) headerView() string { @@ -1258,9 +1268,9 @@ func (m stashModel) headerView() string { } if m.stashedOnly() { - return lib.Subtle("Can’t load stash") + maybeOffline + return subtleStyle.Render("Can’t load stash") + maybeOffline } - return lib.Subtle("No markdown files found") + maybeOffline + return subtleStyle.Render("No markdown files found") + maybeOffline } // Tabs @@ -1288,9 +1298,9 @@ func (m stashModel) headerView() string { } if m.sectionIndex == i && len(m.sections) > 1 { - s = selectedTabColor(s) + s = selectedTabStyle.Render(s) } else { - s = tabColor(s) + s = tabStyle.Render(s) } sections = append(sections, s) } @@ -1379,7 +1389,7 @@ func loadRemoteMarkdown(cc *charm.Client, md *markdown) tea.Cmd { newMD, err := fetchMarkdown(cc, md.ID, md.docType) if err != nil { if debug { - log.Printf("error loading %s markdown (ID %d, Note: '%s'): %v", md.docType, md.ID, md.Note, err) + log.Printf("error loading %s markdown (ID %s, Note: '%s'): %v", md.docType, md.ID, md.Note, err) } return markdownFetchFailedMsg{ err: err, diff --git a/ui/stashhelp.go b/ui/stashhelp.go index fea1fdf..a53dfca 100644 --- a/ui/stashhelp.go +++ b/ui/stashhelp.go @@ -4,7 +4,6 @@ import ( "fmt" "strings" - lib "github.com/charmbracelet/charm/ui/common" "github.com/muesli/reflow/ansi" ) @@ -195,7 +194,7 @@ func (m stashModel) miniHelpView(entries ...string) string { } var ( - truncationChar = lib.Subtle("…") + truncationChar = subtleStyle.Render("…") truncationWidth = ansi.PrintableRuneWidth(truncationChar) ) diff --git a/ui/stashitem.go b/ui/stashitem.go index 7c5005e..4389754 100644 --- a/ui/stashitem.go +++ b/ui/stashitem.go @@ -5,10 +5,9 @@ import ( "log" "strings" - lib "github.com/charmbracelet/charm/ui/common" + "github.com/charmbracelet/lipgloss" "github.com/muesli/reflow/ansi" "github.com/muesli/reflow/truncate" - "github.com/muesli/termenv" "github.com/sahilm/fuzzy" ) @@ -77,8 +76,8 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { icon = dullFuchsiaFg(icon) if m.currentSection().key == filterSection && m.filterState == filterApplied || singleFilteredItem { - s := termenv.Style{}.Foreground(lib.Fuschia.Color()) - title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) + s := lipgloss.NewStyle().Foreground(fuschia) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Copy().Underline(true)) } else { title = fuchsiaFg(title) } @@ -100,8 +99,8 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { title = dimIndigoFg(title) date = dimSubtleIndigoFg(date) } else { - s := termenv.Style{}.Foreground(lib.Indigo.Color()) - title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) + s := lipgloss.NewStyle().Foreground(indigo) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Copy().Underline(true)) date = subtleIndigoFg(date) } } else if isFiltering && m.filterInput.Value() == "" { @@ -117,8 +116,8 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { if title == noMemoTitle { title = brightGrayFg(title) } else { - s := termenv.Style{}.Foreground(lib.NewColorPair("#dddddd", "#1a1a1a").Color()) - title = styleFilteredText(title, m.filterInput.Value(), s, s.Underline()) + s := lipgloss.NewStyle().Foreground(lipgloss.AdaptiveColor{Light: "#1a1a1a", Dark: "#dddddd"}) + title = styleFilteredText(title, m.filterInput.Value(), s, s.Copy().Underline(true)) } date = brightGrayFg(date) } @@ -128,7 +127,7 @@ func stashItemView(b *strings.Builder, m stashModel, index int, md *markdown) { fmt.Fprintf(b, "%s %s", gutter, date) } -func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle termenv.Style) string { +func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle lipgloss.Style) string { b := strings.Builder{} normalizedHay, err := normalize(haystack) @@ -138,7 +137,7 @@ func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle term matches := fuzzy.Find(needles, []string{normalizedHay}) if len(matches) == 0 { - return defaultStyle.Styled(haystack) + return defaultStyle.Render(haystack) } m := matches[0] // only one match exists @@ -146,12 +145,12 @@ func styleFilteredText(haystack, needles string, defaultStyle, matchedStyle term styled := false for _, mi := range m.MatchedIndexes { if i == mi { - b.WriteString(matchedStyle.Styled(string(rune))) + b.WriteString(matchedStyle.Render(string(rune))) styled = true } } if !styled { - b.WriteString(defaultStyle.Styled(string(rune))) + b.WriteString(defaultStyle.Render(string(rune))) } } diff --git a/ui/styles.go b/ui/styles.go index ed527f4..fe7c0ff 100644 --- a/ui/styles.go +++ b/ui/styles.go @@ -1,63 +1,85 @@ package ui import ( - lib "github.com/charmbracelet/charm/ui/common" - te "github.com/muesli/termenv" + . "github.com/charmbracelet/lipgloss" ) -type styleFunc func(string) string +// Colors. +var ( + normal = AdaptiveColor{Light: "#1A1A1A", Dark: "#dddddd"} + normalDim = AdaptiveColor{Light: "#A49FA5", Dark: "#777777"} + gray = AdaptiveColor{Light: "#909090", Dark: "#626262"} + midGray = AdaptiveColor{Light: "#B2B2B2", Dark: "#4A4A4A"} + darkGray = AdaptiveColor{Light: "#DDDADA", Dark: "#3C3C3C"} + brightGray = AdaptiveColor{Light: "#847A85", Dark: "#979797"} + dimBrightGray = AdaptiveColor{Light: "#C2B8C2", Dark: "#4D4D4D"} + indigo = AdaptiveColor{Light: "#5A56E0", Dark: "#7571F9"} + dimIndigo = AdaptiveColor{Light: "#9498FF", Dark: "#494690"} + subtleIndigo = AdaptiveColor{Light: "#7D79F6", Dark: "#514DC1"} + dimSubtleIndigo = AdaptiveColor{Light: "#BBBDFF", Dark: "#383584"} + cream = AdaptiveColor{Light: "#FFFDF5", Dark: "#FFFDF5"} + yellowGreen = AdaptiveColor{Light: "#04B575", Dark: "#ECFD65"} + dullYellowGreen = AdaptiveColor{Light: "#6BCB94", Dark: "#9BA92F"} + fuschia = AdaptiveColor{Light: "#EE6FF8", Dark: "#EE6FF8"} + dimFuchsia = AdaptiveColor{Light: "#F1A8FF", Dark: "#99519E"} + dullFuchsia = AdaptiveColor{Dark: "#AD58B4", Light: "#F793FF"} + dimDullFuchsia = AdaptiveColor{Light: "#F6C9FF", Dark: "#6B3A6F"} + green = Color("#04B575") + red = AdaptiveColor{Light: "#FF4672", Dark: "#ED567A"} + faintRed = AdaptiveColor{Light: "#FF6F91", Dark: "#C74665"} -const ( - darkGray = "#333333" + semiDimGreen = AdaptiveColor{Light: "#35D79C", Dark: "#036B46"} + dimGreen = AdaptiveColor{Light: "#72D2B0", Dark: "#0B5137"} +) + +// Ulimately, we'll transition to named styles. +var ( + normalFg = NewStyle().Foreground(normal).Render + dimNormalFg = NewStyle().Foreground(normalDim).Render + + brightGrayFg = NewStyle().Foreground(brightGray).Render + dimBrightGrayFg = NewStyle().Foreground(dimBrightGray).Render + + grayFg = NewStyle().Foreground(gray).Render + midGrayFg = NewStyle().Foreground(midGray).Render + darkGrayFg = NewStyle().Foreground(darkGray).Render + + greenFg = NewStyle().Foreground(green).Render + semiDimGreenFg = NewStyle().Foreground(semiDimGreen).Render + dimGreenFg = NewStyle().Foreground(dimGreen).Render + + fuchsiaFg = NewStyle().Foreground(fuschia).Render + dimFuchsiaFg = NewStyle().Foreground(dimFuchsia).Render + + dullFuchsiaFg = NewStyle().Foreground(dullFuchsia).Render + dimDullFuchsiaFg = NewStyle().Foreground(dimDullFuchsia).Render + + indigoFg = NewStyle().Foreground(fuschia).Render + dimIndigoFg = NewStyle().Foreground(dimIndigo).Render + + subtleIndigoFg = NewStyle().Foreground(subtleIndigo).Render + dimSubtleIndigoFg = NewStyle().Foreground(dimSubtleIndigo).Render + + yellowFg = NewStyle().Foreground(yellowGreen).Render // renders light green on light backgrounds + dullYellowFg = NewStyle().Foreground(dullYellowGreen).Render // renders light green on light backgrounds + redFg = NewStyle().Foreground(red).Render + faintRedFg = NewStyle().Foreground(faintRed).Render ) var ( - normalFg = newFgStyle(lib.NewColorPair("#dddddd", "#1a1a1a")) - dimNormalFg = newFgStyle(lib.NewColorPair("#777777", "#A49FA5")) + tabStyle = NewStyle(). + Foreground(AdaptiveColor{Light: "#909090", Dark: "#626262"}) - brightGrayFg = newFgStyle(lib.NewColorPair("#979797", "#847A85")) - dimBrightGrayFg = newFgStyle(lib.NewColorPair("#4D4D4D", "#C2B8C2")) + selectedTabStyle = NewStyle(). + Foreground(AdaptiveColor{Light: "#333333", Dark: "#979797"}) - grayFg = newFgStyle(lib.NewColorPair("#626262", "#909090")) - midGrayFg = newFgStyle(lib.NewColorPair("#4A4A4A", "#B2B2B2")) - darkGrayFg = newFgStyle(lib.NewColorPair("#3C3C3C", "#DDDADA")) + errorTitleStyle = NewStyle(). + Foreground(cream). + Background(red). + Padding(0, 1) - greenFg = newFgStyle(lib.NewColorPair("#04B575", "#04B575")) - semiDimGreenFg = newFgStyle(lib.NewColorPair("#036B46", "#35D79C")) - dimGreenFg = newFgStyle(lib.NewColorPair("#0B5137", "#72D2B0")) + subtleStyle = NewStyle(). + Foreground(AdaptiveColor{Light: "#9B9B9B", Dark: "#5C5C5C"}) - fuchsiaFg = newFgStyle(lib.Fuschia) - dimFuchsiaFg = newFgStyle(lib.NewColorPair("#99519E", "#F1A8FF")) - - dullFuchsiaFg = newFgStyle(lib.NewColorPair("#AD58B4", "#F793FF")) - dimDullFuchsiaFg = newFgStyle(lib.NewColorPair("#6B3A6F", "#F6C9FF")) - - indigoFg = newFgStyle(lib.Indigo) - dimIndigoFg = newFgStyle(lib.NewColorPair("#494690", "#9498FF")) - - subtleIndigoFg = newFgStyle(lib.NewColorPair("#514DC1", "#7D79F6")) - dimSubtleIndigoFg = newFgStyle(lib.NewColorPair("#383584", "#BBBDFF")) - - yellowFg = newFgStyle(lib.YellowGreen) // renders light green on light backgrounds - dullYellowFg = newFgStyle(lib.NewColorPair("#9BA92F", "#6BCB94")) // renders light green on light backgrounds - redFg = newFgStyle(lib.Red) - faintRedFg = newFgStyle(lib.FaintRed) - - // Ultimately, we should transition to named styles - tabColor = newFgStyle(lib.NewColorPair("#626262", "#909090")) - selectedTabColor = newFgStyle(lib.NewColorPair("#979797", "#332F33")) + paginationStyle = subtleStyle.Copy() ) - -// Returns a termenv style with foreground and background options. -func newStyle(fg, bg lib.ColorPair, bold bool) func(string) string { - s := te.Style{}.Foreground(fg.Color()).Background(bg.Color()) - if bold { - s = s.Bold() - } - return s.Styled -} - -// Returns a new termenv style with background options only. -func newFgStyle(c lib.ColorPair) styleFunc { - return te.Style{}.Foreground(c.Color()).Styled -} diff --git a/ui/ui.go b/ui/ui.go index 5a15f7c..ce91ef5 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -14,8 +14,7 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/charm" "github.com/charmbracelet/charm/keygen" - "github.com/charmbracelet/charm/ui/common" - lib "github.com/charmbracelet/charm/ui/common" + "github.com/charmbracelet/charm/ui/keygen" "github.com/charmbracelet/glow/utils" "github.com/muesli/gitcha" te "github.com/muesli/termenv" @@ -29,8 +28,7 @@ const ( ) var ( - config Config - glowLogoTextColor = lib.Color("#ECFD65") + config Config markdownExtensions = []string{ "*.md", "*.mdown", "*.mkdn", "*.mkd", "*.markdown", @@ -53,33 +51,41 @@ func NewProgram(cfg Config) *tea.Program { debug = true } config = cfg - return tea.NewProgram(newModel(cfg)) + opts := []tea.ProgramOption{tea.WithAltScreen()} + if cfg.EnableMouse { + opts = append(opts, tea.WithMouseCellMotion()) + } + return tea.NewProgram(newModel(cfg), opts...) } type errMsg struct{ err error } func (e errMsg) Error() string { return e.err.Error() } -type newCharmClientMsg *charm.Client -type sshAuthErrMsg struct{} -type keygenFailedMsg struct{ err error } -type keygenSuccessMsg struct{} -type initLocalFileSearchMsg struct { - cwd string - ch chan gitcha.SearchResult -} -type foundLocalFileMsg gitcha.SearchResult -type localFileSearchFinished struct{} -type gotStashMsg []*charm.Markdown -type stashLoadErrMsg struct{ err error } -type gotNewsMsg []*charm.Markdown -type statusMessageTimeoutMsg applicationContext -type newsLoadErrMsg struct{ err error } -type stashSuccessMsg markdown -type stashFailMsg struct { - err error - markdown markdown -} +type ( + newCharmClientMsg *charm.Client + sshAuthErrMsg struct{} + keygenFailedMsg struct{ err error } + keygenSuccessMsg struct{} + initLocalFileSearchMsg struct { + cwd string + ch chan gitcha.SearchResult + } +) +type ( + foundLocalFileMsg gitcha.SearchResult + localFileSearchFinished struct{} + gotStashMsg []*charm.Markdown + stashLoadErrMsg struct{ err error } + gotNewsMsg []*charm.Markdown + statusMessageTimeoutMsg applicationContext + newsLoadErrMsg struct{ err error } + stashSuccessMsg markdown + stashFailMsg struct { + err error + markdown markdown + } +) // applicationContext indicates the area of the application something appies // to. Occasionally used as an argument to commands and messages. @@ -455,12 +461,9 @@ func errorView(err error, fatal bool) string { exitMsg += "return" } s := fmt.Sprintf("%s\n\n%v\n\n%s", - te.String(" ERROR "). - Foreground(lib.Cream.Color()). - Background(lib.Red.Color()). - String(), + errorTitleStyle.Render("ERROR"), err, - common.Subtle(exitMsg), + subtleStyle.Render(exitMsg), ) return "\n" + indent(s, 3) }