From b6dcc354176b9198e1415413e9be27f06c9249f7 Mon Sep 17 00:00:00 2001 From: Celestial Date: Sat, 14 Feb 2026 13:49:39 +0100 Subject: [PATCH 1/2] fix(ui): keep progress fill behind centered label --- CHANGELOG.md | 13 ++++++------ src/ui/render/progress.rs | 44 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a587aa..9c67fa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,13 +5,12 @@ The format is based on Keep a Changelog, and this project follows SemVer. ## Unreleased -- Completed Phase 7 of the hexagonal migration by removing direct `TesterArgs` coupling from the application layer (`application::commands`, `application::local_run`, `application::distributed_run`) and tightening adapter-boundary mapping in entry planning. -- Added architecture guardrails that fail checks when `src/application` reintroduces `TesterArgs` or `crate::args` imports. -- Removed remaining non-test direct `distributed -> app` and `application -> app` imports by introducing explicit runtime ports and shared summary-output utilities, so orchestration flows now route via application/adapters seams. -- Added migration validation coverage for all run-plan feature routes (local, distributed controller/agent, replay, compare, cleanup, dump-urls, service) and distributed/local application dispatch seams. -- Updated architecture docs to a current flow-focused overview with explicit mode-by-mode call chains. -- Added technical architecture docs across ARD/ADR/patterns covering type-level invariants/newtypes, invalid-state elimination, cache/inlining guidance, dispatch strategy (static-first), and low-lock concurrency patterns using `Arc`, atomics, channels, and `ArcShift`. -- Removed legacy migration-risk and baseline-metrics ARD documents and updated doc indexes/references accordingly. +## 0.1.10 + +Released: 2026-02-14 + +- Finalized Phase 7 hexagonal boundaries by removing direct `TesterArgs` coupling from application orchestration and routing execution through explicit runtime/application seams. +- Fixed TUI run-panel progress bar rendering so the centered time label no longer visually splits filled progress segments. ## 0.1.9 diff --git a/src/ui/render/progress.rs b/src/ui/render/progress.rs index 7766f98..d87ac06 100644 --- a/src/ui/render/progress.rs +++ b/src/ui/render/progress.rs @@ -1,4 +1,5 @@ use ratatui::prelude::text; +use ratatui::style::Style; use ratatui::text::Span; use super::theme::{ACCENT_PROGRESS_RGB, PANEL_TEXT_RGB, rgb, style_color}; @@ -53,10 +54,12 @@ pub(super) fn progress_bar_line( let mut spans = Vec::with_capacity(bar_width.saturating_add(2)); spans.push(Span::raw("[")); for idx in 0..bar_width { + let is_partial_cell = partial_count == 1 && idx == full_count; + let is_filled_cell = idx < full_count || is_partial_cell; if let Some(ch) = label_cells.get(idx).copied().flatten() { spans.push(Span::styled( ch.to_string(), - style_color(no_color, rgb(PANEL_TEXT_RGB)), + label_cell_style(no_color, is_filled_cell), )); continue; } @@ -79,3 +82,42 @@ pub(super) fn progress_bar_line( spans.push(Span::raw("]")); text::Line::from(spans) } + +fn label_cell_style(no_color: bool, on_filled_cell: bool) -> Style { + if no_color { + return Style::default(); + } + let style = Style::default().fg(rgb(PANEL_TEXT_RGB)); + if on_filled_cell { + style.bg(rgb(ACCENT_PROGRESS_RGB)) + } else { + style + } +} + +#[cfg(test)] +mod tests { + use super::{ACCENT_PROGRESS_RGB, progress_bar_line, rgb}; + + #[test] + fn label_on_filled_cell_keeps_progress_background() { + let line = progress_bar_line(9, 10, 20, false, "x"); + let bg = line + .spans + .iter() + .find(|span| span.content.as_ref() == "x") + .and_then(|span| span.style.bg); + assert_eq!(bg, Some(rgb(ACCENT_PROGRESS_RGB))); + } + + #[test] + fn label_on_empty_cell_has_no_background_fill() { + let line = progress_bar_line(1, 10, 20, false, "x"); + let bg = line + .spans + .iter() + .find(|span| span.content.as_ref() == "x") + .and_then(|span| span.style.bg); + assert_eq!(bg, None); + } +} From a4a1a60ba446bc28ab8afa82e4e7b29660d3a02d Mon Sep 17 00:00:00 2001 From: Celestial Date: Sat, 14 Feb 2026 18:28:58 +0100 Subject: [PATCH 2/2] chore(release): bump version to 0.1.10 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 13f4e4b..bbf23da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2407,7 +2407,7 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "strest" -version = "0.1.9" +version = "0.1.10" dependencies = [ "arcshift", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index e966e2f..943d671 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strest" -version = "0.1.9" +version = "0.1.10" edition = "2024" description = "Blazing-fast async HTTP load tester in Rust - lock-free design, real-time stats, distributed runs, and optional chart exports for high-load API testing." license = "MIT OR Apache-2.0"