.. Copyright (c) 2026 Tobias Erbsland - Erbsland DEV. https://erbsland.dev SPDX-License-Identifier: Apache-2.0 .. index:: single: Changelog single: Changes ********* Changelog ********* Version 1.7.0 - 2026-03-27 ========================== Release 1.7.0 unifies direct terminal output and buffer-based text rendering around a shared cursor-oriented API. The biggest additions are :cpp:any:`CursorWriter ` and :cpp:any:`CursorBuffer `, which make it much easier to reuse output code between live terminals, scrollback buffers, and rich text views. This release also introduces explicit character attributes and reusable text styles, expands buffer composition APIs, adds several new demos and reference pages, and improves key decoding and UTF-8 recovery for interactive applications. Highlights ---------- * Added :cpp:any:`CursorWriter ` as a shared cursor-based output interface implemented by :cpp:any:`Terminal ` and :cpp:any:`CursorBuffer `, so the same printing helpers can target both live terminals and in-memory buffers. * Added :cpp:any:`CursorBuffer ` with VT100-style wrapping, configurable overflow behavior, paragraph printing, inherited color resolution, and fill-character based screen clearing, which makes scrollback panes, log viewers, and text consoles much easier to implement. * Added :cpp:any:`CharAttributes ` and :cpp:any:`CharStyle ` so ANSI text attributes and color can be configured, combined, inherited, and reused consistently across direct terminal output, strings, and buffer rendering. * Added :cpp:any:`BufferDrawOptions ` plus improved :cpp:any:`WritableBuffer ` buffer-to-buffer drawing support for aligned placement, source cropping, and character-combination based composition. * Added the ``display-all-attributes``, ``key-input-demo``, and ``log-viewer`` demos together with substantially expanded reference and demo documentation for cursor output, text rendering, geometry, fonts, backends, and input handling. Added ----- * Added :cpp:any:`CursorWriter ` and :cpp:any:`CursorWriterPtr ` as the shared public abstraction for cursor-based text output, style changes, cursor movement, paragraph printing, and screen clearing. * Added :cpp:any:`CursorBuffer ` with :cpp:any:`CursorBuffer::OverflowMode ` options for shifting, wrapping, or growing scrollback-style buffers at the bottom edge. * Added :cpp:any:`CharAttributes ` for bold, dim, italic, underline, blink, reverse, hidden, and strikethrough state with explicit specified-versus-inherited semantics. * Added :cpp:any:`CharStyle ` as a reusable combined style object for color plus character attributes, including overlay/base resolution and stable hashing. * Added :cpp:any:`BufferDrawOptions ` so callers can draw buffers into other buffers with explicit target rectangles, source rectangles, color overwrite behavior, and optional :cpp:any:`CharCombinationStyle ` composition. * Added the ``display-all-attributes`` demo to show supported ANSI text attributes and style combinations. * Added the ``key-input-demo`` demo to visualize interactive key handling, printable text input, special keys, and live terminal resizing behavior. * Added the ``log-viewer`` demo to demonstrate cursor-based text generation, scrollback handling, follow mode, and :cpp:any:`BufferView ` based viewport rendering. * Added new reference chapters for backend integration, cursor output, and text rendering, plus new generated documentation helpers for drawing, drawing text, fonts, and geometry. Improved -------- * :cpp:any:`Terminal ` now implements :cpp:any:`CursorWriter `, so direct terminal printing and in-memory cursor output share one conceptual API for colors, character attributes, cursor movement, auto-wrap, and paragraph rendering. * :cpp:any:`WritableBuffer ` now has broader buffer composition support, making it easier to place pre-rendered regions, cropped views, and combined character artwork inside larger layouts. * :cpp:any:`Char `, :cpp:any:`String `, and related text-rendering paths now integrate more cleanly with reusable styles, inherited attributes, and multi-codepoint rendering support. * Key decoding and console input handling are more robust, including better handling for printable single-character input, broken UTF-8 lead bytes, chunked input timing, and polling-based POSIX readiness checks. * The documentation now covers cursor-oriented output, ANSI character attributes, text rendering, geometry, fonts, demo applications, and backend behavior in much greater depth. Implementation -------------- * Added focused unit tests for :cpp:any:`CursorBuffer `, :cpp:any:`CharAttributes `, :cpp:any:`CharStyle `, combined character handling, key decoding, and UTF-8 resynchronization. * Refactored paragraph rendering and related internal helpers so terminal output and cursor-buffer output can share more behavior. * Improved backend internals for attribute emission, input polling, and UTF-8 recovery while keeping the public API higher-level and easier to reuse. Version 1.6.0 - 2026-03-25 ========================== Release 1.6.0 makes text-heavy terminal applications much easier to build. The biggest user-facing addition is a new paragraph layout system that works both for direct terminal output and for text rendered into buffers. This release also adds a new remapped buffer type for row- and column-oriented editing workloads, improves terminal capability detection, and substantially expands the documentation and demos around wrapped text output. Highlights ---------- * Added :cpp:any:`ParagraphOptions `, :cpp:any:`ParagraphBackgroundMode `, :cpp:any:`ParagraphOnError `, :cpp:any:`TabOverflowBehavior `, and :cpp:any:`TextOptions ` to configure alignment, indentation, wrap markers, word splitting, tab handling, ellipsis behavior, background fill, and fallback behavior in one reusable model. * Added :cpp:any:`Terminal::printParagraph() ` so applications can print structured, width-aware paragraphs directly to the terminal without first building a full-screen buffer. * Added :cpp:any:`RemappedBuffer ` and :cpp:any:`Orientation ` for efficient row and column insertion, deletion, movement, shifting, and rotation in editors, log viewers, scrollback panes, and other large grid-based views. * Expanded :cpp:any:`Text `, :cpp:any:`String `, and :cpp:any:`Char ` with paragraph-aware rendering options and new helpers such as :cpp:any:`String::terminalLines() `, :cpp:any:`String::containsControlCharacters() `, and :cpp:any:`Char::isControl() `. * Added :cpp:any:`Terminal::isInteractive() `, a new ``command-line-help`` demo, and a much broader documentation set for paragraph layout, backends, and Unicode width handling. Added ----- * Added :cpp:any:`ParagraphOptions ` as a reusable public configuration object for wrapped paragraph rendering in :cpp:any:`Terminal `, :cpp:any:`TextOptions `, and :cpp:any:`Text `. * Added :cpp:any:`ParagraphBackgroundMode ` so wrapped paragraphs can optionally extend their background color into continuation indents, the remaining cells at the right edge, or both. This makes highlighted help blocks and callout text look consistent even when they wrap. * Added :cpp:any:`ParagraphOnError ` and :cpp:any:`TabOverflowBehavior ` to control narrow-layout fallbacks and non-advancing tab stops in a predictable way. * Added :cpp:any:`TextOptions ` so color, font, animation, and paragraph layout settings can be bundled and reused independently from the :cpp:any:`Text ` content object. * Added :cpp:any:`Terminal::printParagraph() ` for direct terminal output with indentation, wrap markers, tab stops, paragraph spacing, wrap limits, ellipsis markers, and layout fallback handling. * Added :cpp:any:`Terminal::isInteractive() ` so applications can detect after initialization whether a real interactive terminal is attached and switch to a plain-text output path when needed. * Added :cpp:any:`RemappedBuffer ` with efficient operations for resizing, shifting, rotating, erasing, inserting, and moving complete rows and columns while keeping the visible grid model intact. * Added :cpp:any:`Orientation ` and :cpp:any:`Coordinate ` as public support types used by the new buffer and geometry APIs. * Added :cpp:any:`String::String(std::size_t, Char) `, :cpp:any:`String::terminalLines() `, :cpp:any:`String::containsControlCharacters() `, and :cpp:any:`Char::isControl() ` for common text-processing and validation tasks. * Added the ``command-line-help`` demo application to show how paragraph-aware output can keep a classic command-line help screen readable across narrow and wide terminal widths. Improved -------- * :cpp:any:`Text ` now renders through a structured paragraph pipeline instead of only using the earlier simpler layout settings. The same paragraph configuration can therefore be reused for direct terminal printing and for text rendered inside rectangles. * Tab handling in left-aligned paragraphs is now much more practical for help text and option lists. Applications can define explicit tab stops and choose whether a non-advancing tab inserts a space or starts a wrapped continuation line. * Paragraph rendering now supports visible wrap markers, word-break markers, wrap limits with ellipsis, configurable paragraph spacing, and clearer fallback handling when a layout becomes too narrow to render safely. * The terminal backends now expose whether the process is attached to an interactive terminal, making it easier to produce a rich UI in a real terminal while keeping redirected output, logs, and CI runs readable. * Geometry and buffer APIs now consistently use :cpp:any:`Coordinate `, and :cpp:any:`Buffer::get() ` returns a shared space for out-of-range reads, which simplifies caller code that inspects the edges of a buffer. Documentation ------------- * Added a detailed new :doc:`Paragraph Options ` reference chapter with rendered examples for alignment, indentation, wrap markers, background modes, word splitting, tab stops, wrap limits, and error handling. * Added documentation for the new ``command-line-help`` demo, showing a practical end-to-end use of :cpp:any:`Terminal::printParagraph() `. * Expanded the reference documentation for buffer, terminal, and text APIs. * Added implementation chapters for paragraph layout and painting, Unicode width handling, and the POSIX and Windows backends, plus a helper tool used to generate consistent paragraph-layout examples for the documentation. Implementation -------------- * Refactored the text rendering internals into dedicated paragraph layout and paragraph painting components, which improves consistency between terminal output and buffer-based text rendering. * Refactored writable and readable buffer convenience APIs into explicit internal wrapper implementations and expanded unit test coverage for text rendering, terminal convenience methods, and :cpp:any:`RemappedBuffer `. Version 1.5.0 - 2026-03-21 ========================== Release 1.5.0 sharpens the library's low-level building blocks for bitmap processing, geometry, and hash-based containers, while also fixing how inherited colors are resolved when strings and characters are appended or written incrementally. From the user perspective, the most noticeable additions are new helpers for expanding and probing bitmaps, new geometry clamping and neighbor APIs, and direct support for using core value types in ``std::unordered_map`` and ``std::unordered_set``. Highlights ---------- * Added :cpp:any:`Bitmap::expanded() `, :cpp:any:`Bitmap::pixelCardinal() `, :cpp:any:`Position::ringEight() `, :cpp:any:`Position::ringEightDeltas() `, and :cpp:any:`Direction::fromDelta() ` to make neighborhood analysis, contour detection, and grid navigation easier to express with the public API. * Added :cpp:any:`Size::clamp() ` and :cpp:any:`Rectangle::clamp() ` so positions can be forced into valid drawable bounds without repeating manual ``min``/``max`` code throughout applications and demos. * Added ``hash()`` methods and ``std::hash`` specializations for :cpp:any:`Foreground `, :cpp:any:`Background `, :cpp:any:`Color `, :cpp:any:`Char `, :cpp:any:`Direction `, :cpp:any:`Position `, :cpp:any:`Rectangle `, and :cpp:any:`Key `, which makes these value types directly usable in ``std::unordered_map`` and ``std::unordered_set``. * Added :cpp:any:`TerminalFlag ` and :cpp:any:`TerminalFlags ` so applications can control built-in terminal signal handling explicitly, including an opt-out for environments that already manage process shutdown and terminal restoration. * Improved color parsing and color inheritance: color names now accept spaces, underscores, and hyphens, and inherited color components in :cpp:any:`String::append() ` and :cpp:any:`Terminal::write() ` now resolve against the currently active color as users expect. Added ----- * Added :cpp:any:`Bitmap::expanded() ` to grow a bitmap by margins or crop it with negative margins, with a configurable fill value for newly created cells. * Added :cpp:any:`Bitmap::pixelCardinal() ` as a four-neighbor bitmask helper, complementing :cpp:any:`pixelQuad() ` and :cpp:any:`pixelRing() ` for cellular automata, pathfinding, and shape-analysis code. * Added :cpp:any:`Position::ringEight() ` and :cpp:any:`Position::ringEightDeltas() ` for clockwise access to the eight surrounding positions, plus :cpp:any:`Direction::fromDelta() ` for converting arbitrary deltas into one of the canonical directions by sign. * Added :cpp:any:`Size::componentClamp() `, :cpp:any:`Size::clamp() `, :cpp:any:`Rectangle::clamp() `, and :cpp:any:`Rectangle::center() ` for layout and cursor-position calculations that need safe in-bounds coordinates. * Added :cpp:any:`TerminalFlag ` and :cpp:any:`TerminalFlags ` and corresponding :cpp:any:`Terminal ` constructors, so applications can opt out of the built-in signal restoration logic when integrating with another framework or host environment. * Added hashing support through ``hash()`` methods and ``std::hash`` specializations on the most common value objects, including geometry types, colors, characters, directions, and keys. Improved -------- * :cpp:any:`String::append() ` now applies the currently active color to appended :cpp:any:`Char ` and :cpp:any:`String ` values when those values contain inherited foreground or background components. This makes mixed argument lists behave consistently with plain text arguments. * :cpp:any:`Terminal::write() ` now resolves inherited colors against the terminal's tracked current color before output. Incremental writes therefore keep foreground and background inheritance consistent with previous terminal output. * Built-in terminal backends now restore the terminal state more robustly on POSIX and Windows when an application is interrupted, which reduces the chance of leaving the shell in an inconsistent state after ``Ctrl+C`` or similar termination events. * :cpp:any:`Foreground::fromString() `, :cpp:any:`Background::fromString() `, and :cpp:any:`Color::fromString() ` now accept more forgiving names such as ``"bright blue"``, ``"bright_blue"``, and ``"bright-blue"``, which simplifies configuration parsing and hand-written theme definitions. * :cpp:any:`TerminalFlag ` values can now be combined directly with the bitwise OR operator, which makes terminal construction code more concise. Implementation -------------- * Expanded unit test coverage significantly across bitmap helpers, buffer conveniences, buffer views, color parsing, geometry helpers, terminal convenience APIs, update settings, and hashing behavior. * Reworked built-in signal handling with platform-specific dispatchers for POSIX and Windows and refreshed the terminal reference documentation for the new terminal flag API. * Added shared hash utilities and refreshed API documentation for the new public methods and behavior clarifications. Version 1.4.0 - 2026-03-15 ========================== Release 1.4.0 reorganizes the rendering API around reusable buffer abstractions, adds scrollable buffer views and backend customization, and expands the text and bitmap helper APIs. From the user perspective, the most important behavior changes are the new generic :cpp:any:`ReadableBuffer `/:cpp:any:`WritableBuffer ` pipeline, richer :cpp:any:`Terminal ` control, and updated screen rendering defaults for safe margins and alternate-screen updates. Highlights ---------- * Added :cpp:any:`ReadableBuffer ` and :cpp:any:`WritableBuffer ` as public base interfaces, so application code can render, compare, copy, and mutate terminal content without depending on one concrete :cpp:any:`Buffer ` implementation. * Added :cpp:any:`BufferView `, :cpp:any:`BufferConstRefView `, and :cpp:any:`CropEdges ` for view-based rendering of larger logical canvases, including optional in-view crop markers for scrollable or clipped content. * Extended :cpp:any:`Terminal ` with :cpp:any:`Backend `, :cpp:any:`OutputMode `, :cpp:any:`MoveMode `, safe-margin handling, alternate-screen control, direct cursor movement helpers, and backend injection for custom terminal integrations and tests. * Expanded :cpp:any:`UpdateSettings ` with configurable minimum-size background and message handling, explicit bottom-right crop marks, and control over automatic switching to the alternate screen buffer. * Added :cpp:any:`ParagraphSpacing ` plus new :cpp:any:`Text ` and :cpp:any:`String ` support for multi-paragraph layouts, and expanded :cpp:any:`Bitmap ` with higher-level analysis and editing helpers such as outlining, flood fill, and bounding boxes. Added ----- * Added :cpp:any:`ReadableBuffer::countDifferencesTo() ` and :cpp:any:`ReadableBuffer::toMask() ` to compare rendered frames and derive bitmap masks from visible buffer content. * Added :cpp:any:`WritableBuffer::setFrom() `, :cpp:any:`WritableBuffer::setAndResizeFrom() `, shared drawing helpers, and :cpp:any:`Buffer::clone() ` so frame-generation code can work against abstract writable targets and keep copies of previous frames. * Added a default :cpp:any:`Buffer() ` constructor, validating ``Buffer(Size, Char)`` construction, ``Buffer::resize(Size, bool, Char)``, and :cpp:any:`Buffer::fromLinesInString() `/:cpp:any:`Buffer::fromLines() ` for more flexible buffer lifecycle management. * Added :cpp:any:`Backend ` as a public extension point for custom platform output and input handling, and changed :cpp:any:`Input ` into a public interface that backends can implement. * Added :cpp:any:`Terminal::OutputMode ` with :cpp:any:`FullControl ` and :cpp:any:`Text ` modes, plus :cpp:any:`Terminal::setBackend() `, :cpp:any:`setAlternateScreen() `, :cpp:any:`moveTo() `, :cpp:any:`moveHome() `, :cpp:any:`moveCursor() `, :cpp:any:`moveRight() `, :cpp:any:`moveUp() `, :cpp:any:`moveDown() `, :cpp:any:`setAutoWrap() `, and :cpp:any:`setCursorVisible() `. * Added :cpp:any:`Bitmap::rect() `, :cpp:any:`pixelRing() `, :cpp:any:`boundingRect() `, :cpp:any:`pixelCount() `, :cpp:any:`invert() `/:cpp:any:`inverted() `, :cpp:any:`outlined() `, :cpp:any:`fillRect() `, :cpp:any:`floodFill() `, :cpp:any:`fromFunction() `, and :cpp:any:`toPattern() `. * Added :cpp:any:`Text::setParagraphSpacing() ` and ``String::wrapIntoLines(..., ParagraphSpacing)``, plus :cpp:any:`String::count() `, :cpp:any:`indexOf() `, :cpp:any:`substr() `, :cpp:any:`splitLines() `, and :cpp:any:`String::fromLines() ` helpers. * Added more geometry and character helpers, including :cpp:any:`Rectangle ` overlap/containment/intersection tools, :cpp:any:`Rectangle::frameDirection() `, :cpp:any:`Rectangle::bounds() `, and new :cpp:any:`Char ` convenience checks such as :cpp:any:`isEmpty() ` and :cpp:any:`isOneOf() `. Improved -------- * :cpp:any:`Terminal::updateScreen() ` and :cpp:any:`Terminal::write() ` now accept any :cpp:any:`ReadableBuffer ` implementation instead of requiring a concrete :cpp:any:`Buffer `, which makes buffer views and custom readable buffers work throughout the screen-update pipeline. * :cpp:any:`Terminal::size() ` now reports a drawable size with a one-column and one-row compatibility margin by default. This makes full-screen layouts safer on real terminals, and applications that want the full detected size can disable the margin explicitly. * :cpp:any:`Terminal::updateScreen() ` can now automatically switch to the alternate screen buffer through :cpp:any:`UpdateSettings `. The default settings enable this behavior when the backend supports alternate-screen updates. * Minimum-size handling in :cpp:any:`Terminal::updateScreen() ` now supports a custom background fill and centered message instead of only a single marker character. * Paragraph wrapping now distinguishes between compact and double-spaced paragraphs through :cpp:any:`ParagraphSpacing `, which improves structured help text and other multi-section layouts. * Deprecated ``Terminal::colorEnabled()``/``setColorEnabled()`` in favor of :cpp:any:`outputMode() `, deprecated :cpp:any:`Terminal::lineBreak() ` in favor of :cpp:any:`writeLineBreak() `, deprecated the old ``Buffer::drawText(std::string_view, Alignment, Rectangle, ...)`` overload, and deprecated the old :cpp:any:`UpdateSettings ` marker naming/constructor API. Implementation -------------- * Expanded API documentation, demos, and unit tests across buffer rendering, terminal behavior, text layout, bitmap processing, and backend integration. * Refactored the rendering pipeline into focused painter, backend, string-wrapping, and line-buffer components to improve maintainability and testability. Version 1.3.0 - 2026-03-10 ========================== Release 1.3.0 adds a more expressive frame-drawing API for animated borders and fills. The main change for library users is that frame rendering can now be configured through reusable :cpp:any:`FrameDrawOptions ` instances instead of piecing together several lower-level overloads. Highlights ---------- * Added :cpp:any:`FrameDrawOptions ` and :cpp:any:`FrameColorMode ` for configurable frame styles, fill styles, combination behavior, and animated color effects. * Added a new ``Buffer::drawFrame(Rectangle, const FrameDrawOptions &, std::size_t)`` overload to render frames and optional fills from one reusable options object. * Added :cpp:any:`Rectangle::frameIndex() ` to address frame cells in clockwise order, enabling border-based animations such as chasing light effects. Added ----- * Added :cpp:any:`FrameDrawOptions ` with support for :cpp:any:`FrameStyle `, :cpp:any:`Char16Style `, and :cpp:any:`Tile9Style ` selection in one API. * Added animated frame and fill color handling with :cpp:any:`FrameColorMode::OneColor `, stripe modes, diagonal modes, and clockwise/counter-clockwise chasing-border modes. * Added reusable frame configuration for fill blocks, combination styles, separate frame and fill color sequences, and shared animation offsets. * Added a templated :cpp:any:`BitmapDrawOptions ` color constructor so callers can pass the same color argument forms that other rendering APIs already accept. Improved -------- * Frame rendering can now animate the border independently from the fill area, which makes status boxes, dashboards, and decorative panels much easier to build with the public API. * :cpp:any:`Tile9Style ` and :cpp:any:`Char16Style ` frame rendering now integrate more cleanly with animated colors and base-color overlays through the unified :cpp:any:`FrameDrawOptions ` workflow. Implementation -------------- * Added the ``frame-color-animations`` demo plus focused unit tests for the new frame color and frame-index behavior. * Improved internal frame-rendering helpers and related documentation. Version 1.2.0 - 2026-03-10 ========================== Release 1.2.0 brings richer rendering primitives, better Unicode handling, smarter terminal updates, and broader examples and test coverage. Highlights ---------- * Added :cpp:any:`BitmapDrawOptions ` and new :cpp:any:`Buffer::drawBitmap() ` overloads for configurable bitmap rendering with scale modes, animated color sequences, stripe-based color modes, custom block characters, and optional :cpp:any:`Char16Style ` integration. * Added :cpp:any:`Tile9Style ` plus matching :cpp:any:`Buffer ` support for repeating 3x3 and extended 16-tile patterns when filling rectangles, drawing frames, and drawing filled frames. * Added :cpp:any:`Rectangle::gridCells() ` to split layouts into evenly spaced grid cells. * Expanded :cpp:any:`Char ` and :cpp:any:`String ` with UTF-32 support, multi-codepoint handling, improved combining-character support, and more flexible color overlay and base-color operations. * Improved color composition with explicit :cpp:any:`Inherited ` handling across :cpp:any:`ColorPart `, :cpp:any:`Color `, text rendering, bitmap rendering, and buffer-based drawing. * Extended :cpp:any:`Terminal ` screen updates with clearer refresh strategies, optional line buffering, optional back-buffer diff updates, improved crop-mark handling, and better minimum-size rendering behavior. Added ----- * New ``display-all-colors`` demo for exploring the color model and layout helpers. * New ``bitmap-showcase`` demo for bitmap rendering options, styles, and animated color modes. * New ``update-screen-modes`` demo for comparing clear, overwrite, and back-buffer update behavior. * New unit tests for :cpp:any:`Tile9Style `, terminal update behavior, bitmap rendering paths, and :cpp:any:`Rectangle::gridCells() `. * Added ``display-all-colors``, ``bitmap-showcase``, and ``update-screen-modes`` demo applications. * Added :cpp:any:`BitmapDrawOptions ` and configurable bitmap rendering in :cpp:any:`Buffer `. * Added :cpp:any:`Tile9Style ` and tile-based fill/frame rendering support. * Added :cpp:any:`Rectangle::gridCells() `. * Added UTF-32 and multi-codepoint support to :cpp:any:`Char ` and :cpp:any:`String `. Improved -------- * Updated ``frame-weaver``, ``text-gallery``, ``retro-plasma``, and ``terminal-chronicle`` to use the newer rendering and color APIs. * Refined terminal output APIs and documentation around refresh modes, direct writes, buffer rendering, crop marks, and smart overwrites. * Improved bitmap, text, geometry, color, and output reference documentation. * Improved color overlay behavior and inherited color handling throughout the library. * Improved :cpp:any:`Terminal::updateScreen() ` with refresh-mode, back-buffer, crop-mark, and minimum-size handling updates. Implementation -------------- * Improved memory efficiency. * Expanded unit tests and API/reference documentation across rendering, geometry, text, and terminal output. Version 1.0.0 — 2026-03-08 ========================== First public open-source release.