From c7ce9329cba1686318711dc0b2c8543c1d30ca84 Mon Sep 17 00:00:00 2001 From: Aaron Stannard Date: Wed, 17 Dec 2025 20:47:08 -0600 Subject: [PATCH] Prepare release 0.4.0 Update version to 0.4.0 and add release notes covering: - Breaking change: VerticalLayout/HorizontalLayout default to Auto() sizing - Rich content support for SelectionListNode - Platform-native console for Windows with event-driven input - Formalized diagnostic tracing system --- Directory.Build.props | 76 ++++++++++++++++++++----------------------- RELEASE_NOTES.md | 43 ++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 40 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 72f234e..7d1683f 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -10,49 +10,45 @@ enable true true - 0.3.0 - **New Features**: -- **Inline animated text segments with tracked segment support** ([#71](https://github.com/Aaronontheweb/Termina/pull/71)) - - Opt-in tracked segments for `StreamingTextNode` enabling inline animations (spinners, timers, etc.) - - Caller-provided `SegmentId` system (like HTML div IDs) for tracking and manipulating segments - - New interfaces: `ITextSegment`, `IAnimatedTextSegment`, `ICompositeTextSegment` - - `SpinnerSegment` component with 6 animation styles: Dots, Line, Arrow, Bounce, Box, Circle - - `StaticTextSegment` for trackable static text - - Methods: `AppendTracked(id, segment)`, `Replace(id, segment, keepTracked)`, `Remove(id)` - - Interface-based message protocol with `IChatMessage` for clean chat operations - - Enables any inline animated element (timers, progress bars, blinks, highlighters) with minimal overhead + 0.4.0 + **Breaking Changes**: +- **VerticalLayout and HorizontalLayout now default to Auto() sizing** ([#97](https://github.com/Aaronontheweb/Termina/pull/97)) + - Previously, these layouts defaulted to Fill(), which caused nested layouts to compete with siblings for space + - New Auto() default means nested layouts size to their content by default + - Fill() is now only needed for children that should claim remaining space within a container + - Root layouts always fill terminal bounds regardless of constraints + - StackLayout retains Fill() as its default since overlays should fill + - Fixes [#95](https://github.com/Aaronontheweb/Termina/issues/95) -**Bug Fixes**: -- **Fix modal text input not accepting keystrokes** ([#70](https://github.com/Aaronontheweb/Termina/issues/70), [#74](https://github.com/Aaronontheweb/Termina/pull/74)) - - Critical fix where `TextInputNode` in modal dialogs would be immediately disposed after being focused - - Fixed `ReactiveLayoutNode` lifecycle to call `OnDeactivate()` instead of `Dispose()` when switching children - - Fixed modal focus propagation - `ModalNode` now forwards `OnFocused()` and `OnBlurred()` to content - - Fixed `ReactiveLayoutNode` to call `OnActivate()` on new children when they are dynamically swapped in - - Fixed render loop invalidation to properly propagate through container hierarchy - - Users can now properly type in modal dialogs without `ObjectDisposedException` +**New Features**: +- **Rich content support for SelectionListNode** ([#96](https://github.com/Aaronontheweb/Termina/pull/96)) + - New `SelectionItemContent` class for multi-line, styled selection items + - Support for `ITextSegment` (static and animated) in selection item content + - "Other" option with inline text input for custom user responses + - Multi-line items with per-line styling and animated segments (spinners, etc.) + - Proper coordinate translation via sub-context rendering -- **Fix NavigationBehavior.PreserveState layout disposal issue** ([#67](https://github.com/Aaronontheweb/Termina/issues/67), [#69](https://github.com/Aaronontheweb/Termina/pull/69)) - - Implemented Active/Inactive State Pattern for layout nodes to prevent `ObjectDisposedException` when navigating - - Added `IActivatableNode` interface defining `OnActivate`/`OnDeactivate` lifecycle methods - - Layout nodes now pause/resume instead of dispose/recreate on navigation with PreserveState behavior - - `ReactivePage` now builds layout once and preserves it across navigations - - `TextInputNode`, `SpinnerNode`, `ReactiveLayoutNode`, `ConditionalNode`, `SelectionListNode`, `ModalNode`, and `ContainerNode` all properly implement lifecycle propagation - - `TerminaApplication` now properly disposes cached pages via `IDisposable` implementation - - Fixes race conditions and ensures proper resource cleanup +- **Platform-native console abstraction for event-driven input** ([#90](https://github.com/Aaronontheweb/Termina/pull/90)) + - Replaced polling-based input with platform-native event-driven input on Windows + - Windows console enables VT100/ANSI support via `ENABLE_VIRTUAL_TERMINAL_PROCESSING` + - Event-driven input via `ReadConsoleInputW` eliminates polling latency + - Window resize events via `WINDOW_BUFFER_SIZE_EVENT` + - ~1000x rendering performance improvement on Windows (22-60ms → 0.02-0.08ms per frame) + - Cached console dimensions to avoid repeated P/Invoke calls + - Fallback console for non-Windows platforms with 1ms polling delay + - Closes [#78](https://github.com/Aaronontheweb/Termina/issues/78), [#79](https://github.com/Aaronontheweb/Termina/issues/79), [#81](https://github.com/Aaronontheweb/Termina/issues/81) -**Improvements**: -- **Add TERMINA002 analyzer and refactor MVVM architecture** ([#68](https://github.com/Aaronontheweb/Termina/pull/68)) - - New Roslyn analyzer (TERMINA002) detects layout nodes incorrectly stored as fields/properties in ViewModels - - Refactored MVVM pattern: ViewModel owns Input (public) for business logic, Page owns Focus for interactive control - - ViewModels now handle keyboard input directly in `OnActivated()` - - Pages can access `ViewModel.Input` when routing to interactive layout nodes - - Updated documentation to reflect clearer separation of concerns - - Reduces ceremony while maintaining clean MVVM architecture - -- **Documentation improvements** ([#66](https://github.com/Aaronontheweb/Termina/pull/66)) - - Added quick install section to docs homepage with NuGet badges and installation commands - - Improved documentation discoverability for new users - - Fixed docs deployment workflow trigger +- **Formalized diagnostic tracing system** ([#84](https://github.com/Aaronontheweb/Termina/pull/84)) + - Lightweight, zero-cost-when-disabled tracing system for debugging TUI applications + - Custom abstraction over Microsoft.Extensions.Logging (no direct dependency required) + - Deferred string formatting via `TraceEvent` struct with template and args + - Lock-free file output using Channel with single reader pattern + - Category-based filtering (Focus, Layout, Input, Page, Render, etc.) + - Level-based filtering (Trace, Debug, Info, Warning, Error) + - Optional MEL integration via `LoggerTraceListener` adapter + - DI extension methods for easy configuration + - Trace logs written to %TEMP%/termina-logs/ with timestamped filenames + - Addresses [#72](https://github.com/Aaronontheweb/Termina/issues/72) --- diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 9bff36f..ca3aaee 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,46 @@ +#### 0.4.0 December 17th 2025 #### + +**Breaking Changes**: +- **VerticalLayout and HorizontalLayout now default to Auto() sizing** ([#97](https://github.com/Aaronontheweb/Termina/pull/97)) + - Previously, these layouts defaulted to Fill(), which caused nested layouts to compete with siblings for space + - New Auto() default means nested layouts size to their content by default + - Fill() is now only needed for children that should claim remaining space within a container + - Root layouts always fill terminal bounds regardless of constraints + - StackLayout retains Fill() as its default since overlays should fill + - Fixes [#95](https://github.com/Aaronontheweb/Termina/issues/95) + +**New Features**: +- **Rich content support for SelectionListNode** ([#96](https://github.com/Aaronontheweb/Termina/pull/96)) + - New `SelectionItemContent` class for multi-line, styled selection items + - Support for `ITextSegment` (static and animated) in selection item content + - "Other" option with inline text input for custom user responses + - Multi-line items with per-line styling and animated segments (spinners, etc.) + - Proper coordinate translation via sub-context rendering + +- **Platform-native console abstraction for event-driven input** ([#90](https://github.com/Aaronontheweb/Termina/pull/90)) + - Replaced polling-based input with platform-native event-driven input on Windows + - Windows console enables VT100/ANSI support via `ENABLE_VIRTUAL_TERMINAL_PROCESSING` + - Event-driven input via `ReadConsoleInputW` eliminates polling latency + - Window resize events via `WINDOW_BUFFER_SIZE_EVENT` + - ~1000x rendering performance improvement on Windows (22-60ms → 0.02-0.08ms per frame) + - Cached console dimensions to avoid repeated P/Invoke calls + - Fallback console for non-Windows platforms with 1ms polling delay + - Closes [#78](https://github.com/Aaronontheweb/Termina/issues/78), [#79](https://github.com/Aaronontheweb/Termina/issues/79), [#81](https://github.com/Aaronontheweb/Termina/issues/81) + +- **Formalized diagnostic tracing system** ([#84](https://github.com/Aaronontheweb/Termina/pull/84)) + - Lightweight, zero-cost-when-disabled tracing system for debugging TUI applications + - Custom abstraction over Microsoft.Extensions.Logging (no direct dependency required) + - Deferred string formatting via `TraceEvent` struct with template and args + - Lock-free file output using Channel with single reader pattern + - Category-based filtering (Focus, Layout, Input, Page, Render, etc.) + - Level-based filtering (Trace, Debug, Info, Warning, Error) + - Optional MEL integration via `LoggerTraceListener` adapter + - DI extension methods for easy configuration + - Trace logs written to %TEMP%/termina-logs/ with timestamped filenames + - Addresses [#72](https://github.com/Aaronontheweb/Termina/issues/72) + +--- + #### 0.3.0 December 17th 2025 #### **New Features**: