Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 36 additions & 40 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -10,49 +10,45 @@
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<VersionPrefix>0.3.0</VersionPrefix>
<PackageReleaseNotes>**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
<VersionPrefix>0.4.0</VersionPrefix>
<PackageReleaseNotes>**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)

---</PackageReleaseNotes>
</PropertyGroup>
Expand Down
43 changes: 43 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -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**:
Expand Down