mirror of
https://github.com/anotherhadi/spilltea.git
synced 2026-07-06 20:42:33 +02:00
use ilovetui colors & styles
This commit is contained in:
@@ -1,43 +0,0 @@
|
||||
package style
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"charm.land/lipgloss/v2"
|
||||
)
|
||||
|
||||
// PanelContentH returns the usable inner content height for a panel rendered by
|
||||
// RenderWithTitle. It subtracts the two border lines (top + bottom) from the
|
||||
// total panel height.
|
||||
func PanelContentH(totalH int) int {
|
||||
h := totalH - 2
|
||||
if h < 0 {
|
||||
return 0
|
||||
}
|
||||
return h
|
||||
}
|
||||
|
||||
// RenderWithTitle renders a lipgloss bordered box with a title embedded in the
|
||||
// top border, matching the border's own foreground color. height is the total
|
||||
// desired output height (including both border lines).
|
||||
func RenderWithTitle(border lipgloss.Style, title, content string, width, height int) string {
|
||||
boxH := height - 1
|
||||
if contentH := boxH - 1; contentH > 0 {
|
||||
lines := strings.Split(content, "\n")
|
||||
if len(lines) > contentH {
|
||||
content = strings.Join(lines[:contentH], "\n")
|
||||
}
|
||||
}
|
||||
box := border.BorderTop(false).Width(width).Height(boxH).Render(content)
|
||||
|
||||
boxWidth := lipgloss.Width(strings.SplitN(box, "\n", 2)[0])
|
||||
label := " " + title + " "
|
||||
fillW := boxWidth - lipgloss.Width(label) - 2
|
||||
if fillW < 0 {
|
||||
fillW = 0
|
||||
}
|
||||
bc := lipgloss.NewStyle().Foreground(border.GetBorderTopForeground())
|
||||
topLine := bc.Render("╭ ") + bc.Render(title) + bc.Render(" "+strings.Repeat("─", fillW)+"╮")
|
||||
|
||||
return lipgloss.JoinVertical(lipgloss.Left, topLine, box)
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"charm.land/bubbles/v2/textarea"
|
||||
"charm.land/bubbles/v2/viewport"
|
||||
"charm.land/lipgloss/v2"
|
||||
ilovetui "github.com/anotherhadi/ilovetui"
|
||||
)
|
||||
|
||||
func NewViewport() viewport.Model {
|
||||
@@ -24,7 +25,7 @@ func ViewportView(vp *viewport.Model) string {
|
||||
if len(lines) == 0 {
|
||||
return v
|
||||
}
|
||||
arrow := lipgloss.NewStyle().Foreground(S.Subtle).Render("↓")
|
||||
arrow := lipgloss.NewStyle().Foreground(ilovetui.S.Subtle).Render("↓")
|
||||
arrowW := lipgloss.Width(arrow)
|
||||
inner := vp.Width() - 2*arrowW
|
||||
if inner < 0 {
|
||||
@@ -51,16 +52,16 @@ func NewTextarea(showLineNumbers bool) textarea.Model {
|
||||
ts := ta.Styles()
|
||||
ts.Focused.Base = lipgloss.NewStyle()
|
||||
ts.Blurred.Base = lipgloss.NewStyle()
|
||||
ts.Focused.Text = lipgloss.NewStyle().Foreground(S.Text)
|
||||
ts.Focused.CursorLine = lipgloss.NewStyle().Background(S.Selection).Foreground(S.Text)
|
||||
ts.Focused.CursorLineNumber = lipgloss.NewStyle().Background(S.Selection).Foreground(S.Primary).Bold(true)
|
||||
ts.Focused.LineNumber = lipgloss.NewStyle().Foreground(S.Subtle)
|
||||
ts.Focused.Placeholder = lipgloss.NewStyle().Foreground(S.Subtle)
|
||||
ts.Focused.EndOfBuffer = lipgloss.NewStyle().Foreground(S.SubtleBg)
|
||||
ts.Blurred.Text = lipgloss.NewStyle().Foreground(S.MutedFg)
|
||||
ts.Blurred.LineNumber = lipgloss.NewStyle().Foreground(S.SubtleBg)
|
||||
ts.Blurred.Placeholder = lipgloss.NewStyle().Foreground(S.Subtle)
|
||||
ts.Blurred.EndOfBuffer = lipgloss.NewStyle().Foreground(S.SubtleBg)
|
||||
ts.Focused.Text = lipgloss.NewStyle().Foreground(ilovetui.S.Text)
|
||||
ts.Focused.CursorLine = lipgloss.NewStyle().Background(ilovetui.S.Selection).Foreground(ilovetui.S.Text)
|
||||
ts.Focused.CursorLineNumber = lipgloss.NewStyle().Background(ilovetui.S.Selection).Foreground(ilovetui.S.Primary).Bold(true)
|
||||
ts.Focused.LineNumber = lipgloss.NewStyle().Foreground(ilovetui.S.Subtle)
|
||||
ts.Focused.Placeholder = lipgloss.NewStyle().Foreground(ilovetui.S.Subtle)
|
||||
ts.Focused.EndOfBuffer = lipgloss.NewStyle().Foreground(ilovetui.S.SubtleBg)
|
||||
ts.Blurred.Text = lipgloss.NewStyle().Foreground(ilovetui.S.Muted)
|
||||
ts.Blurred.LineNumber = lipgloss.NewStyle().Foreground(ilovetui.S.SubtleBg)
|
||||
ts.Blurred.Placeholder = lipgloss.NewStyle().Foreground(ilovetui.S.Subtle)
|
||||
ts.Blurred.EndOfBuffer = lipgloss.NewStyle().Foreground(ilovetui.S.SubtleBg)
|
||||
ta.SetStyles(ts)
|
||||
return ta
|
||||
}
|
||||
@@ -69,15 +70,15 @@ func SeverityStyle(sev string) lipgloss.Style {
|
||||
base := lipgloss.NewStyle().Bold(true)
|
||||
switch sev {
|
||||
case "critical":
|
||||
return base.Foreground(S.Error)
|
||||
return base.Foreground(ilovetui.S.Error)
|
||||
case "high":
|
||||
return base.Foreground(S.Warning)
|
||||
return base.Foreground(ilovetui.S.Warning)
|
||||
case "medium":
|
||||
return base.Foreground(S.Primary)
|
||||
return base.Foreground(ilovetui.S.Primary)
|
||||
case "low":
|
||||
return base.Foreground(S.Success)
|
||||
return base.Foreground(ilovetui.S.Success)
|
||||
default:
|
||||
return base.Foreground(S.Subtle)
|
||||
return base.Foreground(ilovetui.S.Subtle)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,13 +86,13 @@ func StatusStyle(code, width int) lipgloss.Style {
|
||||
base := lipgloss.NewStyle().Bold(true).Width(width)
|
||||
switch {
|
||||
case code >= 500:
|
||||
return base.Foreground(S.Error)
|
||||
return base.Foreground(ilovetui.S.Error)
|
||||
case code >= 400:
|
||||
return base.Foreground(S.Warning)
|
||||
return base.Foreground(ilovetui.S.Warning)
|
||||
case code >= 300:
|
||||
return base.Foreground(S.Primary)
|
||||
return base.Foreground(ilovetui.S.Primary)
|
||||
default:
|
||||
return base.Foreground(S.Success)
|
||||
return base.Foreground(ilovetui.S.Success)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,236 +0,0 @@
|
||||
package style
|
||||
|
||||
import (
|
||||
"github.com/anotherhadi/spilltea/internal/config"
|
||||
|
||||
"charm.land/glamour/v2/ansi"
|
||||
)
|
||||
|
||||
func GlamourStyleConfig(cfg *config.Config) ansi.StyleConfig {
|
||||
c := cfg.TUI.Colors
|
||||
|
||||
str := func(s string) *string { return &s }
|
||||
hex := func(base string) *string { return str("#" + base) }
|
||||
boolPtr := func(b bool) *bool { return &b }
|
||||
uintPtr := func(u uint) *uint { return &u }
|
||||
|
||||
return ansi.StyleConfig{
|
||||
Document: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
BlockPrefix: "\n",
|
||||
BlockSuffix: "\n",
|
||||
Color: hex(c.Base05),
|
||||
},
|
||||
Margin: uintPtr(2),
|
||||
},
|
||||
BlockQuote: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
Color: hex(c.Base03),
|
||||
Italic: boolPtr(true),
|
||||
},
|
||||
Indent: uintPtr(1),
|
||||
IndentToken: str("│ "),
|
||||
},
|
||||
List: ansi.StyleList{
|
||||
LevelIndent: 2,
|
||||
},
|
||||
Heading: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
BlockSuffix: "\n",
|
||||
Color: hex(c.Base0D),
|
||||
Bold: boolPtr(true),
|
||||
},
|
||||
},
|
||||
H1: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
Prefix: " ",
|
||||
Suffix: " ",
|
||||
Color: hex(c.Base07),
|
||||
BackgroundColor: hex(c.Base0D),
|
||||
Bold: boolPtr(true),
|
||||
},
|
||||
},
|
||||
H2: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
Prefix: "## ",
|
||||
Color: hex(c.Base0D),
|
||||
Bold: boolPtr(true),
|
||||
},
|
||||
},
|
||||
H3: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
Prefix: "### ",
|
||||
Color: hex(c.Base0C),
|
||||
},
|
||||
},
|
||||
H4: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
Prefix: "#### ",
|
||||
Color: hex(c.Base0B),
|
||||
},
|
||||
},
|
||||
H5: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
Prefix: "##### ",
|
||||
Color: hex(c.Base09),
|
||||
},
|
||||
},
|
||||
H6: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
Prefix: "###### ",
|
||||
Color: hex(c.Base08),
|
||||
Bold: boolPtr(false),
|
||||
},
|
||||
},
|
||||
Strikethrough: ansi.StylePrimitive{
|
||||
CrossedOut: boolPtr(true),
|
||||
},
|
||||
Emph: ansi.StylePrimitive{
|
||||
Italic: boolPtr(true),
|
||||
},
|
||||
Strong: ansi.StylePrimitive{
|
||||
Bold: boolPtr(true),
|
||||
},
|
||||
HorizontalRule: ansi.StylePrimitive{
|
||||
Color: hex(c.Base03),
|
||||
Format: "\n--------\n",
|
||||
},
|
||||
Item: ansi.StylePrimitive{
|
||||
BlockPrefix: "• ",
|
||||
},
|
||||
Enumeration: ansi.StylePrimitive{
|
||||
BlockPrefix: ". ",
|
||||
},
|
||||
Task: ansi.StyleTask{
|
||||
Ticked: "[✓] ",
|
||||
Unticked: "[ ] ",
|
||||
},
|
||||
Link: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0C),
|
||||
Underline: boolPtr(true),
|
||||
},
|
||||
LinkText: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0D),
|
||||
Bold: boolPtr(true),
|
||||
},
|
||||
Image: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0C),
|
||||
Underline: boolPtr(true),
|
||||
},
|
||||
ImageText: ansi.StylePrimitive{
|
||||
Color: hex(c.Base04),
|
||||
Format: "Image: {{.text}} ->",
|
||||
},
|
||||
Code: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
Prefix: " ",
|
||||
Suffix: " ",
|
||||
Color: hex(c.Base0B),
|
||||
BackgroundColor: hex(c.Base01),
|
||||
},
|
||||
},
|
||||
CodeBlock: ansi.StyleCodeBlock{
|
||||
StyleBlock: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{
|
||||
Color: hex(c.Base04),
|
||||
},
|
||||
Margin: uintPtr(2),
|
||||
},
|
||||
Chroma: &ansi.Chroma{
|
||||
Text: ansi.StylePrimitive{
|
||||
Color: hex(c.Base05),
|
||||
},
|
||||
Error: ansi.StylePrimitive{
|
||||
Color: hex(c.Base07),
|
||||
BackgroundColor: hex(c.Base08),
|
||||
},
|
||||
Comment: ansi.StylePrimitive{
|
||||
Color: hex(c.Base03),
|
||||
Italic: boolPtr(true),
|
||||
},
|
||||
CommentPreproc: ansi.StylePrimitive{
|
||||
Color: hex(c.Base09),
|
||||
},
|
||||
Keyword: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0E),
|
||||
},
|
||||
KeywordReserved: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0E),
|
||||
},
|
||||
KeywordNamespace: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0D),
|
||||
},
|
||||
KeywordType: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0A),
|
||||
},
|
||||
Operator: ansi.StylePrimitive{
|
||||
Color: hex(c.Base05),
|
||||
},
|
||||
Punctuation: ansi.StylePrimitive{
|
||||
Color: hex(c.Base05),
|
||||
},
|
||||
Name: ansi.StylePrimitive{
|
||||
Color: hex(c.Base05),
|
||||
},
|
||||
NameBuiltin: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0D),
|
||||
},
|
||||
NameTag: ansi.StylePrimitive{
|
||||
Color: hex(c.Base08),
|
||||
},
|
||||
NameAttribute: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0A),
|
||||
},
|
||||
NameClass: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0A),
|
||||
Bold: boolPtr(true),
|
||||
Underline: boolPtr(true),
|
||||
},
|
||||
NameConstant: ansi.StylePrimitive{
|
||||
Color: hex(c.Base09),
|
||||
},
|
||||
NameDecorator: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0C),
|
||||
},
|
||||
NameFunction: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0D),
|
||||
},
|
||||
LiteralNumber: ansi.StylePrimitive{
|
||||
Color: hex(c.Base09),
|
||||
},
|
||||
LiteralString: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0B),
|
||||
},
|
||||
LiteralStringEscape: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0C),
|
||||
},
|
||||
GenericDeleted: ansi.StylePrimitive{
|
||||
Color: hex(c.Base08),
|
||||
},
|
||||
GenericEmph: ansi.StylePrimitive{
|
||||
Italic: boolPtr(true),
|
||||
},
|
||||
GenericInserted: ansi.StylePrimitive{
|
||||
Color: hex(c.Base0B),
|
||||
},
|
||||
GenericStrong: ansi.StylePrimitive{
|
||||
Bold: boolPtr(true),
|
||||
},
|
||||
GenericSubheading: ansi.StylePrimitive{
|
||||
Color: hex(c.Base04),
|
||||
},
|
||||
Background: ansi.StylePrimitive{
|
||||
BackgroundColor: hex(c.Base01),
|
||||
},
|
||||
},
|
||||
},
|
||||
Table: ansi.StyleTable{
|
||||
StyleBlock: ansi.StyleBlock{
|
||||
StylePrimitive: ansi.StylePrimitive{},
|
||||
},
|
||||
},
|
||||
DefinitionDescription: ansi.StylePrimitive{
|
||||
BlockPrefix: "\n> ",
|
||||
},
|
||||
}
|
||||
}
|
||||
+26
-25
@@ -3,12 +3,13 @@ package style
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"image/color"
|
||||
"strings"
|
||||
|
||||
"charm.land/lipgloss/v2"
|
||||
ilovetui "github.com/anotherhadi/ilovetui"
|
||||
"github.com/anotherhadi/spilltea/internal/config"
|
||||
"golang.org/x/net/html"
|
||||
"image/color"
|
||||
)
|
||||
|
||||
func Paint(c color.Color, s string) string {
|
||||
@@ -75,8 +76,8 @@ func highlightHeaders(raw string) string {
|
||||
} else if trimmed == "" {
|
||||
out.WriteString(line)
|
||||
} else if idx := strings.Index(trimmed, ": "); idx != -1 {
|
||||
out.WriteString(Paint(S.Subtle, trimmed[:idx+2]))
|
||||
out.WriteString(Paint(S.Text, trimmed[idx+2:]))
|
||||
out.WriteString(Paint(ilovetui.S.Subtle, trimmed[:idx+2]))
|
||||
out.WriteString(Paint(ilovetui.S.Text, trimmed[idx+2:]))
|
||||
} else {
|
||||
out.WriteString(line)
|
||||
}
|
||||
@@ -95,16 +96,16 @@ func highlightStatusLine(line string) string {
|
||||
switch parts[0] {
|
||||
case "GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS", "CONNECT", "TRACE":
|
||||
result := S.Method(parts[0]).Width(0).Render(parts[0]) + " "
|
||||
result += Paint(S.Primary, parts[1])
|
||||
result += Paint(ilovetui.S.Primary, parts[1])
|
||||
if len(parts) == 3 {
|
||||
result += " " + Paint(S.Subtle, parts[2])
|
||||
result += " " + Paint(ilovetui.S.Subtle, parts[2])
|
||||
}
|
||||
return result
|
||||
}
|
||||
result := Paint(S.Subtle, parts[0]) + " "
|
||||
result += Paint(S.Warning, parts[1])
|
||||
result := Paint(ilovetui.S.Subtle, parts[0]) + " "
|
||||
result += Paint(ilovetui.S.Warning, parts[1])
|
||||
if len(parts) == 3 {
|
||||
result += " " + Paint(S.MutedFg, parts[2])
|
||||
result += " " + Paint(ilovetui.S.Muted, parts[2])
|
||||
}
|
||||
return result
|
||||
}
|
||||
@@ -134,9 +135,9 @@ func highlightJSON(s string) string {
|
||||
k++
|
||||
}
|
||||
if k < n && s[k] == ':' {
|
||||
out.WriteString(Paint(S.Primary, str))
|
||||
out.WriteString(Paint(ilovetui.S.Primary, str))
|
||||
} else {
|
||||
out.WriteString(Paint(S.Success, str))
|
||||
out.WriteString(Paint(ilovetui.S.Success, str))
|
||||
}
|
||||
i = j
|
||||
case (ch >= '0' && ch <= '9') || (ch == '-' && i+1 < n && s[i+1] >= '0' && s[i+1] <= '9'):
|
||||
@@ -147,19 +148,19 @@ func highlightJSON(s string) string {
|
||||
for j < n && ((s[j] >= '0' && s[j] <= '9') || s[j] == '.' || s[j] == 'e' || s[j] == 'E' || s[j] == '+' || s[j] == '-') {
|
||||
j++
|
||||
}
|
||||
out.WriteString(Paint(S.Warning, s[i:j]))
|
||||
out.WriteString(Paint(ilovetui.S.Warning, s[i:j]))
|
||||
i = j
|
||||
case i+4 <= n && s[i:i+4] == "true":
|
||||
out.WriteString(Paint(S.Error, "true"))
|
||||
out.WriteString(Paint(ilovetui.S.Error, "true"))
|
||||
i += 4
|
||||
case i+5 <= n && s[i:i+5] == "false":
|
||||
out.WriteString(Paint(S.Error, "false"))
|
||||
out.WriteString(Paint(ilovetui.S.Error, "false"))
|
||||
i += 5
|
||||
case i+4 <= n && s[i:i+4] == "null":
|
||||
out.WriteString(Paint(S.Error, "null"))
|
||||
out.WriteString(Paint(ilovetui.S.Error, "null"))
|
||||
i += 4
|
||||
case ch == '{' || ch == '}' || ch == '[' || ch == ']' || ch == ':' || ch == ',':
|
||||
out.WriteString(Paint(S.Subtle, string(ch)))
|
||||
out.WriteString(Paint(ilovetui.S.Subtle, string(ch)))
|
||||
i++
|
||||
default:
|
||||
out.WriteByte(ch)
|
||||
@@ -265,11 +266,11 @@ func highlightHTML(s string) string {
|
||||
if i+4 <= n && s[i:i+4] == "<!--" {
|
||||
end := strings.Index(s[i:], "-->")
|
||||
if end == -1 {
|
||||
out.WriteString(Paint(S.Subtle, s[i:]))
|
||||
out.WriteString(Paint(ilovetui.S.Subtle, s[i:]))
|
||||
break
|
||||
}
|
||||
end = i + end + 3
|
||||
out.WriteString(Paint(S.Subtle, s[i:end]))
|
||||
out.WriteString(Paint(ilovetui.S.Subtle, s[i:end]))
|
||||
i = end
|
||||
continue
|
||||
}
|
||||
@@ -278,10 +279,10 @@ func highlightHTML(s string) string {
|
||||
i++
|
||||
continue
|
||||
}
|
||||
out.WriteString(Paint(S.Subtle, "<"))
|
||||
out.WriteString(Paint(ilovetui.S.Subtle, "<"))
|
||||
i++
|
||||
if i < n && (s[i] == '/' || s[i] == '!') {
|
||||
out.WriteString(Paint(S.Subtle, string(s[i])))
|
||||
out.WriteString(Paint(ilovetui.S.Subtle, string(s[i])))
|
||||
i++
|
||||
}
|
||||
j := i
|
||||
@@ -289,7 +290,7 @@ func highlightHTML(s string) string {
|
||||
j++
|
||||
}
|
||||
if j > i {
|
||||
out.WriteString(Paint(S.Primary, s[i:j]))
|
||||
out.WriteString(Paint(ilovetui.S.Primary, s[i:j]))
|
||||
i = j
|
||||
}
|
||||
for i < n && s[i] != '>' {
|
||||
@@ -299,10 +300,10 @@ func highlightHTML(s string) string {
|
||||
out.WriteByte(ch)
|
||||
i++
|
||||
case ch == '/':
|
||||
out.WriteString(Paint(S.Subtle, "/"))
|
||||
out.WriteString(Paint(ilovetui.S.Subtle, "/"))
|
||||
i++
|
||||
case ch == '=':
|
||||
out.WriteString(Paint(S.Subtle, "="))
|
||||
out.WriteString(Paint(ilovetui.S.Subtle, "="))
|
||||
i++
|
||||
case ch == '"' || ch == '\'':
|
||||
q := ch
|
||||
@@ -313,19 +314,19 @@ func highlightHTML(s string) string {
|
||||
if j < n {
|
||||
j++
|
||||
}
|
||||
out.WriteString(Paint(S.Success, s[i:j]))
|
||||
out.WriteString(Paint(ilovetui.S.Success, s[i:j]))
|
||||
i = j
|
||||
default:
|
||||
j = i
|
||||
for j < n && s[j] != '=' && s[j] != ' ' && s[j] != '>' && s[j] != '/' && s[j] != '\t' && s[j] != '\n' {
|
||||
j++
|
||||
}
|
||||
out.WriteString(Paint(S.Warning, s[i:j]))
|
||||
out.WriteString(Paint(ilovetui.S.Warning, s[i:j]))
|
||||
i = j
|
||||
}
|
||||
}
|
||||
if i < n && s[i] == '>' {
|
||||
out.WriteString(Paint(S.Subtle, ">"))
|
||||
out.WriteString(Paint(ilovetui.S.Subtle, ">"))
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
||||
+17
-68
@@ -1,29 +1,12 @@
|
||||
package style
|
||||
|
||||
import (
|
||||
"image/color"
|
||||
|
||||
"charm.land/bubbles/v2/help"
|
||||
"charm.land/lipgloss/v2"
|
||||
"github.com/anotherhadi/spilltea/internal/config"
|
||||
ilovetui "github.com/anotherhadi/ilovetui"
|
||||
)
|
||||
|
||||
type Styles struct {
|
||||
Primary color.Color
|
||||
Success color.Color
|
||||
Error color.Color
|
||||
Warning color.Color
|
||||
SubtleBg color.Color
|
||||
Selection color.Color
|
||||
Text color.Color
|
||||
MutedFg color.Color
|
||||
Subtle color.Color
|
||||
|
||||
Bold lipgloss.Style
|
||||
Faint lipgloss.Style
|
||||
|
||||
Panel lipgloss.Style
|
||||
PanelFocused lipgloss.Style
|
||||
PanelEditing lipgloss.Style
|
||||
|
||||
PagerDotActive string
|
||||
@@ -38,67 +21,33 @@ type Styles struct {
|
||||
|
||||
var S *Styles
|
||||
|
||||
func Init(cfg *config.Config) {
|
||||
c := cfg.TUI.Colors
|
||||
|
||||
subtleBg := lipgloss.Color("#" + c.Base01) // Lighter Background (status bars)
|
||||
selection := lipgloss.Color("#" + c.Base02) // Selection Background
|
||||
subtle := lipgloss.Color("#" + c.Base03) // Faint text, borders
|
||||
mutedFg := lipgloss.Color("#" + c.Base04) // Muted foreground
|
||||
text := lipgloss.Color("#" + c.Base05) // Default Foreground
|
||||
errCol := lipgloss.Color("#" + c.Base08) // Red: errors
|
||||
warning := lipgloss.Color("#" + c.Base09) // Orange: warnings
|
||||
success := lipgloss.Color("#" + c.Base0B) // Green: success
|
||||
primary := lipgloss.Color("#" + c.Base0D) // Accent: primary
|
||||
purple := lipgloss.Color("#" + c.Base0E) // Purple: editing
|
||||
|
||||
func Init() {
|
||||
methodBase := lipgloss.NewStyle().Bold(true).Width(7)
|
||||
S = &Styles{
|
||||
Primary: primary,
|
||||
Success: success,
|
||||
Error: errCol,
|
||||
Warning: warning,
|
||||
SubtleBg: subtleBg,
|
||||
Selection: selection,
|
||||
MutedFg: mutedFg,
|
||||
Text: text,
|
||||
Subtle: subtle,
|
||||
|
||||
Bold: lipgloss.NewStyle().Bold(true),
|
||||
Faint: lipgloss.NewStyle().Foreground(subtle).Faint(true),
|
||||
|
||||
Panel: lipgloss.NewStyle().
|
||||
Border(lipgloss.RoundedBorder()).
|
||||
BorderForeground(subtle),
|
||||
|
||||
PanelFocused: lipgloss.NewStyle().
|
||||
Border(lipgloss.RoundedBorder()).
|
||||
BorderForeground(primary),
|
||||
|
||||
PanelEditing: lipgloss.NewStyle().
|
||||
Border(lipgloss.RoundedBorder()).
|
||||
BorderForeground(purple),
|
||||
BorderForeground(ilovetui.S.Base0E),
|
||||
|
||||
PagerDotActive: lipgloss.NewStyle().Foreground(primary).SetString("•").String(),
|
||||
PagerDotInactive: lipgloss.NewStyle().Foreground(subtle).SetString("•").String(),
|
||||
PagerDotActive: lipgloss.NewStyle().Foreground(ilovetui.S.Primary).SetString("•").String(),
|
||||
PagerDotInactive: lipgloss.NewStyle().Foreground(ilovetui.S.Subtle).SetString("•").String(),
|
||||
|
||||
methodGet: methodBase.Foreground(success),
|
||||
methodPost: methodBase.Foreground(warning),
|
||||
methodPutPatch: methodBase.Foreground(primary),
|
||||
methodDelete: methodBase.Foreground(errCol),
|
||||
methodDefault: methodBase.Foreground(text),
|
||||
methodGet: methodBase.Foreground(ilovetui.S.Success),
|
||||
methodPost: methodBase.Foreground(ilovetui.S.Warning),
|
||||
methodPutPatch: methodBase.Foreground(ilovetui.S.Primary),
|
||||
methodDelete: methodBase.Foreground(ilovetui.S.Error),
|
||||
methodDefault: methodBase.Foreground(ilovetui.S.Text),
|
||||
}
|
||||
}
|
||||
|
||||
func NewHelp() help.Model {
|
||||
h := help.New()
|
||||
h.Styles.ShortKey = lipgloss.NewStyle().Foreground(S.Primary)
|
||||
h.Styles.ShortDesc = lipgloss.NewStyle().Foreground(S.MutedFg)
|
||||
h.Styles.ShortSeparator = lipgloss.NewStyle().Foreground(S.Subtle)
|
||||
h.Styles.FullKey = lipgloss.NewStyle().Foreground(S.Primary)
|
||||
h.Styles.FullDesc = lipgloss.NewStyle().Foreground(S.MutedFg)
|
||||
h.Styles.FullSeparator = lipgloss.NewStyle().Foreground(S.Subtle)
|
||||
h.Styles.Ellipsis = lipgloss.NewStyle().Foreground(S.Subtle)
|
||||
h.Styles.ShortKey = lipgloss.NewStyle().Foreground(ilovetui.S.Primary)
|
||||
h.Styles.ShortDesc = lipgloss.NewStyle().Foreground(ilovetui.S.Muted)
|
||||
h.Styles.ShortSeparator = lipgloss.NewStyle().Foreground(ilovetui.S.Subtle)
|
||||
h.Styles.FullKey = lipgloss.NewStyle().Foreground(ilovetui.S.Primary)
|
||||
h.Styles.FullDesc = lipgloss.NewStyle().Foreground(ilovetui.S.Muted)
|
||||
h.Styles.FullSeparator = lipgloss.NewStyle().Foreground(ilovetui.S.Subtle)
|
||||
h.Styles.Ellipsis = lipgloss.NewStyle().Foreground(ilovetui.S.Subtle)
|
||||
return h
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user