summaryrefslogtreecommitdiff
path: root/internal/tui/dashboard/overview.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-05 21:50:58 +0200
committerPaul Buetow <paul@buetow.org>2026-03-05 21:50:58 +0200
commita4298701546b09fccb15ce30db7c7e3f4070525c (patch)
treeb3433014284ccd354be48efb2ce125ccaf236d7e /internal/tui/dashboard/overview.go
parent2bd89ced830f97fd12a672fddb6978d204a014fd (diff)
fix(tui): stabilize full-width layout and sparkline rendering
Diffstat (limited to 'internal/tui/dashboard/overview.go')
-rw-r--r--internal/tui/dashboard/overview.go38
1 files changed, 16 insertions, 22 deletions
diff --git a/internal/tui/dashboard/overview.go b/internal/tui/dashboard/overview.go
index 3ddeaf6..866c5bb 100644
--- a/internal/tui/dashboard/overview.go
+++ b/internal/tui/dashboard/overview.go
@@ -33,6 +33,7 @@ func renderOverview(snap *statsengine.Snapshot, width, height int) string {
trendWithArrow(snap.ThroughputTrend),
)
+ panelW := panelWidth(width)
panelInner := panelInnerWidth(width)
labelWidth := maxLabelWidth("Latency:", "Gap:", "Throughput:")
latencySpark := renderOverviewSparklineAligned("Latency:", snap.LatencySeriesNs(), panelInner, labelWidth)
@@ -44,8 +45,8 @@ func renderOverview(snap *statsengine.Snapshot, width, height int) string {
latencyHist := "Latency buckets: " + summarizeHistogramBrief(snap.LatencyHistogram)
gapHist := "Gap buckets: " + summarizeHistogramBrief(snap.GapHistogram)
- panel := common.PanelStyle.Width(panelInner)
- sparkPanel := panel.Render(strings.Join([]string{latencySpark, "", gapSpark, "", throughputSpark}, "\n"))
+ panel := common.PanelStyle.Width(panelW)
+ sparkPanel := panel.Render(strings.Join([]string{latencySpark, gapSpark, throughputSpark}, "\n"))
topPanel := panel.Render(strings.Join([]string{topSyscalls, topFiles, topProcesses}, "\n"))
histPanel := panel.Render(strings.Join([]string{latencyHist, gapHist}, "\n"))
@@ -73,7 +74,7 @@ func renderSyscallBox(snap *statsengine.Snapshot, width int) string {
snap.SyscallRatePerSec,
generatedAt,
)
- return common.PanelStyle.Width(summaryBoxInnerWidth(width)).Height(5).Render(content)
+ return common.PanelStyle.Width(width).Height(5).Render(content)
}
func renderBytesBox(snap *statsengine.Snapshot, width int) string {
@@ -83,7 +84,7 @@ func renderBytesBox(snap *statsengine.Snapshot, width int) string {
formatBytes(snap.WriteBytesPerSec),
formatBytes(float64(snap.TotalBytes)),
)
- return common.PanelStyle.Width(summaryBoxInnerWidth(width)).Height(5).Render(content)
+ return common.PanelStyle.Width(width).Height(5).Render(content)
}
func renderErrorBox(snap *statsengine.Snapshot, width int) string {
@@ -99,7 +100,7 @@ func renderErrorBox(snap *statsengine.Snapshot, width int) string {
snap.LatencyMeanNs,
snap.GapMeanNs,
)
- return common.PanelStyle.Width(summaryBoxInnerWidth(width)).Height(5).Render(content)
+ return common.PanelStyle.Width(width).Height(5).Render(content)
}
func trendWithArrow(trend statsengine.Trend) string {
@@ -212,19 +213,8 @@ func summaryBoxWidth(width int) int {
return w
}
-func summaryBoxInnerWidth(width int) int {
- inner := width - panelHorizontalChrome
- if inner < 14 {
- return 14
- }
- return inner
-}
-
func renderOverviewSparkline(label string, data []float64, panelInner int) string {
w := panelInner - utf8.RuneCountInString(label) - 1 - sparklineSafetyMargin
- if w > sparklineMaxWidth {
- w = sparklineMaxWidth
- }
if w < 8 {
w = 8
}
@@ -234,9 +224,6 @@ func renderOverviewSparkline(label string, data []float64, panelInner int) strin
func renderOverviewSparklineAligned(label string, data []float64, panelInner int, labelWidth int) string {
paddedLabel := padLabelRight(label, labelWidth)
w := panelInner - labelWidth - 1 - sparklineSafetyMargin
- if w > sparklineMaxWidth {
- w = sparklineMaxWidth
- }
if w < 8 {
w = 8
}
@@ -262,13 +249,20 @@ func padLabelRight(label string, width int) string {
return label + strings.Repeat(" ", pad)
}
-func panelInnerWidth(width int) int {
+func panelWidth(width int) int {
if width <= 0 {
width = 80
}
- inner := width - panelHorizontalChrome
- if inner < 20 {
+ if width < 20 {
return 20
}
+ return width
+}
+
+func panelInnerWidth(width int) int {
+ inner := panelWidth(width) - panelHorizontalChrome
+ if inner < 16 {
+ return 16
+ }
return inner
}