Skip to content

Redesign the status bar with structured counts and scoped aria-live#646

Merged
jschick04 merged 1 commit into
mainfrom
feat/status-bar-redesign
Jul 14, 2026
Merged

Redesign the status bar with structured counts and scoped aria-live#646
jschick04 merged 1 commit into
mainfrom
feat/status-bar-redesign

Conversation

@jschick04

Copy link
Copy Markdown
Collaborator

Summary

Replaces the ad-hoc status bar (a flat row of spans in one aria-live region) with a structured left/right layout and fixes a real screen-reader accessibility defect.

  • Left (persistent, silent): active source (channel name / file base name / "All logs (N)" / group name) - counts ("1,234 events", or "200 of 1,234 shown" when narrowed, plus "3 selected" for a multi-select) - a read-only "Filtered" indicator whose tooltip names the mechanism ("Filter active" / "N lenses" / "Filter + N lenses").
  • Right (transient): loading / failed / live-channel / resolver activity.

Tracks ADO 63067058. Base is main (independent of the still-open time-window PR #645; no file overlap).

Design

Shaped by a 5-reviewer UX design panel: left/right split (VS-Code-style persistent-vs-transient), thousands-separated counts, a compact read-only filter indicator (the lens breadcrumb above the table owns the removable chips), source = active tab only, and the accessibility model below.

Accessibility fix (the core of the ADO)

The old bar was a single aria-live="polite" aria-atomic="true" region, so a screen reader re-announced the entire bar on every count tick - driven by the unthrottled event-count and per-event live-buffer counters.

  • Root region: no aria-live / role / aria-atomic. Counts and source update silently.
  • A single visually-hidden role="status" aria-live="polite" region carries only a coarse, transition-only label (load error / buffer full / loading / continuously updating), so it announces on state changes, not on numeric ticks.
  • The unthrottled "New Events: N" counter renders outside the live region with aria-live="off".
  • A load error takes priority over "Loading" so a failure is announced even while another log is still loading.

Key correctness

  • Lens-aware counts: the "shown" gate reads the composed AppliedFilter.IsFilteringEnabled (base intersect lenses), so a lens-only narrowing correctly shows "M of N shown" - and a new public FilterPaneState.IsFilteringEnabled distinguishes the persistent filter for the tooltip (drift-locked to FilterPaneFilterBuilder.Build).
  • Removed a latent whole-component early return that could drop the activity region.
  • Dropped remote/computer detection for v1 (LogView.ComputerName is the event-origin machine, not the connection source - deferred to v2).

Implementation

  • FilterPaneState.IsFilteringEnabled (public computed, allocation-free).
  • StatusBarFormatter (public static, Runtime, mirrors EventTableColumnFormatter): source / counts / filter-tooltip / activity-announcement.
  • StatusBar.razor(.cs/.css) restructured; new IStateSelection projectors for the persistent-filter bool and lens count.

Tests (34 new)

  • StatusBarFormatterTests (formatter variants, culture-robust counts, error-over-loading priority).
  • FilterPaneStateFilteringTests (locks IsFilteringEnabled == Build(state).IsFilteringEnabled across 7 states).
  • StatusBarTests (bUnit: root not live / announce region is role=status, "No log open", shown-iff-filtered, selected only at N>=2, "New Events" is aria-live=off, lens-only narrowing shows counts + "N lenses").

Validation

Runtime.Tests 1716/1716, UI.Tests 1045/1045, full-solution Release build 0 warnings / 0 errors.

Deferred to v2

Indicator interactivity (click-to-focus), remote-source indication, a color-coded status palette meeting WCAG AA on the status-bar fill, focused-row position, an explicit "Hidden" count, and aria transition-coalescing.

Copilot AI review requested due to automatic review settings July 14, 2026 01:44

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Redesigns the UI status bar into a structured left/right layout with culture-aware count formatting and a scoped screen-reader announcement region, addressing the prior aria-live behavior that re-announced the entire bar on frequent count updates.

Changes:

  • Reworks StatusBar markup/CSS to split persistent (source/counts/filter indicator) vs transient activity, and confines announcements to a hidden role="status" region.
  • Introduces StatusBarFormatter to centralize pure formatting logic for source labels, counts, filter tooltip text, and activity announcements.
  • Adds FilterPaneState.IsFilteringEnabled and unit tests to lock its behavior to FilterPaneFilterBuilder.Build(state).IsFilteringEnabled, plus bUnit coverage for the status bar accessibility/behavior.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
File Description
tests/Unit/EventLogExpert.UI.Tests/StatusBar/StatusBarTests.cs Adds bUnit coverage for new status bar structure, filter/lens behavior, and aria-live scoping.
tests/Unit/EventLogExpert.Runtime.Tests/StatusBar/StatusBarFormatterTests.cs Adds unit tests for status bar formatting helpers (source/counts/tooltips/announcement priority).
tests/Unit/EventLogExpert.Runtime.Tests/FilterPane/FilterPaneStateFilteringTests.cs Locks FilterPaneState.IsFilteringEnabled behavior to the existing builder output to prevent drift.
src/EventLogExpert.UI/StatusBar/StatusBar.razor.css Implements new flex-based left/right layout and screen-reader-only announce region styling.
src/EventLogExpert.UI/StatusBar/StatusBar.razor.cs Updates Fluxor selections (buffer count + selection count) and adds selections for persistent filter and lens count.
src/EventLogExpert.UI/StatusBar/StatusBar.razor Replaces single live region with structured layout and a dedicated announce-only live region; moves count/source rendering to formatter.
src/EventLogExpert.Runtime/StatusBar/StatusBarFormatter.cs New formatter providing pure presentation helpers for status bar strings and tooltip/announcement logic.
src/EventLogExpert.Runtime/FilterPane/FilterPaneState.cs Adds computed IsFilteringEnabled for persistent-filter indicator logic.

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

@jschick04 jschick04 marked this pull request as ready for review July 14, 2026 01:49
@jschick04 jschick04 requested a review from a team as a code owner July 14, 2026 01:49
Copilot AI review requested due to automatic review settings July 14, 2026 15:02
@jschick04 jschick04 force-pushed the feat/status-bar-redesign branch from e2d633e to de35f3f Compare July 14, 2026 15:02

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

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 8 out of 8 changed files in this pull request and generated 2 comments.

Comment thread src/EventLogExpert.Runtime/FilterPane/FilterPaneState.cs
Comment thread src/EventLogExpert.Runtime/StatusBar/StatusBarFormatter.cs
@jschick04 jschick04 merged commit 1841af0 into main Jul 14, 2026
8 checks passed
@jschick04 jschick04 deleted the feat/status-bar-redesign branch July 14, 2026 15:19
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