Changes since v2.0.0:
- Draw styled text as written instead of parsing it as markup [patch] (Claude)
- Add UIApplication.Post to change the tree from another thread [minor] (Claude)
- Use BorderStyle.DoubleLine in the README Quick Start, and compile it in the tests [patch] (Claude)
- Move WrapText's line break into a helper to keep it under the complexity limit (Claude)
- Keep a paragraph's indentation when its first word has to be broken [patch] (Claude)
- End a run on OperationCanceledException only when the run was cancelled [patch] (Claude)
- Refuse a cyclic BorderElement.Child before detaching the old one [patch] (Claude)
- Merge remote-tracking branch 'origin/main' into claude/tui-167-refuse-cyclic-add (Claude)
- Guard the run's token source with a lock instead of catching ObjectDisposedException [patch] (Claude)
- Claim only the padding when wrapped text has no column to draw in [patch] (Claude)
- Dispose the token source each run links to the caller's token [patch] (Claude)
- Lay a swapped-back root out at the terminal's current size [patch] (Claude)
- Invalidate on layout property changes and re-arrange on a padding change [patch] (Claude)
- Refuse a second child in BorderElement [patch] (Claude)
- Refuse adding a container to itself or one of its descendants [patch] (Claude)
- Combine the nested input-not-handled check [patch] (Claude)
- Give the pending read up when a run ends, so the next key is not swallowed [patch] (Claude)
- Wrap text inside a border or a horizontal stack to the width it gets [patch] (Claude)
- test: cover OffsetConsoleProvider and invisible elements in Render (Claude)
- Move the control-character helper and its provider tests to the end of their files (Claude)
- fix: draw an element at the position passed to IConsoleProvider.Render [patch] (Claude)
- fix: draw changes made outside a keypress by redrawing when the tree invalidates [patch] (Claude)
- fix: expand tabs and replace control characters in text before measuring and drawing [patch] (Claude)
- fix: stretch StackPanel children across the cross axis so alignment applies [patch] (Claude)
- fix: measure a titled BorderElement wide enough to draw its title [patch] (Claude)
- [patch] Leave the terminal's color for a transparent foreground or background (Claude)
- test: drive ReadInputAsync through an injected key reader [patch] (Claude)
- Merge remote-tracking branch 'origin/main' into fix/152-keychar (Claude)
- test: cover Ctrl+C and plain C in ToInputResult [patch] (Claude)
- fix: pass the typed character through with each key [patch] (Claude)
- fix: keep a BorderElement title with a line break on the top border row [patch] (Claude)
- fix: hide and show the cursor on the injected console without moving it [patch] (Claude)
- fix: arrange the tree on every render pass, not only on a resize [patch] (Claude)
- refactor: move overlong-word slicing out of WrapText [patch] (Claude)
- fix: keep indentation and spacing when TextElement wraps words [patch] (Claude)
- fix: invalidate each ancestor once instead of 2^depth times [patch] (Claude)
- test: cover the ArgumentException read-failure path [patch] (matt-edmondson)
- fix: end the run after repeated failed reads instead of spinning forever [patch] (matt-edmondson)