RazorConsole v0.5.0

Released: March 8, 2026 | Milestone v0.5.0

RazorConsole v0.5.0 introduces powerful new layout and scrolling capabilities, including a CSS flexbox-inspired FlexBox component and a new ViewHeightScrollable component for line-by-line scrolling over arbitrary content. This release also expands Table column attributes, fixes a critical focus bug with @key, and adds macOS ARM64 to the CI test matrix.

Highlights

  • FlexBox Layout Component: Added a new FlexBox component that brings CSS-like flexbox semantics — direction, justify, align, wrap, and gap — to console layouts (#302, fixes #109)
  • ViewHeightScrollable Component: Added a new ViewHeightScrollable component that enables smooth line-by-line scrolling over any content with optional embedded scrollbar support for Panel, Border, and Table (#306)
  • Table Column Attribute Extensions: Added Width, Padding, and NoWrap attributes to table columns, aligning the Table component with Spectre.Console's native column API (#309)
  • Focus Fix with @key: Resolved a critical bug where FocusManager.FocusAsync failed to target components identified by @key when they were conditionally added to the render tree (#310, fixes #307)
  • CI: macOS ARM64 Testing: Added macos-latest to the CI build-and-test matrix, ensuring cross-platform coverage includes Apple Silicon (#312, fixes #311)

Milestone Completion

All 8 items in the v0.5.0 milestone have been completed:

Issues

  • #109 - Add a Box IRenderable to support flex-like layout
  • #307 - Can't set focus to Panel with @key with FocusManager
  • #311 - CI - enable test on macos-latest

Pull Requests

  • #301 - Bump version prefix to 0.5.0
  • #302 - Feat: Implement flex box layout
  • #306 - feat: Add ViewHeightScrollable
  • #309 - feat(components): Add Width, Padding and NoWrap attributes in Table columns
  • #310 - Fix #307 by moving populate key to component upfront in render pipeline
  • #312 - Enable CI tests on macos-latest

Detailed Changes

Components & Rendering

  • New FlexBox Component:

    • Added FlexBox component that lays out child items using a CSS flexbox model (#302)
    • Supports Direction (Row / Column), Justify (Start, End, Center, SpaceBetween, SpaceAround, SpaceEvenly), Align (Start, End, Center, Stretch), Wrap (NoWrap, Wrap), Gap, Width, and Height parameters (#302)
    • Backed by FlexBoxRenderable and FlexBoxElementTranslator for accurate terminal cell-buffer rendering (#302)
    • Includes gallery examples for row layout, justify-center, space-between navigation, column direction, and wrapping layouts (#302)
  • New ViewHeightScrollable Component:

    • Added ViewHeightScrollable component for line-by-line vertical scrolling over arbitrary content (#306)
    • Supports LinesToRender, ScrollOffset (two-way bindable), and optional ScrollbarSettings — sharing the same scrollbar API as the existing Scrollable component (#306)
    • Embedded scrollbar mode (IsScrollbarEmbedded = true) renders the scrollbar inside Panel, Border, and Table containers for a polished look (#306)
    • Keyboard support: ArrowUp/ArrowDown (single line), PageUp/PageDown (page), Home/End (bounds) (#306)
    • Introduced ScrollableLayoutCoordinator singleton service to coordinate maxOffset between the component and ScrollableRenderable (#306)
    • Refactored ScrollableWithBarRenderable into a unified ScrollableRenderable serving both Scrollable and ViewHeightScrollable (#306)
    • Gallery examples updated across all components where code blocks are too large to fit the visible area (#306)
  • Table Column Attribute Extensions:

    • Added Width, Padding, and NoWrap attributes to table column elements, matching Spectre.Console's native TableColumn API (#309)

Focus & Input Reliability

  • FocusManager @key Fix:
    • Fixed FocusManager.FocusAsync(key) failing to resolve focus targets identified by @key when the component was conditionally rendered (e.g., inside @if) (#310)
    • Root cause: @key attributes were not being applied to the component's VNode early enough in the render pipeline, so the key was unavailable at focus resolution time (#310)
    • Fix: Key population now runs upfront in the render pipeline before focus resolution, ensuring @key is always present when FocusAsync is called after StateHasChanged (#310)
    • Added gallery example (/issue-307-focus) reproducing and verifying the fix with two cascading Select components (#310)

Build & CI

  • macOS ARM64 CI Coverage:

    • Added macos-latest to the os matrix in .github/workflows/ci.yml, enabling tests to run on macOS ARM64 in GitHub Actions (#312)
  • Version Bump:

    • Updated VersionPrefix to 0.5.0 in nuget-package.props (#301)

Acknowledgments

Special thanks to the contributors who made this release possible:

  • Skoreyko Misha (TeseySTD) for implementing the ViewHeightScrollable component with embedded scrollbar support and refactoring the scrollable rendering pipeline, and for extending Table column attributes
  • LittleLittleCloud for implementing the FlexBox layout component and fixing the critical @key focus resolution bug

Full Changelog: https://github.com/RazorConsole/RazorConsole/compare/v0.4.0...v0.5.0