Since #834 the desktop app renders markdown through MarkView.Avalonia, whose links are inline MarkdownHyperlink spans inside a text block rather than focusable controls. MarkdownView forwards the viewer's pointer-driven LinkClicked event to the tab's open-link command, and that is the only activation path: Tab never reaches a link, and Enter or Space activates nothing. This affects chat messages (assistant and user turns, system notes) and the pull request reader's description and comment bodies.
The previous renderer represented allowed links as HyperlinkButtons, which were focusable and pinned by a keyboard-activation test, at the cost of a baseline-alignment workaround to keep a button inside the line.
Accepted as a known gap when #834 was reviewed. Candidate fixes, each its own design:
- Cycle links with the arrow keys when the viewer has focus and open the current one on Enter, drawing a focus ring on the hyperlink's text bounds.
- Render allowed links as focusable inline controls again, bringing back the in-line baseline handling.
Whichever path is taken, the link policy must stay where it is: a link exists only where LinkPolicy would open it, and activation goes through the tab's command, never a self-navigating control.
Since #834 the desktop app renders markdown through MarkView.Avalonia, whose links are inline
MarkdownHyperlinkspans inside a text block rather than focusable controls.MarkdownViewforwards the viewer's pointer-drivenLinkClickedevent to the tab's open-link command, and that is the only activation path: Tab never reaches a link, and Enter or Space activates nothing. This affects chat messages (assistant and user turns, system notes) and the pull request reader's description and comment bodies.The previous renderer represented allowed links as
HyperlinkButtons, which were focusable and pinned by a keyboard-activation test, at the cost of a baseline-alignment workaround to keep a button inside the line.Accepted as a known gap when #834 was reviewed. Candidate fixes, each its own design:
Whichever path is taken, the link policy must stay where it is: a link exists only where
LinkPolicywould open it, and activation goes through the tab's command, never a self-navigating control.