Skip to content

Overhaul TUI dashboard visuals#36

Merged
eous merged 6 commits intomainfrom
feature/dashboard-overhaul
Mar 27, 2026
Merged

Overhaul TUI dashboard visuals#36
eous merged 6 commits intomainfrom
feature/dashboard-overhaul

Conversation

@eous
Copy link
Copy Markdown
Contributor

@eous eous commented Mar 27, 2026

Summary

Major visual refresh of the TUI dashboard, replacing the uniform text-and-sparkline layout with purpose-appropriate widgets per panel type.

New sensor source:

  • MemoryUtilSource — reads /proc/meminfo for RAM used/total/utilization, swap used/total/utilization, and cached+buffers. Visible in both dashboard and tree view.

Visual improvements:

  • 12 per-panel accent colors (distinct across default, light, high-contrast, monochrome themes) applied to panel titles and borders
  • Gradient sparklines with per-character coloring — truecolor RGB gradients on capable terminals (auto-detected via $COLORTERM/$TERM), ANSI fallback on basic terminals
  • Category-specific sparkline palettes: red-orange for thermal, cyan for utilization, magenta for power, blue for voltage
  • Per-core CPU heatmap grid replacing the old density bar and per-core sparkline list — each core is a colored block that lights up from near-black (idle) to bright cyan (loaded)
  • CPU utilization and RAM/Swap as LineGauge progress bars
  • CPU Freq as LineGauge bars showing current vs max observed frequency
  • GPU sparklines use uniform color instead of per-category rainbow
  • System summary in header bar (hostname, CPU model, kernel version)
  • Headline values in panel titles (e.g., "CPU 4.2%", "Thermal 54.0°C")
  • Network link speed display (handles fractional speeds like 2.5G)
  • Theme cycling hotkey (t key) — cycles default → light → high-contrast → monochrome

Architecture:

  • PanelContent enum with Lines and Mixed variants enabling text + widget panels
  • PanelRow enum with Text and Gauge variants for mixed-content rendering
  • ColorLevel detection and sparkline_color() gradient computation in theme
  • SystemSummary struct gathered once at TUI startup

…eatmap

- Add MemoryUtilSource sensor (RAM/swap/cached from /proc/meminfo)
- Per-panel accent colors across all 4 theme variants (12 distinct colors)
- Terminal color detection (truecolor/256/basic) via COLORTERM/TERM
- Gradient sparklines with per-character coloring (category-specific palettes)
- PanelContent enum enabling mixed text + widget panels
- CPU panel: utilization LineGauge, per-core heatmap grid, RAPL power
- Memory panel: RAM/Swap usage gauges with GB labels, cached + HSMP/RAPL
- CPU Freq panel: LineGauge bars showing current vs max frequency
- System summary in header (hostname, CPU model, kernel version)
- Headline values in panel titles (CPU %, hottest temp)
- Network panel: link speed display (handles 2.5G/10G/etc)
- Theme cycling hotkey (t key)
- GPU sparklines: uniform color instead of per-category rainbow
- Remove redundant CPU Cores panel (heatmap replaces it)
Copilot AI review requested due to automatic review settings March 27, 2026 04:47
@eous
Copy link
Copy Markdown
Contributor Author

eous commented Mar 27, 2026

Screenshot From 2026-03-26 21-48-56

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refreshes the TUI dashboard by introducing purpose-specific widgets/panels, richer theming (accent colors + gradient sparklines), and a new /proc/meminfo-based memory sensor source.

Changes:

  • Added MemoryUtilSource to report RAM/swap utilization and cached+buffers.
  • Introduced terminal color capability detection and per-panel accent colors + gradient sparkline coloring.
  • Reworked dashboard rendering to support mixed text+gauge panels, per-core CPU heatmap, theme cycling, and a system summary header.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
src/sensors/poller.rs Registers the new memory utilization sensor source in discovery.
src/sensors/mod.rs Exposes the new memory_util sensors module.
src/sensors/memory_util.rs Implements /proc/meminfo polling and adds basic unit tests.
src/output/tui/theme.rs Adds color capability detection, panel accent colors, and gradient sparkline coloring.
src/output/tui/mod.rs Adds system summary gathering, theme cycling, and per-character sparkline spans.
src/output/tui/dashboard.rs Overhauls dashboard panels to use gauges/heatmaps, headline values, and colored sparklines.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/sensors/memory_util.rs
Comment thread src/sensors/memory_util.rs
Comment thread src/output/tui/theme.rs
Comment thread src/output/tui/mod.rs
Comment thread src/output/tui/theme.rs Outdated
Comment thread src/output/tui/theme.rs
Comment thread src/output/tui/mod.rs Outdated
Comment thread src/output/tui/mod.rs
Comment thread src/sensors/memory_util.rs
Comment thread src/sensors/memory_util.rs
@emansom
Copy link
Copy Markdown
Contributor

emansom commented Mar 27, 2026

Screenshot From 2026-03-26 21-48-56

Looking fancy! However, CPU freq takes up way too much space on your system! 😱

@emansom
Copy link
Copy Markdown
Contributor

emansom commented Mar 27, 2026

In this current or a future PR that could possibly be resolved, by splitting up horizontally within each sensor grid?

e.g. two frequency lines next to eachother?
Core 0 2.1GHz [ ] Core 3 2.8Ghz [ ]

@emansom
Copy link
Copy Markdown
Contributor

emansom commented Mar 27, 2026

same horizontal split within sensor grid could be applied to the other sensor grids to utilize more of the current blank space?

- Fix sparkline_color doc comment (said "3-step" but impl is single color)
- Add name field to TuiTheme so theme cycling starts from the active theme
@eous
Copy link
Copy Markdown
Contributor Author

eous commented Mar 27, 2026

Screenshot From 2026-03-27 10-52-50

- Multi-column layout (MultiCol variant) for CPU Freq and Fans panels
- Theme cycling hotkey (t) with correct start position via TuiTheme.name
- CPU heatmap floor darkened to near-black for idle cores
- Sparkline gradients: red-orange for thermal, near-black→cyan for utilization
- GPU sparklines unified to single color (no per-category rainbow)
- RAM/Swap gauge labels match panel text color
- Network link speed: correct MiB/s→Mbps conversion, fractional speed support
- System summary header (hostname, CPU model, kernel)
- Headline values in panel titles (CPU %, hottest temp)
- Memory→center column, CPU Freq→left column in 3-col layout
- Remove duplicate CPU label from gauge (headline covers it)
- Fix CPU Freq truncation flag for 2-column layout
- Fix sparkline_color doc comment accuracy
@emansom
Copy link
Copy Markdown
Contributor

emansom commented Mar 27, 2026

Screenshot_20260327_211310

Some ideas:

  • Only use multi-col panels if there's no vertical lines left, and still sensors remaining
  • Ensure both multi-col and single-col panels use the maximum horizontal and vertical width available, meaning that the CPU heatmap and sparklines, other sensor charts etc. all grow with the max size of the panel/widget; accounting for available sensors, displaying more sensor data takes precedent above enlarging heatmaps/graphs/sparklines/sensor charts.

@emansom
Copy link
Copy Markdown
Contributor

emansom commented Mar 27, 2026

Another idea:

  • Switch between heatmap and graphlines dependent on available room in the panel/widget and how many sensors there are in/for that specific widget.

eous added 2 commits March 27, 2026 14:31
- Only use 2-column layout for CPU Freq when entries exceed single-column
  capacity; Fans go 2-column when more than 6 entries
- Truncated panels expand into space freed by compact panels, so panels
  with more data (e.g., many thermal sensors) grow naturally
- Simplified constraint logic: always use Length for non-truncated panels,
  Fill for truncated — no separate branch needed
@eous eous force-pushed the feature/dashboard-overhaul branch from cb12598 to 6a133d9 Compare March 27, 2026 21:34
@eous eous requested a review from Copilot March 27, 2026 21:38
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 7 changed files in this pull request and generated 6 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/sensors/memory_util.rs
Comment thread src/sensors/memory_util.rs
Comment thread src/output/tui/mod.rs Outdated
Comment thread src/output/tui/dashboard.rs Outdated
Comment thread src/sensors/memory_util.rs Outdated
Comment thread src/sensors/memory_util.rs
- Clamp ram_util to 0..100% to handle available > total edge case
- Return None from parse_meminfo when total_kb is 0
- Disable theme cycling (t key) when --color never is active
- Fix heatmap comment (cols_per_row is fixed, not adaptive)
@eous eous merged commit 988bfe9 into main Mar 27, 2026
6 checks passed
@eous eous deleted the feature/dashboard-overhaul branch March 27, 2026 21:46
@emansom
Copy link
Copy Markdown
Contributor

emansom commented Mar 27, 2026

@eous Yes, looking better now! Less unused space in one dimension. Although, not entirely what I had in mind. I should've communicated more effectively, my apologies. Still figuring things out on how to formulate my thoughts for agentic usecases.

Will draft up a PR tomorrow with how I envision the dashboard should scale and size things!

This is how the latest merged code (this PR) looks on my machine:

Screenshot_20260327_231636

@eous
Copy link
Copy Markdown
Contributor Author

eous commented Mar 28, 2026

I think I get what you are saying. I’ll do another round tomorrow and hopefully we can come up with some interesting ideas together.

emansom added a commit to emansom/siomon that referenced this pull request Mar 28, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 28, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 28, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 28, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
@emansom
Copy link
Copy Markdown
Contributor

emansom commented Mar 28, 2026

@eous I'm making progress in https://github.com/emansom/siomon/tree/feature/flexbox 🚀

Screenshot_20260329_005048

emansom added a commit to emansom/siomon that referenced this pull request Mar 28, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
@emansom
Copy link
Copy Markdown
Contributor

emansom commented Mar 29, 2026

Auto switch between heatmap and sparklelines when there's insufficient space, also graphs:

Screenshot_20260329_034917 Screenshot_20260329_034946

emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Address UX feedback from PR level1techs#36 by integrating Ratatui's Flex layout
API to make the dashboard adapt to all terminal sizes and orientations.

- Import Flex enum; apply Flex::SpaceBetween to column splits for true
  equal-width distribution, Flex::Start to vertical panel stacking
- Add LayoutParams.col_width and PanelBudget struct that cascade
  terminal dimensions through to every widget on each frame, adapting
  to resize events
- Derive spark_width from col_width instead of fixed breakpoints,
  giving sparklines proportional width at any terminal size
- Flex-grow for panels: when all panels fit in a column, use
  Fill(natural_height) so surplus space distributes proportionally
  instead of leaving blank gaps at the bottom
- Add PanelContent::Heatmap variant rendered via nested Layout with
  Fill(1) constraints — cells resize both horizontally and vertically
  to cover the full panel area without hardcoded string repeats
- Convert CPU core utilization heatmap to area-filling Heatmap content
  that grows with the panel
- Replace per-core CPU Freq LineGauge with compact inline grid using
  Unicode bars — multiple cores per row derived from budget.inner_width
  (128 cores renders in ~32-43 rows instead of 128)
- Fans panel multi-col now based on actual panel dimensions
  (budget.inner_height/inner_width) instead of fixed threshold (> 6)
- Adaptive visualization for thermal, power, and voltage panels:
  switch to heatmap grid when sensor count exceeds 2x available panel
  height; otherwise use individual rows with sparklines
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Replace static percentage-based column layouts with Ratatui Flex API
(Fill + SpaceBetween) so panels distribute space evenly and grow into
surplus. Panels no longer leave blank vertical space at the column
bottom; non-truncated panels flex-grow proportionally to their natural
height.

Add labeled heatmaps for CPU cores and thermal sensors. Each heatmap
cell shows a centered bordered label with the sensor name and bold
value (e.g. "C12 55%", "CPU Temp 72.3C"). When cells are too small
for centered bordered labels, rendering falls back to sparklines at
render time using actual Rect dimensions. On multi-NUMA systems the
CPU heatmap shows one cell per CCD with the average utilization
instead of individual cores, and the panel title becomes "CCDs". When
sparkline fallback also exceeds vertical space, a single "All CCDs"
or "All Cores" summary sparkline is shown using the total CPU sensor
(or computed average when unavailable).

Convert Power, Storage, Network, Fans, CPU Freq, Voltage, GPU, and
Memory panels from sparkline/text to Ratatui Chart widgets with
Braille markers. Each dataset gets a maximally-contrasting color from
a reordered 12-color palette. Chart history is windowed to the last
N seconds, configurable via `chart_history_secs` in `[dashboard]`
config (default 10s). CPU Freq charts group by NUMA node (highest
freq per node) on multi-NUMA systems, individual cores on single-NUMA.

Sparklines now left-pad with the lowest block character so they fill
their full allocated width immediately instead of drip-feeding from
the left as history accumulates. Sparkline width is derived from
column width (col_width - 35 chars overhead) instead of fixed
breakpoints, making them reactive to terminal resize.

Add NUMA topology detection via /sys/devices/system/node/ with
cpulist parsing for CCD-aware heatmap and chart grouping.

Remove dead code: MultiCol panel variant, unused struct fields
(inner_width, inner_height, col_width), HashMap import, NetIfaceData
struct. Move net_bar to #[cfg(test)].
@emansom
Copy link
Copy Markdown
Contributor

emansom commented Mar 29, 2026

Opened #47

emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Replace static percentage-based column layouts with Ratatui Flex API
(Fill + SpaceBetween) so panels distribute space evenly and grow into
surplus. Panels no longer leave blank vertical space at the column
bottom; non-truncated panels flex-grow proportionally to their natural
height.

Add labeled heatmaps for CPU cores and thermal sensors. Each heatmap
cell shows a centered bordered label with the sensor name and bold
value (e.g. "C12 55%", "CPU Temp 72.3C"). When cells are too small
for centered bordered labels, rendering falls back to sparklines at
render time using actual Rect dimensions. On multi-NUMA systems the
CPU heatmap shows one cell per CCD with the average utilization
instead of individual cores, and the panel title becomes "CCDs". When
sparkline fallback also exceeds vertical space, a single "All CCDs"
or "All Cores" summary sparkline is shown using the total CPU sensor
(or computed average when unavailable).

Convert Power, Storage, Network, Fans, CPU Freq, Voltage, GPU, and
Memory panels from sparkline/text to Ratatui Chart widgets with
Braille markers. Each dataset gets a maximally-contrasting color from
a reordered 12-color palette. Chart history is windowed to the last
N seconds, configurable via `chart_history_secs` in `[dashboard]`
config (default 10s). CPU Freq charts group by NUMA node (highest
freq per node) on multi-NUMA systems, individual cores on single-NUMA.

Sparklines now left-pad with the lowest block character so they fill
their full allocated width immediately instead of drip-feeding from
the left as history accumulates. Sparkline width is derived from
column width (col_width - 35 chars overhead) instead of fixed
breakpoints, making them reactive to terminal resize.

Add NUMA topology detection via /sys/devices/system/node/ with
cpulist parsing for CCD-aware heatmap and chart grouping.

Remove dead code: MultiCol panel variant, unused struct fields
(inner_width, inner_height, col_width), HashMap import, NetIfaceData
struct. Move net_bar to #[cfg(test)].
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Replace static percentage-based column layouts with Ratatui Flex API
(Fill + SpaceBetween) so panels distribute space evenly and grow into
surplus. Panels no longer leave blank vertical space at the column
bottom; non-truncated panels flex-grow proportionally to their natural
height.

Add labeled heatmaps for CPU cores and thermal sensors. Each heatmap
cell shows a centered bordered label with the sensor name and bold
value (e.g. "C12 55%", "CPU Temp 72.3C"). When cells are too small
for centered bordered labels, rendering falls back to sparklines at
render time using actual Rect dimensions. On multi-NUMA systems the
CPU heatmap shows one cell per CCD with the average utilization
instead of individual cores, and the panel title becomes "CCDs". When
sparkline fallback also exceeds vertical space, a single "All CCDs"
or "All Cores" summary sparkline is shown using the total CPU sensor
(or computed average when unavailable).

Convert Power, Storage, Network, Fans, CPU Freq, Voltage, GPU, and
Memory panels from sparkline/text to Ratatui Chart widgets with
Braille markers. Each dataset gets a maximally-contrasting color from
a reordered 12-color palette. Chart history is windowed to the last
N seconds, configurable via `chart_history_secs` in `[dashboard]`
config (default 10s). CPU Freq charts group by NUMA node (highest
freq per node) on multi-NUMA systems, individual cores on single-NUMA.

Sparklines now left-pad with the lowest block character so they fill
their full allocated width immediately instead of drip-feeding from
the left as history accumulates. Sparkline width is derived from
column width (col_width - 35 chars overhead) instead of fixed
breakpoints, making them reactive to terminal resize.

Add NUMA topology detection via /sys/devices/system/node/ with
cpulist parsing for CCD-aware heatmap and chart grouping.

Remove dead code: MultiCol panel variant, unused struct fields
(inner_width, inner_height, col_width), HashMap import, NetIfaceData
struct. Move net_bar to #[cfg(test)].
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Replace static percentage-based column layouts with Ratatui Flex API
(Fill + SpaceBetween) so panels distribute space evenly and grow into
surplus. Panels no longer leave blank vertical space at the column
bottom; non-truncated panels flex-grow proportionally to their natural
height.

Add labeled heatmaps for CPU cores and thermal sensors. Each heatmap
cell shows a centered bordered label with the sensor name and bold
value (e.g. "C12 55%", "CPU Temp 72.3C"). When cells are too small
for centered bordered labels, rendering falls back to sparklines at
render time using actual Rect dimensions. On multi-NUMA systems the
CPU heatmap shows one cell per CCD with the average utilization
instead of individual cores, and the panel title becomes "CCDs". When
sparkline fallback also exceeds vertical space, a single "All CCDs"
or "All Cores" summary sparkline is shown using the total CPU sensor
(or computed average when unavailable).

Convert Power, Storage, Network, Fans, CPU Freq, Voltage, GPU, and
Memory panels from sparkline/text to Ratatui Chart widgets with
Braille markers. Each dataset gets a maximally-contrasting color from
a reordered 12-color palette. Chart history is windowed to the last
N seconds, configurable via `chart_history_secs` in `[dashboard]`
config (default 10s). CPU Freq charts group by NUMA node (highest
freq per node) on multi-NUMA systems, individual cores on single-NUMA.

Sparklines now left-pad with the lowest block character so they fill
their full allocated width immediately instead of drip-feeding from
the left as history accumulates. Sparkline width is derived from
column width (col_width - 35 chars overhead) instead of fixed
breakpoints, making them reactive to terminal resize.

Add NUMA topology detection via /sys/devices/system/node/ with
cpulist parsing for CCD-aware heatmap and chart grouping.

Remove dead code: MultiCol panel variant, unused struct fields
(inner_width, inner_height, col_width), HashMap import, NetIfaceData
struct. Move net_bar to #[cfg(test)].
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Replace static percentage-based column layouts with Ratatui Flex API
(Fill + SpaceBetween) so panels distribute space evenly and grow into
surplus. Panels no longer leave blank vertical space at the column
bottom; non-truncated panels flex-grow proportionally to their natural
height.

Add labeled heatmaps for CPU cores and thermal sensors. Each heatmap
cell shows a centered bordered label with the sensor name and bold
value (e.g. "C12 55%", "CPU Temp 72.3C"). When cells are too small
for centered bordered labels, rendering falls back to sparklines at
render time using actual Rect dimensions. On multi-NUMA systems the
CPU heatmap shows one cell per CCD with the average utilization
instead of individual cores, and the panel title becomes "CCDs". When
sparkline fallback also exceeds vertical space, a single "All CCDs"
or "All Cores" summary sparkline is shown using the total CPU sensor
(or computed average when unavailable).

Convert Power, Storage, Network, Fans, CPU Freq, Voltage, GPU, and
Memory panels from sparkline/text to Ratatui Chart widgets with
Braille markers. Each dataset gets a maximally-contrasting color from
a reordered 12-color palette. Chart history is windowed to the last
N seconds, configurable via `chart_history_secs` in `[dashboard]`
config (default 10s). CPU Freq charts group by NUMA node (highest
freq per node) on multi-NUMA systems, individual cores on single-NUMA.

Sparklines now left-pad with the lowest block character so they fill
their full allocated width immediately instead of drip-feeding from
the left as history accumulates. Sparkline width is derived from
column width (col_width - 35 chars overhead) instead of fixed
breakpoints, making them reactive to terminal resize.

Add NUMA topology detection via /sys/devices/system/node/ with
cpulist parsing for CCD-aware heatmap and chart grouping.

Remove dead code: MultiCol panel variant, unused struct fields
(inner_width, inner_height, col_width), HashMap import, NetIfaceData
struct. Move net_bar to #[cfg(test)].
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Replace static percentage-based column layouts with Ratatui Flex API
(Fill + SpaceBetween) so panels distribute space evenly and grow into
surplus. Panels no longer leave blank vertical space at the column
bottom; non-truncated panels flex-grow proportionally to their natural
height.

Add labeled heatmaps for CPU cores and thermal sensors. Each heatmap
cell shows a centered bordered label with the sensor name and bold
value (e.g. "C12 55%", "CPU Temp 72.3C"). When cells are too small
for centered bordered labels, rendering falls back to sparklines at
render time using actual Rect dimensions. On multi-NUMA systems the
CPU heatmap shows one cell per CCD with the average utilization
instead of individual cores, and the panel title becomes "CCDs". When
sparkline fallback also exceeds vertical space, a single "All CCDs"
or "All Cores" summary sparkline is shown using the total CPU sensor
(or computed average when unavailable).

Convert Power, Storage, Network, Fans, CPU Freq, Voltage, GPU, and
Memory panels from sparkline/text to Ratatui Chart widgets with
Braille markers. Each dataset gets a maximally-contrasting color from
a reordered 12-color palette. Chart history is windowed to the last
N seconds, configurable via `chart_history_secs` in `[dashboard]`
config (default 10s). CPU Freq charts group by NUMA node (highest
freq per node) on multi-NUMA systems, individual cores on single-NUMA.

Sparklines now left-pad with the lowest block character so they fill
their full allocated width immediately instead of drip-feeding from
the left as history accumulates. Sparkline width is derived from
column width (col_width - 35 chars overhead) instead of fixed
breakpoints, making them reactive to terminal resize.

Add NUMA topology detection via /sys/devices/system/node/ with
cpulist parsing for CCD-aware heatmap and chart grouping.

Remove dead code: MultiCol panel variant, unused struct fields
(inner_width, inner_height, col_width), HashMap import, NetIfaceData
struct. Move net_bar to #[cfg(test)].
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Replace static percentage-based column layouts with Ratatui Flex API
(Fill + SpaceBetween) so panels distribute space evenly and grow into
surplus. Panels no longer leave blank vertical space at the column
bottom; non-truncated panels flex-grow proportionally to their natural
height.

Add labeled heatmaps for CPU cores and thermal sensors. Each heatmap
cell shows a centered bordered label with the sensor name and bold
value (e.g. "C12 55%", "CPU Temp 72.3C"). When cells are too small
for centered bordered labels, rendering falls back to sparklines at
render time using actual Rect dimensions. On multi-NUMA systems the
CPU heatmap shows one cell per CCD with the average utilization
instead of individual cores, and the panel title becomes "CCDs". When
sparkline fallback also exceeds vertical space, a single "All CCDs"
or "All Cores" summary sparkline is shown using the total CPU sensor
(or computed average when unavailable).

Convert Power, Storage, Network, Fans, CPU Freq, Voltage, GPU, and
Memory panels from sparkline/text to Ratatui Chart widgets with
Braille markers. Each dataset gets a maximally-contrasting color from
a reordered 12-color palette. Chart history is windowed to the last
N seconds, configurable via `chart_history_secs` in `[dashboard]`
config (default 10s). CPU Freq charts group by NUMA node (highest
freq per node) on multi-NUMA systems, individual cores on single-NUMA.

Sparklines now left-pad with the lowest block character so they fill
their full allocated width immediately instead of drip-feeding from
the left as history accumulates. Sparkline width is derived from
column width (col_width - 35 chars overhead) instead of fixed
breakpoints, making them reactive to terminal resize.

Add NUMA topology detection via /sys/devices/system/node/ with
cpulist parsing for CCD-aware heatmap and chart grouping.

Remove dead code: MultiCol panel variant, unused struct fields
(inner_width, inner_height, col_width), HashMap import, NetIfaceData
struct. Move net_bar to #[cfg(test)].
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Replace static percentage-based column layouts with Ratatui Flex API
(Fill + SpaceBetween) so panels distribute space evenly and grow into
surplus. Panels no longer leave blank vertical space at the column
bottom; non-truncated panels flex-grow proportionally to their natural
height.

Add labeled heatmaps for CPU cores and thermal sensors. Each heatmap
cell shows a centered bordered label with the sensor name and bold
value (e.g. "C12 55%", "CPU Temp 72.3C"). When cells are too small
for centered bordered labels, rendering falls back to sparklines at
render time using actual Rect dimensions. On multi-NUMA systems the
CPU heatmap shows one cell per CCD with the average utilization
instead of individual cores, and the panel title becomes "CCDs". When
sparkline fallback also exceeds vertical space, a single "All CCDs"
or "All Cores" summary sparkline is shown using the total CPU sensor
(or computed average when unavailable).

Convert Power, Storage, Network, Fans, CPU Freq, Voltage, GPU, and
Memory panels from sparkline/text to Ratatui Chart widgets with
Braille markers. Each dataset gets a maximally-contrasting color from
a reordered 12-color palette. Chart history is windowed to the last
N seconds, configurable via `chart_history_secs` in `[dashboard]`
config (default 10s). CPU Freq charts group by NUMA node (highest
freq per node) on multi-NUMA systems, individual cores on single-NUMA.

Sparklines now left-pad with the lowest block character so they fill
their full allocated width immediately instead of drip-feeding from
the left as history accumulates. Sparkline width is derived from
column width (col_width - 35 chars overhead) instead of fixed
breakpoints, making them reactive to terminal resize.

Add NUMA topology detection via /sys/devices/system/node/ with
cpulist parsing for CCD-aware heatmap and chart grouping.

Remove dead code: MultiCol panel variant, unused struct fields
(inner_width, inner_height, col_width), HashMap import, NetIfaceData
struct. Move net_bar to #[cfg(test)].
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Replace static percentage-based column layouts with Ratatui Flex API
(Fill + SpaceBetween) so panels distribute space evenly and grow into
surplus. Panels no longer leave blank vertical space at the column
bottom; non-truncated panels flex-grow proportionally to their natural
height.

Add labeled heatmaps for CPU cores and thermal sensors. Each heatmap
cell shows a centered bordered label with the sensor name and bold
value (e.g. "C12 55%", "CPU Temp 72.3C"). When cells are too small
for centered bordered labels, rendering falls back to sparklines at
render time using actual Rect dimensions. On multi-NUMA systems the
CPU heatmap shows one cell per CCD with the average utilization
instead of individual cores, and the panel title becomes "CCDs". When
sparkline fallback also exceeds vertical space, a single "All CCDs"
or "All Cores" summary sparkline is shown using the total CPU sensor
(or computed average when unavailable).

Convert Power, Storage, Network, Fans, CPU Freq, Voltage, GPU, and
Memory panels from sparkline/text to Ratatui Chart widgets with
Braille markers. Each dataset gets a maximally-contrasting color from
a reordered 12-color palette. Chart history is windowed to the last
N seconds, configurable via `chart_history_secs` in `[dashboard]`
config (default 10s). CPU Freq charts group by NUMA node (highest
freq per node) on multi-NUMA systems, individual cores on single-NUMA.

Sparklines now left-pad with the lowest block character so they fill
their full allocated width immediately instead of drip-feeding from
the left as history accumulates. Sparkline width is derived from
column width (col_width - 35 chars overhead) instead of fixed
breakpoints, making them reactive to terminal resize.

Add NUMA topology detection via /sys/devices/system/node/ with
cpulist parsing for CCD-aware heatmap and chart grouping.

Remove dead code: MultiCol panel variant, unused struct fields
(inner_width, inner_height, col_width), HashMap import, NetIfaceData
struct. Move net_bar to #[cfg(test)].
emansom added a commit to emansom/siomon that referenced this pull request Mar 29, 2026
Replace static percentage-based column layouts with Ratatui Flex API
(Fill + SpaceBetween) so panels distribute space evenly and grow into
surplus. Panels no longer leave blank vertical space at the column
bottom; non-truncated panels flex-grow proportionally to their natural
height.

Add labeled heatmaps for CPU cores and thermal sensors. Each heatmap
cell shows a centered bordered label with the sensor name and bold
value (e.g. "C12 55%", "CPU Temp 72.3C"). When cells are too small
for centered bordered labels, rendering falls back to sparklines at
render time using actual Rect dimensions. On multi-NUMA systems the
CPU heatmap shows one cell per CCD with the average utilization
instead of individual cores, and the panel title becomes "CCDs". When
sparkline fallback also exceeds vertical space, a single "All CCDs"
or "All Cores" summary sparkline is shown using the total CPU sensor
(or computed average when unavailable).

Convert Power, Storage, Network, Fans, CPU Freq, Voltage, GPU, and
Memory panels from sparkline/text to Ratatui Chart widgets with
Braille markers. Each dataset gets a maximally-contrasting color from
a reordered 12-color palette. Chart history is windowed to the last
N seconds, configurable via `chart_history_secs` in `[dashboard]`
config (default 10s). CPU Freq charts group by NUMA node (highest
freq per node) on multi-NUMA systems, individual cores on single-NUMA.

Sparklines now left-pad with the lowest block character so they fill
their full allocated width immediately instead of drip-feeding from
the left as history accumulates. Sparkline width is derived from
column width (col_width - 35 chars overhead) instead of fixed
breakpoints, making them reactive to terminal resize.

Add NUMA topology detection via /sys/devices/system/node/ with
cpulist parsing for CCD-aware heatmap and chart grouping.

Remove dead code: MultiCol panel variant, unused struct fields
(inner_width, inner_height, col_width), HashMap import, NetIfaceData
struct. Move net_bar to #[cfg(test)].
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants