From e49aac8569f9a7f45185f25feb7437c32b0df048 Mon Sep 17 00:00:00 2001 From: xavierk Date: Sat, 19 Sep 2026 11:13:37 +0530 Subject: [PATCH] Release Fenris 0.5.0 with Chalktone dashboard and dotted activity plots --- CHANGELOG.md | 13 + README.md | 23 + assets/dashboard-chalktone.png | Bin 0 -> 303448 bytes docs/research/glint-dashboard-adoption.md | 67 ++ docs/spec/dashboard-clarity.md | 8 +- docs/spec/fenris-redesign.md | 6 + docs/spec/glint-dashboard-design.md | 148 ++++ pyproject.toml | 2 +- src/fenris/__init__.py | 2 +- src/fenris/activity_plot.py | 104 +++ src/fenris/preferences.py | 6 +- src/fenris/themes.py | 24 +- src/fenris/tui.py | 870 +++++++++------------- tests/test_activity_plot.py | 52 ++ tests/test_dashboard_design.py | 176 +++++ tests/test_issue_79.py | 14 +- tests/test_issue_80.py | 10 +- tests/test_issue_92.py | 18 +- tests/test_live_graph.py | 2 +- tests/test_preferences.py | 16 +- tests/test_status_read.py | 2 +- tests/test_themes.py | 18 +- tests/test_tui.py | 125 ++-- 23 files changed, 1083 insertions(+), 623 deletions(-) create mode 100644 assets/dashboard-chalktone.png create mode 100644 docs/research/glint-dashboard-adoption.md create mode 100644 docs/spec/glint-dashboard-design.md create mode 100644 src/fenris/activity_plot.py create mode 100644 tests/test_activity_plot.py create mode 100644 tests/test_dashboard_design.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 74d1cfd..cb22cc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,19 @@ backfill releases from before this changelog. ## [Unreleased] +## [0.5.0] - 2026-09-19 + +### Changed + +- Make drive activity the focus of a Chalktone dashboard with Live, Day, and History tabs, panel zoom, and fixed monitoring controls. +- Replace block bars with labelled dotted volume plots that fit the terminal and preserve gaps, partial evidence, and point inspection. + +### Fixed + +- Preserve historical selections and store-fault messages through graph refresh and resize. +- Show hourly drill-down results without overwriting them with a loading placeholder. +- Keep known unallocated daily volume visible across coverage gaps, and distinguish missing hourly evidence from zero on small terminals. + ## [0.4.0] - 2026-09-18 ### Added diff --git a/README.md b/README.md index c83465b..af6019a 100644 --- a/README.md +++ b/README.md @@ -252,6 +252,29 @@ is retried at the next interval; it never fabricates missing observations. ## Reading the dashboard +![Chalktone dashboard with a dotted activity plot](assets/dashboard-chalktone.png) + +Preview uses synthetic observations, not measurements from a real drive. + +The Chalktone dashboard opens with a large **Live** activity plot. **Day** shows +hourly evidence for a selected date, labelled UTC, and **History** shows daily +evidence. Local-day totals keep their recorded timezone. Dotted traces show +measured read/write volumes, not transfer speed; missing evidence breaks the +trace. `?` marks a gap, `~` a partial total, and `u` unallocated daily volume. +Use the selected-point readout for exact values and evidence state. + +- `v` cycles Live / Day / History; the tabs are also clickable. +- `←` / `→` inspect points; `w` switches read/write volume in every view. +- `[` / `]` browse dates, `g` enters a date, and `t` returns to today/live. +- `Tab` / `Shift+Tab` move focus; `z` expands the focused panel, and `z` or + `Esc` restores it. Monitoring status and controls remain visible. +- `s` cycles Chalktone, Amber, Nord, and High Contrast; saved theme preferences + survive upgrades. `m` toggles reduced motion. + +On smaller terminals, textual summaries and scrollable panels keep evidence +accessible. Pause, resume, collect, disclosures, help, and quit remain available +in the fixed control row. + Run `fenris` as your normal user to open the TUI dashboard. The dashboard does not need `sudo`. Use `sudo` for package installation and system configuration; pause, resume, and collect-now actions normally authenticate through polkit. diff --git a/assets/dashboard-chalktone.png b/assets/dashboard-chalktone.png new file mode 100644 index 0000000000000000000000000000000000000000..1f2f58c34ca645d4514c37420d0dbfa2a185957b GIT binary patch literal 303448 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

nIY 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�C~dlQiljt7|T~}!JN9`TFf81i{v-akNUSlW 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�i0x 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

cPvHj$yX~QWc`(` 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 literal 0 HcmV?d00001 diff --git a/docs/research/glint-dashboard-adoption.md b/docs/research/glint-dashboard-adoption.md new file mode 100644 index 0000000..c846aa3 --- /dev/null +++ b/docs/research/glint-dashboard-adoption.md @@ -0,0 +1,67 @@ +# Glint dashboard design adoption + +Research date: 2026-09-19. Status: feasibility findings with interview decisions in progress. This note does not authorize implementation or change Fenris's accepted behavior. + +## Finding + +Fenris can adopt a Glint-inspired terminal dashboard through an independently authored redesign of its existing Textual presentation layer. Glint is a Rust terminal application, not an HTML/CSS dashboard or a drop-in Textual component library. Its most relevant ideas are a compact pane grid, consistent title rows and metadata, obvious focus, restrained colors, and enlarging a focused pane. A wholesale Glint integration would introduce a different UI runtime, unrelated application infrastructure, and a licensing decision without being necessary to achieve this visual direction. + +The user has selected **Chalktone / screenshot 3**, **a large activity chart as the primary panel**, and **panel styling plus keyboard focus and zoom**. The activity panel has **Live / Day / History tabs**; enlarging a panel retains a **fixed monitoring status, freshness, and control strip**. A general dashboard builder is outside the selected scope. The developing product specification is [Glint dashboard design](../spec/glint-dashboard-design.md). + +## Primary-source snapshot + +Inspected Glint's default branch at commit [`c1d73d3e8ead2f4069630b2a237306af8f6e69c8`](https://github.com/ntrospect0/glint/tree/c1d73d3e8ead2f4069630b2a237306af8f6e69c8), committed 2026-07-19. A shallow reference checkout was created outside Fenris at `/tmp/fenris-glint-reference`. + +- [README](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/README.md) contains three dashboard screenshots, a setup screenshot, and a live-capture link. The first two dashboard screenshots use `tokyonight`; the third uses `chalktone`. They show example compositions, not one mandatory layout. +- [Screenshot 1](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/docs/screenshots/glint-demo1.png), [screenshot 2](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/docs/screenshots/glint-demo2.png), [screenshot 3](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/docs/screenshots/glint-demo3.png), and [setup screenshot](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/docs/screenshots/glint-setup.png) are versioned in the repository. This source investigation does not substitute for visual inspection of those images. +- [Cargo.toml](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/Cargo.toml) declares Rust edition 2021, package version 0.5.0, Ratatui 0.28, Crossterm 0.28, and a `glint` binary. It also brings Tokio, HTTP clients, configuration/watch infrastructure, and optional widget dependencies. +- [GitHub repository API](https://api.github.com/repos/ntrospect0/glint), checked on the research date, reports an unarchived repository created 2026-05-27. [GitHub releases API](https://api.github.com/repos/ntrospect0/glint/releases) returned no releases. The [changelog](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/CHANGELOG.md) labels 0.5.0 and 0.4.0 unreleased, and README installation is from source. This is evidence of a young project and its distribution state, not proof that it is abandoned. +- [CI configuration](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/.github/workflows/ci.yml) runs Cargo tests and Clippy on Ubuntu; Clippy warnings do not fail CI. Source review alone does not establish that current CI passes. No Glint build or test run was performed for this assessment. + +## What can transfer + +| Glint pattern and source | Fit for Fenris | Scope implication | +| --- | --- | --- | +| Pane grid with row/column spans: [layout model](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/src/config/layout.rs), [default configuration](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/src/config/defaults/config.toml). | Fenris already uses a Textual grid and rounded bordered panes. A considered re-layout can use that existing ownership. | Decide which Fenris facts deserve persistent space. A fixed layout is much smaller than Glint's user-composable dashboard system. | +| Title integrated into the border, right-aligned metadata, focus treatment, shortcut indication: [UI title helpers](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/src/ui/mod.rs). | Useful for clearly named activity, history, drive, and monitoring panes. Date/range/freshness can become concise pane metadata where legible. | Independently implement the visible behavior in Fenris; do not translate or copy these GPL helpers. Ensure essential evidence is not merely truncated away. | +| Semantic theme roles separating border, title, metadata, and text: [theme model](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/src/theme/mod.rs), [bundled schemes](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/src/config/defaults/colorschemes.toml). | Fenris already owns themes in `src/fenris/themes.py`. Extend that role system for a chosen visual direction while keeping semantic status colors and text. | Select the preferred screenshot/palette before making the default. High Contrast and reduced-motion preferences already exist and must remain usable. | +| Tab/click focus, keyboard shortcuts, and focused-pane enlargement: [README controls](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/README.md), [app focus/zoom ownership](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/src/app.rs). | Particularly useful for graphs when a small terminal limits detail. | Zoom is new interaction behavior, not just styling. Selection/date/focus must survive entry, exit, resize, and refresh; essential fault/pause state needs a visibility decision. | +| Multiple widgets stacked in one cell, cycled with `.`/`,`: [stack implementation](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/src/widgets/stack.rs). | A possible way to expose secondary details without permanent screen cost. | Hiding monitoring state, confidence, or evidence behind inactive tabs would weaken Fenris's current contract. Choose deliberately; not assumed needed. | +| Responsive views exposing more detail at larger sizes: [view tiers](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/src/widgets/view_tier.rs), [widget author guide](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/docs/widget-sdk.md). | Useful principle, but Glint's breakpoints describe its content and are not Fenris requirements. | Preserve Fenris's constrained-terminal facts and controls, then design larger views. Do not simply reuse Glint's threshold values. | +| Compact bottom status bar: [status bar](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/src/ui/status_bar.rs). | Supports a quieter action/focus rail. | Fenris has real monitoring continuity, freshness, collection outcome, authentication, and quit semantics. Its footer cannot be reduced to Glint's version/clock/theme bar. | + +Glint's calendar, stocks, news, email, weather, notes, galleries, external credentials, and profile/setup machinery are outside the stated Fenris redesign. Its widget SDK adds widgets inside the Rust application via a trait and registry; it is not an existing Python integration seam ([widget SDK](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/docs/widget-sdk.md), [widget interface](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/src/widgets/mod.rs)). + +## Fenris ownership and constraints + +The present application is Python with Textual, pinned to Textual 8.2.8 in [`requirements.txt`](../../requirements.txt). [`FenrisTuiApp`](../../src/fenris/tui.py) already owns the grid, header, bordered panes, compact layout, help, action bindings, and theme registration; `DailyBarGraph` and `LiveActivityGraph` already own graph selection/rendering. [`themes.py`](../../src/fenris/themes.py) owns Amber, Nord, High Contrast, and status color precedence. These are the natural extension points; a new backend or service is unnecessary for a visual redesign. + +The design must preserve these existing responsibilities and evidence semantics: + +- The collector owns privileged drive acquisition and observation-store writes; the TUI is an unprivileged reader and dispatches administrative actions through the sanctioned helper. A visual redesign does not imply a second sampler or store writer. Sources: [`CONTEXT.md`](../../CONTEXT.md), [redesign spec](../spec/fenris-redesign.md), [`tui.py`](../../src/fenris/tui.py). +- Usage-adjusted theoretical lifespan remains a write-endurance projection, accompanied by projection confidence and supporting facts. It must not become a physical failure countdown. Unknown, unavailable, warming, stale, and store-fault states require meaningful presentation. Sources: [`CONTEXT.md`](../../CONTEXT.md), [projection ADR](../adr/0002-projection-model-sustained-regime.md), [live activity specification](../spec/live-drive-activity.md). +- Gaps must not become zeros, and unavailable measurements must not become decorative smooth curves. Local-day labels, read/write units, incomplete evidence, selected dates, and timezone context matter. Sources: [local-day history ADR](../adr/0010-local-day-activity-history.md), [live activity specification](../spec/live-drive-activity.md). +- Pause is a deliberate disable; quitting only leaves the TUI. Monitoring continuity, last collection outcome, and freshness must remain understandable. Sources: [service lifecycle ADR](../adr/0003-service-lifecycle-and-sanctioned-toggle.md), [dashboard clarity specification](../spec/dashboard-clarity.md), [`status_composition.py`](../../src/fenris/status_composition.py). +- The current source switches to constrained presentation below 80 columns or 24 rows; the accepted live-activity specification requires daily totals, dates, evidence labels, confidence, and controls to remain accessible on narrow terminals. A new design must be reviewed against real target dimensions. Sources: [`tui.py`](../../src/fenris/tui.py), [live activity specification](../spec/live-drive-activity.md). + +The fixed Panes information architecture is normative in the older [redesign specification, section 7](../spec/fenris-redesign.md), and [dashboard clarity](../spec/dashboard-clarity.md) says it preserves that architecture and prescribes a separate quit rail. A significantly different pane hierarchy or footer should explicitly amend those presentation decisions when the user selects the new design, rather than silently treating old contracts as irrelevant. The underlying evidence and action semantics can be retained. + +## License boundary + +Glint declares **GPL-3.0-or-later** in [Cargo.toml](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/Cargo.toml) and source SPDX headers. Its [README license section](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/README.md) says distributed modified versions must remain GPL-licensed with copyright notices, and its [LICENSE](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/LICENSE) specifies the distribution obligations. Fenris deliberately uses MIT across source and packages under [ADR 0009](../adr/0009-mit-license.md). + +Copying or translating Glint implementation into an integrated distributed Fenris would therefore raise GPL compliance and licensing choices that conflict with keeping the combined implementation solely MIT. It is not an adoption route to take implicitly. The recommended route is independently authored Fenris UI code using common layout/interaction ideas observed in Glint, without copying Glint code or assets. If direct implementation reuse becomes a requirement, resolve licensing or separate permission first; this research does not establish that permission. + +## Interview state + +The selected direction is an independently implemented Chalktone-inspired dashboard with a fixed Fenris layout, an activity-first hierarchy, keyboard focus and enlargement, one activity panel with Live / Day / History tabs, and a persistent monitoring status/freshness/control strip during enlargement. Existing 80×24 support and constrained reflow are retained rather than reopened as a new minimum-size decision. The [developing design specification](../spec/glint-dashboard-design.md) owns the precise requirements and any remaining decisions; this research note is supporting evidence. + +No product code, glossary, ADR, or existing acceptance criteria were changed by this investigation. Keyboard focus/zoom feasibility does not establish that exact interaction behavior has been implemented or runtime-validated in Fenris. + +## Validation scope + +Evidence comes from the pinned Glint source, its checked-in documentation/screenshots, GitHub's first-party API, and Fenris's current source and accepted documents. The main design investigation visually inspected screenshots 1 and 3 and separately verified Textual grid documentation. + +The main investigation also reviewed synthetic renders of current Fenris at 140×44 and 80×24, after refresh cleared the launch authentication banner, using installed Textual 8.2.7 (the repository lock is 8.2.8). The captures are `/tmp/fenris-current-capture-3xdv46jm/fenris-current-140x44.png` and `/tmp/fenris-current-capture-3xdv46jm/fenris-current-80x24.png`. They showed a large blank vertical area; at 80×24 the drive, monitoring status, and actions fell below the initial viewport. This supports rearranging the panels and keeping the status/control strip visible, but is not a diagnosis of the deployed drive or proof across every state. + +No Glint runtime was executed, and no Glint asset was copied into the product. No accessibility audit was conducted. This research establishes architectural feasibility and records decisions; it does not claim pixel fidelity, a working integration, an upstream test result, or a measured performance result. diff --git a/docs/spec/dashboard-clarity.md b/docs/spec/dashboard-clarity.md index 8d617fd..ef55c94 100644 --- a/docs/spec/dashboard-clarity.md +++ b/docs/spec/dashboard-clarity.md @@ -1,5 +1,11 @@ # Fenris dashboard clarity specification +**Presentation amendment (2026-09-19):** The accepted +[Glint-inspired dashboard design](glint-dashboard-design.md) supersedes the +preserved Panes arrangement and standalone heavy quit rail. Identity, continuity, +paused-state explanations, and the distinction between quitting and pausing +remain required; quit now has an explicit entry in the fixed controls. + **Status: decision-complete.** Assembled by [Assemble the dashboard clarity specification and close the map](https://git.bongbetic.com/xavierk/Fenris/issues/60) from the closed tickets of the Wayfinder map [Chart Fenris dashboard clarity](https://git.bongbetic.com/xavierk/Fenris/issues/55). This document is normative for the follow-up **execution effort**; nothing here is implemented by the map. **Canonical roles.** The [redesign specification](fenris-redesign.md) (frozen) and [ADRs 0001–0007](../adr/) remain authoritative and untouched — this is a companion spec covering five dashboard clarity additions plus the changelog-driven release-notes mechanism. The [criteria register](acceptance-criteria.md) carries the testable statements: **DC-1–DC-8**, appended by this assembly, with **TUI-4's binding list amended** (§4). Terminology follows the glossary in [`CONTEXT.md`](../../CONTEXT.md), including *Deliberate disable* and *Release*. @@ -119,4 +125,4 @@ This resolves the map's README-wording fog: the wording is decided here; the act ## 9. Out of scope -Executing any of this — code, tests, releases — and any TUI layout or information-architecture redesign beyond the five additions named above. Execution is a fresh effort after handoff. \ No newline at end of file +Executing any of this — code, tests, releases — and any TUI layout or information-architecture redesign beyond the five additions named above. Execution is a fresh effort after handoff. diff --git a/docs/spec/fenris-redesign.md b/docs/spec/fenris-redesign.md index a3beb4f..c5e6763 100644 --- a/docs/spec/fenris-redesign.md +++ b/docs/spec/fenris-redesign.md @@ -362,6 +362,12 @@ Never "82 % confidence" or "95 % accurate". ## 7. Panes TUI +**Presentation amendment (2026-09-19):** The accepted +[Glint-inspired dashboard design](glint-dashboard-design.md) supersedes this +section's panel arrangement and graph appearance with an activity-first layout, +dotted volume plots, Live / Day / History tabs, and focused-panel zoom. Shared +evidence, projection, authentication, and monitoring-action contracts still apply. + **Decisions:** [Prototype the TUI information architecture](https://git.bongbetic.com/xavierk/Fenris/issues/3) (Variant A adopted), [Evaluate Python TUI frameworks](https://git.bongbetic.com/xavierk/Fenris/issues/6) (Textual). **ADRs:** [0003](../adr/0003-service-lifecycle-and-sanctioned-toggle.md) §§8, 10; [0004](../adr/0004-install-upgrade-removal-lifecycle.md) §10. **Criteria:** TUI-1–TUI-4, CI-1, CI-2, CI-4. The [prototype](https://git.bongbetic.com/xavierk/Fenris/src/branch/prototype/tui-information-architecture/prototype/tui-ia) is visual reference only; this section is normative. ### 7.1 Framework and floor diff --git a/docs/spec/glint-dashboard-design.md b/docs/spec/glint-dashboard-design.md new file mode 100644 index 0000000..672d9ef --- /dev/null +++ b/docs/spec/glint-dashboard-design.md @@ -0,0 +1,148 @@ +# Glint-inspired Fenris dashboard + +Status: accepted on 2026-09-19. The user confirmed the complete design and +additionally requested Glint-style plotted graphs in place of block bars. + +## Purpose and reference + +Adopt the visual approach of [Glint](https://github.com/ntrospect0/glint) for +Fenris's terminal dashboard. The selected visual reference is the third README +screenshot, using Chalktone, at upstream commit +`c1d73d3e8ead2f4069630b2a237306af8f6e69c8`: +[reference screenshot](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/docs/screenshots/glint-demo3.png). + +The source and architectural assessment is recorded in +[the research note](../research/glint-dashboard-adoption.md). + +## Confirmed user choices + +- Adopt panel styling, keyboard focus, and panel zoom. A freely configurable + dashboard builder is outside the selected scope. +- Give the live read/write activity chart the largest opening-screen area, + with endurance outlook and monitoring state visible alongside it. +- Use the muted Chalktone appearance from Glint's third screenshot as the + visual direction. +- Put Live / Day / History views inside one activity panel, keeping both + read/write totals and the selected date visible. +- Expand a focused panel within the dashboard while retaining a fixed strip + for monitoring state, observation freshness, and essential controls. +- Replace block bars with thin dotted time-series plots resembling Glint's + chart. Label volume and time axes, retain exact selected-point readouts, + and leave explicit breaks for missing or incompatible evidence. Joining + adjacent measured points is visual guidance, not additional observations. + +## Implementation recommendation + +Implement the selected visual and interaction patterns independently in +Fenris's existing Python/Textual presentation layer. Retain the collector, +observation store, shared status/projection contracts, and authenticated control +path. Glint is a Rust/Ratatui application under GPL-3.0-or-later; copying or +porting its implementation into Fenris would require a separate licensing +decision under [ADR 0009](../adr/0009-mit-license.md). Referencing general panel +and navigation patterns does not require adopting its application architecture. + +Use thin borders, compact titles, an explicit focused-panel indicator, and +restrained cream/earth-tone accents. Preserve readable contrast and semantic +state labels; the reference's dim secondary text is not a readability target. +Use Fenris content and identity, without Glint's unrelated clock, weather, +finance, email, or gallery features. + +## Existing behavior to preserve + +- Activity is measured read/write volume, with both totals accessible and + writes selected initially. A visual stock-chart reference must not turn + interval volume into speed or imply continuity through unknown evidence. +- Preserve the latest-three-hour opening view, date selection, local-day and + timezone labels, available history precision, and historical selection across + refresh under [live drive activity](live-drive-activity.md). +- Preserve the usage-adjusted theoretical lifespan and categorical projection + confidence with contributing facts. Navigation and graph selection cannot + change the projection evidence window or endurance accounting. +- Preserve explicit zero, gap, incomplete, unallocated, unavailable, paused, + stale, collection-failure, and store-fault states. +- Keep boot enablement, runtime activity, collection outcome, and observation + freshness distinct. Quit leaves background monitoring running; pause remains + a deliberate disable through the existing control path. +- Preserve keyboard and mouse access, constrained-terminal text/reflow, + high-contrast availability, reduced motion, help, and disclosures. + +## Concrete layout and interaction proposal + +- A compact identity header above one dashboard workspace. +- A narrow supporting column for the endurance outlook and drive facts; + a wide activity panel receives the remaining workspace. On the normal + dashboard, confidence and monitoring state remain visible beside activity. +- Live starts with the latest three hours; Day exposes the selected local + day's available detail; History exposes the retained longer-term evidence. + Reuse existing measurements and ranges rather than introducing a new data + model. Show selected date/timezone, read/write totals, measurement, and + evidence state wherever applicable. +- Use visible, clickable tabs; Tab/Shift+Tab and mouse clicks move focus. + Use `z` to toggle focused-panel zoom and Escape to restore the dashboard + when an input/dialog is not consuming Escape. Preserve selection, date, + range, measurement, and focus across zoom and refresh. +- Keep the bottom status/control area outside the expanding workspace. It + may wrap when required: compactness cannot merge the four service facts or + hide a fault/pause state. Keep quit distinct from pause in wording and + behavior without spending three full rows on a separate heavy quit box. +- Use existing date-navigation and read/write shortcuts, with visible help + updated for tabs, focus, and zoom. Text entry must consume its own keys. +- Use Chalktone-inspired styling as the new default while retaining existing + selectable themes, High Contrast, and reduced motion. Preserve an explicitly + saved theme preference during upgrade. +- Design for 80×24 and larger, with existing text/reflow behavior below that + size. Essential facts and actions must remain accessible; the large-screen + reference does not require squeezing its entire density into small terminals. + +These defaults implement the confirmed choices. Date entry and inspection +retain existing evidence precision: hourly/daily UTC evidence is labelled UTC, +while local-day totals keep their recorded timezone. This visual redesign does +not manufacture finer or local-hour precision from coarse UTC evidence. + +## Smallest sufficient implementation proof + +Render normal and zoomed views at a representative large terminal and 80×24, +plus a constrained terminal. Check focus/tab/zoom/date/read-write interactions +and selection persistence through refresh. Exercise paused, stale, store-fault, +missing-baseline, and incomplete-evidence displays using existing synthetic +stores and headless TUI patterns. Verify quit never invokes monitoring control +and existing action tests still cover the sanctioned helper. UI fixtures are +not evidence of the user's deployed drive state. + +## Specification reconciliation + +This accepted redesign supersedes conflicting presentation requirements in +[the original Panes specification](fenris-redesign.md#7-panes-tui) and +[dashboard clarity](dashboard-clarity.md): the full-width headline becomes a +supporting endurance panel, the history/live plots share a tabbed activity +panel, and a compact fixed control row replaces the heavy standalone quit +rail. The block-bar requirement is superseded by dotted volume plots. Their +behavioral requirements, including clear quit-versus-pause semantics, remain. + +The live-drive-activity specification excludes unrelated redesign from that +earlier task. This is a separate design request, not permission to undo its +accepted data, date-navigation, evidence, or forecast behavior. Existing design +documents and source may differ in implementation status; this assessment is +not proof that every earlier acceptance criterion has shipped. + +## Documentation scope + +No new domain term has been resolved: panel, focus, zoom, and theme are general +interface concepts and do not belong in the domain glossary. No new ADR is +needed for a reversible presentation change that retains the existing stack, +license, data model, and privilege boundary. Record any later durable +architectural trade-off separately if one emerges. + +## Implementation validation + +Implemented in Fenris's existing presentation layer with Textual 8.2.8. +The full suite passed 801 tests; 43 packaging/signing checks were skipped for +missing package artifacts or signing tools. After the final incomplete-evidence +fixes, all 81 focused dashboard, history, and plot tests passed. New renderer +and regression files pass configured Ruff checks; affected production files +pass correctness lint and the diff passes whitespace checks. Existing broader +lint warnings were not part of this redesign. + +Rendered normal and zoomed dashboards at 140×44, plus normal 80×24 and +constrained 70×20 views. The [saved preview](../../assets/dashboard-chalktone.png) +uses synthetic observations. No installation or release was performed. diff --git a/pyproject.toml b/pyproject.toml index 0aaaa86..7d50257 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "fenris" -version = "0.4.0" +version = "0.5.0" description = "NVMe wear monitor with persistent TUI" requires-python = ">=3.10" license = {file = "LICENSE"} diff --git a/src/fenris/__init__.py b/src/fenris/__init__.py index 607ce04..50ad9af 100644 --- a/src/fenris/__init__.py +++ b/src/fenris/__init__.py @@ -1,2 +1,2 @@ """Fenris: NVMe wear monitor with persistent TUI.""" -__version__ = "0.4.0" +__version__ = "0.5.0" diff --git a/src/fenris/activity_plot.py b/src/fenris/activity_plot.py new file mode 100644 index 0000000..f65d443 --- /dev/null +++ b/src/fenris/activity_plot.py @@ -0,0 +1,104 @@ +"""A terminal volume plot shared by Fenris's activity views. + +Braille provides two by four dots per terminal cell. Only adjacent, complete +measurements are connected; gaps and partial evidence never imply continuity. +The returned columns also place mouse inspection on the plotted time axis. +""" +from collections.abc import Mapping, Sequence +from dataclasses import dataclass + +from rich.text import Text + + +@dataclass(frozen=True) +class VolumePoint: + time: float + volume: int | None + label: str + state: str = "measured" + + +def volume_plot( + points: Sequence[VolumePoint], width: int, height: int, + selected: int, colors: Mapping[str, str], +) -> tuple[Text, list[int], str]: + """Render bounded axes and a dotted trace, without resampling evidence.""" + width, height = max(12, width), max(4, height) + axis_width = 8 + columns, rows = width - axis_width, height - 2 + pixel_width, pixel_height = columns * 2, rows * 4 + maximum = max((p.volume or 0 for p in points), default=0) + scale, unit = (1e12, "TB") if maximum >= 1e12 else ( + (1e9, "GB") if maximum >= 1e9 else + (1e6, "MB") if maximum >= 1e6 else + (1e3, "KB") if maximum >= 1e3 else (1, "B") + ) + ceiling = maximum or scale + start = points[0].time if points else 0 + span = (points[-1].time - start) if len(points) > 1 else 0 + xs = [round((p.time - start) / span * (pixel_width - 1)) if span else 0 + for p in points] + cells = [[0] * columns for _ in range(rows)] + # Unicode braille dot numbering, indexed by y within cell and then x. + bits = ((1, 8), (2, 16), (4, 32), (64, 128)) + + def dot(x: int, y: int) -> None: + cells[y // 4][x // 2] |= bits[y % 4][x % 2] + + previous = None + markers = {} + for index, (point, x) in enumerate(zip(points, xs)): + if point.volume is None: + previous = None + if point.state != "future": + markers[x // 2] = "?" + continue + y = round((1 - point.volume / ceiling) * (pixel_height - 1)) + y = min(pixel_height - 1, max(0, y)) + if previous is not None and point.state == "measured": + px, py = previous + steps = max(abs(x - px), abs(y - py), 1) + for step in range(steps + 1): + dot(round(px + (x - px) * step / steps), + round(py + (y - py) * step / steps)) + dot(x, y) + previous = (x, y) if point.state == "measured" else None + if point.state != "measured": + markers[x // 2] = "~" if point.state == "partial" else "u" + elif point.volume == 0: + markers.setdefault(x // 2, "·") + + selected_column = xs[selected] // 2 if 0 <= selected < len(xs) else -1 + result = Text(no_wrap=True, overflow="crop") + ticks = {0, rows // 2, rows - 1} + for row, values in enumerate(cells): + value = ceiling * (rows - 1 - row) / max(1, rows - 1) / scale + label = f"{value:6.2f}"[-6:] if row in ticks else " " + result.append(label + " │", style=colors["muted"]) + for col, value in enumerate(values): + char = chr(0x2800 + value) if value else " " + style = colors["allocated"] + if col == selected_column: + style = "bold " + colors["selection"] + if not value: + char = "┊" + style = colors["muted"] + result.append(char, style=style) + result.append("\n") + result.append(" └", style=colors["muted"]) + for col in range(columns): + result.append("▼" if col == selected_column else markers.get(col, "─"), + style=colors["selection"] if col == selected_column else colors["muted"]) + result.append("\n" + " " * axis_width) + labels = [" "] * columns + end_of_label = -1 + for index in sorted({0, len(points) // 2, len(points) - 1}): + if index < 0 or not points: + continue + label = points[index].label[:columns] + column = max(0, min(columns - len(label), xs[index] // 2 - len(label) // 2)) + if column > end_of_label: + labels[column:column + len(label)] = label + end_of_label = column + len(label) + result.append("".join(labels), style=colors["muted"]) + return result, [axis_width + x // 2 for x in xs], unit diff --git a/src/fenris/preferences.py b/src/fenris/preferences.py index 9411579..cc65f29 100644 --- a/src/fenris/preferences.py +++ b/src/fenris/preferences.py @@ -19,8 +19,8 @@ from typing import Any, Dict PREFERENCE_FILE_NAME = "preferences.json" -VALID_THEMES = {"amber", "nord", "high_contrast"} -DEFAULT_THEME = "amber" +VALID_THEMES = {"chalktone", "amber", "nord", "high_contrast"} +DEFAULT_THEME = "chalktone" DEFAULT_REDUCED_MOTION = False @@ -46,7 +46,7 @@ def load_preferences() -> Dict[str, Any]: reduced_motion: bool If the file is missing, corrupt, unreadable, or contains invalid - values, returns safe defaults (Amber theme, normal motion). + values, returns safe defaults (Chalktone theme, normal motion). """ path = get_preference_path() diff --git a/src/fenris/themes.py b/src/fenris/themes.py index ca2bb28..0480712 100644 --- a/src/fenris/themes.py +++ b/src/fenris/themes.py @@ -1,6 +1,6 @@ """Fenris theme presets (issue #80). -Three accessible colour presets: Amber (default), Nord, and High Contrast. +Chalktone-inspired default plus Amber, Nord, and High Contrast. Themes style chrome, borders, accents, muted text, and graph roles; status semantic colours/glyphs/text always win. @@ -126,7 +126,22 @@ _HIGH_CONTRAST = Theme( # Theme registry # --------------------------------------------------------------------------- +_CHALKTONE = Theme( + name="fenris-chalktone", + primary="#abc4b3", secondary="#c9b69a", accent="#dfc49a", + warning="#e9bc79", error="#e58d89", success="#acd29c", + foreground="#e0d8c5", background="#202426", surface="#202426", + panel="#252a2c", boost="#333b3d", dark=True, + variables={ + "graph-allocated": "#abc4b3", "graph-unallocated": "#dfc49a", + "graph-gap": "#e58d89", "graph-zero": "#a7b1a9", + "graph-partial": "#e9bc79", "graph-selection": "#f3dbb0", + "border-default": "#606d6a", "muted-text": "#a7b1a9", + }, +) + THEMES = { + "chalktone": _CHALKTONE, "amber": _AMBER, "nord": _NORD, "high_contrast": _HIGH_CONTRAST, @@ -138,16 +153,16 @@ THEME_NAMES = set(THEMES.keys()) def get_theme(name: str) -> Theme: """Return a registered theme by preset name. - Unknown names fall back to Amber. + Unknown names fall back to Chalktone. """ - return THEMES.get(name, _AMBER) + return THEMES.get(name, _CHALKTONE) def get_graph_colors(theme_name: str) -> Dict[str, str]: """Return the graph colour roles for a theme preset. Returns a dict with keys: allocated, unallocated, gap, zero, partial, - selection. Falls back to Amber for unknown names. + selection and muted text. Falls back to Chalktone for unknown names. """ theme = get_theme(theme_name) variables = theme.variables or {} @@ -158,4 +173,5 @@ def get_graph_colors(theme_name: str) -> Dict[str, str]: "zero": variables.get("graph-zero", "#665533"), "partial": variables.get("graph-partial", "#aa8822"), "selection": variables.get("graph-selection", "#ffd54f"), + "muted": variables.get("muted-text", "#a7b1a9"), } diff --git a/src/fenris/tui.py b/src/fenris/tui.py index af3e883..1f59daa 100644 --- a/src/fenris/tui.py +++ b/src/fenris/tui.py @@ -1,10 +1,7 @@ -"""Panes TUI: keyboard-first Textual app (spec §7, TUI-1, TUI-4). +"""Fenris terminal dashboard with tabbed volume plots and focused-panel zoom. -One dense screen, four normative regions: - 1. Headline band (full width, top) - 2. Usage-history pane (left, wider) - 3. Drive-health + settings pane (right, narrower) - 4. Service strip (full width, bottom) +Presentation follows docs/spec/glint-dashboard-design.md; shared status, +projection, evidence, and privileged-action contracts remain unchanged. Bindings: p (pause, asks), r (resume), c (collect now), d (disclosures), q (quit). Privileged actions route through fenris-monitor as terminal-attached subprocesses @@ -25,8 +22,11 @@ from textual.app import App, ComposeResult from textual.binding import Binding from textual.containers import Container, Horizontal, VerticalScroll from textual.screen import ModalScreen +from textual.message import Message from textual.widget import Widget -from textual.widgets import Input, Static +from textual.widgets import Input, Static, Tab, Tabs + +from .activity_plot import VolumePoint, volume_plot from .projection import ( ConfidenceState, @@ -53,7 +53,7 @@ from .status_composition import ( from .control import MONITOR_HELPER, MonitorError, run_monitor from .derive import _parse_ts from .preferences import load_preferences, save_preferences -from .themes import THEMES, THEME_NAMES, get_theme, get_graph_colors +from .themes import THEMES, get_graph_colors # --------------------------------------------------------------------------- @@ -105,21 +105,11 @@ def _can_render_wolf(width: int) -> bool: # --------------------------------------------------------------------------- -# Bar graph glyphs and constants +# History ranges # --------------------------------------------------------------------------- -_GLYPH_ALLOCATED = "\u2588" # \u2588 full block -_GLYPH_UNALLOCATED = "\u2592" # \u2592 medium shade -_GLYPH_GAP = "\u2591" # \u2591 light shade -_GLYPH_ZERO = "\u00b7" # \u00b7 middle dot -_GLYPH_PARTIAL = "\u2504" # \u2504 partial-period cap -_GLYPH_SELECTED = "\u25bc" # \u25bc selection marker - _RANGE_OPTIONS = (7, 14, 30, 90) _RANGE_DEFAULT = 14 -_BAR_HEIGHT = 6 -_BAR_WIDTH = 2 -_BAR_SPACING = 1 # Terminal size thresholds for constrained layout (issue #81) _MIN_WIDTH = 80 @@ -127,28 +117,28 @@ _MIN_HEIGHT = 24 # --------------------------------------------------------------------------- -# Interactive daily bar graph widget +# Interactive history plot widget # --------------------------------------------------------------------------- -class DailyBarGraph(Widget): - """Interactive daily writes bar graph with hourly drill-down. - - Renders writes-only daily bars using block glyphs, supports keyboard - and mouse navigation, range switching (7/14/30/90 days), day selection, - and hourly drill-down. No plotting dependency (issue #75 AC5). - """ +class HistoryGraph(Widget): + """Historical read/write volume plots with day and hour inspection.""" can_focus = True can_focus_children = False - CSS = """ - DailyBarGraph { + class DaySelected(Message): + def __init__(self, day: str) -> None: + super().__init__() + self.day = day + + DEFAULT_CSS = """ + HistoryGraph { height: 100%; width: 100%; layout: vertical; } #bar-range { - height: 1; + height: auto; width: 100%; } #bar-render { @@ -157,11 +147,12 @@ class DailyBarGraph(Widget): overflow: hidden; } #bar-legend { - height: 1; + height: auto; width: 100%; } #bar-readout { - height: 2; + height: auto; + min-height: 2; width: 100%; } """ @@ -178,8 +169,10 @@ class DailyBarGraph(Widget): self._max_bytes: int = 0 self._hourly_selected: int = -1 self._drill_unallocated_bytes: int = 0 - self._visible_start: int = 0 self._on_drill: Optional[Callable[[str], None]] = None + self.measure = "written" + self._point_columns: list[int] = [] + self._empty_message = "Awaiting first sample" def compose(self) -> ComposeResult: yield Static("", id="bar-range") @@ -192,8 +185,10 @@ class DailyBarGraph(Widget): day_data: List[Dict[str, Any]], on_drill: Any = None, selected_date: Optional[str] = None, + empty_message: str = "Awaiting first sample", ) -> None: """Update graph with day data. on_drill(day) called on drill entry.""" + self._empty_message = empty_message selected_day = selected_date if selected_day is None and 0 <= self.selected_index < len(self._day_data): selected_day = self._day_data[self.selected_index].get("day") @@ -251,26 +246,27 @@ class DailyBarGraph(Widget): return self._render_range() self._render_bars() - self._render_legend() self._render_readout() def _show_empty(self) -> None: self.query_one("#bar-range").update( "[dim]Usage history · %d days · UTC[/dim]" % self.range_days ) - self.query_one("#bar-render").update("[dim]Awaiting first sample[/dim]") + self.query_one("#bar-render").update( + ("Graph needs ≥80×24\n" if self._is_constrained() else "") + self._empty_message) self.query_one("#bar-legend").update("") self.query_one("#bar-readout").update("") def _is_constrained(self, terminal_width: int = 0) -> bool: - """Return True when the terminal or widget is too narrow for the bar graph. + """Return True when the terminal or widget is too narrow for the plot. - At 80 columns with a 3fr:2fr grid split the pane content width is ~46 - (after round border + padding). Below 32 the bars become unreadable. + Below 32 columns the plot axes and time labels become unreadable. When terminal_width is provided (issue #81), also check against _MIN_WIDTH. """ try: w = self.region.width + if self.is_mounted and (self.app.size.width < _MIN_WIDTH or self.app.size.height < _MIN_HEIGHT): + return True if terminal_width > 0 and terminal_width < _MIN_WIDTH: return True return 0 < w < 32 @@ -300,19 +296,7 @@ class DailyBarGraph(Widget): ) self.query_one("#bar-legend").update("") - # Preserve selection readout - if 0 <= self.selected_index < len(self._day_data): - day = self._day_data[self.selected_index] - self.query_one("#bar-readout").update( - "[bold]%s[/bold] \u00b7 W %.3f GB \u00b7 R %.3f GB" - % ( - day.get("local_label", ""), - day.get("total_written", day.get("total_bytes", 0)) / 1e9, - day.get("total_read", 0) / 1e9, - ) - ) - else: - self.query_one("#bar-readout").update("[dim]No selectable day[/dim]") + self._render_readout() def _show_constrained_hourly_summary(self) -> None: """Textual fallback for hourly view when terminal is too small.""" @@ -330,18 +314,7 @@ class DailyBarGraph(Widget): ) self.query_one("#bar-legend").update("") - if 0 <= self._hourly_selected < len(self._hour_data): - h = self._hour_data[self._hourly_selected] - self.query_one("#bar-readout").update( - "[bold]%s[/bold] \u00b7 W %.3f GB \u00b7 R %.3f GB" - % ( - h.get("local_label", ""), - h.get("bytes_written", 0) / 1e9, - h.get("bytes_read", 0) / 1e9, - ) - ) - else: - self.query_one("#bar-readout").update("[dim]\u2190 \u2192 Select hour[/dim]") + self._render_hourly_readout() def on_resize(self) -> None: """Re-render when terminal size changes.""" @@ -358,116 +331,39 @@ class DailyBarGraph(Widget): parts.append("[reverse bold]\\[%s][/reverse bold]" % label) else: parts.append("[%s]" % label) - label = "Usage history · %d days · UTC %s" % ( + label = "%d days · UTC %s" % ( self.range_days, " ".join(parts), ) if self.view_mode == "hourly": - label = "Usage history · Hourly · UTC · [bold]%s[/bold] · Esc Back" % ( + label = "Hourly · UTC · [bold]%s[/bold] · Backspace History" % ( self.drill_day or "", ) self.query_one("#bar-range").update(label) - def _visible_items(self, items: List[Dict[str, Any]], selected: int) -> tuple[int, List[Dict[str, Any]]]: - """Return the readable viewport containing the selected item.""" - width = getattr(getattr(self, "region", None), "width", 0) or 52 - capacity = max(1, (width - 12) // (_BAR_WIDTH + _BAR_SPACING)) - capacity = min(capacity, len(items)) - if capacity >= len(items): - return 0, items - selected = max(0, selected) - start = min(max(0, selected - capacity + 1), len(items) - capacity) - return start, items[start:start + capacity] - - @staticmethod - def _unit_scale(max_bytes: int) -> tuple[float, str]: - if max_bytes >= 1_000_000_000_000: - return 1e12, "TB" - if max_bytes >= 1_000_000_000: - return 1e9, "GB" - return 1e6, "MB" - def _render_bars(self) -> None: - start, visible = self._visible_items(self._day_data, self.selected_index) - self._visible_start = start - if not visible: - self.query_one("#bar-render").update("") - return - - max_bytes = self._max_bytes or 1 - render_height = self.query_one("#bar-render").region.height - bar_h = max(1, min(_BAR_HEIGHT, render_height - 2)) - n = len(visible) - - scale, unit = _unit_scale(max_bytes) - lines: List[str] = [ - "Writes (%s) · %s → %s UTC" % ( - unit, visible[0].get("day", ""), visible[-1].get("day", ""), + points = [] + for index, day in enumerate(self._day_data): + volume = day.get("total_read", 0) if self.measure == "read" else day.get("total_bytes", 0) + unallocated = day.get("unallocated_read" if self.measure == "read" else "unallocated_bytes", 0) + state = "unallocated" if unallocated else "gap" if day.get("is_gap") else ( + "partial" if day.get("is_partial") else "measured" ) - ] - for row in range(bar_h, 0, -1): - if row == bar_h: - axis = "%7.2f " % (max_bytes / scale) - elif row == (bar_h + 1) // 2 and row != 1: - axis = "%7.2f " % (max_bytes / scale / 2) - elif row == 1: - axis = "%7s " % "0" - else: - axis = " " - line = axis - threshold = (row / bar_h) * max_bytes - for i, day in enumerate(visible): - allocated = day.get("allocated_bytes", 0) - total = day.get("total_bytes", 0) - is_zero = day.get("is_zero", False) - is_gap = day.get("is_gap", False) - if is_zero and row == 1: - glyph = _GLYPH_ZERO - elif is_gap: - glyph = _GLYPH_GAP if row <= 2 else " " - elif total == 0: - glyph = " " - elif day.get("is_partial") and row == max( - 1, (total * bar_h + max_bytes - 1) // max_bytes, - ): - glyph = _GLYPH_PARTIAL - elif threshold <= allocated: - glyph = _GLYPH_ALLOCATED - elif threshold <= total: - glyph = _GLYPH_UNALLOCATED - else: - glyph = " " + points.append(VolumePoint(index, None if state == "gap" else volume, + day.get("day", "")[5:], state)) + self._plot(points, self.selected_index) - line += glyph * _BAR_WIDTH - if i < n - 1: - line += " " * _BAR_SPACING - - lines.append(line) - - # Date labels - label_line = "Day UTC " - for i, day in enumerate(visible): - label = day.get("local_label", day.get("day", ""))[-2:] - if start + i == self.selected_index: - label = _GLYPH_SELECTED + label[-1:] - label_line += label - if i < n - 1: - label_line += " " * _BAR_SPACING - lines.append(label_line) - - self.query_one("#bar-render").update("\n".join(lines)) - - def _render_legend(self) -> None: - legend = ( - "%s Alloc %s Unalloc %s Gap %s Zero %s Partial" - % ( - _GLYPH_ALLOCATED, - _GLYPH_UNALLOCATED, - _GLYPH_GAP, - _GLYPH_ZERO, - _GLYPH_PARTIAL, - ) + def _plot(self, points: list[VolumePoint], selected: int) -> None: + target = self.query_one("#bar-render") + colors = get_graph_colors(getattr(self.app, "_current_theme_name", "chalktone")) + chart, self._point_columns, unit = volume_plot( + points, target.content_size.width or 40, target.content_size.height or 8, + selected, colors, + ) + target.update(chart) + self.query_one("#bar-legend").update( + ("Reads" if self.measure == "read" else "Writes") + + " (%s) · ? Gap · · Zero · ~ Partial · u Unalloc" % unit ) - self.query_one("#bar-legend").update(legend) def _render_readout(self) -> None: if self.selected_index < 0 or self.selected_index >= len(self._day_data): @@ -475,6 +371,17 @@ class DailyBarGraph(Widget): return day = self._day_data[self.selected_index] + if day.get("is_gap"): + # Known daily evidence survives missing hourly coverage; absent + # evidence must not be presented as a measured zero. + volumes = [] + for label, key in (("W", "unallocated_bytes"), ("R", "unallocated_read")): + volume = day.get(key, 0) + volumes.append("%s %.3f GB unallocated" % (label, volume / 1e9) + if volume else "%s unavailable" % label) + self.query_one("#bar-readout").update( + "%s UTC · gap\n%s" % (day.get("day", ""), " · ".join(volumes))) + return total_written = day.get("total_written", day.get("total_bytes", 0)) total_read = day.get("total_read", 0) allocated_w = day.get("allocated_bytes", 0) @@ -484,9 +391,7 @@ class DailyBarGraph(Widget): coverage = day.get("coverage", 0) hours = day.get("evidenced_hours", 0) - state = " · partial" if day.get("is_partial") else ( - " · gap" if day.get("is_gap") else "" - ) + state = " · partial" if day.get("is_partial") else "" parts = [ "[bold]%s UTC[/bold] \u00b7 W %.3f GB \u00b7 R %.3f GB \u00b7 %d hours \u00b7 %.0f%% coverage%s" % ( @@ -518,6 +423,8 @@ class DailyBarGraph(Widget): def _refresh_hourly(self) -> None: if not self._hour_data: self.query_one("#bar-render").update("[dim]No hourly data[/dim]") + self.query_one("#bar-legend").update("") + self.query_one("#bar-readout").update("") return self._render_range() @@ -526,79 +433,27 @@ class DailyBarGraph(Widget): self._show_constrained_hourly_summary() return - max_bytes = max( - (h.get("bytes_written", 0) for h in self._hour_data), default=0 - ) or 1 - start, visible = self._visible_items(self._hour_data, self._hourly_selected) - self._visible_start = start - render_height = self.query_one("#bar-render").region.height - bar_h = max(1, min(_BAR_HEIGHT, render_height - 2)) - n = len(visible) - scale, unit = _unit_scale(max_bytes) - - lines: List[str] = [ - "Writes (%s) · %s:00 → %s:00 UTC" % ( - unit, - visible[0].get("local_label", ""), - visible[-1].get("local_label", ""), + points = [] + for index, hour in enumerate(self._hour_data): + state = "future" if hour.get("is_future") else ( + "gap" if hour.get("is_gap") else "partial" if hour.get("is_partial") else "measured" ) - ] - for row in range(bar_h, 0, -1): - if row == bar_h: - axis = "%7.2f " % (max_bytes / scale) - elif row == (bar_h + 1) // 2 and row != 1: - axis = "%7.2f " % (max_bytes / scale / 2) - elif row == 1: - axis = "%7s " % "0" - else: - axis = " " - line = axis - threshold = (row / bar_h) * max_bytes - for i, hour in enumerate(visible): - bw = hour.get("bytes_written", 0) - if hour.get("is_future"): - glyph = " " - elif hour.get("is_gap"): - glyph = _GLYPH_GAP if row <= 2 else " " - elif hour.get("is_zero") and row == 1: - glyph = _GLYPH_ZERO - elif bw == 0: - glyph = " " - elif hour.get("is_partial") and row == max( - 1, (bw * bar_h + max_bytes - 1) // max_bytes, - ): - glyph = _GLYPH_PARTIAL - elif threshold <= bw: - glyph = _GLYPH_ALLOCATED - else: - glyph = " " - line += glyph * _BAR_WIDTH - if i < n - 1: - line += " " * _BAR_SPACING - lines.append(line) + volume = hour.get("bytes_read" if self.measure == "read" else "bytes_written", 0) + points.append(VolumePoint(index, None if state in ("future", "gap") else volume, + hour.get("local_label", "") + ":00", state)) + self._plot(points, self._hourly_selected) - label_line = "Hour UTC" - for i, hour in enumerate(visible): - label = hour.get("local_label", hour.get("hour", ""))[-2:] - if start + i == self._hourly_selected: - label = _GLYPH_SELECTED + label[-1:] - label_line += " " + label - if i < n - 1: - label_line += " " * max(0, _BAR_SPACING - 1) - lines.append(label_line) + self._render_hourly_readout() - self.query_one("#bar-render").update("\n".join(lines)) - self.query_one("#bar-legend").update( - "%s Writes · %s Gap · %s Zero · %s Partial" - % (_GLYPH_ALLOCATED, _GLYPH_GAP, _GLYPH_ZERO, _GLYPH_PARTIAL) - ) - - # Hourly readout + def _render_hourly_readout(self) -> None: if 0 <= self._hourly_selected < len(self._hour_data): h = self._hour_data[self._hourly_selected] - state = " · partial" if h.get("is_partial") else ( - " · gap" if h.get("is_gap") else "" - ) + if h.get("is_gap") or h.get("is_future"): + self.query_one("#bar-readout").update( + "%s:00 UTC · %s\nW unavailable · R unavailable" % ( + h.get("local_label", ""), "future" if h.get("is_future") else "gap")) + return + state = " · partial" if h.get("is_partial") else "" note = "" if self._drill_unallocated_bytes: note = "\n%.3f GB could not be assigned to an hour" % ( @@ -657,6 +512,13 @@ class DailyBarGraph(Widget): self._refresh() event.stop() + if event.key in ("left", "right", "1", "2", "3", "4"): + self._notify_selection() + + def _notify_selection(self) -> None: + if 0 <= self.selected_index < len(self._day_data): + self.post_message(self.DaySelected(self._day_data[self.selected_index]["day"])) + def _enter_drill(self) -> None: if self.selected_index < 0 or self.selected_index >= len(self._day_data): return @@ -665,12 +527,9 @@ class DailyBarGraph(Widget): self._drill_unallocated_bytes = day.get("unallocated_bytes", 0) self.view_mode = "hourly" self._hourly_selected = -1 + self._render_range() if self._on_drill: self._on_drill(self.drill_day) - self._render_range() - self.query_one("#bar-render").update("[dim]loading...[/dim]") - self.query_one("#bar-legend").update("") - self.query_one("#bar-readout").update("") def _exit_drill(self) -> None: self.view_mode = "daily" @@ -680,8 +539,12 @@ class DailyBarGraph(Widget): self._refresh() def _handle_hourly_key(self, event: Any) -> None: + if event.key == "escape" and getattr(self.app, "_zoomed_panel", None): + return if event.key in ("escape", "backspace"): self._exit_drill() + if hasattr(self.app, "_set_activity_view"): + self.app._set_activity_view("history") event.stop() elif event.key == "left": if self._hourly_selected < 0: @@ -718,10 +581,7 @@ class DailyBarGraph(Widget): old_day = self._day_data[self.selected_index].get("day") # Count actual data days (not gaps) after the target - n_data_after = sum( - 1 for d in self._all_day_data[idx:] - if d.get("sample_count", 0) > 0 or d.get("total_bytes", 0) > 0 - ) + n_data_after = len(self._all_day_data) - idx if n_data_after > self.range_days: self.range_days = max(n_data_after, min(_RANGE_OPTIONS)) @@ -738,17 +598,20 @@ class DailyBarGraph(Widget): def on_click(self, event: Any) -> None: render = self.query_one("#bar-render") - offset_x = event.x - render.region.x - bar_total = _BAR_WIDTH + _BAR_SPACING - idx = max(0, offset_x - 8) // bar_total + if not self._point_columns or not render.region.contains(event.screen_x, event.screen_y): + return + self.focus() + offset_x = event.screen_x - render.content_region.x + idx = min(range(len(self._point_columns)), key=lambda i: abs(self._point_columns[i] - offset_x)) if self.view_mode == "daily": - global_idx = self._visible_start + idx + global_idx = idx if 0 <= global_idx < len(self._day_data): self.selected_index = global_idx self._refresh() + self._notify_selection() else: - global_idx = self._visible_start + idx + global_idx = idx if 0 <= global_idx < len(self._hour_data): self._hourly_selected = global_idx self._refresh_hourly() @@ -762,7 +625,7 @@ def _query_daily_graph_data( conn: sqlite3.Connection, window_end: Optional[datetime] = None, ) -> List[Dict[str, Any]]: - """Query day aggregates for the bar graph. + """Query day aggregates for the history plot. Returns one dict per day with total/allocated/unallocated bytes, coverage, evidence hours, and classification flags. @@ -1022,8 +885,7 @@ def _query_live_graph_data( class LiveActivityGraph(Widget): """Rolling last-three-hours interval volume graph with read/write toggle. - Renders interval written (or read) volumes as vertical bars using block - glyphs. Supports keyboard and mouse navigation, a read/write toggle + Renders interval written (or read) volumes as a dotted time-series plot. Supports keyboard and mouse navigation, a read/write toggle (w key), and selected-point inspection showing timestamps, timezone, measured volume, and evidence state. Reads only committed observation-store evidence. @@ -1032,14 +894,14 @@ class LiveActivityGraph(Widget): can_focus = True can_focus_children = False - CSS = """ + DEFAULT_CSS = """ LiveActivityGraph { height: 100%; width: 100%; layout: vertical; } #live-header { - height: 1; + height: auto; width: 100%; } #live-render { @@ -1048,11 +910,12 @@ class LiveActivityGraph(Widget): overflow: hidden; } #live-legend { - height: 1; + height: auto; width: 100%; } #live-readout { - height: 2; + height: auto; + min-height: 2; width: 100%; } """ @@ -1062,6 +925,8 @@ class LiveActivityGraph(Widget): self._data: List[Dict[str, Any]] = [] self._selected_index: int = -1 self._measure: str = "written" # "written" or "read" + self._point_columns: list[int] = [] + self._empty_message = "Awaiting intervals" def compose(self) -> ComposeResult: yield Static("", id="live-header") @@ -1078,8 +943,9 @@ class LiveActivityGraph(Widget): self._measure = "read" if self._measure == "written" else "written" self._refresh() - def set_data(self, data: List[Dict[str, Any]]) -> None: + def set_data(self, data: List[Dict[str, Any]], empty_message: str = "Awaiting intervals") -> None: """Update graph with live interval data.""" + self._empty_message = empty_message prev_selected_end = None if 0 <= self._selected_index < len(self._data): prev_selected_end = self._data[self._selected_index].get("end_ts") @@ -1102,87 +968,43 @@ class LiveActivityGraph(Widget): def _refresh(self) -> None: self._render_header() if not self._data: - self.query_one("#live-render").update("[dim]Awaiting intervals[/dim]") + self.query_one("#live-render").update(Text(self._empty_message)) self.query_one("#live-legend").update("") self.query_one("#live-readout").update("") return self._render_bars() - self._render_legend() self._render_readout() def _render_header(self) -> None: label = "Writes" if self._measure == "written" else "Reads" - toggle_hint = "w Toggle W/R" n = len(self._data) self.query_one("#live-header").update( - "Live %s · last %dh · %d intervals · %s" - % (label.lower(), LIVE_WINDOW_H, n, toggle_hint) + "%s · last %dh · %d intervals" + % (label, LIVE_WINDOW_H, n) ) def _render_bars(self) -> None: - max_bytes = max( - (self._current_bytes(d) for d in self._data), default=0 - ) or 1 - - render_height = self.query_one("#live-render").region.height - bar_h = max(1, min(_BAR_HEIGHT, render_height - 2)) - n = len(self._data) - scale, unit = _unit_scale(max_bytes) - - measure_label = "Writes" if self._measure == "written" else "Reads" - lines: List[str] = [ - "%s (%s) · %s → %s" % ( - measure_label, unit, - self._data[0].get("start_label", ""), - self._data[-1].get("end_label", ""), - ) - ] - for row in range(bar_h, 0, -1): - if row == bar_h: - axis = "%7.2f " % (max_bytes / scale) - elif row == (bar_h + 1) // 2 and row != 1: - axis = "%7.2f " % (max_bytes / scale / 2) - elif row == 1: - axis = "%7s " % "0" - else: - axis = " " - line = axis - threshold = (row / bar_h) * max_bytes - for i, item in enumerate(self._data): - bw = self._current_bytes(item) - if item.get("is_gap") or item.get("is_segment_boundary"): - glyph = _GLYPH_GAP if row <= 2 else " " - elif bw == 0 and item.get("is_zero"): - glyph = _GLYPH_ZERO if row == 1 else " " - elif bw == 0: - glyph = " " - elif threshold <= bw: - glyph = _GLYPH_ALLOCATED - else: - glyph = " " - line += glyph * _BAR_WIDTH - if i < n - 1: - line += " " * _BAR_SPACING - lines.append(line) - - # Time labels - label_line = "Time " - for i, item in enumerate(self._data): - label = item.get("start_label", "")[-2:] - if i == self._selected_index: - label = _GLYPH_SELECTED + label[-1:] - label_line += label - if i < n - 1: - label_line += " " * _BAR_SPACING - lines.append(label_line) - - self.query_one("#live-render").update("\n".join(lines)) - - def _render_legend(self) -> None: + target = self.query_one("#live-render") + points = [VolumePoint( + _parse_ts(item["end_ts"]).timestamp(), + None if item.get("is_gap") or item.get("is_segment_boundary") else self._current_bytes(item), + item.get("end_label", ""), + "gap" if item.get("is_gap") or item.get("is_segment_boundary") else "measured", + ) for item in self._data] + if self.app.size.width < _MIN_WIDTH or self.app.size.height < _MIN_HEIGHT: + self._point_columns = [] + self.query_one("#live-legend").update("") + target.update("Graph needs ≥80×24\n%d measured intervals · ← → Inspect\n%s → %s UTC" % ( + len(self._data), self._data[0].get("start_label", ""), self._data[-1].get("end_label", ""))) + return + chart, self._point_columns, unit = volume_plot( + points, target.content_size.width or 40, target.content_size.height or 8, + self._selected_index, get_graph_colors(getattr(self.app, "_current_theme_name", "chalktone")), + ) + target.update(chart) self.query_one("#live-legend").update( - "%s Volume %s Gap %s Zero" % ( - _GLYPH_ALLOCATED, _GLYPH_GAP, _GLYPH_ZERO, - ) + ("Reads" if self.measure == "read" else "Writes") + + " (%s / interval) · UTC · ? Gap · · Zero" % unit ) def _render_readout(self) -> None: @@ -1191,6 +1013,11 @@ class LiveActivityGraph(Widget): return item = self._data[self._selected_index] + if item.get("is_segment_boundary"): + self.query_one("#live-readout").update( + "%s → %s UTC · segment boundary\nW unavailable · R unavailable" % ( + item.get("start_label", ""), item.get("end_label", ""))) + return bw = item.get("bytes_written", 0) br = item.get("bytes_read", 0) measure_val = bw if self._measure == "written" else br @@ -1201,7 +1028,7 @@ class LiveActivityGraph(Widget): state_parts.append("gap") if item.get("is_segment_boundary"): state_parts.append("segment boundary") - if item.get("is_zero"): + if item.get("is_zero") and not item.get("is_gap") and not item.get("is_segment_boundary"): state_parts.append("measured zero") state = " · " + ", ".join(state_parts) if state_parts else "" @@ -1234,15 +1061,14 @@ class LiveActivityGraph(Widget): ) self._refresh() event.stop() - elif event.key == "w": - self.toggle_measure() - event.stop() def on_click(self, event: Any) -> None: render = self.query_one("#live-render") - offset_x = event.x - render.region.x - bar_total = _BAR_WIDTH + _BAR_SPACING - idx = max(0, offset_x - 8) // bar_total + if not self._point_columns or not render.region.contains(event.screen_x, event.screen_y): + return + self.focus() + offset_x = event.screen_x - render.content_region.x + idx = min(range(len(self._point_columns)), key=lambda i: abs(self._point_columns[i] - offset_x)) if 0 <= idx < len(self._data): self._selected_index = idx self._refresh() @@ -1369,11 +1195,14 @@ class HelpScreen(ModalScreen[None]): "[bold]Keyboard controls[/bold]\n" + _ACTION_LEGEND + "\n" "q Quit the dashboard — monitoring continues\n" - "Tab Focus the graph · ← → Select · 1-4 Change range\n" + "Tab / Shift+Tab Focus panels · ← → Select · 1-4 History range\n" + "v Live / Day / History · z Zoom panel · Esc Restore\n" "[ Previous day · ] Next day · g Go to date\n" "Enter Show hours · Esc Return to days\n" - "w Toggle W/R on live graph\n" - "Theme changed via preferences file\n\n" + "w Toggle read/write volume on every graph\n" + "s Cycle Chalktone / Amber / Nord / High Contrast\n" + "Dotted lines join adjacent measured volumes; gaps are never filled.\n" + "Values are bytes per interval, hour, or day, not transfer speed.\n\n" "[dim]↑ ↓ Scroll · Esc Close[/dim]", id="help-text", ) @@ -1455,94 +1284,56 @@ class FenrisTuiApp(App): SUB_TITLE = "" CSS = """ + Screen { background: $background; color: $text; } + #identity { height: 1; padding: 0 1; color: $accent; } + #auth-notice { height: auto; padding: 0 1; color: $text-muted; } + #dashboard-scroll { height: 1fr; } #main-grid { layout: grid; - grid-size: 2 5; - grid-columns: 3fr 2fr; - grid-rows: auto 10 8 auto 3; - height: auto; - } - #main-grid.local-day { - grid-size: 2 6; - grid-rows: auto 10 8 auto auto 3; - } - #main-grid.paused { - grid-size: 2 6; - grid-rows: auto auto 10 8 auto 3; - } - #main-grid.paused.local-day { - grid-size: 2 7; - grid-rows: auto auto 10 8 auto auto 3; - } - #main-grid.constrained { - grid-size: 1 5; - grid-columns: 1fr; - grid-rows: auto auto auto auto auto; - } - #main-grid.constrained.local-day { - grid-size: 1 6; - grid-rows: auto auto auto auto auto auto; - } - #main-grid.constrained.paused { - grid-size: 1 6; - grid-rows: auto auto auto auto auto auto; - } - #main-grid.constrained.paused.local-day { - grid-size: 1 7; - grid-rows: auto auto auto auto auto auto auto; - } - #main-grid.constrained #usage-history { - display: none; - } - #main-grid.constrained #constrained-summary { - display: block; - } - #main-grid.constrained #live-activity { - display: none; - } - #constrained-summary { - display: none; - border: round #555555; - padding: 0 1; - height: auto; - min-height: 3; - } - #live-activity { - column-span: 2; - border: round #555555; - padding: 0 1; - height: auto; - min-height: 5; - } - #local-day { - column-span: 2; - display: none; - border: round #555555; - padding: 0 1; - height: auto; - min-height: 3; - } - #dashboard-scroll { height: 1fr; } - #headline-band { column-span: 2; height: auto; min-height: 8; } - #paused-banner { - column-span: 2; - display: none; - background: $error 20%; - color: $text; - height: auto; - min-height: 5; - } - #service-strip { column-span: 2; height: auto; } - #quit-rail { - column-span: 2; - border: heavy $accent; - content-align: center middle; + grid-size: 2 2; + grid-columns: 1fr 2fr; + grid-rows: 3fr 2fr; + grid-gutter: 0 1; height: 100%; } - .pane { border: round #555555; padding: 0 1; height: 100%; } - #confirm-text { padding: 1 2; } - #disc-text { padding: 1 2; } - #help-text { padding: 1 2; } + .dashboard-pane { + border: round $primary 35%; + border-title-color: $text; + padding: 0 1; + scrollbar-size: 1 1; + } + .dashboard-pane:focus, .dashboard-pane:focus-within { + border: round $accent; + border-title-color: $accent; + } + #activity-panel { row-span: 2; height: 100%; } + #headline-band, #drive-health { height: auto; } + #activity-tabs { height: 1; margin: 0; } + #activity-tabs Underline { display: none; } + #activity-tabs Tab { padding: 0 1; height: 1; } + #activity-tools { height: 1; color: $accent; } + #usage-history, #live-activity { height: 1fr; min-height: 6; } + #bar-render, #live-render { min-height: 4; } + #local-day { height: auto; min-height: 2; color: $text; } + #paused-banner { display: none; height: auto; background: $warning 15%; padding: 0 1; } + #status-area { height: auto; max-height: 35%; scrollbar-size: 1 1; } + #service-strip { height: auto; padding: 0 1; border-top: solid $primary 35%; } + #action-rail { height: auto; padding: 0 1; color: $accent; } + #main-grid.zoomed { grid-size: 1 1; grid-columns: 1fr; grid-rows: 1fr; } + #main-grid.zoomed .dashboard-pane { display: none; } + #main-grid.zoomed .dashboard-pane.zoom-target { display: block; row-span: 1; } + #main-grid.constrained { layout: vertical; height: auto; } + #main-grid.constrained .dashboard-pane { height: auto; } + #main-grid.constrained #activity-panel { height: auto; } + #main-grid.constrained #live-activity, #main-grid.constrained #usage-history { + height: auto; min-height: 0; + } + #main-grid.constrained #live-render, #main-grid.constrained #bar-render { + height: auto; min-height: 0; + } + #main-grid.constrained #endurance-panel { max-height: 16; } + #main-grid.constrained.zoomed .zoom-target { height: 24; } + #confirm-text, #disc-text, #help-text { padding: 1 2; } """ BINDINGS = [ @@ -1558,6 +1349,10 @@ class FenrisTuiApp(App): Binding("w", "toggle_measure", "W/R", show=False), Binding("?", "help", "Help", show=False), Binding("q", "quit", "Quit", show=False), + Binding("z", "toggle_zoom", "Zoom", show=False), + Binding("escape", "exit_zoom", "Restore", show=False), + Binding("v", "next_view", "View", show=False), + Binding("s", "cycle_theme", "Theme", show=False), ] def __init__( @@ -1590,109 +1385,145 @@ class FenrisTuiApp(App): # Track the date the user is browsing (None = live/today view) self._browse_date: Optional[str] = None + self._activity_view = "live" + self._zoomed_panel: Optional[str] = None def compose(self) -> ComposeResult: + yield Static(_IDENTITY_FULL, id="identity") + yield Static("Open with fenris (no sudo). Actions authenticate via polkit. ? Help", id="auth-notice") + yield Static("", id="paused-banner") with VerticalScroll(id="dashboard-scroll"): with Container(id="main-grid"): - yield Static("", id="headline-band", classes="pane") - yield Static("", id="paused-banner") - yield DailyBarGraph(id="usage-history", classes="pane") - yield Static("", id="constrained-summary", classes="pane") - yield LiveActivityGraph(id="live-activity") - yield Static("", id="drive-health", classes="pane") - yield Static("", id="local-day", classes="pane") - yield Static("", id="service-strip", classes="pane") - yield Static("q Quit TUI", id="quit-rail") + with VerticalScroll(id="endurance-panel", classes="dashboard-pane"): + yield Static("", id="headline-band") + with Container(id="activity-panel", classes="dashboard-pane"): + yield Tabs(Tab("Live", id="view-live"), Tab("Day", id="view-day"), + Tab("History", id="view-history"), id="activity-tabs") + yield Static("", id="local-day") + yield Static( + "[@click=app.prev_day]← Day[/] [@click=app.next_day]Day →[/] " + "[@click=app.go_to_date]g Date[/] [@click=app.today]t Today[/] " + "[@click=app.toggle_measure]w W/R[/]", id="activity-tools") + yield LiveActivityGraph(id="live-activity") + yield HistoryGraph(id="usage-history") + with VerticalScroll(id="drive-panel", classes="dashboard-pane"): + yield Static("", id="drive-health") + with VerticalScroll(id="status-area"): + yield Static("", id="service-strip") + yield Static( + "[@click=app.pause]p Pause[/] · [@click=app.resume]r Resume[/] · " + "[@click=app.collect]c Collect[/] · [@click=app.disclose]d Disclosures[/] · " + "[@click=app.quit]q Quit TUI[/]\n" + "Tab Focus · [@click=app.toggle_zoom]z Zoom[/] · [@click=app.next_view]v View[/] · " + "[@click=app.cycle_theme]s Theme[/] · [@click=app.toggle_motion]m Motion[/] · " + "[@click=app.help]? Help[/]", id="action-rail") def on_mount(self) -> None: - """Set border titles, apply theme, and render initial state.""" - # Apply loaded theme (issue #80) - # Preference uses underscores (high_contrast); Textual theme uses dashes (fenris-high-contrast) self.theme = "fenris-%s" % self._current_theme_name.replace("_", "-") - - self.query_one("#headline-band").border_title = "Headline" - self.query_one("#usage-history").border_title = "Usage history" - self.query_one("#constrained-summary").border_title = "Usage history" - self.query_one("#drive-health").border_title = "Drive" + self.query_one("#endurance-panel").border_title = "Endurance outlook" + self.query_one("#activity-panel").border_title = "Drive activity" + self.query_one("#drive-panel").border_title = "Drive" self.query_one("#live-activity").border_title = "Live activity" - self.query_one("#local-day").border_title = "Local day" - self.query_one("#service-strip").border_title = "Monitoring and actions" - self._refresh_timer = self.set_interval( - self.refresh_interval_s, self.on_refresh_tick - ) + self._refresh_timer = self.set_interval(self.refresh_interval_s, self.on_refresh_tick) + self._refresh() + self._apply_activity_view() + self.query_one("#live-activity").focus(scroll_visible=not self._is_constrained_mode) + + def _apply_activity_view(self) -> None: + self.query_one("#live-activity").display = self._activity_view == "live" + self.query_one("#usage-history").display = self._activity_view != "live" + self.query_one("#activity-tabs", Tabs).active = "view-" + self._activity_view + + def _set_activity_view(self, view: str) -> None: + self._activity_view = view + graph = self.query_one("#usage-history") + if view == "live": + self._browse_date = None + elif view == "day" and graph._day_data and graph.view_mode != "hourly": + if self._browse_date is not None: + graph.drill_day = self._browse_date + graph.view_mode = "hourly" + self._on_graph_drill(self._browse_date) + else: + graph._enter_drill() + elif view == "history" and graph.view_mode == "hourly": + graph._exit_drill() + self._apply_activity_view() + self._refresh() + self.query_one("#live-activity" if view == "live" else "#usage-history").focus( + scroll_visible=not self._is_constrained_mode) + + def on_tabs_tab_activated(self, event: Tabs.TabActivated) -> None: + view = event.tab.id.removeprefix("view-") + if event.tabs.active == event.tab.id and view != self._activity_view: + self._set_activity_view(view) + + def on_history_graph_day_selected(self, event: HistoryGraph.DaySelected) -> None: + if self._activity_view != "history": + return + self._browse_date = event.day + with read_status(self.store_path, self._clock_now, query_services=False) as (conn, _): + if conn is not None: + self._render_local_day(conn) + + def action_next_view(self) -> None: + views = ("live", "day", "history") + self._set_activity_view(views[(views.index(self._activity_view) + 1) % len(views)]) + + def action_toggle_zoom(self) -> None: + if self._zoomed_panel: + self.action_exit_zoom() + return + focused = self.focused + panel = next((widget for widget in [focused, *focused.ancestors] + if widget.has_class("dashboard-pane")), None) if focused else None + panel = panel or self.query_one("#activity-panel") + self._zoomed_panel = panel.id + panel.add_class("zoom-target") + self.query_one("#main-grid").add_class("zoomed") + panel.border_subtitle = "z / Esc Restore" + + def action_exit_zoom(self) -> None: + if not self._zoomed_panel: + return + panel = self.query_one("#" + self._zoomed_panel) + panel.remove_class("zoom-target") + panel.border_subtitle = "" + self.query_one("#main-grid").remove_class("zoomed") + self._zoomed_panel = None + + def action_cycle_theme(self) -> None: + names = list(THEMES) + self._current_theme_name = names[(names.index(self._current_theme_name) + 1) % len(names)] + self.theme = "fenris-" + self._current_theme_name.replace("_", "-") + save_preferences(theme=self._current_theme_name, reduced_motion=self._reduced_motion) self._refresh() def on_resize(self) -> None: """Re-render with the new terminal size after Textual applies it.""" self.call_after_refresh(self._refresh) - def _update_constrained_summary(self) -> None: - """Update the textual summary shown when terminal is too small for graph.""" - graph = self.query_one("#usage-history") - summary = self.query_one("#constrained-summary") - - if not graph._day_data: - summary.update("[dim]Graph needs ≥80×24[/dim]\nAwaiting first sample") - return - - # Summarise visible days as text (issue #81 AC2) - total_written = sum(d.get("total_written", d.get("total_bytes", 0)) for d in graph._day_data) - total_read = sum(d.get("total_read", 0) for d in graph._day_data) - days_with_data = sum( - 1 for d in graph._day_data - if d.get("total_bytes", 0) > 0 or d.get("total_read", 0) > 0 - ) - n = len(graph._day_data) - first = graph._day_data[0].get("local_label", "") - last = graph._day_data[-1].get("local_label", "") - text = ( - "[dim]Graph needs ≥80×24[/dim]\n" - " %d days · %d with activity · W %.3f GB R %.3f GB\n" - " %s → %s" % (n, days_with_data, total_written / 1e9, total_read / 1e9, first, last) - ) - - # Preserve selected-day context (issue #81 AC2) - if 0 <= graph.selected_index < len(graph._day_data): - day = graph._day_data[graph.selected_index] - text += "\n [bold]%s[/bold] \u00b7 W %.3f GB \u00b7 R %.3f GB" % ( - day.get("local_label", ""), - day.get("total_written", day.get("total_bytes", 0)) / 1e9, - day.get("total_read", 0) / 1e9, - ) - - summary.update(text) - def on_refresh_tick(self) -> None: """Refresh dashboard and dismiss launch-only authentication guidance.""" self._show_auth_notice = False self._refresh() - def _headline_prefix(self) -> str: - """Render identity and any launch-only guidance above drive state.""" - # Use wolf glyph if terminal can render it (issue #79) - width = getattr(self, '_size', (80, 24))[0] if hasattr(self, '_size') else 80 - if _can_render_wolf(width): - identity = _IDENTITY_FULL - else: - identity = _IDENTITY_FALLBACK - lines = ["[bold]%s[/bold]" % identity] - if self._show_auth_notice: - lines.append("[dim]Open with fenris (no sudo). Actions authenticate via polkit. ? Help[/dim]") - return "\n".join(lines) - def _render_headline(self, body: str = "") -> None: - """Render full-width identity, guidance, and current drive state.""" - text = self._headline_prefix() - if body: - text += "\n\n" + body - self.query_one("#headline-band").update(text) + self.query_one("#identity").update(_IDENTITY_FULL if _can_render_wolf(self.size.width) else _IDENTITY_FALLBACK) + self.query_one("#auth-notice").display = self._show_auth_notice + self.query_one("#headline-band").update(body) def _refresh(self) -> None: """Refresh all four regions from store data.""" self._clock_now = datetime.now(timezone.utc) width, height = self.size + was_constrained = self._is_constrained_mode self._is_constrained_mode = width < _MIN_WIDTH or height < _MIN_HEIGHT main_grid = self.query_one("#main-grid") + if was_constrained != self._is_constrained_mode: + first, second = ("activity-panel", "endurance-panel") if self._is_constrained_mode else ( + "endurance-panel", "activity-panel") + main_grid.move_child(self.query_one("#" + first), before=self.query_one("#" + second)) if self._is_constrained_mode: main_grid.add_class("constrained") else: @@ -1704,9 +1535,13 @@ class FenrisTuiApp(App): self._render_empty_or_fault(comp) else: self._render_all_regions(conn, comp) - self.query_one("#service-strip").update( - "%s\n%s" % (render_status_tui(comp), _ACTION_LEGEND) - ) + status_lines = render_status_tui(comp).splitlines() + if comp.paused_lines: + status_lines = status_lines[:-len(comp.paused_lines)] + lines = [line for line in status_lines if line] + if len(lines) > 1: + lines[:2] = [lines[0] + " · " + lines[1]] + self.query_one("#service-strip").update("\n".join(lines)) self._render_paused_banner(comp) def _render_empty_or_fault(self, comp: StatusComposition) -> None: @@ -1732,13 +1567,9 @@ class FenrisTuiApp(App): self.query_one("#drive-health").update("") graph = self.query_one("#usage-history") - graph.set_data([]) - if comp.store_fault or comp.newer_schema: - self.query_one("#bar-render").update(message) - if self._is_constrained_mode: - self.query_one("#constrained-summary").update( - "[dim]Graph needs ≥80×24[/dim]\n" + message - ) + graph.set_data([], empty_message=message) + self.query_one("#live-activity").set_data( + [], empty_message=message if comp.store_fault or comp.newer_schema else "Awaiting intervals") # Hide local-day widget when no data local_day_widget = self.query_one("#local-day") local_day_widget.styles.display = "none" @@ -1764,11 +1595,14 @@ class FenrisTuiApp(App): headline = self._format_headline(proj) confidence = self._format_confidence(proj) scenario = self._format_scenario(proj) - self._render_headline(headline + "\n" + confidence + "\n" + scenario) + summary, _, context = headline.partition("\n") + confidence_title, _, facts = confidence.partition("\n") + self._render_headline(summary + "\n" + confidence_title + "\n\n" + + context + "\n" + facts + "\n" + scenario) except Exception: self._render_headline("[bold]No projection available[/bold]") - # --- Usage-history pane (§7.2 left): interactive bar graph --- + # --- Activity panel: live and historical volume plots --- graph = self.query_one("#usage-history") day_data = _query_daily_graph_data(conn, self._clock_now) @@ -1801,10 +1635,6 @@ class FenrisTuiApp(App): selected_date=self._browse_date, ) - # Update constrained summary if in constrained mode (issue #81) - if self._is_constrained_mode: - self._update_constrained_summary() - # --- Drive-health pane (§7.2 right, issue #79) --- health = _query_drive_health(conn) # Vendor wear grouped under Drive health with context @@ -1889,7 +1719,9 @@ class FenrisTuiApp(App): main_grid = self.query_one("#main-grid") if local is None: - widget.styles.display = "none" + date = self._browse_date or self._clock_now.astimezone().date().isoformat() + widget.update("%s · local-day evidence unavailable\nW unavailable · R unavailable" % date) + widget.display = True main_grid.remove_class("local-day") return @@ -1902,7 +1734,7 @@ class FenrisTuiApp(App): tz_display = "%s %s" % (local["tz_name"], local["tz_offset"]) text = ( - "[bold]%s[/bold] %s%s\n" + "[bold]%s[/bold] · %s%s\n" " W %.3f GB · R %.3f GB · %.0f%% coverage" % ( local["local_date"], @@ -1918,6 +1750,9 @@ class FenrisTuiApp(App): def _on_graph_drill(self, day: str) -> None: """Load hourly data when the graph enters drill-down mode.""" graph = self.query_one("#usage-history") + self._activity_view = "day" + self._browse_date = day + self._apply_activity_view() with read_status( self.store_path, self._clock_now, query_services=False, ) as (conn, _): @@ -1925,6 +1760,8 @@ class FenrisTuiApp(App): _query_hourly_graph_data(conn, day, self._clock_now) if conn is not None else [] ) + if conn is not None: + self._render_local_day(conn) def _format_headline(self, proj: ProjectionResult) -> str: """Format the lifespan headline (spec §6.11).""" @@ -1940,8 +1777,8 @@ class FenrisTuiApp(App): if proj.regime_days: regime = " · sustained regime: %d days" % proj.regime_days return ( - "[bold]Usage-adjusted theoretical lifespan: [white]%s remaining[/white][/bold]" - "\n If current habits continue%s" % (remaining, regime) + "[bold]%s remaining[/bold]" + "\nUsage-adjusted theoretical lifespan\nIf current habits continue%s" % (remaining, regime) ) def _format_confidence(self, proj: ProjectionResult) -> str: @@ -1981,14 +1818,19 @@ class FenrisTuiApp(App): # --- Actions --- def action_toggle_measure(self) -> None: - """Toggle between written and read volumes on the live graph.""" + """Toggle between written and read volumes in all activity views.""" live = self.query_one("#live-activity") live.toggle_measure() + graph = self.query_one("#usage-history") + graph.measure = live.measure self._refresh() def action_today(self) -> None: """Return to today's live view from any historical browsing.""" self._browse_date = None + self._activity_view = "live" + self._apply_activity_view() + self.query_one("#live-activity").focus(scroll_visible=not self._is_constrained_mode) graph = self.query_one("#usage-history") if graph.view_mode == "hourly": graph._exit_drill() @@ -2015,7 +1857,7 @@ class FenrisTuiApp(App): self._browse_date = target_str if graph.view_mode == "hourly": graph._exit_drill() - self._refresh() + self._set_activity_view("day") def action_prev_day(self) -> None: """Select the previous (older) day.""" @@ -2034,7 +1876,7 @@ class FenrisTuiApp(App): graph._exit_drill() self._browse_date = date_str graph.navigate_to_date(date_str) - self._refresh() + self._set_activity_view("day") def action_go_to_date(self) -> None: """Open the date entry screen.""" diff --git a/tests/test_activity_plot.py b/tests/test_activity_plot.py new file mode 100644 index 0000000..673cb8b --- /dev/null +++ b/tests/test_activity_plot.py @@ -0,0 +1,52 @@ +"""Visible geometry and evidence boundaries of the terminal volume plot.""" +from fenris.activity_plot import VolumePoint, volume_plot +from fenris.themes import get_graph_colors + + +def plot(points, selected=-1, width=48, height=10): + return volume_plot(points, width, height, selected, get_graph_colors("chalktone")) + + +def test_trace_fits_viewport_and_uses_time_not_sample_index(): + points = [VolumePoint(t, v, str(t)) for t, v in ((0, 0), (3, 50), (30, 100))] + text, columns, unit = plot(points) + assert unit == "B" + assert len(text.plain.splitlines()) == 10 + assert all(len(line) <= 48 for line in text.plain.splitlines()) + assert columns[1] - columns[0] < (columns[2] - columns[0]) / 5 + assert any(0x2801 <= ord(c) <= 0x28ff for c in text.plain) + assert not any(c in text.plain for c in "█▒░") + assert "100.00" in text.plain and "0.00" in text.plain + + +def test_gap_breaks_trace_while_measured_zero_stays_on_axis(): + text, columns, _ = plot([ + VolumePoint(0, 0, "00:00"), VolumePoint(1, None, "00:03", "gap"), + VolumePoint(2, 100, "00:06"), + ]) + rows = text.plain.splitlines() + assert "?" in rows[-2] + # No invented intermediate dots on either side of the missing measurement. + for row in rows[:-2]: + assert all(c == " " for c in row[columns[0] + 1:columns[-1]]) + assert 0x2801 <= ord(rows[-3][columns[0]]) <= 0x28ff + + +def test_partial_and_unallocated_totals_are_isolated_and_labelled(): + text, columns, unit = plot([ + VolumePoint(0, 1_000_000, "01", "partial"), + VolumePoint(1, 2_000_000, "02", "unallocated"), + VolumePoint(2, 3_000_000, "03"), + ]) + assert unit == "MB" + assert "~" in text.plain and "u" in text.plain + for row in text.plain.splitlines()[:-2]: + assert all(c == " " for c in row[columns[0] + 1:columns[1]]) + + +def test_many_intervals_and_selection_fit_small_plot_without_losing_points(): + points = [VolumePoint(i, i % 9 * 1_000_000, str(i)) for i in range(180)] + text, columns, _ = plot(points, selected=100, width=32, height=6) + assert len(columns) == len(points) + assert text.plain.splitlines()[-2][columns[100]] == "▼" + assert all(len(row) == 32 for row in text.plain.splitlines()) diff --git a/tests/test_dashboard_design.py b/tests/test_dashboard_design.py new file mode 100644 index 0000000..36029cb --- /dev/null +++ b/tests/test_dashboard_design.py @@ -0,0 +1,176 @@ +"""User-facing navigation, zoom, and plotted volume in the redesigned dashboard.""" +from datetime import datetime, timedelta, timezone +from xml.etree import ElementTree + +import pytest +from test_tui import ( + _insert_baseline, + _insert_day, + _insert_local_day, + _insert_segment, + _open_period, +) + +from fenris.store import init_store +from fenris.tui import FenrisTuiApp + +NOW = datetime(2026, 9, 19, 12, tzinfo=timezone.utc) + + +@pytest.fixture +def dashboard(tmp_path, monkeypatch): + monkeypatch.setenv("XDG_CONFIG_HOME", str(tmp_path / "prefs")) + + class Clock(datetime): + @classmethod + def now(cls, tz=None): + return NOW + + monkeypatch.setattr("fenris.tui.datetime", Clock) + monkeypatch.setattr("fenris.status.query_service_state", lambda: { + "boot_enabled": True, "timer_active": True, "last_collect_ok": True, + "last_collect_age_s": 0, "last_collect_reason": None, + }) + conn = init_store(tmp_path / "test.db") + _insert_segment(conn) + _insert_baseline(conn) + _open_period(conn) + for offset in range(18): + date = (NOW - timedelta(days=offset)).date().isoformat() + _insert_day(conn, date, bw=(offset + 1) * 1_000_000_000) + _insert_local_day(conn, date, bw=(offset + 1) * 1_000_000_000, br=2_000_000_000) + for index in range(61): + conn.execute( + "INSERT INTO samples (ts, device, bytes_written, bytes_read, segment_id) VALUES (?, ?, ?, ?, ?)", + ((NOW - timedelta(minutes=(60 - index) * 3)).isoformat(), + "/dev/test", index * 1_000_000, index * 2_000_000, 1), + ) + conn.execute( + "INSERT INTO hour_observations (hour, bytes_written_delta, bytes_read_delta, coverage, sample_count) " + "VALUES (?, ?, ?, ?, ?)", ("2026-09-18T12:00:00+00:00", 4_000_000, 8_000_000, 1, 20), + ) + conn.commit() + conn.close() + return FenrisTuiApp(store_path=tmp_path / "test.db", refresh_interval_s=999) + + +def visible(app): + return " ".join("".join(ElementTree.fromstring(app.export_screenshot()).itertext()).split()) + + +@pytest.mark.asyncio +@pytest.mark.parametrize("size", [(140, 44), (80, 24)]) +async def test_live_plot_inspection_zoom_refresh_and_resize(dashboard, size): + app = dashboard + async with app.run_test(size=size) as pilot: + app.on_refresh_tick() + await pilot.pause() + assert app.theme == "fenris-chalktone" + graph = app.query_one("#live-activity") + assert app.focused is graph + await pilot.press("left", "w") + selected = str(app.query_one("#live-readout").render()) + assert "11:54" in selected and "W 0.001 GB" in selected and "R 0.002 GB" in selected + assert "Reads" in str(app.query_one("#live-legend").render()) + await pilot.press("z") + app.on_refresh_tick() + await pilot.pause() + assert str(app.query_one("#live-readout").render()) == selected + assert app.query_one("#activity-panel").region.width == size[0] + for fact in ("Freshness:", "Last collect:", "Boot:", "Timer:", "q Quit TUI"): + assert fact in visible(app) + await pilot.resize_terminal(100, 30) + await pilot.press("escape") + assert str(app.query_one("#live-readout").render()) == selected + assert app._zoomed_panel is None + assert app.query_one("#action-rail").region.bottom <= 30 + + +@pytest.mark.asyncio +async def test_tabs_date_entry_and_hourly_inspection_keep_context(dashboard): + app = dashboard + async with app.run_test(size=(100, 36)) as pilot: + await pilot.click("#view-history") + await pilot.press("left", "enter") + assert app.query_one("#activity-tabs").active == "view-day" + assert "2026-09-18" in str(app.query_one("#local-day").render()) + # Hour 23 is selected initially; move to the known hour 12. + await pilot.press(*(["left"] * 11)) + readout = str(app.query_one("#bar-readout").render()) + assert "12:00 UTC" in readout and "W 0.004 GB" in readout + await pilot.press("z", "w") + app.on_refresh_tick() + await pilot.pause() + assert str(app.query_one("#bar-readout").render()) == readout + await pilot.press("g") + await pilot.press(*list("2026-09-17")) + await pilot.press("escape") + assert str(app.query_one("#bar-readout").render()) == readout + assert app._zoomed_panel == "activity-panel" + await pilot.press("escape", "t") + assert app.query_one("#activity-tabs").active == "view-live" + + +@pytest.mark.asyncio +async def test_mouse_inspection_matches_time_axis(dashboard): + app = dashboard + async with app.run_test(size=(100, 36)) as pilot: + await pilot.pause() + graph = app.query_one("#live-activity") + x = graph._point_columns[0] + await pilot.click("#live-render", offset=(x, 1)) + text = str(app.query_one("#live-readout").render()) + assert "09:00 → 09:03 UTC" in text + + +@pytest.mark.asyncio +async def test_theme_control_persists_choice_and_quit_never_pauses(dashboard, monkeypatch): + calls = [] + monkeypatch.setattr(dashboard, "_run_helper", lambda *args: calls.append(args)) + async with dashboard.run_test(size=(80, 24)) as pilot: + await pilot.press("s") + assert dashboard.theme == "fenris-amber" + await pilot.press("q") + assert calls == [] + from fenris.preferences import load_preferences + assert load_preferences()["theme"] == "amber" + + +@pytest.mark.asyncio +@pytest.mark.parametrize("size", [(100, 36), (70, 20)]) +async def test_unallocated_volume_survives_day_with_missing_coverage(dashboard, size): + async with dashboard.run_test(size=size) as pilot: + await pilot.click("#view-history") + graph = dashboard.query_one("#usage-history") + graph.set_data([{ + "day": "2026-09-18", "total_bytes": 2_000_000_000, + "unallocated_bytes": 2_000_000_000, "is_gap": True, + "is_partial": True, + }]) + readout = str(dashboard.query_one("#bar-readout").render()) + assert "W 2.000 GB unallocated" in readout + assert "R unavailable" in readout and "gap" in readout + if size[0] >= 80: + plot = str(dashboard.query_one("#bar-render").render()) + assert any(0x2801 <= ord(c) <= 0x28ff for c in plot) + graph.measure = "read" + graph._refresh() + plot = str(dashboard.query_one("#bar-render").render()) + assert not any(0x2801 <= ord(c) <= 0x28ff for c in plot) + + +@pytest.mark.asyncio +@pytest.mark.parametrize("state", ["gap", "future"]) +async def test_small_terminal_hour_readout_does_not_invent_zero(dashboard, state): + async with dashboard.run_test(size=(70, 20)) as pilot: + await pilot.click("#view-day") + graph = dashboard.query_one("#usage-history") + graph.set_hour_data([{ + "hour": "2026-09-18T12:00:00+00:00", "local_label": "12", + "is_gap": state == "gap", "is_future": state == "future", + }]) + graph._hourly_selected = 0 + graph._refresh_hourly() + readout = str(dashboard.query_one("#bar-readout").render()) + assert "W unavailable · R unavailable" in readout + assert state in readout and "12:00 UTC" in readout diff --git a/tests/test_issue_79.py b/tests/test_issue_79.py index 80b2e72..894fbef 100644 --- a/tests/test_issue_79.py +++ b/tests/test_issue_79.py @@ -95,7 +95,7 @@ class TestFenrisIdentity: ) async with app.run_test(size=(120, 24)) as pilot: headline = str(app.query_one("#headline-band").render()) - assert "🐺 Fenris by Bongbetic" in headline + assert "🐺 Fenris by Bongbetic" in str(app.query_one("#identity").render()) @pytest.mark.asyncio async def test_titlebox_fallback_without_wolf(self, tmp_path): @@ -108,7 +108,7 @@ class TestFenrisIdentity: async with app.run_test(size=(60, 24)) as pilot: headline = str(app.query_one("#headline-band").render()) # Either shows wolf or fallback - both are acceptable - assert "Fenris by Bongbetic" in headline + assert "Fenris by Bongbetic" in str(app.query_one("#identity").render()) @pytest.mark.asyncio async def test_wolf_never_shows_tofu(self, tmp_path): @@ -140,7 +140,7 @@ class TestFenrisIdentity: async with app.run_test(size=(120, 24)) as pilot: headline = str(app.query_one("#headline-band").render()) # Identity appears once, lifespan is separate data - assert "🐺 Fenris by Bongbetic" in headline + assert "🐺 Fenris by Bongbetic" in str(app.query_one("#identity").render()) assert "remaining" in headline.lower() or "projection" in headline.lower() @@ -174,7 +174,7 @@ class TestSingleMakerCredit: ) async with app.run_test(size=(120, 24)) as pilot: headline = str(app.query_one("#headline-band").render()) - assert "Fenris by Bongbetic" in headline + assert "Fenris by Bongbetic" in str(app.query_one("#identity").render()) @pytest.mark.asyncio async def test_empty_store_no_maker_credit_in_strip(self, tmp_path): @@ -275,7 +275,7 @@ class TestPreservedBehavior: """Separate q Quit TUI rail preserved.""" app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") async with app.run_test(size=(120, 24)) as pilot: - rail = str(app.query_one("#quit-rail").render()) + rail = str(app.query_one("#action-rail").render()) assert "q Quit TUI" in rail @pytest.mark.asyncio @@ -287,11 +287,11 @@ class TestPreservedBehavior: ) async with app.run_test(size=(120, 24)) as pilot: headline = str(app.query_one("#headline-band").render()) - assert "polkit" in headline.lower() + assert "polkit" in str(app.query_one("#auth-notice").render()).lower() # Should clear after first tick await pilot.pause(0.25) headline_after = str(app.query_one("#headline-band").render()) - assert "polkit" not in headline_after.lower() + assert not app.query_one("#auth-notice").display @pytest.mark.asyncio async def test_deliberate_pause_block_preserved(self, tmp_path): diff --git a/tests/test_issue_80.py b/tests/test_issue_80.py index e129f90..5758934 100644 --- a/tests/test_issue_80.py +++ b/tests/test_issue_80.py @@ -93,7 +93,7 @@ class TestPresetLoading: """Themes load from preferences and apply to the TUI.""" @pytest.mark.asyncio - async def test_tui_applies_amber_theme_by_default(self, tmp_path): + async def test_tui_applies_chalktone_theme_by_default(self, tmp_path): """TUI starts with the Amber theme when no preferences exist.""" from fenris.tui import FenrisTuiApp @@ -102,7 +102,7 @@ class TestPresetLoading: app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") async with app.run_test() as pilot: # Theme should be fenris-amber - assert app.theme == "fenris-amber" + assert app.theme == "fenris-chalktone" @pytest.mark.asyncio async def test_tui_applies_nord_theme_from_prefs(self, tmp_path): @@ -180,7 +180,7 @@ class TestKeyBindings: app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") async with app.run_test() as pilot: # Start at amber - assert app.theme == "fenris-amber" + assert app.theme == "fenris-chalktone" # Enter drill mode on the graph graph = app.query_one("#usage-history") @@ -382,7 +382,7 @@ class TestSafePersistence: app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") async with app.run_test() as pilot: # TUI should start with default theme - assert app.theme == "fenris-amber" + assert app.theme == "fenris-chalktone" # Dashboard should be functional headline = str(app.query_one("#headline-band").render()) assert headline is not None @@ -401,7 +401,7 @@ class TestSafePersistence: app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") async with app.run_test() as pilot: # TUI should start without crash - assert app.theme in ("fenris-amber", "fenris-nord", "fenris-high-contrast") + assert app.theme in ("fenris-chalktone", "fenris-amber", "fenris-nord", "fenris-high-contrast") # --------------------------------------------------------------------------- diff --git a/tests/test_issue_92.py b/tests/test_issue_92.py index 4922a22..56a407e 100644 --- a/tests/test_issue_92.py +++ b/tests/test_issue_92.py @@ -29,7 +29,7 @@ from fenris.local_day import ( ) from fenris.tui import ( FenrisTuiApp, - DailyBarGraph, + HistoryGraph, _RANGE_OPTIONS, _RANGE_DEFAULT, ) @@ -111,11 +111,12 @@ def _make_app(tmp_path, clock=None): import fenris.tui as tui_mod from datetime import datetime as _real_datetime - mock_dt = type("MockDatetime", (), { - "now": staticmethod(lambda tz=None: clock), - "strptime": staticmethod(lambda *a, **kw: _real_datetime.strptime(*a, **kw)), - "date": staticmethod(lambda: clock.date()), - })() + class MockDatetime(_real_datetime): + @classmethod + def now(cls, tz=None): + return clock + + mock_dt = MockDatetime patcher = patch.object(tui_mod, "datetime", mock_dt) patcher.start() @@ -262,7 +263,7 @@ class TestArrowInspection: async with app.run_test(size=(100, 40)) as pilot: await pilot.pause() graph = app.query_one("#usage-history") - # Focus the graph widget explicitly + await pilot.press("v", "v") graph.focus() await pilot.pause() day_before = graph._day_data[graph.selected_index].get("day") @@ -281,6 +282,7 @@ class TestArrowInspection: async with app.run_test(size=(100, 40)) as pilot: await pilot.pause() graph = app.query_one("#usage-history") + await pilot.press("v", "v") await pilot.click("#usage-history") # Enter drill-down @@ -329,6 +331,7 @@ class TestTodayBinding: async with app.run_test(size=(100, 40)) as pilot: await pilot.pause() graph = app.query_one("#usage-history") + await pilot.press("v", "v") await pilot.click("#usage-history") # Enter drill @@ -546,6 +549,7 @@ class TestDrillDownData: async with app.run_test(size=(100, 40)) as pilot: await pilot.pause() graph = app.query_one("#usage-history") + await pilot.press("v", "v") await pilot.click("#usage-history") # Enter drill-down diff --git a/tests/test_live_graph.py b/tests/test_live_graph.py index aa3dca7..100f553 100644 --- a/tests/test_live_graph.py +++ b/tests/test_live_graph.py @@ -263,7 +263,7 @@ class TestLiveActivityGraph: await pilot.pause() header = str(graph.query_one("#live-header").render()) assert "1 intervals" in header - assert "w Toggle W/R" in header + assert "w W/R" in str(app.query_one("#activity-tools").render()) # --------------------------------------------------------------------------- diff --git a/tests/test_preferences.py b/tests/test_preferences.py index c6449bd..2ef84d7 100644 --- a/tests/test_preferences.py +++ b/tests/test_preferences.py @@ -3,7 +3,7 @@ Covers: - Preference load/save with safe defaults - XDG_CONFIG_HOME user-scoped persistence - - Amber default theme, normal-motion default + - Chalktone default theme, normal-motion default - Invalid/unreadable/unwritable preference data does not crash - Theme presets: Amber, Nord, High Contrast - Reduced motion preference persistence @@ -72,9 +72,9 @@ class TestPreferencePath: class TestDefaults: """When no preference file exists, defaults are returned.""" - def test_default_theme_is_amber(self): + def test_default_theme_is_chalktone(self): """Amber is the default theme preset.""" - assert DEFAULT_THEME == "amber" + assert DEFAULT_THEME == "chalktone" def test_default_reduced_motion_is_false(self): """Normal motion is the default.""" @@ -82,13 +82,13 @@ class TestDefaults: def test_valid_themes_are_all_presets(self): """Three valid presets exist.""" - assert VALID_THEMES == {"amber", "nord", "high_contrast"} + assert VALID_THEMES == {"chalktone", "amber", "nord", "high_contrast"} def test_load_returns_defaults_when_no_file(self, tmp_path): """Missing preference file returns safe defaults.""" with patch.dict(os.environ, {"XDG_CONFIG_HOME": str(tmp_path)}): prefs = load_preferences() - assert prefs["theme"] == "amber" + assert prefs["theme"] == "chalktone" assert prefs["reduced_motion"] is False @@ -151,7 +151,7 @@ class TestSafeFailures: with patch.dict(os.environ, {"XDG_CONFIG_HOME": str(config_home)}): prefs = load_preferences() - assert prefs["theme"] == "amber" + assert prefs["theme"] == "chalktone" assert prefs["reduced_motion"] is False def test_unknown_theme_returns_default(self, tmp_path): @@ -165,7 +165,7 @@ class TestSafeFailures: with patch.dict(os.environ, {"XDG_CONFIG_HOME": str(config_home)}): prefs = load_preferences() - assert prefs["theme"] == "amber" + assert prefs["theme"] == "chalktone" def test_missing_keys_get_defaults(self, tmp_path): """Partial preference file fills in missing keys.""" @@ -218,7 +218,7 @@ class TestSafeFailures: with patch.dict(os.environ, {"XDG_CONFIG_HOME": str(config_home)}): prefs = load_preferences() - assert prefs["theme"] == "amber" + assert prefs["theme"] == "chalktone" def test_wrong_type_for_reduced_motion(self, tmp_path): """Non-boolean reduced_motion falls back to default.""" diff --git a/tests/test_status_read.py b/tests/test_status_read.py index 59e0e78..ca55039 100644 --- a/tests/test_status_read.py +++ b/tests/test_status_read.py @@ -67,7 +67,7 @@ async def test_cli_tui_acquisition_parity(tmp_path, kind, service): assert not app.query_one("#main-grid").has_class("paused") await pilot.resize_terminal(60, 18) await pilot.pause() - assert phrase in str(app.query_one("#constrained-summary").render()).lower() + assert phrase in str(app.query_one("#live-render").render()).lower() for text in (cli, strip): assert ("boot: enabled" if service == ACTIVE else "boot: disabled" if service == DISABLED else "boot: unknown") in text assert ("timer: active" if service == ACTIVE else "timer: inactive" if service == DISABLED else "timer: unknown") in text diff --git a/tests/test_themes.py b/tests/test_themes.py index 4cebbef..ede1457 100644 --- a/tests/test_themes.py +++ b/tests/test_themes.py @@ -2,7 +2,7 @@ Covers: - Three valid presets: Amber, Nord, High Contrast - - Amber is the default with amber graph role + - Chalktone is the default; Amber retains its amber graph role - Theme roles for graph rendering (allocated, unallocated, gap, zero, partial) - Status semantic colours/glyphs/text always win over theme - Global action reachability and focus contrast in every preset @@ -29,13 +29,13 @@ from fenris.themes import ( class TestThemeRegistry: """All three presets are registered with correct names.""" - def test_three_themes_registered(self): - """Exactly three themes exist.""" - assert len(THEMES) == 3 + def test_four_themes_registered(self): + """All four presets are registered.""" + assert len(THEMES) == 4 def test_theme_names(self): """Theme names are amber, nord, high_contrast.""" - assert THEME_NAMES == {"amber", "nord", "high_contrast"} + assert THEME_NAMES == {"chalktone", "amber", "nord", "high_contrast"} def test_get_theme_valid(self): """get_theme returns a Theme for each valid name.""" @@ -44,14 +44,14 @@ class TestThemeRegistry: theme = get_theme(name) assert isinstance(theme, Theme) - def test_get_theme_invalid_returns_amber(self): + def test_get_theme_invalid_returns_chalktone(self): """Unknown theme name returns the amber theme.""" theme = get_theme("nonexistent") - assert theme.name == "fenris-amber" + assert theme.name == "fenris-chalktone" # --------------------------------------------------------------------------- -# Amber theme tests (default, amber graph role) +# Amber theme tests (amber graph role) # --------------------------------------------------------------------------- class TestAmberTheme: @@ -179,7 +179,7 @@ class TestGraphColorRoles: assert amber["allocated"] != nord["allocated"] or amber["allocated"] != hc["allocated"] def test_zero_role_is_dim(self): - """Zero-usage bars use a dim/subtle colour in all themes.""" + """Zero-usage markers use a dim/subtle colour in all themes.""" for name in THEME_NAMES: colors = get_graph_colors(name) # Zero should be distinct from allocated diff --git a/tests/test_tui.py b/tests/test_tui.py index 7c0f3ed..6a975d7 100644 --- a/tests/test_tui.py +++ b/tests/test_tui.py @@ -40,19 +40,13 @@ from fenris.status import ( ) from fenris.tui import ( FenrisTuiApp, - DailyBarGraph, + HistoryGraph, _format_remaining, _query_drive_health, _query_daily_graph_data, _query_hourly_graph_data, _RANGE_OPTIONS, _RANGE_DEFAULT, - _BAR_HEIGHT, - _GLYPH_ALLOCATED, - _GLYPH_UNALLOCATED, - _GLYPH_GAP, - _GLYPH_ZERO, - _GLYPH_PARTIAL, _MIN_WIDTH, _MIN_HEIGHT, ) @@ -365,15 +359,15 @@ class TestDenseScreen: }): async with app.run_test(): strip = str(app.query_one("#service-strip").render()).lower() - rail = str(app.query_one("#quit-rail").render()) - usage = app.query_one("#usage-history") + rail = str(app.query_one("#action-rail").render()) + usage = app.query_one("#activity-panel") service = app.query_one("#service-strip") - quit_rail = app.query_one("#quit-rail") + quit_rail = app.query_one("#action-rail") assert "continuity" in strip assert "monitoring: active in background · persists across reboots" in strip - assert "r resume — enable monitoring and future boots" in strip + assert "r Resume" in str(app.query_one("#action-rail").render()) assert "q quit" not in strip - assert rail == "q Quit TUI" + assert "q Quit TUI" in rail assert usage.region.y < service.region.y < quit_rail.region.y assert usage.region.bottom <= service.region.y assert service.region.bottom <= quit_rail.region.y @@ -405,13 +399,12 @@ class TestDenseScreen: main_grid = app.query_one("#main-grid") assert str(main_grid.styles.layout) == "" assert main_grid.has_class("paused") - assert len(main_grid.styles.grid_rows) == 6 banner = str(paused_banner.render()).lower() assert "monitoring: paused — deliberate disable" in banner assert "paused time is excluded from your usage habit · resume: fenris monitor resume" in banner - assert paused_banner.region.height >= 5 - assert paused_banner.region.y < app.query_one("#usage-history").region.y - assert app.query_one("#usage-history").region.bottom <= app.query_one( + assert paused_banner.region.height >= 2 + assert paused_banner.region.y < app.query_one("#activity-panel").region.y + assert app.query_one("#activity-panel").region.bottom <= app.query_one( "#service-strip" ).region.y screenshot = app.export_screenshot() @@ -423,11 +416,6 @@ class TestDenseScreen: assert "monitoring: does not start on next boot" in str( app.query_one("#service-strip").render() ).lower() - dashboard_scroll = app.query_one("#dashboard-scroll") - assert dashboard_scroll.max_scroll_y > 0 - dashboard_scroll.focus() - await pilot.press("end") - assert dashboard_scroll.scroll_y == dashboard_scroll.max_scroll_y footer_text = " ".join( "".join( ElementTree.fromstring(app.export_screenshot()).itertext() @@ -490,23 +478,23 @@ class TestDenseScreen: async with app.run_test() as pilot: headline = str(app.query_one("#headline-band").render()) # Identity now shows Fenris by Bongbetic (issue #79) - assert "Fenris by Bongbetic" in headline - assert auth_notice in headline + assert "Fenris by Bongbetic" in str(app.query_one("#identity").render()) + assert auth_notice in str(app.query_one("#auth-notice").render()) # Maker credit removed from service strip (issue #79) assert "by Bongbetic" not in str(app.query_one("#service-strip").render()) await pilot.pause(0.25) - assert auth_notice not in str(app.query_one("#headline-band").render()) + assert not app.query_one("#auth-notice").display await pilot.pause(0.25) - assert auth_notice not in str(app.query_one("#headline-band").render()) + assert not app.query_one("#auth-notice").display fresh_app = FenrisTuiApp( store_path=tmp_path / "nonexistent.db", refresh_interval_s=0.2, ) async with fresh_app.run_test(): - assert auth_notice in str(fresh_app.query_one("#headline-band").render()) + assert auth_notice in str(fresh_app.query_one("#auth-notice").render()) # --------------------------------------------------------------------------- @@ -600,7 +588,7 @@ class TestFirstRun: strip = str(app.query_one("#service-strip").render()) assert "no observations yet" in headline.lower() assert "r resume — enable monitoring and future boots" in headline.lower() - assert "r resume — enable monitoring and future boots" in strip.lower() + assert "r resume" in str(app.query_one("#action-rail").render()).lower() # --------------------------------------------------------------------------- @@ -864,15 +852,15 @@ class TestQueryHourlyGraphData: # --------------------------------------------------------------------------- -# DailyBarGraph widget unit tests (issue #75) +# HistoryGraph widget unit tests (issue #75) # --------------------------------------------------------------------------- -class TestDailyBarGraph: +class TestHistoryGraph: def test_empty_data(self, tmp_path): """Empty data shows awaiting message.""" app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") # We test the widget directly via the app's compose - graph = DailyBarGraph() + graph = HistoryGraph() # Simulate setting empty data from textual.app import App as TextualApp class _TestApp(TextualApp): @@ -884,14 +872,14 @@ class TestDailyBarGraph: def test_range_default(self): """Default range is 14 days.""" - graph = DailyBarGraph() + graph = HistoryGraph() assert graph.range_days == _RANGE_DEFAULT assert graph.selected_index == -1 assert graph.view_mode == "daily" def test_trim_to_range(self): """Data is trimmed to the selected range.""" - graph = DailyBarGraph() + graph = HistoryGraph() data = [{"day": "2026-09-%02d" % d, "total_bytes": d * 100} for d in range(1, 31)] graph._all_day_data = data @@ -902,7 +890,7 @@ class TestDailyBarGraph: def test_range_all_fits(self): """When data fits within range, all days are shown.""" - graph = DailyBarGraph() + graph = HistoryGraph() data = [{"day": "2026-09-%02d" % d, "total_bytes": d * 100} for d in range(1, 8)] graph._all_day_data = data @@ -911,7 +899,7 @@ class TestDailyBarGraph: assert len(graph._day_data) == 7 def test_scale_includes_allocated_and_unallocated_writes(self): - graph = DailyBarGraph() + graph = HistoryGraph() graph._all_day_data = [{ "day": "2026-09-16", "total_bytes": 800, @@ -927,7 +915,7 @@ class TestDailyBarGraph: # --------------------------------------------------------------------------- class TestBarGraphTUI: - """Headless tests for the interactive bar graph.""" + """Headless tests for the interactive history plot.""" @pytest.mark.asyncio async def test_graph_renders_with_data(self, tmp_path): @@ -943,20 +931,21 @@ class TestBarGraphTUI: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(80, 24)) as pilot: + await pilot.press("v", "v") graph = app.query_one("#usage-history") - assert isinstance(graph, DailyBarGraph) + assert isinstance(graph, HistoryGraph) assert len(graph._day_data) > 0 # Legend should be visible legend = str(app.query_one("#bar-legend").render()) - assert "Alloc" in legend + assert "Unalloc" in legend assert "Zero" in legend range_label = str(app.query_one("#bar-range").render()) assert "14 days" in range_label assert "UTC" in range_label plotted = str(app.query_one("#bar-render").render()) - assert "Writes (" in plotted - assert "Day UTC" in plotted - assert "→" in plotted + assert "Writes (" in legend + assert "UTC" in range_label + assert "─" in plotted @pytest.mark.asyncio async def test_arrow_selection(self, tmp_path): @@ -972,6 +961,7 @@ class TestBarGraphTUI: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(80, 24)) as pilot: + await pilot.press("v", "v") graph = app.query_one("#usage-history") app.set_focus(graph) await pilot.pause() @@ -1002,6 +992,7 @@ class TestBarGraphTUI: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(80, 24)) as pilot: + await pilot.press("v", "v") graph = app.query_one("#usage-history") app.set_focus(graph) await pilot.pause() @@ -1043,6 +1034,7 @@ class TestBarGraphTUI: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(80, 24)) as pilot: + await pilot.press("v", "v") graph = app.query_one("#usage-history") app.set_focus(graph) await pilot.pause() @@ -1079,6 +1071,7 @@ class TestBarGraphTUI: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(80, 24)) as pilot: + await pilot.press("v", "v") graph = app.query_one("#usage-history") app.set_focus(graph) await pilot.pause() @@ -1114,8 +1107,9 @@ class TestBarGraphTUI: """Empty store shows awaiting message in graph.""" app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") async with app.run_test(size=(80, 24)) as pilot: + await pilot.press("v", "v") graph = app.query_one("#usage-history") - assert isinstance(graph, DailyBarGraph) + assert isinstance(graph, HistoryGraph) render = str(app.query_one("#bar-render").render()) assert "awaiting" in render.lower() @@ -1124,8 +1118,9 @@ class TestBarGraphTUI: """Graph pane has a border title.""" app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") async with app.run_test(size=(80, 24)) as pilot: + await pilot.press("v", "v") graph = app.query_one("#usage-history") - assert graph.border_title == "Usage history" + assert app.query_one("#activity-panel").border_title == "Drive activity" @pytest.mark.asyncio async def test_glyphs_in_legend(self, tmp_path): @@ -1141,13 +1136,11 @@ class TestBarGraphTUI: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(80, 24)) as pilot: + await pilot.press("v", "v") await pilot.pause() legend = str(app.query_one("#bar-legend").render()) - assert _GLYPH_ALLOCATED in legend - assert _GLYPH_UNALLOCATED in legend - assert _GLYPH_GAP in legend - assert _GLYPH_ZERO in legend - assert _GLYPH_PARTIAL in legend + for meaning in ("Writes", "Unalloc", "Gap", "Zero", "Partial"): + assert meaning in legend # --------------------------------------------------------------------------- @@ -1172,6 +1165,7 @@ class TestConstrainedLayout: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(80, 24)) as pilot: + await pilot.press("v", "v") # All four regions should be visible assert app.query_one("#headline-band") is not None assert app.query_one("#usage-history") is not None @@ -1180,8 +1174,8 @@ class TestConstrainedLayout: # Graph should not be in constrained mode assert not app._is_constrained_mode # Constrained summary should be hidden - summary = app.query_one("#constrained-summary") - assert str(summary.styles.display) == "none" + summary = app.query_one("#bar-render") + assert "Graph needs" not in str(summary.render()) @pytest.mark.asyncio async def test_constrained_below_80_width(self, tmp_path): @@ -1198,13 +1192,14 @@ class TestConstrainedLayout: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(79, 24)) as pilot: + await pilot.press("v", "v") # Should be in constrained mode assert app._is_constrained_mode # Main grid should have constrained class main_grid = app.query_one("#main-grid") assert main_grid.has_class("constrained") # Constrained summary should be visible - summary = app.query_one("#constrained-summary") + summary = app.query_one("#bar-render") summary_text = str(summary.render()) assert "Graph needs ≥80×24" in summary_text assert "days" in summary_text @@ -1225,10 +1220,11 @@ class TestConstrainedLayout: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(80, 23)) as pilot: + await pilot.press("v", "v") # Should be in constrained mode assert app._is_constrained_mode # Constrained summary should be visible - summary = app.query_one("#constrained-summary") + summary = app.query_one("#bar-render") summary_text = str(summary.render()) assert "Graph needs ≥80×24" in summary_text @@ -1247,11 +1243,12 @@ class TestConstrainedLayout: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(79, 24)) as pilot: + await pilot.press("v", "v") # Start in constrained mode assert app._is_constrained_mode graph = app.query_one("#usage-history") - # Select a day while constrained - graph.selected_index = 5 + # Select a day through the visible graph while constrained. + await pilot.press(*(["left"] * 8)) # Resize to normal — pilot.resize_terminal changes terminal size await pilot.resize_terminal(80, 24) @@ -1285,6 +1282,7 @@ class TestConstrainedLayout: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(80, 24)) as pilot: + await pilot.press("v", "v") # Start in normal mode assert not app._is_constrained_mode graph = app.query_one("#usage-history") @@ -1303,7 +1301,7 @@ class TestConstrainedLayout: # Should be in constrained mode assert app._is_constrained_mode # Constrained summary should show selected day context - summary = app.query_one("#constrained-summary") + summary = app.query_one("#bar-render") summary_text = str(summary.render()) assert "Graph needs ≥80×24" in summary_text # Selected day context should survive @@ -1314,8 +1312,9 @@ class TestConstrainedLayout: """Constrained summary shows awaiting message for empty store.""" app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") async with app.run_test(size=(79, 24)) as pilot: + await pilot.press("v", "v") assert app._is_constrained_mode - summary = app.query_one("#constrained-summary") + summary = app.query_one("#bar-render") summary_text = str(summary.render()) assert "Graph needs ≥80×24" in summary_text assert "awaiting" in summary_text.lower() @@ -1335,24 +1334,25 @@ class TestConstrainedLayout: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(79, 24)) as pilot: + await pilot.press("v", "v") # All regions should exist assert app.query_one("#headline-band") is not None assert app.query_one("#drive-health") is not None assert app.query_one("#service-strip") is not None - assert app.query_one("#quit-rail") is not None + assert app.query_one("#action-rail") is not None # Headline should contain projection headline = str(app.query_one("#headline-band").render()) assert "remaining" in headline.lower() or "projection" in headline.lower() # Service strip should have actions - strip = str(app.query_one("#service-strip").render()) + strip = str(app.query_one("#action-rail").render()) assert "p Pause" in strip assert "r Resume" in strip - assert "q quit" not in strip # Quit is in quit-rail + assert "q Quit TUI" in strip # Quit rail should be visible - rail = str(app.query_one("#quit-rail").render()) + rail = str(app.query_one("#action-rail").render()) assert "Quit" in rail @pytest.mark.asyncio @@ -1368,6 +1368,7 @@ class TestConstrainedLayout: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(79, 24)) as pilot: + await pilot.press("v", "v") strip = str(app.query_one("#service-strip").render()) # Status should be visible even with long reasons assert "stale" in strip.lower() or "freshness" in strip.lower() @@ -1387,6 +1388,7 @@ class TestConstrainedLayout: app = FenrisTuiApp(store_path=tmp_path / "test.db") async with app.run_test(size=(79, 24)) as pilot: + await pilot.press("v", "v") # Quit should still work await pilot.press("q") assert not app.is_running @@ -1396,6 +1398,7 @@ class TestConstrainedLayout: """Theme and motion toggles work in constrained mode.""" app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") async with app.run_test(size=(79, 24)) as pilot: + await pilot.press("v", "v") assert app._is_constrained_mode # Toggle theme await pilot.press("t") @@ -1415,8 +1418,8 @@ class TestConstrainedLayout: assert _MIN_HEIGHT == 24 def test_is_constrained_with_terminal_width(self, tmp_path): - """DailyBarGraph._is_constrained checks terminal width.""" - graph = DailyBarGraph() + """HistoryGraph._is_constrained checks terminal width.""" + graph = HistoryGraph() # Widget-level check (no terminal width) assert graph._is_constrained() is False # Terminal width below minimum