Conversation
…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)
There was a problem hiding this comment.
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
MemoryUtilSourceto 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.
Looking fancy! However, CPU freq takes up way too much space on your system! 😱 |
|
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? |
|
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
- 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
|
Another idea:
|
- 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
cb12598 to
6a133d9
Compare
There was a problem hiding this comment.
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.
- 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 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:
|
|
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. |
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
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
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
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
|
@eous I'm making progress in https://github.com/emansom/siomon/tree/feature/flexbox 🚀
|
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
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
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
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
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
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
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
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
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
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
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
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
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
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)].
|
Opened #47 |
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)].
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)].
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)].
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)].
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)].
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)].
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)].
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)].
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)].







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/meminfofor RAM used/total/utilization, swap used/total/utilization, and cached+buffers. Visible in both dashboard and tree view.Visual improvements:
$COLORTERM/$TERM), ANSI fallback on basic terminalsLineGaugeprogress barsLineGaugebars showing current vs max observed frequencytkey) — cycles default → light → high-contrast → monochromeArchitecture:
PanelContentenum withLinesandMixedvariants enabling text + widget panelsPanelRowenum withTextandGaugevariants for mixed-content renderingColorLeveldetection andsparkline_color()gradient computation in themeSystemSummarystruct gathered once at TUI startup