Skip to content
Closed
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
46 changes: 40 additions & 6 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,46 @@
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<VersionPrefix>0.11.1</VersionPrefix>
<PackageReleaseNotes>**Bug Fix** — DECCKM arrow disambiguation:
<VersionPrefix>0.14.0</VersionPrefix>
<PackageReleaseNotes>**New Features**:

- CSI A/B no longer misrouted as wheel events in terminals that ignore DECCKM.
- Added DeckmConfirmed auto-detection: CSI A/B are keyboard arrows until an SS3 arrow key proves the terminal honors DECCKM.
- Narrowed DECCKM confirmation to SS3 arrow keys only — VT220 F1-F4 (SS3 P/Q/R/S) no longer false-positive.
- **Gradient primitives, GraphNode, and ProgressBarNode** ([#298](https://github.com/Aaronontheweb/termina/pull/298))
- New gradient system for rich visual theming
- `GraphNode` for data visualization and flow diagrams
- `ProgressBarNode` for animated progress indicators

- **Toast notifications with colors and icons** ([#296](https://github.com/Aaronontheweb/termina/pull/296))
- Enhanced `ToastNode` with configurable foreground/background colors
- Icon support for status differentiation

- **Modal footers with configurable colors** ([#292](https://github.com/Aaronontheweb/termina/pull/292), [#293](https://github.com/Aaronontheweb/termina/pull/293))
- `ModalNode` now supports `WithFooter` and `WithFooterColor` for adding a styled footer section
- Footer renders below modal content with optional color theming
- Includes a Gallery demo showcasing the feature on TodoList modals

- **Render loop frame provider** ([#306](https://github.com/Aaronontheweb/termina/pull/306))
- New `IRenderLoopFrameProvider` for deterministic frame timing control
- Enables precise animation and layout update scheduling

**Bug Fixes**:

- **Suppressed stale pre-swap frames on deferred navigation** ([#315](https://github.com/Aaronontheweb/termina/pull/315))
- Fixed visual artifacts when navigation is queued from an input handler during render swap

- **Eliminated no-op resize full refresh** ([#312](https://github.com/Aaronontheweb/termina/pull/312))
- Resizes that don't change bounds no longer trigger expensive full layout refresh

- **Corrected ScrollableContainerNode bounds.Y handling** ([#301](https://github.com/Aaronontheweb/termina/pull/301))
- `ScrollableContainerNode` now respects `bounds.Y` instead of overwriting layout above it
- Fixes layout stacking issues in scrollable containers

- **Fixed CSI Z (backtab/Shift+Tab) parsing** ([#297](https://github.com/Aaronontheweb/termina/pull/297))
- CSI Z sequences now correctly map to Tab with Shift modifier instead of being misinterpreted

**Dependency Updates**:

- Updated `Akka.Hosting` from 1.5.68 to 1.5.69 ([#299](https://github.com/Aaronontheweb/termina/pull/299))
- Updated `OpenTelemetry.Api` from 1.15.3 to 1.16.0 ([#291](https://github.com/Aaronontheweb/termina/pull/291))

---</PackageReleaseNotes>
</PropertyGroup>
Expand Down Expand Up @@ -49,4 +83,4 @@
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
</Project>
</Project>
46 changes: 45 additions & 1 deletion RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,48 @@
#### 0.12.0 June 9th 2026 ####
#### 0.14.0 June 23rd 2026 ####

**New Features**:

- **Gradient primitives, GraphNode, and ProgressBarNode** ([#298](https://github.com/Aaronontheweb/termina/pull/298))
- New gradient system for rich visual theming
- `GraphNode` for data visualization and flow diagrams
- `ProgressBarNode` for animated progress indicators

- **Toast notifications with colors and icons** ([#296](https://github.com/Aaronontheweb/termina/pull/296))
- Enhanced `ToastNode` with configurable foreground/background colors
- Icon support for status differentiation

- **Modal footers with configurable colors** ([#292](https://github.com/Aaronontheweb/termina/pull/292), [#293](https://github.com/Aaronontheweb/termina/pull/293))
- `ModalNode` now supports `WithFooter` and `WithFooterColor` for adding a styled footer section
- Footer renders below modal content with optional color theming
- Includes a Gallery demo showcasing the feature on TodoList modals

- **Render loop frame provider** ([#306](https://github.com/Aaronontheweb/termina/pull/306))
- New `IRenderLoopFrameProvider` for deterministic frame timing control
- Enables precise animation and layout update scheduling

**Bug Fixes**:

- **Suppressed stale pre-swap frames on deferred navigation** ([#315](https://github.com/Aaronontheweb/termina/pull/315))
- Fixed visual artifacts when navigation is queued from an input handler during render swap

- **Eliminated no-op resize full refresh** ([#312](https://github.com/Aaronontheweb/termina/pull/312))
- Resizes that don't change bounds no longer trigger expensive full layout refresh

- **Corrected ScrollableContainerNode bounds.Y handling** ([#301](https://github.com/Aaronontheweb/termina/pull/301))
- `ScrollableContainerNode` now respects `bounds.Y` instead of overwriting layout above it
- Fixes layout stacking issues in scrollable containers

- **Fixed CSI Z (backtab/Shift+Tab) parsing** ([#297](https://github.com/Aaronontheweb/termina/pull/297))
- CSI Z sequences now correctly map to Tab with Shift modifier instead of being misinterpreted

**Dependency Updates**:

- Updated `Akka.Hosting` from 1.5.68 to 1.5.69 ([#299](https://github.com/Aaronontheweb/termina/pull/299))
- Updated `OpenTelemetry.Api` from 1.15.3 to 1.16.0 ([#291](https://github.com/Aaronontheweb/termina/pull/291))

---

#### 0.13.0 May 30th 2026 ####

**New Features**:

Expand Down
36 changes: 36 additions & 0 deletions src/Termina/Layout/ModalNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public sealed class ModalNode : LayoutNode, IFocusable, IInvalidatingNode
private ILayoutNode? _content;
private string? _title;
private Color? _titleColor;
private string? _footer;
private Color? _footerColor;
private BorderStyle _borderStyle = BorderStyle.Rounded;
private Color? _borderColor;
private BackdropStyle _backdrop = BackdropStyle.Dim;
Expand Down Expand Up @@ -120,6 +122,24 @@ public ModalNode WithTitleColor(Color color)
return this;
}

/// <summary>
/// Sets the modal footer text, rendered in the bottom border line.
/// </summary>
public ModalNode WithFooter(string footer)
{
_footer = footer;
return this;
}

/// <summary>
/// Sets the footer color.
/// </summary>
public ModalNode WithFooterColor(Color color)
{
_footerColor = color;
return this;
}

/// <summary>
/// Sets the border style.
/// </summary>
Expand Down Expand Up @@ -353,6 +373,22 @@ private void RenderPanel(IRenderContext context, Rect bounds)
panelContext.WriteAt(titleX, 0, titleText);
}

// Draw footer if present (on bottom border line)
if (!string.IsNullOrEmpty(_footer))
{
var maxFooterLen = bounds.Width - 4;
var displayFooter = _footer.Length > maxFooterLen ? _footer[..maxFooterLen] : _footer;
var footerText = $" {displayFooter} ";
var footerX = 2;

if (_footerColor.HasValue)
panelContext.SetForeground(_footerColor.Value);
else
panelContext.ResetColors();

panelContext.WriteAt(footerX, bounds.Height - 1, footerText);
}

panelContext.ResetColors();

// Render content
Expand Down