Jumbee.Console.Snapshot 0.1.8

dotnet add package Jumbee.Console.Snapshot --version 0.1.8
                    
NuGet\Install-Package Jumbee.Console.Snapshot -Version 0.1.8
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Jumbee.Console.Snapshot" Version="0.1.8" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Jumbee.Console.Snapshot" Version="0.1.8" />
                    
Directory.Packages.props
<PackageReference Include="Jumbee.Console.Snapshot" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Jumbee.Console.Snapshot --version 0.1.8
                    
#r "nuget: Jumbee.Console.Snapshot, 0.1.8"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Jumbee.Console.Snapshot@0.1.8
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Jumbee.Console.Snapshot&version=0.1.8
                    
Install as a Cake Addin
#tool nuget:?package=Jumbee.Console.Snapshot&version=0.1.8
                    
Install as a Cake Tool

Jumbee.Console Snaphshot

About

This is an add-on library for Jumbee.Console that provides headless snapshot testing: render any control or layout to text or PNG without a real terminal.

Getting Started

See GETTING-STARTED.md on the project site, and the project documentation.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.8 0 7/31/2026
0.1.7 30 7/30/2026
0.1.6 47 7/29/2026
0.1.5 95 7/23/2026
0.1.4 93 7/21/2026
0.1.3 91 7/20/2026
0.1.2 96 7/20/2026
0.1.1 102 7/19/2026

# Changelog

## 0.1.8

### Fixed
Several controls and classes had the documentation for overriden members hidden by the base class versions due to an incorrect tag.

## 0.1.7

### Added

- **`ProgressBar` control** — a composable, themeable single-row task-progress display: a settable description, a smooth sub-cell fill bar, and optional percentage, elapsed/remaining-time and spinner columns, plus an indeterminate pulse for work whose total isn't known.

### Fixed

- **Framed controls now render their frame inside a `VerticalStackPanel` / `HorizontalStackPanel`. A margin on a stacked control now reserves space as expected.

### Docs

- Added `/llms.txt` generation (per [llmstxt.org](https://llmstxt.org/)) to the API-docs script — a curated, link-listed index of the docs and public API for LLM tooling.


## 0.1.6

### Added

- **`PlotPalette`** (`Jumbee.Console.Styles`) and **`IStyleTheme.PlotSeries`** — plot colours are now themeable: the axis, grid, tick and surface chrome plus the series palette come from the active theme instead of being passed per call, so a runtime theme switch re-colours existing plots.
- **`Plot.DamageTracking`** — opt-in partial redraw. The plot reports only the sub-rectangles a draw actually changed and the compositor skips the rest; roughly 5× off the composite for a sparse figure. Off by default — see the remarks on the property for when it pays and when it costs.
- **`ConsolePlot`: axis ticks can be set to `0`**, which removes that axis's grid lines and labels.

### Changed

- **`TextLabel` takes its colours from `IStyleTheme.LabelText`** (both foreground and background) until one is set explicitly. Colours passed to the constructor still win and now register as theme overrides, so a later theme switch re-colours only the labels that never asked for a colour. A theme supplying a background lets labels sit on a coloured strip without every caller passing one.

### Fixed

- **`CompositeControl` swallowed clicks on display composites.** A composite that opted into the mouse (`WantsMouse`) but whose children were not themselves focusable or mouse-listening produced cells with no listener, so a click anywhere over such a child never reached the composite. Those cells now carry the composite's own listener, restoring click-to-focus for panes like a plot; a child with its own listener is unaffected.
- `ConsolePlot`: custom tick values are honoured, and `Clear` no longer rewrites the whole buffer.

### Docs

- Documented the **cost model of damage tracking**, not just its benefit: it narrows what the compositor *scans* and never what the terminal *receives*, and because the scan it replaces is a linear buffer walk while damage bookkeeping is scattered, break-even needs the changing region to be a small fraction of the control — see `Control.TracksDamage` and "When damage tracking pays" in `docs/internal/Rendering Model.md`.

### Examples

- **New AudioScope demo** — a real-time oscilloscope, spectroscope and vectorscope over one shared audio source. Fully managed and cross-platform: MP3/WAV decode through NLayer, capture through WASAPI (Windows) or ALSA (Linux), with device selection, loopback, mono, `--overlap`, `--tick` and four colour schemes.
- Both Docker images gained an `audio-scope` target with a bundled sample track, and now ship the ALSA runtime so `audio-scope live` works on a Linux host given `--device /dev/snd`.

## 0.1.5


### Added

- **`Color.FromHexString`** — parses a hex colour string (e.g. `"#FF8800"`) into a `Jumbee.Console.Color`.
- **24-bit (true-color) support in ConsolePlot** — plot chrome and series take full RGB `Jumbee.Console.Color` values.
- `Plot` **screen-anchored axis titles** — the Y title pins to the top-left and the X title to the bottom-right, so they stay put as the axes rescale.

### Changed
- Performance optimizations for `Plot` control.
- **`UI.Start`: the frame-rate parameter is now `fps`** (frames per second) instead of `paintInterval`
- `Overlay` and `TextLabel` are now `sealed`.

### Fixed

- Fixed a latent crash when drawing **scatter points outside a fixed axis range** — such a point mapped past the plot buffer and threw `IndexOutOfRangeException`; it is now correctly clipped.
- UI/threading robustness: self-heal a UI run that was previously hard-killed, plus assorted input/UI/threading fixes.

## 0.1.4

### Fixed

- `MarkdownViewer` now **word-wraps paragraph text** to the control width. Previously a paragraph wider than the view clipped at the right edge and dropped everything past the first row (its doc already claimed it "reflows to the control width"). Implemented via a new opt-in `wrapWords` mode on `AnsiConsoleBuffer` (word-boundaried, with a character-level fallback for an over-long word); other controls are unaffected.
- The package now bundles the **XML documentation** of its private assemblies (`Jumbee.Console.Styles`, the Spectre.Console fork, ConsolePlot, …) alongside their DLLs in `lib/`. Previously only the DLLs shipped, so the theming/`Color`/`IStyleTheme`/`IGlyphTheme` API (in `Jumbee.Console.Styles`) and the bundled Spectre types had **no IntelliSense/doc surface** for consumers. (The bundling target's `.xml` match never fired because the XML doc copies don't carry `ReferenceSourceTarget=ProjectReference`.)

### Added

- `UI.HotKeys.Char(char)` — builds a `ConsoleKeyInfo` for a bare letter, digit, punctuation, or space key so it can be registered as a global hotkey (e.g. `UI.RegisterHotKey(UI.HotKeys.Char('q'), UI.Stop)`). It mirrors the input decoder exactly — including that punctuation keys (e.g. `/`) carry key code `0` with the character — so a registered hotkey matches a real keypress, and the same value drives a headless `routeGlobal` snapshot test.
- `Tree.SelectionChanged` event — raised whenever the highlighted node changes (arrow/vim keys, Home/End/PageUp/PageDown, or a mouse click), mirroring `ListBox.SelectionChanged`. Lets a detail pane follow tree navigation instead of only reacting to `NodeActivated` (leaf Enter/double-click).
- `TreeGuide.None` — a connector-less tree where hierarchy is shown by indentation (and node glyphs) alone.
- `Tree.TreeNode.Tag` and `ListBox.ListBoxItem.Tag` — an `object?` slot for arbitrary application data, so a node/row can map back to its domain object without a side dictionary.

### Changed

- `Tree.TreeNode.UpdateTree()` is now `public` (was `protected`) — it appeared in the docs but wasn't callable (`CS0122`). It forces a redraw of the owning tree, for the rare case a mutation didn't go through a property setter.

### Docs

- Documented that `ConsoleSnapshot.ToTextAfter`/`RenderAfter` deliver keys to the `control` argument itself, not to whatever `UI.SetFocus` last targeted — pass the control that actually changes (for a composite app, the specific child under test, not the root).
- Refreshed the "Snapshot Testing" internals page to the current input API (`routeGlobal`, `UI.HotKeys.Char`) and cross-linked the getting-started "Testing without a terminal" guide. The getting-started hotkey examples now use `UI.HotKeys.Char`; the previous punctuation example built the key with `ConsoleKey.Oem2`, which does not match a real `/` keypress.
- `UI.RegisterHotKey`: documented that the hotkey table is **process-global** (not scoped to a `UI.Start` root) — so a hotkey letter never reaches a focused text field (unregister/re-register around focus), and a second app instance re-registers the same keys (register/exercise one at a time in headless tests).
- `Grid`: documented its **fixed-cell** sizing (each value is an absolute cell count; the grid's size is their sum; `0` is a collapsed row/column, **not** fill-the-parent like `DockPanel`) — use `DockPanel`/`SplitPanel` for proportional/fill layouts.
- `SplitPanel.MinFirst`: documented it clamps to ≥ 1, so `SplitPosition` can't reach 0 (a "fully collapsed" pane is a 1-cell sliver).
- Composite Controls: added the single-child idiom (`SetContent(new Boundary(child))`).
- Troubleshooting: added the `Jumbee.Console.Tree` vs `Spectre.Console.Tree` name-ambiguity (`CS0104`) fix, and clarified that `MarkdownViewer` lives in core `Jumbee.Console` while the other viewers are in `Jumbee.Console.Documents`.

## 0.1.3

### Changed

- `ConsoleSnapshot.Key(key, …)` now fills in `KeyChar` for letter and digit keys (lowercase, uppercase under Shift, the control char under Ctrl), so a simulated key matches a hotkey registered the natural way (a bare letter). Previously it left `KeyChar='\0'`, so `ToTextAfter(…, routeGlobal: true)` silently failed to fire bare-letter global hotkeys. Non-character keys (arrows, function keys) are unchanged.

### Docs

- Documented that text snapshots (`ConsoleSnapshot.ToText`) don't capture colour or decoration — assert colour with `SavePng`/`ToImage`, or render a visible marker.
- Documented the runtime-reconfiguration pattern on `UI.Layout` (read-only): for a full-screen "zen" toggle, collapse a `SplitPanel` pane via `SplitPosition` or reassign `DockPanel.DockedControl`/`FillControl`, rather than swapping the root.

## 0.1.2

### Added

- `UI.SendInput(target, key, routeGlobal)` — an opt-in overload that runs the global hotkey dispatch (keys registered with `UI.RegisterHotKey`) before routing to the focused control, mirroring the live input path. Backward-compatible; existing calls route straight to the control as before.
- `Jumbee.Console.Snapshot`: `ConsoleSnapshot.RenderAfter` and `ToTextAfter` now accept a `routeGlobal` flag, so a headless snapshot test can exercise an app's global keybindings, not just control-routed input. Build the simulated key the same way the hotkey was registered so it compares equal.

### Changed

- The bundled package README now includes a runnable first-app example and a note about the private Spectre.Console fork: do not also reference the upstream `Spectre.Console` NuGet package (the assembly identities collide and the build fails with `CS1704`).

## 0.1.1

- Initial public release.