Skip to content

Releases: Aaronontheweb/termina

Termina 0.12.1

11 Jun 03:29
26ba033

Choose a tag to compare

0.12.1 June 11th 2026

New Features:

  • WithFooter and WithFooterColor API on ModalNode (#292)
    • New WithFooter(string) and WithFooterColor(Color) builder methods on ModalNode for adding a footer line to modal dialogs
    • Footer renders on the bottom border line with automatic text truncation to fit modal width
    • Optional color customization via WithFooterColor — falls back to reset terminal colors when not specified
    • Demonstrated with a TodoListPage demo showcasing modals with actionable footers

Documentation:

  • Updated ModalNode component docs with WithFooter API reference and usage example (#293)

Termina 0.12.0

09 Jun 21:32
188fa85

Choose a tag to compare

0.12.0 June 9th 2026

New Features:

  • FilePickerNode for interactive file/folder selection (#284)
    • New layout node providing an interactive terminal-based file picker with breadcrumb navigation, fuzzy filtering, and configurable selection modes (Files, Directories, or All)
    • Supports both single-select and multi-select modes with Space/Enter keyboard shortcuts
    • Hidden file toggle and glob-based file filters via FileSystemName.MatchesSimpleExpression
    • IFileSystemProvider abstraction enables deterministic unit testing of file picker behavior
    • Includes a Gallery demo page demonstrating file picker and folder picker side by side

Dependency Updates:

  • Updated R3 reactive framework from 1.3.0 to 1.3.1 (#282)

Termina 0.11.1

08 Jun 17:36
6068588

Choose a tag to compare

0.11.1 June 8th 2026

Bug Fix — DECCKM arrow disambiguation:

  • CSI A/B no longer misrouted as wheel events in terminals that ignore DECCKM (#280)
    • CsiFunctionalDecoder unconditionally treated bare CSI A/B as alternate-scroll wheel events when Kitty was inactive, assuming the terminal honored DECCKM (?1h) and sent real arrows as SS3. Terminals that ignore DECCKM (VHS, some PTY wrappers) keep sending arrows as CSI form, so arrow navigation broke silently.
    • Added a DeckmConfirmed flag to TerminalModeContext. The parser sets it when it first sees an SS3 arrow key — proof the terminal honored DECCKM. CsiFunctionalDecoder only routes CSI A/B as wheel after this confirmation; until then they are keyboard arrows.
    • Narrowed the DECCKM confirmation to SS3 arrow keys only (A/B/C/D). SS3 F1-F4 (P/Q/R/S) use the SS3 encoding as a VT220 legacy independent of DECCKM and no longer false-positive the detection.

Termina 0.11.0

07 Jun 02:34
a0ffb2a

Choose a tag to compare

0.11.0 June 7th 2026

Terminal Input Reliability and Native Copy/Paste Support

  • Added an internal semantic input pipeline that decodes terminal protocol input before adapting back to Termina's existing public input events.
  • Extracted protocol-specific decoders for SGR mouse input, SS3 keyboard input, CSI functional keys, legacy CSI keyboard sequences, Kitty keyboard formats, bracketed paste, and unknown-sequence fallback handling.
  • Preserved the existing public input surface: KeyPressed, MouseScrollEvent, PasteEvent, and ResizeEvent.
  • Expanded Linux terminal conformance coverage for baseline PTY, tmux, kitty, and kitty plus tmux scenarios.
  • Added real terminal selection, explicit clipboard copy, and paste-into-focused-input coverage to validate native terminal clipboard workflows.
  • Hardened file trace disposal so buffered trace events drain deterministically.

Upgrade Notes

  • Existing applications continue using LegacyMouseTracking by default.
  • Applications that need native terminal text selection should opt into raw input plus alternate-scroll.
  • Built-in text inputs handle bracketed paste automatically.
  • Custom focusable input components should implement IPasteReceiver to receive focused paste content.
  • For tmux, enable passthrough with set -g allow-passthrough on.
  • When tmux mouse mode captures selection, use Shift-drag plus the terminal copy shortcut, usually Ctrl+Shift+C.
  • See the 0.11.0 upgrade advisory for the recommended runtime configuration and tmux workflow.

Termina 0.10.2

30 May 13:08
81e04d0

Choose a tag to compare

0.10.2 May 30th 2026

Bug Fixes — Input parsing, rendering, and tracing:

  • Unrecognized CSI tilde sequences now flush correctly (#232)

    • Fix for [5~ (PgUp), [6~ (PgDn) and other bracketed CSI sequences being silently swallowed by the escape sequence parser. These were causing the parser to stay stuck in InBracketSequence mode, blocking all subsequent input. Sequences now flush as raw KeyPressed events for application handling.
  • Legacy CSI tilde key decoding — Maps legacy CSI tilde key sequences to semantic ConsoleKey events while preserving unknown tilde raw flush behavior.

  • TextInputNode placeholder background color fixed (#233)

    • Placeholders now render with the correct background fill against the configured Background color instead of inheriting the terminal's default.
  • FileTraceListener UTF-8 encoding fixed (#234)

    • Switched from Encoding.Default to UTF-8 (without BOM), preventing ArgumentException on Unicode characters (e.g., ➭ U+27AD) and the resulting consumer task faults, channel fill, and OOM issues in trace output.
    • DisposeAsync drain order fixed — _disposed flag is now set after waiting for the consumer to drain, preventing buffered events from being skipped and leaving trace files empty.

Test Fixes

  • SelectionItemContent invalidation test made deterministic (#236)

Termina 0.10.1

24 May 21:05
0.10.1
e4bdc4b

Choose a tag to compare

0.10.1 May 24th 2026

Bug FixesStreamingTextNode thread-safety and disposal hardening:

  • RebuildBuffer correctly inserts a newline before block segments after Clear() (#224)

    • Pre-fix, after Clear() reset HasContentOnCurrentLine, the first re-added block segment skipped its leading newline during rebuild, causing block content to collide with prior content on the same line.
    • Moves the block-newline check inline, evaluated after prior elements are re-appended so the buffer state reflects the in-progress reconstruction.
  • Animation callbacks now hold _contentLock (#225)

    • Animation Invalidated callbacks from IAnimatedTextSegment (e.g. SpinnerSegment on the R3 timer thread) previously called RebuildBuffer without locking, racing with public mutators (Append/AppendTracked/Remove/Replace/Clear/Dispose) that all hold the lock. Symptoms ranged from InvalidOperationException ("Collection was modified") on the foreach inside RebuildBuffer to torn buffer state and ObjectDisposedException if Dispose() ran while a callback was queued behind the lock.
    • Funnels both callback sites through a single OnAnimationInvalidated() helper that takes _contentLock, checks a new volatile _disposed flag, then runs RebuildBuffer + notification safely.
    • Dispose() is now idempotent and sets _disposed = true first so in-flight callbacks bail before touching _invalidated.
  • NotifyChanged hardened against post-Dispose race (#227)

    • Every public mutator released _contentLock before calling NotifyChanged(), so a racing Dispose() could complete _invalidated.OnCompleted()/Dispose() in the gap and the mutator's OnNext would throw ObjectDisposedException. Same shape applied to deliberate use-after-dispose calls.
    • NotifyChanged now reads _disposed and try/catches ObjectDisposedException. OnAnimationInvalidated routes through NotifyChanged so the animation path inherits the same hardening.

Test improvements (#226):

  • Restructured the Replace thread-safety stress test so the ticker always fires on a live, permanently-tracked spinner (was mostly hitting an already-disposed segment after each Replace).
  • Added a reflection-based test that directly exercises the _disposed belt-and-suspenders guard inside OnAnimationInvalidated (the original AfterDispose test was passing for the wrong reason because subscription teardown was hiding the in-flight-callback path).

Termina 0.10.0

23 May 23:22
c8ad8e3

Choose a tag to compare

0.10.0 May 24th 2026

New Features:

  • ReactivePage.InvalidateLayout() for runtime layout rebuilds (#220)

    • New protected void InvalidateLayout() method on ReactivePage<TViewModel> that discards the cached layout tree and rebuilds via BuildLayout()
    • Solves the problem of layout values "baked in" at first navigation time (e.g. SizeConstraint.Auto records) being permanently frozen — consumers can now trigger a full rebuild when external state changes (terminal resize, etc.)
    • Preserves user subscriptions, key bindings, and focus when the target node survives the rebuild
    • Exception-safe: builds the new tree first, then atomically swaps — if BuildLayout throws, the existing layout is left intact
    • Includes 17 comprehensive lifecycle tests covering disposed-guard, re-entrancy, idempotent dispose, and subscription cleanup
  • Alternate-scroll wheel mode with Kitty keyboard protocol disambiguation (#215)

    • Replaces SGR mouse tracking with ?1007h alternate-scroll mode for wheel events, combined with Kitty keyboard protocol (report_all_keys) for true key disambiguation
    • On Ghostty, kitty, WezTerm, foot, and iTerm2 ≥ 3.5: scroll-wheel scrolls IScrollable components, arrow keys act as arrows even in always-focused text inputs, and native text selection (click-drag) still works
    • New opt-in TERMINA_UNIX_RAW_INPUT=1 environment variable enables raw Unix stdin for the protocol to work
    • Dual Ctrl+C quit pattern replaces per-demo Ctrl+Q convention
  • Harden alternate-scroll rollout and document runtime input modes (#217)

    • Restored legacy mouse tracking as the framework default — alternate-scroll is now opt-in via explicit app configuration
    • Moved Kitty keyboard negotiation into TerminaApplication with safer raw-input fallback on non-interactive consoles
    • Added comprehensive website docs covering runtime input modes, raw input, alternate-scroll, Kitty flags, and tmux passthrough

Bug Fixes:

  • ResizeEvent now forwards to ViewModel.Input observable (#219)
    • Fixed TerminaApplication.ProcessEvent swallowing ResizeEvent via early return; — the event now correctly falls through to _inputSubject.OnNext(inputEvent)
    • Pages and ViewModels subscribing via ViewModel.Input.OfType<ResizeEvent>() now receive resize notifications as intended
    • Enables consumers to recompute width- or height-sensitive layout on terminal resize

Termina 0.9.0

18 May 17:04
8b32fb4

Choose a tag to compare

0.9.0 May 18th 2026

New Features:

  • SelectionListNode pre-selection via WithHighlightedIndex() (#213)

    • New fluent method WithHighlightedIndex(int index) allows callers to pre-select a highlighted item in SelectionListNode by index at construction time
    • Useful for dialogs that should open with a sensible default already highlighted
  • SelectionListNode full-height mode via WithFillHeight() (#210)

    • New fluent method WithFillHeight() makes SelectionListNode expand to fill all available vertical space
    • Enables list-first layouts where the selection list is the primary content of the page

Bug Fixes:

  • Fixed navigation data race that crashed pages on ARM64 (#212)

    • Resolved a race condition in the navigation system that caused page crashes on ARM64 hardware
    • Affects any multi-core ARM64 deployment (Apple Silicon, AWS Graviton, Raspberry Pi, etc.)
  • Fixed garbled output when the terminal does not start in UTF-8 (#204)

    • AnsiTerminal no longer caches Console.Out. Setting Console.OutputEncoding replaces Console.Out with a new TextWriter, so a cached reference could be left bound to a stale, non-UTF-8 encoding — rendering Unicode box-drawing characters as U+FFFD. The output writer is now resolved on every flush.
    • Consolidated UTF-8 output-encoding setup into a single owner (ConsoleEnvironment.EnsureUtf8Output, invoked by the platform console) instead of three separate call sites.
    • Original problem diagnosed by @logical-intent in #204 / #205.

Security:

  • Fixed CVE-2026-40894: pinned OpenTelemetry.Api to 1.15.3 (#209)
    • Pinned OpenTelemetry.Api to 1.15.3 to address a security vulnerability in earlier versions

Termina 0.8.0

17 Mar 00:34
2d69948

Choose a tag to compare

0.8.0 March 17th 2026

New Features:

  • CopyableTextNode with terminal clipboard support (#179)

    • New CopyableTextNode component for selectable, copyable text with keyboard-driven selection
    • Configurable copy key bindings via CopyKeyBinding
    • Terminal clipboard integration using OSC 52 escape sequences with automatic tmux transport fallback
    • IClipboardService / IClipboardTransport interfaces for extensible clipboard backends
    • TerminalClipboardService registered automatically via AddTermina() in DI
  • Toast notification system (#179)

    • New ToastOverlayNode for non-blocking in-app notifications
    • IToastService / ToastService for programmatic toast dispatch
    • Configurable ToastPosition (TopRight, TopLeft, BottomRight, BottomLeft) and ToastOptions
    • CopyFeedbackMode controls copy success feedback: toast overlay or inline indicator

Termina 0.7.2

01 Mar 15:07
c48c3d3

Choose a tag to compare

0.7.2 March 1st 2026

New Features:

  • TextAreaNode multi-line text input (#161, #163)
    • New TextAreaNode component for multi-line text input with line-by-line editing
    • Extracted common base class TextInputBaseNode shared with single-line TextInputNode
    • Alt+Enter for universal newline insertion (works on all terminals, unlike Ctrl+Enter)
    • Kitty keyboard protocol support for Ctrl+Enter detection when available (#165)
    • Proper cursor positioning after multiple consecutive newlines
    • Full input clearing on submit with committed segments model

Bug Fixes:

  • Improved TextInputNode paste behavior (#162)

    • Enhanced multi-line paste handling with committed segments model
    • Paste summaries display character count and line count for better UX
    • Full pasted content preserved and submitted as single unit
  • TextAreaNode hardening (#165)

    • Fixed cursor jump after consecutive newlines in TextAreaNode
    • Corrected input clearing on submit to clear entire buffer, not just committed segments
    • Improved stability and consistency of multi-line input behavior

Dependencies:

  • Bumped Akka.Hosting from 1.5.60 to 1.5.61 (#160)