Skip to content

Release v2.0.0-rc.7#5103

Closed
tig wants to merge 58 commits intomainfrom
release/v2.0.0-rc.7
Closed

Release v2.0.0-rc.7#5103
tig wants to merge 58 commits intomainfrom
release/v2.0.0-rc.7

Conversation

@tig
Copy link
Copy Markdown
Member

@tig tig commented Apr 28, 2026

Release v2.0.0-rc.7

This is a rc pre-release.

Version: 2.0.0-rc.7
NuGet Package: Terminal.Gui 2.0.0-rc.7

What happens when this PR is merged

  1. ✅ The Finalize Release workflow will automatically create tag v2.0.0-rc.7
  2. ✅ The Publish workflow will build and push to NuGet.org
  3. ✅ A GitHub Release will be created with auto-generated notes
  4. ✅ A back-merge PR from maindevelop will be opened

Checklist

  • CI passes on this PR
  • Version looks correct: 2.0.0-rc.7
  • Release notes reviewed (will be auto-generated on merge)

tig and others added 30 commits April 20, 2026 11:05
* Cleans up examples.

* updated docs

* new sample.gif

* reverted
* Fixes #4986. Navigating with Viewport.Y greater than zero will cause scrolling to increase, even if the current line fits within the available height.

* Fixes #4990. Navigating with Viewport.X greater than zero will cause scrolling left, even if the current column isn't at the right of the viewport

* Fixes #4994 - Navigating left and right while holding down the Ctrl key does not cause edge scrolling.

* Fixes #4998. TextView.UpdateContentSize isn't working correctly on insert and delete text

* Fixes #4999. TextView with hidden cursor due scrolling pressing any CursorRight/Left/Down/Up keys doesn't adjust to make the cursor visible

* Update Tests/UnitTestsParallelizable/Views/TextView.NavigationTests.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fixes #4891. DoDrawComplete should ignore scrolled Viewport.Location when excluding opaque view area

* Clarify comment related to deleted

* Fix MoveUp() and add more unit tests

* Test that proves despite does not change viewport position but does set NeedsDraw.

* Fix MoveLeft method and add a test

* Fix MoveWordLeft and add unit test

* Fix MoveWordRight and add unit test

* Simplify MoveRight code

* Fix DeleteCharLeft invoke ContentChanged twice

* Fix ShouldInvalidateMaxWidthCache to use full size

* Remove unnecessary LINQ in _cachedMaxWidthPerLine

* Move ShouldInvalidateMaxWidthCache tests

* Fix ArgumentOutOfRangeException on DeleteTextLeft

---------

Co-authored-by: Tig <tig@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
… work well (#5010)

* Cleans up examples.

* updated docs

* Add LayoutAndDrawComplete event, improve shutdown/reset

- Adds LayoutAndDrawComplete event to IApplication and ApplicationImpl, raised after layout/draw completes
- Refactors ApplicationMainLoop to track first layout/draw with _firstLayoutAndDrawComplete
- Removes UnsubscribeDriverEvents and inlines DeviceAttributesStartupQueryTimeout
- Uses Lock for _sessionStackLock for better thread safety
- Ensures terminal attributes are reset (ESC[0m) and cursor shown on shutdown in AnsiOutput
- Adds CSI_ResetAttributes to EscSeqUtils
- Skips IterationImpl_Inline_FullTimeline_TraceDump test (tracing not for test results)

* Update Tests/UnitTestsParallelizable/Drivers/Output/InlineDrawTimingTests.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Terminal.Gui/Drivers/AnsiHandling/EscSeqUtils/EscSeqUtils.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Terminal.Gui/App/MainLoop/ApplicationMainLoop.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update LayoutAndDrawComplete event summary and remarks

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Cleans up examples.

* updated docs

* Use RELEASE_PAT for release workflows to allow PR creation

GITHUB_TOKEN is not permitted to create pull requests in this repo.
Switch prepare-release and finalize-release workflows to use the
RELEASE_PAT secret for checkout, PR creation, and release creation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…5018)

The workflow was manually constructing versions like '2.0.0-beta' without
the incrementing number suffix. Now it scans existing git tags to find the
latest matching tag (e.g., v2.0.0-beta.217) and increments to produce
the next version (e.g., 2.0.0-beta.218).

Also adds:
- Concurrency group to prevent race conditions between runs
- Remote branch conflict detection before creating release branch
- Simplified GitVersion.yml label update logic

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Cleans up examples.

* updated docs

* Use RELEASE_PAT for release workflows to allow PR creation

GITHUB_TOKEN is not permitted to create pull requests in this repo.
Switch prepare-release and finalize-release workflows to use the
RELEASE_PAT secret for checkout, PR creation, and release creation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix version numbering: auto-increment pre-release from existing tags

The workflow was manually constructing versions like '2.0.0-beta' without
the incrementing number suffix. Now it scans existing git tags to find the
latest matching tag (e.g., v2.0.0-beta.217) and increments to produce
the next version (e.g., 2.0.0-beta.218).

Also adds:
- Concurrency group to prevent race conditions between runs
- Remote branch conflict detection before creating release branch
- Simplified GitVersion.yml label update logic

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…CWP InitializingShadowStyle event (#5012)

* Cleans up examples.

* updated docs

* Initial plan

* Fixes #4885. Button: avoid create-then-destroy shadow allocation via GetDefaultShadowStyle()

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/4c164de3-c266-4539-996f-a3b941b0a367

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Update Terminal.Gui/Views/ScrollBar/ScrollButton.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Terminal.Gui/ViewBase/Adornment/ArrangerButton.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Tests/UnitTestsParallelizable/Views/ButtonTests.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Terminal.Gui/Views/Button.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Redesign shadow initialization to use CWP event (OnInitializingShadowStyle + InitializingShadowStyle)

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/14508ce0-b4f0-4534-8270-4c61d75880c9

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Darken shadow effect in ShadowView for non-opaque style

Increased the dimming factor for shadow colors in ShadowView by updating GetDimmerColor parameters from 0.05/0.25 to 0.9. This results in a much darker shadow appearance when ShadowStyle is not Opaque.

* Refactor docs and style in Button and ArrangerButton

Reformat XML docs for readability and line wrapping. Convert OnHotKeyCommand to an expression-bodied member. Apply minor whitespace and style fixes to align with project conventions. No functional changes.

* Update ShadowTests expected ANSI output for background

Changed the expected ANSI color code in ShadowTests.cs from bright white (\x1b[107m) to black (\x1b[40m) for the second cell in the driver output assertion, aligning the test with the updated rendering behavior.

---------

Co-authored-by: Tig <tig@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
updated-dependencies:
- dependency-name: Markdig
  dependency-version: 1.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Cleans up examples.

* updated docs

* Release v2.0.0-beta.218 (#5021)

* Release new `main` build (#5005)

* Updates the sample.gif (#5007)

* Cleans up examples.

* updated docs

* new sample.gif

* reverted

* Fix remaining TextView issues (#4987)

* Fixes #4986. Navigating with Viewport.Y greater than zero will cause scrolling to increase, even if the current line fits within the available height.

* Fixes #4990. Navigating with Viewport.X greater than zero will cause scrolling left, even if the current column isn't at the right of the viewport

* Fixes #4994 - Navigating left and right while holding down the Ctrl key does not cause edge scrolling.

* Fixes #4998. TextView.UpdateContentSize isn't working correctly on insert and delete text

* Fixes #4999. TextView with hidden cursor due scrolling pressing any CursorRight/Left/Down/Up keys doesn't adjust to make the cursor visible

* Update Tests/UnitTestsParallelizable/Views/TextView.NavigationTests.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fixes #4891. DoDrawComplete should ignore scrolled Viewport.Location when excluding opaque view area

* Clarify comment related to deleted

* Fix MoveUp() and add more unit tests

* Test that proves despite does not change viewport position but does set NeedsDraw.

* Fix MoveLeft method and add a test

* Fix MoveWordLeft and add unit test

* Fix MoveWordRight and add unit test

* Simplify MoveRight code

* Fix DeleteCharLeft invoke ContentChanged twice

* Fix ShouldInvalidateMaxWidthCache to use full size

* Remove unnecessary LINQ in _cachedMaxWidthPerLine

* Move ShouldInvalidateMaxWidthCache tests

* Fix ArgumentOutOfRangeException on DeleteTextLeft

---------

Co-authored-by: Tig <tig@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fixes UICatalog --version, adds release workflows and maintainer docs (#5009)

* Fixes `AppModel.Inline` issues needed for `Output-ConsoleGridView` to work well (#5010)

* Cleans up examples.

* updated docs

* Add LayoutAndDrawComplete event, improve shutdown/reset

- Adds LayoutAndDrawComplete event to IApplication and ApplicationImpl, raised after layout/draw completes
- Refactors ApplicationMainLoop to track first layout/draw with _firstLayoutAndDrawComplete
- Removes UnsubscribeDriverEvents and inlines DeviceAttributesStartupQueryTimeout
- Uses Lock for _sessionStackLock for better thread safety
- Ensures terminal attributes are reset (ESC[0m) and cursor shown on shutdown in AnsiOutput
- Adds CSI_ResetAttributes to EscSeqUtils
- Skips IterationImpl_Inline_FullTimeline_TraceDump test (tracing not for test results)

* Update Tests/UnitTestsParallelizable/Drivers/Output/InlineDrawTimingTests.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Terminal.Gui/Drivers/AnsiHandling/EscSeqUtils/EscSeqUtils.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Terminal.Gui/App/MainLoop/ApplicationMainLoop.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update LayoutAndDrawComplete event summary and remarks

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fixes prepare release workflow (#5015)

* Cleans up examples.

* updated docs

* Use RELEASE_PAT for release workflows to allow PR creation

GITHUB_TOKEN is not permitted to create pull requests in this repo.
Switch prepare-release and finalize-release workflows to use the
RELEASE_PAT secret for checkout, PR creation, and release creation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix version numbering: auto-increment pre-release from existing tags (#5018)

The workflow was manually constructing versions like '2.0.0-beta' without
the incrementing number suffix. Now it scans existing git tags to find the
latest matching tag (e.g., v2.0.0-beta.217) and increments to produce
the next version (e.g., 2.0.0-beta.218).

Also adds:
- Concurrency group to prevent race conditions between runs
- Remote branch conflict detection before creating release branch
- Simplified GitVersion.yml label update logic

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix/prepare release (#5019)

* Cleans up examples.

* updated docs

* Use RELEASE_PAT for release workflows to allow PR creation

GITHUB_TOKEN is not permitted to create pull requests in this repo.
Switch prepare-release and finalize-release workflows to use the
RELEASE_PAT secret for checkout, PR creation, and release creation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix version numbering: auto-increment pre-release from existing tags

The workflow was manually constructing versions like '2.0.0-beta' without
the incrementing number suffix. Now it scans existing git tags to find the
latest matching tag (e.g., v2.0.0-beta.217) and increments to produce
the next version (e.g., 2.0.0-beta.218).

Also adds:
- Concurrency group to prevent race conditions between runs
- Remote branch conflict detection before creating release branch
- Simplified GitVersion.yml label update logic

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: BDisp <bd.bdisp@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: BDisp <bd.bdisp@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Refactor driver param, MinUI, and Terminal.Gui integration

- Rename ForceDriver to Driver across all cmdlets and ApplicationData for consistency; update help text
- Switch to ProjectReference for Terminal.Gui, update solution and project files for local dev
- Refactor MinUI handling and help text; clarify that only title/status bar are hidden, filter shown if specified
- Use FrameView.DefaultBorderStyle and modularize filter/status bar logic in OutGridViewWindow, OutTableViewWindow, and ShowObjectTreeWindow
- Add FullScreen param to ShowObjectTreeCmdletCommand; set AppModel accordingly in ShowObjectView
- Ensure explicit disposal of windows and apps in all entry points
- Expose TreeView<T>.GetSize() for accurate sizing
- Update launchSettings.json and tests for new Driver param and MinUI usage
- Improve null-safety, event handling, and consistency throughout UI code

* Revert "Refactor driver param, MinUI, and Terminal.Gui integration"

This reverts commit 10821a1.

* Refactor tree size calculation into GetSize() method

Extracted content size logic to a new public GetSize() method in TreeView<T>. This method computes the logical size based on expanded branches and is now used for content size updates. Added XML documentation for GetSize().
)

* Cleans up examples.

* updated docs

* Update IsCompatibleKey to reject Alt/Ctrl; improve tests

IsCompatibleKey now rejects keys with Alt or Ctrl modifiers, ensuring only plain character keys are accepted for search. Added tests to verify this behavior, including scenarios with AssociatedText. Refactored and reformatted tests for clarity, style compliance, and improved thread safety test code.
…s for all AI tools (#5027)

* Initial plan

* Add v1→v2 corrections table and expand agent-facing files for all AI tools

- Create ai-v2-primer.md: canonical v1→v2 reference for all agents
- Expand llms.txt from 115 to ~330 lines with corrections table, snippets, gotchas
- Flesh out .cursorrules from 5-line stub to full agent config
- Create .windsurfrules for Windsurf AI support
- Create .aider.md for Aider AI support
- Update AGENTS.md with v1→v2 corrections table
- Update CLAUDE.md to reference v2 primer
- Update .github/copilot-instructions.md with v1→v2 corrections and updated lifecycle

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/ac004541-cd96-4c44-b6e7-ac21c60aad0b

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address review feedback: clarify Pos.At docs, improve copilot-instructions readability

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/ac004541-cd96-4c44-b6e7-ac21c60aad0b

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix C# version to 14/net10.0 and clarify style rules are for library contributors only

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/e034da10-7544-4fa9-8186-53d7e5011eee

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Use Accepted (post-event) instead of Accepting as the v1 Clicked replacement

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/15e8840e-cec8-4098-8272-fb78a1516eb4

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
* Initial plan

* Fix MarkdownCodeBlock rendering codeblocks with incorrect background attribute

- Remove ThemeBackground assignment on embedded code blocks in SyncCodeBlockViews()
  so code blocks always use the distinct Code role background instead of blending
  with the main content background when UseThemeBackground=true.
- Pass resolved code block background to GetAttributeForSegment in
  MarkdownCodeBlock.OnDrawingContent() so text segments use the same background
  as the fill, fixing the mismatch when UseThemeBackground=false.
- Add two tests verifying both scenarios.

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/fd4d1cad-1f64-4890-b1a7-74df3f9a2ab7

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix Markdown code block background and highlighter logic

Markdown code blocks now use the SyntaxHighlighter's DefaultBackground for their ThemeBackground, ensuring correct theming for both light and dark themes. The SyntaxHighlighter is passed to MarkdownCodeBlock SubViews. The "Theme BG" CheckBox in Deepdives and MarkdownTester reflects the current UseThemeBackground state. Added and updated tests to verify code block background and highlighter assignment. Minor formatting and style improvements included.

* fixed gitversion yml bug

* Fix SyntaxHighlighter/UseThemeBackground setters to invalidate layout

SyntaxHighlighter and UseThemeBackground were auto-properties, so changing
them after Text was set had no effect until Text was re-assigned. This
required a hack (Text=""; Text=text) in Deepdives, MarkdownTester, and mdv.

- Make both setters call InvalidateParsedAndLayout() on change
- Fix GetAttributeForSegment to override bg on explicit-attribute segments
  when themeBackground is provided (covers real TextMate tokenization)
- Remove Text re-assignment hacks from Deepdives, MarkdownTester, and mdv
- Add tests: explicit-attribute fill/text bg match, SyntaxHighlighter
  invalidation, UseThemeBackground invalidation (all verified to fail
  when their corresponding fixes are reverted)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Default UseThemeBackground to true

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add ThemeName property to ISyntaxHighlighter interface

Replaces CurrentThemeName with ThemeName in TextMateSyntaxHighlighter and updates all usages. Adapts scenario constructors, theme selection logic, and test/mocks to use the new property. Updates unit tests to check ThemeName and renames test methods accordingly.

* Auto-select syntax theme based on terminal background

Add DefaultAttributeChanged event to IDriver and DriverImpl, allowing detection of terminal background color changes. Update Markdown views in Deepdives, MarkdownTester, and Program to auto-switch syntax highlighting themes (light/dark) based on the terminal's background, ensuring better visual consistency and accessibility.

* Fix code block dimmer direction for light themes

Invert isDark when calling GetDimmerColor so code block bg shifts
*away* from the body bg: dark themes get slightly lighter code blocks,
light themes get slightly darker ones. The intuitive direction caused
light-theme code blocks to wash out to medium gray (L>=90 fallback).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Tig <tig@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix click set insertion point row greater than lines count

* Fix autocomplete popup on close not flag host control to redraw

---------

Co-authored-by: Tig <tig@users.noreply.github.com>
* Fix version numbering: auto-increment pre-release from existing tags

The workflow was manually constructing versions like '2.0.0-beta' without
the incrementing number suffix. Now it scans existing git tags to find the
latest matching tag (e.g., v2.0.0-beta.217) and increments to produce
the next version (e.g., 2.0.0-beta.218).

Also adds:
- Concurrency group to prevent race conditions between runs
- Remote branch conflict detection before creating release branch
- Simplified GitVersion.yml label update logic

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix api-docs workflow: add fetch-depth 0 for GitVersion

GitVersion.MsBuild requires full git history during dotnet build.
The api-docs workflow was using a shallow clone, causing the build to fail.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
rcdailey and others added 24 commits April 21, 2026 09:23
)

Adds the Microsoft.Net.Compilers.Toolset package reference to align the
Roslyn compiler version with the Terminal.Gui.Analyzers.Internal source
generator. The analyzer targets Microsoft.CodeAnalysis.CSharp 5.3.0, but
without this toolset, MSBuild uses the SDK-bundled Roslyn 5.0.0 host
which refuses to load analyzers targeting a newer compiler. This caused
warning CS9057 and 233 CS1061 errors about missing
FastHasFlags/FastIsDefined/AsInt32/AsUInt32 members because the
EnumExtensionMethodsGenerator was silently skipped.
…ithout UpdateChecked(), desyncing CheckBox visual state (#5044)

* Fixes #5040. SelectorBase.TabBehavior setter calls CreateSubViews() without UpdateChecked(), desyncing CheckBox visual state

* Add unit test that test the original issue post

* Add unit test that test the original issue post with enum

* Update XML doc to the fact that Value can be changed in the UpdateChecked method

* Add assertions to enforce correct behavior

* Rename unit test method name as suggested
…ew.Viewport` bug (#5045)

* Make Shortcut.CommandView nullable and null-safe

Refactor Shortcut and related code to make CommandView nullable (View?) and update all usages to handle null values safely. Update property setters, event handlers, layout logic, and tests to use null-safe access. Initialize HelpView and KeyView with default Frames. Clean up redundant null checks and improve robustness against null reference exceptions when CommandView is replaced or disposed.

* Improve layout and scrollbar logic, update menu items

- Remove BorderStyle from TreeViewFileSystem tree view
- Prevent invalid viewport/frame updates in View
- Refine scrollbar visibility checks for valid content area
- Remove quit key binding from MenuBar, comment out in PopoverMenu
- Hide scrollbars if visible content size < 2 in auto mode

* Fix viewport/frame growth with heavy adornments (#5043)

Refactored TreeViewFileSystem to use Runnable and improved layout logic. Enhanced View.Content.cs to prevent Frame growth when adornments consume the viewport. Expanded ViewportTests with cases for adornment edge cases. Applied code style and correctness improvements.

* Derive Accent scheme from Base instead of using directly

When the scheme name is "Accent", the code now derives the accent scheme from the "Base" scheme using the driver's default attribute, rather than returning the named "Accent" scheme directly. This ensures consistent accent theming based on the current base scheme.

* Update Terminal.Gui/ViewBase/Adornment/AdornmentImpl.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Allow CommandView to be nullable in Shortcut

Removed null check and updated usages to support CommandView being null. Used null-conditional operators to prevent exceptions and set Title to an empty string when CommandView is null.

* Fixes #5046 - Dim.Auto - Replace screenX4 bounds with int.MaxValue in layout logic

Removed arbitrary screenX4 upper bounds in dimension and layout calculations, using int.MaxValue instead. This change affects maximum content dimension, text formatting constraints, and layout for centered and anchored subviews, improving flexibility and correctness for large dimension scenarios.

* Refactor color scheme and DropDownList mouse handling

- Arrangement scenario now sets SchemeName via SchemeManager instead of assigning a custom Scheme directly.
- DropDownList overrides OnMouseEvent to handle popover activation when ReadOnly and left mouse button is pressed.

* Code review fixes.

Fix Accent scheme fallback, cleanup, and disposal logic

- Derive Accent scheme from Base if missing background color
- Simplify ConstrainToSize assignment in DimAuto.cs
- Reformat namespace in View.Content.cs
- Use _commandView field consistently in Shortcut disposal

* Fixes #5043 - SetViewport: explicitly detect adornments-consume-viewport no-op case

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/7f22400b-e587-4b21-a4a7-90a776f8784d

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
---
updated-dependencies:
- dependency-name: Microsoft.NET.Test.Sdk
  dependency-version: 18.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Initial plan

* Remove mdv example from repo and add to showcase

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/95b13b12-e204-4484-8d7b-ede8494e283d

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
The Build & Test section referenced Tests/UnitTests, which no longer
exists. The actual projects are UnitTestsParallelizable,
UnitTests.NonParallelizable, and UnitTests.Legacy. Also added a
single-test --filter example and a pointer to Tests/README.md.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* docs: add README hero image

* docs: replace simulated hero with real Terminal.Gui app screenshot

Per PR review: the image now embeds a real Terminal.Gui app running
(menu bar, Explorer tree, New Project form, status bar) rather than a
composed mock. Layout, stats, and footer links preserved.

* docs: swap hero to animated gif with real Terminal.Gui demo

Replaces the static hero screenshot with an animated version:
- Embeds a real Terminal.Gui demo recording inside the hero frame
  so the motion carries the pitch.
- Redesigns the surrounding chrome to a monochrome black/white/gray
  palette so the demo's ANSI colors pop.
- README reference updated from hero.png to hero.gif.

* docs: refresh hero gif with cyberpunk palette and full demo loop

Updates the README hero:
- New cyan→purple brand palette (Terminal white, .Gui gradient).
- Full 55.6s Terminal.Gui demo loop stretched to preserve its 932×674 ratio.
- Brighter stats band, unified meta tone on CROSS-PLATFORM /
  github / NuGet / MIT labels.
- Re-rendered at 1200×580, 12 fps, 128 colors (10.0 MB).

* docs: embed hero gif in docfx docs index

---------

Co-authored-by: livlign <livlign@users.noreply.github.com>
…ered (#5063)

* Enforce kitty test for Alt+T

* Fixes #5065. Pressing Shift-Alt-T in a TextField causes a t to be entered

* Fixes implicit modifiers not being processing on press showing a Null value

* Fix modifiers combinations issues

Co-authored-by: Copilot <copilot@github.com>

* Correcting a misleading unit test that contradicts the test's name.

* Fix modifiers returning null on release

Co-authored-by: Copilot <copilot@github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
* Fixes #5057: Prevent Alt/Ctrl keys from inserting text input

Fixes text input controls to ignore Alt/Ctrl-modified keys, even with AssociatedText (Kitty protocol). Updates FileDialog TableView height. Adds regression tests for input handling and hotkey routing. Documents FileDialog keyboard/nav issues. Refactors KeyboardEventTests for clarity.

* updated plan

* Fixes TableView key handling.

Improve FileDialog navigation and TableView key handling

- Reset TableView viewport X and Y to 0 on navigation for consistent top-left alignment in FileDialog.
- Enable TabStop on _tableViewContainer for better keyboard accessibility.
- Adjust _tableView height and anchor _tbFind Y position for improved layout robustness.
- Refactor TableView key handling: ignore control/modified keys, handle navigation only when focused and rows exist, and return true when a key is handled.

* Update TableView activation to use OnActivating pattern

Replaces OnActivated with OnActivating, updating the method to return a bool based on ToggleCurrentCellSelection. This supports cancellable or conditional activation in line with new event handling conventions.

* Fixed all but 2 issues from #4963.

Refactor TableView to v2 command/event architecture

- Implements IValue<Point?> and standard ValueChanged events
- Replaces OnMouseEvent with MouseBindings for all mouse actions
- Aligns Command.Accept/Activate/Toggle semantics to v2 standards
- Adds DefaultKeyBindings (Emacs, Home/End, Space, etc.)
- Uses C# 14 semi-auto properties for selection, default -1
- Moves collection-navigator logic to OnKeyDownNotHandled
- Threads ICommandContext through selection/navigation methods
- Marks legacy events/types as [Obsolete] with shims for compat
- Updates FileDialog and DatePicker to new TableView API
- Adds/updates tests and documents changes in tableview-refactor-summary.md
- Cleans up code style and removes dead code throughout

* Add TableView baseline tests to lock in current behavior

Comprehensive tests for TableView navigation, selection, events, and edge cases. Ensures current behavior is preserved ahead of planned redesign.

* Refactor TableView selection model and null handling

Refactored TableView to use TableSelection/TableSelectionRegion for richer selection state, replacing Point-based selection. Renamed EnsureSelectedCellIsVisible to EnsureCursorIsVisible and updated all references. Changed Command.Toggle to Command.ToggleExtend for extended selection. Improved null handling for Table and selection state, preventing NullReferenceExceptions. Updated tests and documentation to match the new model. Made minor code style and naming improvements.

* Refactor TableView selection to use Value property

Replaced all usages of SelectedRow/SelectedColumn with the new Value property and its Cursor.X/Y members for improved selection state management and null-safety. Updated event handlers to use ValueChanged instead of SelectedCellChanged, and replaced direct selection assignments with SetSelection calls. Modernized UI control initialization, streamlined menu/status bar construction, and improved code style and null handling throughout. Marked SelectedCellChanged as obsolete and updated tests and scenarios to use the new selection APIs.

* No changes detected

No code modifications were present in the provided diff. No commit necessary.

* Rename SelectedCellChanged to CursorChanged in TableView

Renamed the TableView event and event args from SelectedCellChanged/SelectedCellChangedEventArgs to CursorChanged/CursorChangedEventArgs. Updated all references, event invocations, and tests accordingly. Improved comments to clarify the event tracks cursor position changes, not cell selection.

* Refactor TableView: unify selection/events, remove legacy

Major overhaul of TableView selection and event model:
- Remove obsolete events (CellActivated, CellToggled, CursorChanged) and related args.
- All selection state now managed via Value (TableSelection).
- Internal selection fields are private; use SetSelection/Value APIs.
- Update all code/tests to use Value.Cursor and ValueChanged.
- Accept/Accepted replaces CellActivated; ToggleExtend handled directly.
- Deep-copy multi-selection regions for immutability.
- Refactor navigation, selection, and rendering to new model.
- Update all scenarios and tests for new APIs.
- Modernize code style and remove redundant code.

* Enhance TableView docs, comments, and API clarity

Improved and expanded XML documentation and in-code comments for TableView and related sources, fixing typos and grammar for accuracy and consistency. Major updates to tableview.md add a detailed table of contents, expanded sections, code examples, and event usage. Minor code fixes and improved parameter tags enhance maintainability and developer experience.

* Refactor TableView selection for immutability & clarity

Refactored TableView.Selection.cs to move IValue<TableSelection?> implementation to the end of the file and organize related properties. Changed TableSelectionRegion to use init-only properties for immutability. Updated selection region logic to use immutable instances, improved region clamping, and fixed minor logic issues. Enhanced code style and maintainability without altering selection behavior.

* Rename selection fields/methods to cursor terminology

Refactor TableView internals and API to use "cursor" instead of "selected"/"selection" for navigation state. Update all related fields, methods, comments, and tests for clarity and consistency. No functional changes; improves code readability and aligns with TableSelection.Cursor semantics.

* Refactor TableView: move content logic to partial class

Reorganize TableView by moving content-related properties and methods (content size, scrolling, viewport management) into TableView.Content.cs. This structural refactor improves code organization, separation of concerns, and maintainability. No functional changes introduced.

* TableView v2 API redesign: cursor, IValue, bugfixes

Comprehensive TableView API overhaul for v2.0.0: unified selection types, IValue<TableSelection?> support, navigation API terminology shift from "Selection" to "Cursor", and legacy API deprecation. Fixes keyboard selection toggling and region calculation bugs. Extracts content/viewport logic to a partial class and updates XML/docs. Ctrl+Click toggle regression noted for follow-up.

* Toggle multi-select regions on Ctrl+Click in TableView

Refactored UnionSelection to toggle regions on Ctrl+Click: selecting a cell adds a region, clicking again removes it. Updated method summary. Added tests for toggle-on and toggle-off behavior. Simplified Dialog<TResult>.OnViewportChanged to always call SetContentSize.

* Disable TreeView support in FileDialog

Wrap all FileDialog TreeView code in FILEDIALOG_ENABLE_TREE blocks, making TreeView support optional and easier to maintain. Refactor related fields, initialization, and layout for conditional inclusion. Improve file system tree traversal safety by skipping files and reparse points. Make TableStyle and TreeStyle nullable, and adjust constructors accordingly. Add prototype ExpandParents to TreeView (behind TREEVIEW_ENABLE_EXPAND_PARENTS). Set dialog path to user home by default and improve null-safety and code clarity throughout.

* Refactor dialog cancel handling and button access

- Expose CancelButton property in FileDialog for external access and result checking
- Replace hardcoded cancel index checks with Buttons.IndexOf(CancelButton) in OpenDialog and SaveDialog
- Allow Dialog.Result to accept Buttons.Length as a valid value
- Simplify SaveDialog constructors and update FileName logic
- Update documentation and remove obsolete comments

* The test is included only when FILEDIALOG_ENABLE_TREE is defined.

* Update FileDialogStyle.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Dialog.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update FileDialog.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix TableCollectionNavigator: handle null table and null cell values gracefully

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/143b4cb6-65b9-44b2-8ecb-0bdcf483674c

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address code review: clarify NullCellTableSource intent and remove trailing blank line

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/143b4cb6-65b9-44b2-8ecb-0bdcf483674c

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix ColumnOffset setter: guard for empty column cache when all columns are hidden

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/e345d3a4-4aba-415d-9c0a-9036eae84c1f

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address code review: improve comment clarity and use Update() in test for robustness

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/e345d3a4-4aba-415d-9c0a-9036eae84c1f

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Disable FileDialog TreeView, fix surrogate pair truncation

FileDialog TreeView feature is now disabled via `#if !FILEDIALOG_ENABLE_TREE`, hiding all related UI and logic. TreeView initialization and toggle button are only present when the feature is off. `FileDialogStyle` now supports a nullable file system and defaults `DefaultUseColors` to true. FileDialog-related config settings are removed. `TableView.TruncateOrPad` now truncates by grapheme cluster, preventing surrogate pair corruption. Adds a test to ensure truncation does not throw or produce invalid surrogates with emoji.

* Enable FileDialog directory tree by default

Removes FILEDIALOG_ENABLE_TREE conditional blocks, making the directory tree, toggle button, and related styles always active in FileDialog. Updates FileDialogStyle and tests to support the unified implementation. FileDialogExamples now sets PreserveFilenameOnDirectoryChanges via checkbox. Tree functionality is now a standard, always-on part of the dialog UI.

* Improve FileDialog layout, colors, and column visibility

- Add ".lnk" color mapping to FileSystemColorProvider
- Refine FileDialog pane border and alignment
- Reorder _treeView initialization for clarity
- Simplify TableView style for a cleaner appearance
- Use theme-based colors in TableView for consistency
- Ensure column color getter and style order are correct
- Set AllowsMultipleSelection to false in FileDialog
- Refactor ColumnStyle.Visible to use auto-property and MaxWidth logic

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
… to `SuperView` (#5073)

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
…no way of closing it (#5074)

Co-authored-by: Tig <tig@users.noreply.github.com>
…embly (#5071)

* Fixes #5069. ConfigurationManager is trim-safe without TrimmerRootAssembly

ConfigProperty.Initialize() previously relied on a reflection scan of
AppDomain.CurrentDomain.GetAssemblies() to locate [ConfigurationProperty]
host types. Under PublishTrimmed=true, types not otherwise referenced by
the consumer were stripped and Scope<T>.GetUninitializedProperty("Theme")
would throw at startup - forcing AOT apps to carry
<TrimmerRootAssembly Include="Terminal.Gui" />, adding ~1.5 MB per binary.

Terminal.Gui's own host types are now declared statically in a new
internal ConfigPropertyHostTypes registry and rooted via
[DynamicDependency(PublicProperties, typeof(X))] so the trimmer preserves
the properties the initializer depends on. The AppDomain scan is retained
as a JIT-only supplement (gated on RuntimeFeature.IsDynamicCodeSupported)
so test suites and external consumers with their own [ConfigurationProperty]
properties continue to be discovered automatically in non-AOT builds.

Examples/NativeAot drops the TrimmerRootAssembly workaround.
A new parallelizable unit test asserts the static registry matches the set
of types reflected at runtime, so drift between the list and new
[ConfigurationProperty] additions is caught at build time.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Addressed PR feedback in XML comment and test

* Addressed PR review feedback and fixed tests to match project conventions

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
* Initial plan

* Handle JSON null in SourcesManager.Load and add regression tests

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/866693ea-a3e8-40ba-9863-5053e0fbbd31

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
…ll (#5084)

* Prevent ScrollOffset and InsertionPoint being greater than 0 at initialization

Co-authored-by: Copilot <copilot@github.com>

* Prevent select all text on focus

Co-authored-by: Copilot <copilot@github.com>

* Enures InsertionPoint and ScrollOffset set to zero on focus

Co-authored-by: Copilot <copilot@github.com>

* Enures InsertionPoint and ScrollOffset set to zero on leaving focus

Co-authored-by: Copilot <copilot@github.com>

* Enures InsertionPoint, ScrollOffset set to zero and clear selection on copying text

Co-authored-by: Copilot <copilot@github.com>

* Enures clear all selection on leaving focus

Co-authored-by: Copilot <copilot@github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
---
updated-dependencies:
- dependency-name: Microsoft.NET.Test.Sdk
  dependency-version: 18.5.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
updated-dependencies:
- dependency-name: GitHub.Copilot.SDK
  dependency-version: 0.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…/Z which returns as Ctrl+Alt+A/Z (#5098)

* Fix Ctrl+Shift+Alt+A/Z combinations

Co-authored-by: Copilot <copilot@github.com>

* Fix valid printable AltGr+key combinations

Co-authored-by: Copilot <copilot@github.com>

* Fix view name

* Using explicit base type

* Fix formatting

* Fix sequence in unit test

---------

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
…along the way (#5090)

* WIP: Diagnosing #5087 and fixing other bugs along the way

* Refactor FileDialog types, filters, and code style

- Moved AllowedTypeAny and IAllowedType to separate files
- Enhanced Notepad open dialog filters and options
- Replaced Enumerable.Empty<T>() with [] literals
- Changed CancelButton to CancelButtonIndex (int)
- Moved FileDialog UI/filter setup to EndInit
- Simplified FileDialogState and FileDialogTableSource
- Updated OpenDialog/SaveDialog to use CancelButtonIndex
- Applied code style and expression-bodied member improvements

* Remove subview min size logic from Dialog<TResult>

Eliminates tracking and usage of _minimumSubViewsSize. Dialog sizing now only considers viewport, title, and button sizes. OnSubViewAdded override and related calculations are removed for simplification.

* Update Terminal.Gui/Views/FileDialogs/FileDialog.Commands.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Examples/UICatalog/Scenarios/Notepad.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix nullable string warning in AutocompleteFilepathContext by using OfType&lt;string&gt;() after Where filter

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/30418e61-6cfd-44e9-a7f7-0c239168714e

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
* WIP: Diagnosing #5087 and fixing other bugs along the way

* Refactor FileDialog types, filters, and code style

- Moved AllowedTypeAny and IAllowedType to separate files
- Enhanced Notepad open dialog filters and options
- Replaced Enumerable.Empty<T>() with [] literals
- Changed CancelButton to CancelButtonIndex (int)
- Moved FileDialog UI/filter setup to EndInit
- Simplified FileDialogState and FileDialogTableSource
- Updated OpenDialog/SaveDialog to use CancelButtonIndex
- Applied code style and expression-bodied member improvements

* Remove subview min size logic from Dialog<TResult>

Eliminates tracking and usage of _minimumSubViewsSize. Dialog sizing now only considers viewport, title, and button sizes. OnSubViewAdded override and related calculations are removed for simplification.

* Update Terminal.Gui/Views/FileDialogs/FileDialog.Commands.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update Examples/UICatalog/Scenarios/Notepad.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Improve Dialog docs; add FileDialog refactor plan

Expanded XML docs for Dialog/Dialog<TResult> to clarify layout, sizing, and scrollbar limitations. Added filedialog-state-refactor.md detailing planned FileDialogState refactoring, performance fixes, dead code removal, and new test requirements. Cleaned up redundant remarks in Dialog<TResult> constructor.

* Refactor FileDialogState and improve filepath suggestions

Added a protected FileDialogState constructor to support custom child population, updated SearchState to use it, and prevented redundant enumeration. Improved FilepathSuggestionGenerator by fixing nullability, filtering, and type issues for safer and clearer suggestion logic. Also ensured Path is set in all FileDialogState constructors.

* Update docs for Terminal.Gui v2.0 release

Announce v2.0 release, clarify v1 maintenance status, and rewrite README and docs to highlight v2 features, installation, and migration. Remove outdated v1/alpha references and improve navigation and quick start sections.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@tig tig closed this Apr 28, 2026
@tig tig deleted the release/v2.0.0-rc.7 branch April 28, 2026 20:33
Copilot AI added a commit that referenced this pull request May 3, 2026
tig added a commit that referenced this pull request May 4, 2026
…#5150)

* Initial plan

* Fixes #5103. Disable NerdFonts default in FileDialogExamples scenario

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/49264ca7-5e02-4e48-aa49-e81b08ddcf23

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
tig added a commit that referenced this pull request May 7, 2026
…#5150)

* Initial plan

* Fixes #5103. Disable NerdFonts default in FileDialogExamples scenario

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/49264ca7-5e02-4e48-aa49-e81b08ddcf23

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
tig added a commit that referenced this pull request May 7, 2026
* Fixes #5114. Remove main from publish branch triggers; use tags only (#5115)

* Bump ReportGenerator from 5.5.5 to 5.5.6

---
updated-dependencies:
- dependency-name: ReportGenerator
  dependency-version: 5.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update Examples link in README.md (#5104)

* Reframe layout docs around responsive UI and instructional style (#5110)

* Initial plan

* docs: reframe layout docs around responsive UI

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/a6b913bd-38e5-4d80-ac23-9dc8e6716045

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* docs: polish responsive layout wording

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/a6b913bd-38e5-4d80-ac23-9dc8e6716045

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* docs: tighten instructional sentence style

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d453216b-6d43-4261-aa23-0dad98805e91

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* docs: fix remaining instructional prose

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d7be6123-896e-4b95-8e3f-0cee1d6d35d1

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fixes #5114. Remove main from publish branch triggers; use tags only

Main branch pushes were triggering the publish workflow without a release
tag, causing GitVersion to produce invalid NuGet versions (e.g. 2.0.0-5420).

- Remove main from branches trigger; stable releases now publish only on v* tag push
- Develop branch pushes continue publishing pre-release packages automatically
- Update template dispatch conditions to match tag-based flow

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Release v2.0.1 (#5116)

* Update Examples link in README.md (#5104)

* Reframe layout docs around responsive UI and instructional style (#5110)

* Initial plan

* docs: reframe layout docs around responsive UI

* Fix XML comment has cref attribute 'Buttons' that could not be resolved CS1574 (#5118)

* docs: tweak hero gif stats per #5108 (#5121)

Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5088 - Margin Shadow sizing wrong (#5101)

* Add tests for ShadowStyle inheritance and reset behavior

Added two unit tests to ShadowTests.cs:
- ShadowStyle_Getter_Does_Not_Inherit_From_SuperView ensures a child view does not inherit ShadowStyle from its SuperView and that round-tripping the property does not create a MarginView or add shadow thickness.
- Setting_ShadowStyle_Null_Resets_ShadowSize verifies that setting ShadowStyle to null resets the MarginView's ShadowSize to Size.Empty, preventing residual state.

* Fixes #5088 - Changed Margin.ShadowStyle to only use the local value and reset ShadowSize to Size.Empty when unset. Adjusted related tests to match new behavior.

Refactored ShadowStyleDemo window and editor initialization for clarity and consistency, updated shadow window positioning and scheme usage, and improved child view arrangement.

* Update Tests/UnitTestsParallelizable/ViewBase/Adornment/ShadowTests.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fixes #5072. TableView reserves space for later columns when laying out (#5083)

* Fixes #5072. TableView reserves space for later columns when laying out

A wide column (e.g. a long Description) previously consumed all available
viewport width and pushed subsequent columns off-screen. Each visible
column now reserves at least its header width (or configured MinWidth)
during layout so wide columns are clamped instead of starving later
columns.

The reservation only inspects column headers and styles — it never
iterates cell rows — so paginated or very large ITableSource
implementations remain performant.

* Tighten TableView column-bounds test to use strict inequality

Right-edge check now uses < Viewport.Width instead of <= per code review.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Restore foreach loop in TableView.CalculateContentSize

Use a manual index counter rather than converting the loop to for, and
revert the unrelated borderWidth local-variable extraction. The fix only
needs the index to compute the slice of remaining columns to reserve
space for.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Updated table col width calculation and added wide example

* Fixed tests and updated comment wording based on copilot pr feedback

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5119. Popover isn't recalculating it's position when terminal is resizing (#5120)

* Fixes #5119. Popover isn't recalculating it's position when terminal is resizing

* Add one more unit test for popover screen resize

* Fix unit test

---------

Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5122. Visible popovers are always layout and redrawn in every iteration unnecessarily. (#5123)

* Fixes #5075. TableView ShowVerticalCellLines renders incorrectly with custom ColorGetter (#5128)

* Fixes #5075. TableView ShowVerticalCellLines=false renders incorrectly with custom ColorGetter

When ShowVerticalCellLines is false and a ColumnStyle.ColorGetter is in use
(e.g. FileDialog), the 1-char gap between cells retained the row scheme's
attribute, producing visible "stripes" through custom-colored cells.

TruncateOrPad intentionally renders cells to (Width - 1) chars, leaving 1
char for the cell boundary. RenderRow now extends the cell's own background
into that gap when the separator is the default invisible space.
RenderSeparator skips drawing in the same case (RenderRow owns the gap).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* FileDialog: use ShowVerticalCellLines=false now that #5075 fix is in.

Per PR review on #5128, switch FileDialog's TableView to render without
vertical cell lines so its custom ColorGetter (file-type colors) shows
through cleanly. The TableView fix in this PR ensures the 1-char gap
between cells now picks up the cell's own background instead of the
row scheme's, so removing the lines no longer leaves color stripes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>

* Fixes #5132. TableView Home/End navigation with FullRowSelect (#5133)

* Fixes #5068. TableView appends ellipsis indicator when cell content is truncated (#5129)

* Reverts #5133. Revert TableView Home/End FullRowSelect change (#5136)

* Revert "Fixes #5132. TableView Home/End navigation with FullRowSelect (#5133)"

This reverts commit 6361f3368.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Docs: Document Home/End rebinding for FullRowSelect in TableView

Adds a tip to the FullRowSelect section showing how to rebind Home/End
to Command.Start/Command.End for row-level navigation, referencing the
UICatalogRunnable pattern.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fixes #5130. Fix OutputBufferImpl race condition on Contents reference (#5131)

* Adds concurrency test for OutputBufferImpl race condition

Adds AddStr_And_ClearContents_Concurrent_DoesNotThrow test that
reproduces the race condition in OutputBufferImpl where ClearContents
replaces the Contents reference while AddStr is concurrently iterating.

See #5130.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Adds concurrency tests, benchmark, and plan for #5130

- Expanded OutputBufferImplConcurrencyTests with 4 tests covering:
  AddStr+ClearContents, FillRect+ClearContents, Move+AddStr+ClearContents,
  and a three-way concurrent test
- Added OutputBufferBenchmark for perf baseline (AddStr, FillRect,
  ClearContents, SetSize, TypicalDrawCycle)
- Added implementation plan in plans/

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Refactor OutputBufferImpl for thread safety

Replaced locking on Contents with a dedicated _contentsLock object to ensure safe concurrent access to buffer state (Contents, DirtyLines, Clip, etc.). Refactored buffer management methods (ClearContents, SetSize, FillRect, Move, IsValidLocation) to use the new lock. Updated FillRect and AddGrapheme to avoid race conditions. Improved documentation and comments for concurrency. Moved SetCellUrl/GetCellUrl implementations under the lock. In OutputBufferImplConcurrencyTests, reordered and moved helper methods for clarity; no test logic changes. No public API changes, but internal concurrency is now robust.

* Refactor StringExtensions for style and consistency

Refactored methods to use expression-bodied members and improved code style (constants, variable declarations, and formatting). Added and then removed `IsSurrogatePair` and `MakePrintable` extension methods, resulting in no net functional changes. All updates are stylistic and organizational.

* Fix race condition in FillRect(Rectangle, char) overload

The char overload called Move() + AddRune() without holding _contentsLock,
allowing concurrent threads to corrupt Col/Row between the two calls and
write characters to wrong positions.

Fix: delegate to FillRect(Rectangle, Rune) which holds the lock atomically.

Added test proving the race (detected wrong-position writes in <13ms before fix).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Added null check in OutputBufferImpl.cs WriteGrapheme. Introduced locking in RuneExtensions.cs for thread-safe Unicode width calculation.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>

* Fixes #5137 - BREAKING CHANGE - Rename `TableSelection.Cursor` to `TableSelection.SelectedCell` (#5142)

* Initial plan

* Rename TableSelection.Cursor to TableSelection.SelectedCell

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/8d9d1a5e-97bb-4c6e-862a-948119c94fca

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fixes #5145. ReadOnly TextView mouse selection still cannot include final character in v2.0.1 (#5146)

* Fixes #5137. Add custom header styling for TableView (#5138)

* Initial plan

* Add custom header styling for TableView (Options B+C)

- Add HeaderColorGetterArgs class for contextual header color info
- Add HeaderColorGetterDelegate for per-column header color override
- Add ColumnStyle.HeaderColorGetter property
- Add TableStyle.HeaderScheme property for global header scheme
- Update RenderHeaderMidline to apply header styling
- Update CharacterMap scenario to italicize sorted column header
- Add unit tests for both per-column and global header styling

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/157d9f83-14ee-4f74-9d4a-a6b879105d50

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5112. AOT config warning cleanup (#5134)

* Fix NativeAOT configuration cloning and warning cleanup

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix config converter regressions and serialization cleanup

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove stale AOT propagation annotations

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix NativeAOT configuration cloning and warning cleanup

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix config converter regressions and serialization cleanup

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove stale AOT propagation annotations

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix PR 5134 config review feedback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Simplify AttributeJsonConverter style parsing

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Correctly serialize null properties in ScopeJsonConverter

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5149. Improve DropDownList keyboard use when closed (#5151)

* Initial plan

* Improve DropDownList keyboard: Space to open, Up/Down to navigate, CollectionNavigation support

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/c07c6615-2cdd-40a1-b0c0-86f0f31c26bb

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address code review: split compound conditions into separate guard clauses

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/c07c6615-2cdd-40a1-b0c0-86f0f31c26bb

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Code cleanup

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5157. Add `RunAsync(IRunnable, CancellationToken)` (#5159)

* Fixes #5158. Refactor `FileDialog` base type from Dialog to Dialog<IReadOnlyList<string>?> (#5160)

* Fixes #5103. Disable NerdFonts default in FileDialogExamples scenario (#5150)

* Initial plan

* Fixes #5103. Disable NerdFonts default in FileDialogExamples scenario

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/49264ca7-5e02-4e48-aa49-e81b08ddcf23

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* fix: Key.Equals honors GetHashCode contract; drops Handled from identity (#5170) (#5179)

Key.Equals(object?) included Handled in the comparison while GetHashCode
returned only _keyCode.GetHashCode(), violating the .NET contract that
equal objects must have equal hash codes. This broke KeyBindings (a
ConcurrentDictionary<Key, KeyBinding>) when Handled flipped between
storing and lookup.

Handled is per-event state, not part of binding identity, so it is
removed from the equality comparison. KeyEqualityComparer already used
KeyCode-only equality and is consistent.

Two existing tests in KeyTests.cs that asserted the buggy behavior
(Equals_ShouldReturnTrue_WhenEqual and
Equals_Handled_Changed_ShouldReturnFalse_WhenNotEqual) have been
updated to assert the correct contract-honoring behavior.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

Co-authored-by: Claude <noreply@anthropic.com>

* docs: clarify AI test markers — // Claude and // CoPilot are both acceptable (#5189)

CLAUDE.md and .claude/rules/testing-patterns.md disagreed on the AI marker
convention (one said "// Claude - Opus 4.5", the other "// CoPilot - ChatGPT v4").
Empirically both are used: Tests/UnitTestsParallelizable + Tests/UnitTests.NonParallelizable
contain ~105 files with "// Claude" markers and ~93 with "// CoPilot". Update both
guidance files to list the two forms as equally acceptable and tell reviewers not to
flag inconsistency between them. Triggered by Copilot review nits across PRs #5177-#5188.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

Co-authored-by: Claude <noreply@anthropic.com>

* fix: UnixRawModeHelper safe restore on crash + valid-state guard (#5164) (#5186)

* fix: UnixRawModeHelper safe restore on crash + valid-state guard (#5164)

When the input thread crashes before the driver Dispose() runs, the Unix
terminal is left in raw mode and the user's shell is left unusable.

This change adds three safety nets so the original termios is restored on
any abnormal exit path:

- Finalizer: last-resort restore if Dispose() is bypassed (e.g. fatal
  native crash, immediate process abort).
- AppDomain.ProcessExit hook registered after a successful TryEnable;
  unregistered in Dispose() to avoid leaking the helper for the lifetime
  of the process.
- Console.CancelKeyPress hook so Ctrl+C also restores cleanly.

Also adds a _haveSavedTermios guard so Restore() is a hard no-op unless
tcgetattr previously succeeded - preventing an uninitialized termios
struct from ever being written back to the terminal.

Tests in UnitTests.Parallelizable cover:
- Restore() without TryEnable() is a no-op and does not throw.
- Restore() is idempotent.
- Dispose() without TryEnable() is a no-op and double-Dispose is safe.
- The type has a finalizer (last-resort restore contract).
- TryEnable() failure paths leave _haveSavedTermios = false.

The full crash-during-input-thread scenario is integration-only (requires
a real tty); the unit tests cover the observable contract.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

* fix: check tcsetattr return; document CancelKeyPress limitation (#5164)

Address Copilot review feedback on PR #5186:

- Restore() and the finalizer now check the tcsetattr return code. On
  non-zero return, log the errno via the existing Logging infrastructure.
  Restore() leaves IsRawModeEnabled set to true when the syscall fails so
  callers and the finalizer know the terminal was not restored. The
  finalizer logs only and never throws.
- Document the Console.CancelKeyPress limitation: with ISIG disabled in
  raw mode, a keyboard Ctrl+C arrives as a 0x03 byte rather than SIGINT,
  so the hook is unlikely to fire while raw mode is active. The
  subscription remains as belt-and-braces defense for hosts that do not
  disable ISIG and for externally-delivered SIGINT events; the primary
  safety nets are AppDomain.ProcessExit and the finalizer.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

* fix: drop unreachable finalizer from UnixRawModeHelper (#5164 review)

The finalizer in UnixRawModeHelper was dead code: the instance is rooted
by its AppDomain.CurrentDomain.ProcessExit and Console.CancelKeyPress
event-handler subscriptions, so it can never become finalization-eligible
while those hooks are wired. Drop the finalizer and the now-unneeded
GC.SuppressFinalize call. Restoration relies on explicit Dispose as the
primary path with the ProcessExit hook as the safety net for normal
process exit; CancelKeyPress remains a best-effort fallback. Update the
class-level remarks and the obsolete reflection-based finalizer test
accordingly (6 tests -> 5).

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

---------

Co-authored-by: Claude <noreply@anthropic.com>

* docs: clarify SessionBegun/SessionEnded as token lifecycle hooks (#5162) (#5188)

* docs: clarify SessionBegun/SessionEnded as token lifecycle hooks (#5162)

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

* docs: tighten SessionBegun/SessionEnded XML accuracy (#5162)

Address Copilot review feedback on PR #5188 by aligning the
SessionBegun and SessionEnded XML docs with the actual ordering and
contract in ApplicationImpl.Begin/End.

- SessionBegun summary: describe the real firing point (after the
  token is pushed onto SessionStack and TopRunnable is set, but
  before IsRunningChanged/IsModalChanged fire) instead of "immediately
  after token construction".
- SessionEnded summary: drop "token-disposal hook"/"about to be
  released" framing; SessionToken is not IDisposable. Describe the
  real state (state has unwound, IsRunningChanged(false) has fired,
  Runnable is null) without overstating the SessionStack invariant
  (End only pops when wasModal && popped == token).
- Replace "manually dispose of the SessionToken" guidance in both
  remarks blocks with the actual caller responsibility: subscribe to
  SessionEnded and call End(SessionToken) themselves.
- End(SessionToken) remarks: replace "disposes the sessionToken" with
  "clears SessionToken.Runnable on sessionToken" to match the code.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>

* fix: ApplicationImpl.Invoke throws NotInitializedException after Dispose (#5163) (#5185)

* fix: ApplicationImpl.Invoke throws NotInitializedException after Dispose (#5163)

Both `Invoke(Action)` and `Invoke(Action<IApplication>)` overloads
silently dropped actions when called before `Init()` or after
`Dispose()`: the thread-affinity fast path is skipped (no main thread
or top runnable) and the `TimedEvents.Add` fallback queues onto a
stopped queue.

Add an `Initialized` guard at the top of both overloads so the post-
Dispose / pre-Init case fails loudly with `NotInitializedException`,
matching the pattern already used by `Run(IRunnable, ...)` in the
same file.

The deeper thread-affinity race between the fast-path read of
`TopRunnableView` / `MainThreadId` and concurrent shutdown is
intentionally out of scope - that requires a redesign noted in the
issue and is not covered here.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

* fix: address review comments on Invoke disposed-throws (#5163)

- Pass nameof(Invoke) to NotInitializedException so the formatted
  "{member} cannot be accessed before Initialization" message is
  grammatically correct.
- Add ArgumentNullException.ThrowIfNull(action) to the non-generic
  Invoke(Action) overload so a null action fails deterministically
  (consistent with Begin/Run argument validation).
- Wrap Init in try/finally in the AfterDispose tests so a thrown
  Init does not leak the process-wide SynchronizationContext.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>

* fix: ConcurrentDictionaryJsonConverter rejects duplicate keys (#5173) (#5181)

* fix: ConcurrentDictionaryJsonConverter rejects duplicate keys (#5173)

The Read implementation was calling TryAdd and ignoring its return value,
so duplicate keys in input JSON were silently dropped. Now throws a
JsonException on duplicate, mirroring the DictionaryJsonConverter fix.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

* style: normalize space-before-paren in ConcurrentDictionaryJsonConverter (#5173 review)

Apply project's space-before-paren convention to the Read method body,
matching DictionaryJsonConverter<T>. Addresses review feedback on
PR #5181 where the new TryAdd duplicate-key check used the convention
but adjacent calls in the same method body did not.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>

* refactor: remove Region.DrawOuterBoundary debug API (#5168) (#5183)

Per maintainer feedback, DrawOuterBoundary was a debug helper added during
Region's development phase, not a supported public API. There are zero
internal callers across the framework (verified via grep); the only consumer
was the RegionScenario UICatalog demo, which now iterates GetRectangles()
and adds rectangle edges to the LineCanvas directly. Shared edges between
adjacent rectangles overlap; LineCanvas line-style joining handles the
visual result, matching how Border/Adornment already draw.

The 30+ structural smoke tests in DrawOuterBoundaryTests.cs are removed;
none used DriverAssert or verified visual output.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>

* fix: KeyBindings preserves Key on bindings created via Add (#5171) (#5177)

The KeyBindings constructor passed a binding factory to CommandBindingsBase
that dropped the key parameter, calling `new KeyBinding(commands, source)`
where `source` was bound to the View? overload's target/data slot. Result:
every binding created via Add(key, ...) had Key = null and Target = null.

Forward the key (and explicit nulls for target/data) to the
(commands, key, source, target, data) constructor so KeyBinding.Key is
populated.

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

Co-authored-by: Claude <noreply@anthropic.com>

* fix: Region.XOR computes correct symmetric difference (#5167) (#5178)

The XOR branch in Region.Combine mutated `this` via Exclude(region) and
then computed (region - this) against the already-mutated `this`,
producing a non-symmetric result. Snapshot both operands first and
compute (thisOriginal \ regionOriginal) ∪ (regionOriginal \ thisOriginal).

https://claude.ai/code/session_01CdoS4YQ7v9aNPZaNsYnxjv

Co-authored-by: Claude <noreply@anthropic.com>

* Fixes #issue. Correct AI guidance API entries for typed views and wrappers (#5191)

* Initial plan

* docs: correct AI API guidance for wrappers and typed values

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/4aa88436-767a-4bf4-93b4-79b3c9823fc6

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5148. Add selection and copy-to-clipboard to Markdown view (#5152)

* Initial plan

* Add selection, copy, and context menu to Markdown view

- Add MarkdownView.Selection.cs with selection state, SelectAll(), Copy(),
  ClearSelection(), IsInSelection(), GetSelectedText(), context menu lifecycle
- Update MarkdownView.Mouse.cs: add Command.SelectAll/Copy/Context, OnMouseEvent
  for drag selection, update OnActivated for drag-aware link handling,
  update OnHasFocusChanged for context menu lifecycle
- Update MarkdownView.Drawing.cs to highlight selected cells
- Update Markdown.cs: clear selection on text change, update docs
- Add MarkdownViewSelectionTests.cs with 12 tests

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/ecbe0462-5243-4c9a-9464-f0e66acd0b9f

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix code review issues: use explicit type int and App is not null pattern

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/ecbe0462-5243-4c9a-9464-f0e66acd0b9f

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix selection visibility and persistence after mouse release

- Fix selection attribute: use GetAttributeForRole(VisualRole.Focus) instead of
  reversing per-segment colors — gives reliable contrast across all schemes/themes
- Fix selection disappearing on mouse release: remove the LeftButtonReleased →
  Activate binding (inherited from base SetupMouse) so OnActivated fires only on
  LeftButtonClicked; previously OnActivated fired twice causing _isDragging to be
  reset before the Click, which then cleared the selection
- Add two regression tests: Selection_Persists_After_LeftButtonReleased and
  Plain_Click_Clears_Selection

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/23c59c05-1db9-43bb-8f36-2dcceb3db746

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Code cleanup

* Refactor MarkdownView mouse selection handling

Route mouse press and drag events through OnActivated by binding LeftButtonPressed and LeftButtonPressed|PositionReport to Command.Activate. Update selection logic accordingly and add unit tests to verify mouse bindings and drag-selection behavior.

* Add SelectedText property and markdown fidelity tests

Added public SelectedText property to Markdown view, returning the current selection as plain text or null if inactive. Documented that the output may differ from the markdown source. Introduced Copilot-marked tests verifying that selection and copy operations should preserve markdown structure (e.g., list markers, code fences). Tests currently fail, documenting known fidelity issues in the selection/copy implementation. No changes to selection/copy logic yet.

* Preserve markdown syntax in selection and copy

Improves MarkdownView selection/copy fidelity by reconstructing code block fences (with language tags) and list markers in selected/copied text. Returns original markdown source for full-document selections. Updates and adds tests to verify round-trip and partial selection correctness.

* Add test for table markdown preservation in selection

Adds PartialSelection_IncludingTable_SelectedText_Preserves_Table_Markdown to verify that partial selections including tables retain Markdown syntax. Documents current failure: table rows are missing from selected text due to placeholder rendering.

* Support GFM table markdown copy from selection

Reconstruct and output valid GitHub Flavored Markdown pipe-table syntax when selecting and copying table content. Store TableData in RenderedLine, and use it to generate markdown table lines with correct alignment and structure during selection.

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Fix right-click on unfocused Markdown view being a no-op

Handle RightButtonClicked in OnMouseEvent before command bindings fire:
- If view is not focused, SetFocus() first — this synchronously triggers
  OnHasFocusChanged(true) which creates the ContextMenu
- Then call ShowContextMenu(mouse.ScreenPosition) so the menu appears
  at the click location
- Remove RightButtonClicked → Command.Context mouse binding (now
  handled entirely in OnMouseEvent)
- Also fix keyboard context menu anchor: GetContextMenuScreenPosition()
  already provides ViewportToScreen fallback for the keyboard path;
  simplified the null-check in ShowContextMenu to use it
- Rename ambiguous local 'anchor' → 'viewportPosition' in
  GetContextMenuScreenPosition()
- Simplify LeftButtonReleased ungrab: remove redundant IsGrabbed check
  (UngrabMouse is a no-op when not grabbed)
- Add regression tests: RightClick_On_Unfocused_View_Creates_And_Shows_ContextMenu
  and RightClick_On_Focused_View_Shows_ContextMenu

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/e3212c71-6a8b-4c36-97c8-cb32602852a7

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix drag clamping, table duplication, SubView selection drawing, and IsFullDocumentSelected

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/39d748ab-7987-458b-902a-2a9cb47a9c6d

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix code review: use explicit int types in CountOccurrences helper

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/39d748ab-7987-458b-902a-2a9cb47a9c6d

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Fixes #3995. Add notify-clet.yml: dispatch to gui-cs/clet on develop publish + release tag (#5197)

* Initial plan

* Add notify-clet.yml: dispatch to gui-cs/clet on develop publish + release tag

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/4c58f4a8-a920-4d6a-a908-7e49f34c7bb6

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fixes #5192. Fix MarkdownView GetContentHeight overestimating height with tables (#5194)

* Initial plan

* Fix MarkdownView GetContentHeight overestimating height with tables

In BuildRenderedLines, tableView.Frame.Height was read after Recalculate()
set the Height Dim but before layout could update Frame. The Frame retained
a stale value from the initial Recalculate(80) in the TableData setter
(where width defaulted to 80 because Frame.Width was 0).

Fix: Add RenderedHeight property to MarkdownTable that is always up-to-date
after Recalculate(), and use it instead of Frame.Height in BuildRenderedLines.

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/c3c41ab6-99f5-4a09-938e-01519f6012cb

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Improve XML doc for RenderedHeight property

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/c3c41ab6-99f5-4a09-938e-01519f6012cb

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix table height overestimate in mixed-width documents

When a long unwrapped line (e.g. code) makes contentWidth > viewportWidth,
tables (Dim.Fill) render at the wider content width and may need fewer
wrapped rows. Add a pre-scan pass to compute _maxLineWidth from unwrapped
blocks first, then use max(viewportWidth, _maxLineWidth) as the table
layout width. This ensures table placeholder lines match the actual
rendered height at the final content width.

Add regression test proving the fix for this mixed-width scenario.

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/49f44619-798d-400e-83e3-c4c0b8743f12

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address review: use OfType pattern matching instead of string comparison

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/49f44619-798d-400e-83e3-c4c0b8743f12

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5193. Emit OSC 8 hyperlink sequences in Driver.ToAnsi() (#5195)

* Initial plan

* Emit OSC 8 hyperlink sequences in BuildAnsiForRegion for ToAnsi() output

When cells have associated URLs (set by Link/Markdown views via
Driver.CurrentUrl), ToAnsi() now emits OSC 8 open/close sequences
around the link text. This makes links clickable in terminals that
support OSC 8 (Windows Terminal, iTerm2, GNOME Terminal, etc.).

The live rendering path (OutputBase.Write) already handled this;
only the ToAnsi() export path was missing URL tracking.

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/2aa76383-5fae-42a5-9aac-1b681930e8a5

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add fast-path in GetCellUrl to skip lock when no URLs exist, add row-boundary test

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/0f3f41a6-4d54-43d7-a72e-660b48ad54b0

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix thread-safety: re-check _urlMap inside lock after fast-path null check

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/0f3f41a6-4d54-43d7-a72e-660b48ad54b0

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* notify-clet: deterministic version handoff + flat-container poll (#5198)

The previous notify-clet.yml used `dotnet package search` to discover
the version that publish.yml just pushed. That hit NuGet's search/
registration index, which is eventually consistent. On 2026-05-05 a
develop publish triggered notify-clet two seconds after Terminal.Gui
2.0.2-develop.37 hit NuGet, but `dotnet package search` still returned
.36 — so the gui-cs/clet workflow built and published .36 a second time
(silently no-op'd by --skip-duplicate). Result: testers stuck on .36;
the markdown rendering fix shipped in .37 never reached them.

Two changes fix the race:

publish.yml writes the just-pushed version (the GitVersion SemVer it
already computes) to a `published-version` artifact. Deterministic; no
round-trip through any NuGet API.

notify-clet.yml downloads that artifact via workflow_run + actions/
download-artifact, then polls NuGet's *flat-container* API (the
endpoint `dotnet restore` actually uses, which indexes within
seconds — not the search/registration index that lags by minutes)
until the version is restorable. Cap is 10 minutes; in practice
flat-container is sub-minute. If the cap trips, the workflow fails
loudly rather than silently dispatching a stale or unbuildable version.

Channel detection (release vs develop) now derives from the SemVer
suffix on the artifact contents, so the dual on: triggers (release +
workflow_run) collapse to a single workflow_run trigger — publish.yml
already runs on both develop pushes and v* tags, so workflow_run
covers both channels. `actions: read` permission added so notify-clet
can read artifacts from the triggering run.

Repro of the bug: gui-cs/clet workflow run 25406348354 dispatched
TG_VERSION=2.0.2-develop.36 even though the triggering TG publish
(run 25406288505 on this repo) had pushed .37. The clet build that
fixed the symptom required a manual `gh workflow run` dispatch.

* Update package versions and remove nullable from tests

- Bump, add, and reorder NuGet package versions in Directory.Packages.props, including new test and utility dependencies
- Remove Solution Items reference to docfx\docs\borders.md from Terminal.sln
- Refactor ConfigurationMangerTests.cs to use non-nullable types for improved null-safety

* Fixes #3961. Replace ColorPicker TextField+autocomplete with DropDownList (#5199)

* Initial plan

* Replace ColorPicker TextField+autocomplete with DropDownList for color names

Fixes the ColorPicker to use a DropDownList control instead of a TextField
with AppendAutocomplete for selecting color names. This provides a better
user experience with a proper dropdown list of available color names.

Changes:
- Replace _tfName (TextField) with _ddlName (DropDownList)
- Use ListWrapper<string> with color names as the DropDownList source
- Set DropDownList to ReadOnly mode for selection-only behavior
- Add _syncingSubViews guard to prevent re-entrancy when syncing values
- Update tests to reflect the new DropDownList behavior

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/e96bf855-571a-41ff-81f1-f1102b84486c

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix var usage: use explicit string type per codebase conventions

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/e96bf855-571a-41ff-81f1-f1102b84486c

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix App_EnableForDesign_DrawsCorrectly test for DropDownList toggle button

The DropDownList renders a ▼ toggle button that the old TextField didn't
have. Update the expected output in TabsTests to include the arrow character
in the ColorPicker Name field rendering.

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/04da7957-99cb-4aa2-b81a-bef8f66e8dec

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5203 - Add TrySetValueFromString to IValue for IParsable-based string assignment (#5205)

* Initial plan

* Add TrySetValueFromString to IValue with default IParsable-based impl

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/6c89d797-144a-49e4-8ae5-2cead8fc01d7

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* polish: improve test class comment wording per code review

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/6c89d797-144a-49e4-8ae5-2cead8fc01d7

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Update examples to demonstrate IValue.TrySetValueFromString

- InlineColorPicker: Add --initial <color> CLI arg with error on invalid
- InlineSelect: Add --initial <label|index> with label matching and error
- UICatalog Popovers: Add Initial Value TextField, apply via TrySetValueFromString
- PromptExample: Add Initial Value TextField, apply to all prompt views
- OptionSelector: Sync FocusedItem when Value changes via OnValueChanged

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Refactor argument parsing to use switch statement

Refactored command-line argument parsing from if/else to a switch statement with pattern matching for better clarity and maintainability. Improved error handling for missing argument values and changed orientation variable to explicit Orientation type.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fixes #4859. Render to /dev/tty when stdout is redirected (#5208)

* Initial plan

* Render to /dev/tty (Unix) / CONOUT$ (Windows) when stdio is redirected

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/882d62e1-b36c-4d97-8db5-faf391ceedbf

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address review feedback: clarify ttyFd ownership; drop unused Windows P/Invokes

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/882d62e1-b36c-4d97-8db5-faf391ceedbf

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address review comments with clarifying documentation

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/882d62e1-b36c-4d97-8db5-faf391ceedbf

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fixes #5209. TableView header separator lines draw with focus attribute (#5210)

* Initial plan

* Fix TableView header separator lines drawing with focus attribute

The RenderHeaderMidline method was setting the focus/header color
attribute before drawing separator lines (│), causing the vertical
lines between column headers to be rendered with the focus scheme
instead of the normal scheme. This fix resets to Normal attribute
before drawing separators and only applies the focus attribute to
the header text content itself.

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/a4c155ae-c77c-493c-8ef2-80b80b7ad6e2

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5211. FlagSelector ENTER should not toggle, just accept. (#5212)

* Initial plan

* Fix FlagSelector ENTER to only accept without toggling

Add virtual ActivateOnAccept property to SelectorBase (defaults true
for OptionSelector). FlagSelector overrides it to return false so
Enter just accepts without toggling the focused item.

Fixes #4473

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/09dfd0cb-27bb-492f-96b9-591785e1a870

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5202 - BREAKING CHANGE- Refactor LinearRange to implement IValue<T> (#5204)

* Add design plan for LinearRange IValue<T> refactor and clet

* Refactor LinearRange to implement IValue<T> with three subclasses

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/57da70ed-e15b-4920-bd6b-93632a201607

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Remove redundant with {} expression in LinearRange.SpanFromIndices

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/57da70ed-e15b-4920-bd6b-93632a201607

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address PR review: split tests, add visual tests, fix mouse drag, remove legend styling

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/9d0abd93-a506-4979-85bb-22af119cf919

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix CI: update HardCoded cache test to new LinearRangeDefaults config key

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/f3929ef5-6b66-40b7-a053-0e3720beb424

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Add IDesignable.EnableForDesign() to each LinearRange subclass with meaningful demo data

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/43266cee-38bb-4815-a0ce-ff63e04a47ea

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix mouse drag for LinearRange: anchor-based drag for Closed; set semantics for Left/Right Bounded

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/71b66d9b-c491-4a62-8a0c-7ffef88baea4

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Add non-generic LinearSelector / LinearMultiSelector / LinearRange so AllViewsTester can discover them

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d920e093-379a-4605-8b6b-07b1534379e7

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Default DragChar to ContinuousMeterSegment so it matches SetChar

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/cca84663-bd59-4b21-9e91-b98cd066370e

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Remove redundant ClearViewport in LinearRange draw to fix drag flicker

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/5eb88b7e-3e39-48b9-94d3-54e195158efd

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Add SelectedIndex to LinearSelector for unambiguous "no selection" with value-type T

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/e66c5848-2678-4c7b-ad85-65bd43f9441a

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Use HashSet to dedupe indices in LinearMultiSelector.Value setter (O(n) instead of O(n^2))

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/276579a1-65c0-4471-8259-316631a8697b

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Fixes #5213. Security: fix PowerShell command injection in WSLClipboard.SetClipboardDataImpl (#5218)

* Initial plan

* Fix PowerShell command injection in WSLClipboard.SetClipboardDataImpl

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/c07e3cd8-aa15-4626-bdd0-86c06af73814

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>

* Fixes #5216. FileDialog: reject path-traversal in Rename/New and skip symlinks in search (#5222)

* Initial plan

* Fix FileDialog path-traversal in Rename/New and symlink-loop in search

- Add IsContainedIn() and ContainsInvalidNameCharacters() validation to
  DefaultFileOperations.Rename and DefaultFileOperations.New to reject
  names that would traverse outside the parent directory.
- Add reparse-point check in FileDialog.SearchState.RecursiveFind to
  prevent infinite recursion through symlink loops.
- Make FileSystemTreeBuilder.IsReparsePoint internal for reuse.
- Add fdPathTraversalError string resource.
- Add unit tests for path validation helpers.

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/711b726c-fb95-4ee0-83e3-685962f6ae15

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Refactor: validate name characters before Path.Combine for early detection

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/711b726c-fb95-4ee0-83e3-685962f6ae15

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5215. Sanitize control characters to prevent terminal escape injection (#5223)

* Initial plan

* Security: Sanitize control characters in MakePrintable to prevent terminal escape injection

Fix CVE: Untrusted text containing ESC bytes (and other C0/C1 control characters)
was being emitted verbatim to the terminal, enabling terminal hijacking via
MarkdownView, Label, TextView, FileDialog, etc.

The fix strengthens MakePrintable (both string and Rune overloads) to:
- Handle multi-character graphemes containing control characters (previously
  only single-char strings were sanitized)
- Map C0 controls (U+0000-U+001F except TAB) and DEL (U+007F) to Unicode
  Control Pictures (U+2400-U+247F)
- Map C1 controls (U+0080-U+009F) to space (no standard pictures exist)
- Preserve TAB (U+0009) which is handled by higher layers

Also fixes FillRect path in OutputBufferImpl which bypassed MakePrintable
entirely.

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d29b6d3b-b419-4fa8-86d5-08fbfa0d8c47

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address code review: fix ternary formatting and test comment style

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/d29b6d3b-b419-4fa8-86d5-08fbfa0d8c47

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix TAB passthrough, restore C1 control pictures, remove per-char scan

- TAB no longer passes through raw (maps to U+2409 like all C0 controls)
- C1 controls (U+0080-U+009F) map via +U+2400 offset (distinct visuals)
- Remove per-char loop scan for multi-char graphemes: per UAX #29, controls
  are always grapheme cluster boundaries, so only first char needs checking
- Rune.MakePrintable reverted to original one-liner (all controls: +0x2400)

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/86f1970c-dfbd-4840-800c-694a7c58ee6f

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5214. Security: restrict Link.OpenUrl to safe URI schemes; replace cmd /c start with ShellExecute on Windows (#5220)

* Initial plan

* Fix: Link.OpenUrl - scheme allowlist + Windows ShellExecute instead of cmd /c start

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/8a20670d-ff32-4746-8148-c18c8662d0ce

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix: wrap Process.Start calls in try/catch in OpenUrl; log failures via Logging.Warning

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/a67fc977-19a7-41e3-97a8-74e992e2a374

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* docs: expand SafeSchemes XML docs with file:// migration path guidance

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/3dd2f7cc-01bd-4c26-b35d-48c0265cb2a8

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5215. Bound ANSI parser held content to prevent memory DoS (#5221)

* Initial plan

* Security: Bound held content in ANSI parser to prevent memory DoS

Add MaxHeldLength (8 KiB) cap to AnsiResponseParserBase that releases
held content when exceeded, preventing unbounded memory growth from
malformed/unterminated escape sequences.

Add MaxMouseSequenceLength (64) guard to AnsiMouseParser to prevent
regex evaluation against pathologically large inputs.

Add MaxKeyboardSequenceLength (64) guard to AnsiKeyboardParser to
prevent pattern evaluation against oversized inputs.

Fixes gui-cs/Terminal.Gui#5268

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/f5bd020a-34cc-4ccb-b87a-f3b2869cc291

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Address review: add model name to test file comment

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/f5bd020a-34cc-4ccb-b87a-f3b2869cc291

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5227. Make links inside markdown table cells fully interactive (#5228)

* Initial plan

* Fix links inside markdown table cells not being clickable

Add OnActivated handler and HitTestLink method to MarkdownTable that
detects clicks on link segments within table cells. Wire up table
LinkClicked events to parent Markdown.RaiseLinkClicked during layout.

Add Link Shortcut to MarkdownTester and Deepdives scenario status bars
that displays the URL when a link is clicked.

Fixes #4194

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/2964a27b-2b38-420f-9a4c-58370d56481a

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Apply guard clause pattern in table link event handler

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/2964a27b-2b38-420f-9a4c-58370d56481a

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Remove Link shortcut from status bars; update EnableForDesign with link in table and opt-in pattern

- Revert MarkdownTester and Deepdives scenario status bar changes
- Update MarkdownTable.EnableForDesign: "Markdown" feature is now a link
  to the API docs URL
- Update Markdown.EnableForDesign: opt-in to links (e.Handled = true)
- Update DefaultMarkdownSample table to include a Markdown link
- Add LinkClicked opt-in handler in MarkdownTester scenario

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/f22d1b3d-f89f-490b-b473-6d377cecf888

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Add OSC8 rendering, Tab navigation, and focus support for links in MarkdownTable

- Set Driver.CurrentUrl when drawing link segments for OSC8 hyperlink support
- Add link region tracking and Tab/Shift-Tab cycling through table links
- Make table focusable when it contains links (CanFocus/TabStop)
- Highlight active link with reversed colors when focused
- Add OnAdvancingFocus, OnHasFocusChanged, and Command.Accept handler
- Refactor link activation into RaiseLinkClicked helper

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/52a328bc-4eed-4105-99cb-c275980815ad

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Enhance Markdown sample and UI Catalog docs

Updated README to link UI Catalog to Terminal.Gui repo. Improved MarkdownTester preview layout and link handling. Expanded DefaultMarkdownSample with a TOC and richer markdown feature examples for better demonstration and testing.

* Expand [!INCLUDE] in Deepdives Markdown viewer

Added support for expanding Markdown [!INCLUDE] directives in the Deepdives scenario by fetching, caching, and substituting include files from the GitHub API. Introduced async loading of includes and updated document rendering to process includes before display.

* Fix link region dedup: track by position (row/col), not just URL

- TableLinkRegion now stores RowIndex and ColIndex for unique identification
- BuildLinkRegions deduplicates within a cell only (same URL in different cells
  creates separate navigable entries)
- IsActiveLinkAt checks position + URL so only the focused link highlights
- HitTestLinkIndex maps click position to exact link region index
- Active highlight no longer gated on absolute-URI (relative URLs and anchors
  now render reversed when focused)
- Deepdives scenario sets e.Handled=true to prevent Link.OpenUrl from firing

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/a0be0231-70d1-45f0-b871-6e2e52af36c2

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Add unit tests for Tab/Shift-Tab link navigation and Enter activation in MarkdownTable

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/188a4908-34b9-4078-b74e-4e213a039764

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix style: use explicit List<string> type instead of var

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/188a4908-34b9-4078-b74e-4e213a039764

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix anchor links in table cells not scrolling to headings

Table links with #anchor URLs now call ScrollToAnchor on the parent
MarkdownView, matching the behavior of paragraph anchor links.
Also prevent Link.OpenUrl from being called for anchor URLs (meaningless).

Added tests proving:
- Issue 1 (anchor links don't navigate): confirmed and fixed
- Issue 2 (duplicate URL dedup): confirmed false - the dedup is
  correctly scoped per-cell only; same URL in different cells creates
  separate navigable entries

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Revise security policy for supported versions (#5235)

Updated the supported versions and reporting instructions.

* Fixes #5206. Add IValue<int> support to ScrollSlider (#5229)

* Initial plan

* Add IValue<int> support to ScrollSlider

ScrollSlider now implements IValue<int> with Value as an alias for Position.
Raises ValueChanging, ValueChanged, and ValueChangedUntyped events.
Position property remains for backwards compatibility.
ScrollBar already implements IValue<int> - no changes needed.

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/63c3a7ee-d671-449a-a1e1-a912d0cf9c95

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Improve XML docs on ScrollSlider.Value property

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/63c3a7ee-d671-449a-a1e1-a912d0cf9c95

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>

* Fixes #5153. Make Markdown work like Label (#5231)

* Fixes #5153. Make Markdown forward HotKey to next peer like Label

When CanFocus is false and a valid HotKey is set, Markdown now forwards
Command.HotKey to the next peer in SuperView.SubViews — mirroring the
existing Label behavior. This lets a non-focusable Markdown view describe
a focusable peer (e.g. a TextField) and move focus there when its hotkey
is pressed, addressing the inline-clickable-link use case from #5153
without adding new markup.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Fix Markdown text-derived hotkeys

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Document Markdown.HotKeySpecifier divergence from Label

Add <remarks> noting that Markdown derives HotKey from Text (raw
markdown) rather than Title — because Markdown.Text doesn't flow
through Title the way Label.Text does.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fixes #5140. TableView: support CollectionNavigator = null to disable type-to-search (#5232)

The CollectionNavigator property doc says "Set to null to disable this feature,"
but the property type was non-nullable and CycleToNextTableEntryBeginningWith
dereferenced it without a guard, so setting it to null would NRE.

Make the property nullable and add an early-return guard in
CycleToNextTableEntryBeginningWith. With CollectionNavigator = null, printable
keys not otherwise bound now bubble through normal key handling instead of
being consumed for incremental row navigation — letting apps use single-letter
shortcuts while focus remains in the table.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: BDisp <bd.bdisp@gmail.com>

* Fixes #5126. TableView: don't raise Activating when click is outside any cell (#5233)

* Fixes #5126. TableView: don't raise Activating when click is outside any cell

Override OnActivating to cancel activation when a left-click lands in the
header area or below the last data row. Previously, ScreenToCell-returned-
null was only handled inside OnActivated, by which time the Activating event
had already fired with no real selection.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Address review: reject clicks in horizontal whitespace; expand tests

ScreenToCell maps far-right X positions onto the last rendered column (its
column lookup picks the largest X with X <= clientX, with no upper-bound
check). When ExpandLastColumn is false there is visible whitespace to the
right of the last column; without an X-bound check those clicks would still
raise Activating.

Add IsXWithinAnyRenderedColumn and apply it inside TryGetMouseCellHit so the
check runs only on the activation path; ScreenToCell's public API behavior
is unchanged.

Add tests:
- Click_RightOfLastColumn_DoesNotRaise_Activating (ExpandLastColumn=false)
- Click_OnHeader_DoesNotRaise_Activating
- Click_EmptyTable_DoesNotRaise_Activating
- Click_TableWithZeroRows_DoesNotRaise_Activating

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Fixes #5076. Allow hiding TableView outer vertical lines (#5234)

* Fixes #5076. Allow hiding TableView outer vertical lines

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update TableView test scenario for outer vertical lines

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>

* Fixes #5230 - Markdown checklist glyph rendering (#5236)

* Initial plan

* Use glyphs for markdown checklist items

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/fc4319e1-6267-4b21-ae7b-b88593a2ffa0

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Document markdown list marker translation

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/fc4319e1-6267-4b21-ae7b-b88593a2ffa0

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Clarify markdown checkbox marker alignment

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/fc4319e1-6267-4b21-ae7b-b88593a2ffa0

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Tidy markdown marker review feedback

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/fc4319e1-6267-4b21-ae7b-b88593a2ffa0

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Refine markdown checkbox marker readability

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/fc4319e1-6267-4b21-ae7b-b88593a2ffa0

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Simplify markdown marker translation helper

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/fc4319e1-6267-4b21-ae7b-b88593a2ffa0

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Use ordinal markdown marker comparisons

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/fc4319e1-6267-4b21-ae7b-b88593a2ffa0

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Complete markdown marker helper docs

Agent-Logs-Url: https://github.com/gui-cs/Terminal.Gui/sessions/fc4319e…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants