0badc2ddf5
SLA daily breakdown no longer overflows past the monitors panel. Detail sidebar height is capped to monitors panel height via titledPanelH. SLA daily rows are limited to fit within available space. Logs strip stays visible in all detail modes.
69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package tui
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
func (m Model) titledPanelH(title, content string, width, height int, focused bool) string {
|
|
s := m.titledPanel(title, content, width, focused)
|
|
if height <= 0 {
|
|
return s
|
|
}
|
|
lines := strings.Split(s, "\n")
|
|
if len(lines) <= height {
|
|
return s
|
|
}
|
|
return strings.Join(lines[:height-1], "\n") + "\n" + lines[len(lines)-1]
|
|
}
|
|
|
|
func (m Model) titledPanel(title, content string, width int, focused bool) string {
|
|
borderColor := m.theme.Border
|
|
titleColor := m.theme.Muted
|
|
if focused {
|
|
borderColor = m.theme.Accent
|
|
titleColor = m.theme.Accent
|
|
}
|
|
|
|
bc := lipgloss.NewStyle().Foreground(borderColor)
|
|
tc := lipgloss.NewStyle().Foreground(titleColor).Bold(true)
|
|
|
|
innerW := width - 2
|
|
if innerW < 10 {
|
|
innerW = 10
|
|
}
|
|
|
|
titleRendered := tc.Render(" " + title + " ")
|
|
titleLen := len([]rune(title)) + 2
|
|
fillLen := innerW - titleLen - 1
|
|
if fillLen < 0 {
|
|
fillLen = 0
|
|
}
|
|
|
|
top := bc.Render("╭─") + titleRendered + bc.Render(strings.Repeat("─", fillLen)+"╮")
|
|
|
|
contentStyle := lipgloss.NewStyle().Width(innerW).MaxWidth(innerW)
|
|
inner := contentStyle.Render(content)
|
|
|
|
var lines []string
|
|
lines = append(lines, top)
|
|
for _, line := range strings.Split(inner, "\n") {
|
|
lines = append(lines, bc.Render("│")+line+strings.Repeat(" ", max(0, innerW-lipgloss.Width(line)))+bc.Render("│"))
|
|
}
|
|
lines = append(lines, bc.Render("╰"+strings.Repeat("─", innerW)+"╯"))
|
|
|
|
return strings.Join(lines, "\n")
|
|
}
|
|
|
|
func max(a, b int) int {
|
|
if a > b {
|
|
return a
|
|
}
|
|
return b
|
|
}
|
|
|
|
func placeOverlay(fg string, termW, termH int) string {
|
|
return lipgloss.Place(termW, termH, lipgloss.Center, lipgloss.Center, fg)
|
|
}
|