Retro.TUI.Rendering 0.4.1-alpha.4

Prefix Reserved
This is a prerelease version of Retro.TUI.Rendering.
dotnet add package Retro.TUI.Rendering --version 0.4.1-alpha.4
                    
NuGet\Install-Package Retro.TUI.Rendering -Version 0.4.1-alpha.4
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Retro.TUI.Rendering" Version="0.4.1-alpha.4" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Retro.TUI.Rendering" Version="0.4.1-alpha.4" />
                    
Directory.Packages.props
<PackageReference Include="Retro.TUI.Rendering" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Retro.TUI.Rendering --version 0.4.1-alpha.4
                    
#r "nuget: Retro.TUI.Rendering, 0.4.1-alpha.4"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Retro.TUI.Rendering@0.4.1-alpha.4
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Retro.TUI.Rendering&version=0.4.1-alpha.4&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Retro.TUI.Rendering&version=0.4.1-alpha.4&prerelease
                    
Install as a Cake Tool

Retro.TUI.Framework

A modern C-Sharp .NET multiplatform TUI framework powered by SkiaSharp,
inspired by Turbo Vision with a PC Tools 9.x retro aesthetic.

License: MIT .NET Platform Build Coverage NuGet NuGet Downloads

πŸ“– VersiΓ³n espaΓ±ola

Sample App (Preview)


Index

  1. Overview
  2. What it is and what it is not
  3. Inspiration and references
  4. Design decisions
  5. Solution structure
  6. Architecture layers
  7. Roadmap
  8. Detailed technical documentation

1. Overview

Retro.TUI.Framework is a .NET framework for building text user interface (TUI) applications with the following core characteristics:

  • Truly multiplatform: Windows, Linux and macOS from the same code base.
  • Vector rendering: SkiaSharp as the drawing engine, with embedded bitmap fonts and an authentic EGA/CGA color palette.
  • Component model: hierarchical view tree, typed event system, focus management and modal stack, inspired by the Turbo Vision architecture.
  • Fixed EGA palette: 16-color EGA palette with semantic color roles (TuiColorRole). Colors are fixed and faithful to the PC Tools 9.x aesthetic by Central Point Software.
  • Idiomatic C#: naming, patterns and conventions native to modern C# (.NET 10+). It is not a 1:1 translation of Turbo Vision.

2. What it is and what it is not

It is

  • A framework for building desktop TUI applications with a retro look.
  • A reusable library distributable as independent NuGet packages per layer.
  • An extensible foundation for building custom controls and behaviours.

It is not

  • A terminal emulator or a framework for console applications (stdout/stdin).
  • A direct reimplementation of Turbo Vision. It adopts its philosophy and patterns, but adapts them to the modern .NET ecosystem.
  • A specific application. The project includes a sample app (samples/) that reproduces the PC Tools 9 look, but the framework is independent of it.

3. Inspiration and references

Turbo Vision (Borland, 1990)

Turbo Vision was a TUI framework for C++ and Pascal that introduced advanced concepts for its time: view tree, event system, modal stack, semantic palettes and a component composition model. This framework adopts its architectural philosophy and translates it to the modern C# paradigm.

Turbo Vision concept Retro.TUI equivalent
TView TuiView
TGroup TuiGroup
TApplication TuiApplication
TEvent (struct with union) record hierarchy with TuiEvent
Numeric palette (tpXxx) TuiColorRole (semantic enum)
TDeskTop TuiDesktop
TWindow / TDialog TuiWindow / TuiDialog
TMenuBar / TStatusLine TuiMenuBar / TuiStatusBar

PC Tools 9.x (Central Point Software, ~1991)

The visual aesthetic reference. Characteristics reproduced:

  • Standard 16-color EGA palette mapped to semantic roles, with two additional non-EGA grays for inactive title bars and scroll bar tracks.
  • IBM VGA monospaced font (PxPlus IBM VGA 9x16), embedded as a resource in Retro.TUI.Theming.
  • Application title bar in Norton/PCTools style.
  • Window borders with geometric lines (not Unicode box-drawing characters).
  • Semi-transparent shadows on windows and dialogs.
  • Menu bar and status bar with the characteristic color scheme.

4. Design decisions

4.1 Window host: SDL2 + SkiaSharp

Decision: SDL2 (via .NET binding through Silk.NET) as window and input host. SkiaSharp as the 2D rendering engine.

Rationale:

  • SDL2 does exactly one thing: manage windows, keyboard/mouse input and the rendering context. It imposes no UI model of its own.
  • SkiaSharp provides high-quality 2D vector rendering with font support, controllable antialiasing and direct access to graphics primitives.
  • Truly multiplatform: the same API on Windows, Linux and macOS.

4.2 Class prefix: Tui

Decision: all public framework classes use the Tui prefix.

Rationale: avoids collisions with System.* (View, Window, Application, Label, Control...), SkiaSharp (SK prefix) and SDL2 (SDL prefix).

Examples: TuiView, TuiDialog, TuiMenuBar, TuiPalette, TuiTheme.

4.3 Event system: .NET records + Channel<T>

Decision: hierarchy of abstract record TuiEvent with subtypes for each event type. Queue implemented with System.Threading.Channels.Channel<TuiEvent>.

4.4 Color system: fixed EGA palette + semantic roles

Decision: the color scheme is fixed and defined in three static classes β€” TuiEgaPalette (16 canonical EGA color constants), TuiColorMap (internal mapping from TuiColorRole to SKColor) and TuiPalette (public static Resolve(TuiColorRole) method). TuiTheme is a static class holding only typography and shadow parameters.

No control has hardcoded colors. All rendering code resolves colors through TuiPalette.Resolve(TuiColorRole).

4.5 Separate projects per layer

Decision: each layer is an independent .csproj project.

Rationale: enforces layer dependencies at compile time, enables independent NuGet distribution per layer, and facilitates unit testing per layer.

4.6 Naming and conventions

The framework follows official C# conventions throughout: PascalCase, _camelCase for private fields, I prefix for interfaces, XML doc comments on all public API, nullable reference types enabled, record for immutable value types, init-only setters for configuration.


5. Solution structure

Retro.TUI.Framework.sln
β”‚
β”œβ”€β”€ docs/
β”‚   └── architecture.md            Detailed technical design
β”‚
β”œβ”€β”€ samples/
β”‚   └── Retro.TUI.Sample.Basic/    Basic demo application
β”‚
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ Retro.TUI.Core/            Application, message loop
β”‚   β”œβ”€β”€ Retro.TUI.Events/          Event hierarchy and commands
β”‚   β”œβ”€β”€ Retro.TUI.Hosting/         Window and input host (SDL2)
β”‚   β”œβ”€β”€ Retro.TUI.Rendering/       Rendering engine (SkiaSharp)
β”‚   β”œβ”€β”€ Retro.TUI.Theming/         Palettes, themes and color roles
β”‚   β”œβ”€β”€ Retro.TUI.Views/           TuiView, TuiGroup, TuiDesktop
β”‚   β”œβ”€β”€ Retro.TUI.Widgets/         Standard controls
β”‚   └── Retro.TUI.Windows/         TuiWindow, TuiDialog
β”‚
└── tests/
    β”œβ”€β”€ Retro.TUI.Core.Tests/
    β”œβ”€β”€ Retro.TUI.Events.Tests/
    β”œβ”€β”€ Retro.TUI.Hosting.Tests/
    β”œβ”€β”€ Retro.TUI.Rendering.Tests/
    β”œβ”€β”€ Retro.TUI.Theming.Tests/
    β”œβ”€β”€ Retro.TUI.Views.Tests/
    β”œβ”€β”€ Retro.TUI.Widgets.Tests/
    └── Retro.TUI.Windows.Tests/

Project dependencies

Dependencies strictly follow the layer direction. No lower layer knows about any upper layer.

Retro.TUI.Widgets
    └── Retro.TUI.Windows
            └── Retro.TUI.Views
                    └── Retro.TUI.Core
                            β”œβ”€β”€ Retro.TUI.Rendering
                            β”‚       β”œβ”€β”€ Retro.TUI.Theming
                            β”‚       └── Retro.TUI.Events
                            └── Retro.TUI.Hosting
                                    └── Retro.TUI.Events

6. Architecture layers

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   WIDGETS LAYER                      β”‚
β”‚   TuiMenuBar Β· TuiStatusBar Β· TuiButton Β· TuiLabel   β”‚
β”‚   TuiInputLine Β· TuiCheckBox Β· TuiRadioButton Β· ...  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                   WINDOWS LAYER                      β”‚
β”‚           TuiWindow Β· TuiDialog                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                    VIEWS LAYER                       β”‚
β”‚         TuiView Β· TuiGroup Β· TuiDesktop              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                    CORE LAYER                        β”‚
β”‚         TuiApplication Β· TuiMessageLoop              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚    RENDERING LAYER    β”‚       HOSTING LAYER          β”‚
β”‚  TuiRenderContext     β”‚   ITuiHost Β· SdlHost         β”‚
β”‚  TuiGrid Β· TuiFont    β”‚   ITuiInputProvider          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚              THEMING LAYER                           β”‚
β”‚    TuiTheme Β· TuiPalette Β· TuiColorRole              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚               EVENTS LAYER                           β”‚
β”‚   TuiEvent (record hierarchy) Β· TuiCommand           β”‚
β”‚   TuiEventQueue Β· TuiKey Β· TuiModifiers              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

For the complete technical detail of each layer, see:

β†’ docs/architecture.md


7. Roadmap

Milestone Version Content
1 β€” Foundations v0.1.0 Hosting, Rendering, Theming, Events
2 β€” View tree v0.2.0 Views, Core, Application loop
3 β€” Windows v0.3.0 TuiWindow, TuiDialog, modal stack
4 β€” Base controls (Widgets) v0.4.0 MenuBar, StatusBar, Button, Input
5 β€” Advanced controls v0.5.0 CheckBox, RadioButton, ListBox, ScrollBar
6 β€” Sample application v1.0.0 PC Tools 9 desktop sample

Milestone 1 β€” Foundations (Hosting + Rendering + Theming + Events)

v0.1.0

  • βœ… Retro.TUI.Events: record hierarchy, TuiCommand, TuiKey
  • βœ… Retro.TUI.Theming: TuiColorRole, TuiEgaPalette, TuiColorMap, TuiPalette (static), TuiTheme (static) β€” IBM VGA font embedded as resource
  • βœ… Retro.TUI.Hosting: ITuiHost, SdlHost
  • βœ… Retro.TUI.Rendering: TuiRenderContext, TuiGrid, TuiFont

Milestone 2 β€” View tree (Views + Core)

v0.2.0

  • βœ… Retro.TUI.Views: TuiView, TuiGroup, TuiDesktop
  • βœ… Retro.TUI.Core: TuiApplication, TuiMessageLoop, TuiFocusManager
  • βœ… Keyboard and mouse event dispatch to the tree
  • βœ… Custom mouse cursor

Milestone 3 β€” Windows

v0.3.0 βœ…

  • βœ… TuiWindow with title, border and shadow
  • βœ… TuiDialog with modal stack (IModalDialog, TuiDesktop.PushModal/PopModal)
  • βœ… Window drag with mouse (mouse capture via _capturedView)
  • βœ… Z-order (bring to front on click)
  • βœ… TuiApplication.RunModal β€” nested event loop, automatic lifecycle
  • βœ… Modal event routing β€” keyboard, mouse and commands restricted to active modal

Milestone 4 β€” Base controls (Widgets)

v0.4.0

  • TuiMenuBar with hover and menu opening
  • TuiStatusBar with function keys
  • βœ… TuiButton β€” focus, keyboard/mouse/accelerator activation, disabled state, factory presets (Ok, Cancel, Yes, No, Abort, Retry, Ignore)
  • βœ… TuiLabel
  • TuiInputLine with blinking cursor and basic editing

Milestone 5 β€” Advanced controls

v0.5.0

  • TuiCheckBox
  • TuiRadioButton with groups
  • TuiListBox
  • TuiScrollBar
  • Drop-down menus (TuiMenu, TuiMenuItem)

Milestone 6 β€” Sample application

v1.0.0

  • Retro.TUI.Sample.PcTools: reproduction of the PC Tools 9 desktop
  • Framework usage documentation

8. Detailed technical documentation

Document Content
docs/architecture.md Contracts, event hierarchy, theming, lifecycle, view tree

Requirements

  • .NET 10 SDK (10.0.300 or later)
  • Visual Studio 2026 or VS Code with C# Dev Kit
  • SDL2 native libraries (Windows: bundled via NuGet; Linux/macOS: system package)
  • Compatible with Windows 10+, Ubuntu 20.04+, macOS 12+

Contributing

See CONTRIBUTING.md for branch strategy, commit conventions and coding guidelines.

Third-party notices

See THIRD-PARTY-NOTICES.md for the licenses of all third-party components used by this project.

License

This project is licensed under the MIT License.
Β© 2026 Oscar Fernandez Gonzalez a.k.a. Osc@rNET and Contributors

Trademarks and Acknowledgements

This project is not affiliated with, endorsed by, or sponsored by any of the following companies or products:

  • Turbo Vision is a trademark of Embarcadero Technologies, Inc.
  • PC Tools was a trademark of Central Point Software, Inc., later acquired by Symantec Corporation.
  • Norton is a trademark of Gen Digital Inc.
  • IBM is a registered trademark of International Business Machines Corporation.

The retro aesthetic and architectural concepts used in this project are inspired by these products for educational and nostalgic purposes only. All trademarks are the property of their respective owners.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Retro.TUI.Rendering:

Package Downloads
Retro.TUI.Views

View-tree layer for Retro.TUI.Framework. Provides TuiView, TuiGroup and TuiDesktop β€” the composable visual hierarchy that all controls and windows build on. Depends on Events, Theming and Rendering; does not reference SkiaSharp directly.

Retro.TUI.Core

Application core for Retro.TUI.Framework. Provides TuiApplication (entry point), TuiMessageLoop (poll-update-render cycle) and TuiFocusManager (keyboard focus). This is the only layer that wires together Hosting, Rendering and the view tree.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.4.1-alpha.4 98 7/7/2026
0.3.0-alpha.3 83 6/27/2026