Summary
Leafdown's four hand-built interactive surfaces — the command menu bar, the custom titlebar, the editor context popup, and the article navigator — are not fully operable by keyboard, and several expose incorrect or missing semantics to assistive technology. This issue tracks bringing all four to a state where every control is reachable, operable, and correctly announced.
They form one piece of work because they share a documentation plan, a set of files that more than one of them modifies, and a single group-level verification pass. Each remains independently actionable and delivers value on its own.
Scope
- Included:
- The command menu bar (
CommandMenuBar.tsx) and its host in Shell.tsx
- The custom titlebar (
TitleBar.tsx) and the window controls injected by tauri-plugin-frame
- The editor context popup (
EditorContextPopup.tsx) and the ProseMirror plugin that drives it
- The article navigator (
ArticleNavigator.tsx) and the shared VirtualList it renders through
- Out of scope:
- Radix primitives in
src/components/ui/, except where a wrapper breaks behavior Radix otherwise provides
- Color contrast and the
App.css color tokens
- A stated WCAG conformance target, automated accessibility checks in CI, or a screen reader test matrix
Shared decisions
- Accessibility documentation is integrated into the existing documents rather than a new
docs/accessibility.md. Key bindings and semantics stay in the files that already own them — decisions.md, specification.md, architecture.md, patterns.md, and reference.md. A dedicated document would only earn its place alongside a conformance story, which is out of scope here.
- Visible focus is a general rule, not a per-surface fix. The rule landing in
patterns.md applies to any control introduced by the later sub-issues, including the article navigator's rewritten rows.
Sequencing
Genuine dependency:
Shared files with no hard ordering, to coordinate rather than serialize:
Recommended ordering, not a constraint: #118 → #119 → #120 → #121. #118 is pure presentation and tab order with no dependencies. #121 is the largest and the most conflict-prone.
Related context
- Prior investigation or origin: a read-only accessibility review of the four hand-built interactive surfaces. Focus and tab-order findings were verified in a running build; the remainder were verified against application and dependency sources.
- Related issues or pull requests outside this group: none.
Done when
Notes
Summary
Leafdown's four hand-built interactive surfaces — the command menu bar, the custom titlebar, the editor context popup, and the article navigator — are not fully operable by keyboard, and several expose incorrect or missing semantics to assistive technology. This issue tracks bringing all four to a state where every control is reachable, operable, and correctly announced.
They form one piece of work because they share a documentation plan, a set of files that more than one of them modifies, and a single group-level verification pass. Each remains independently actionable and delivers value on its own.
Scope
CommandMenuBar.tsx) and its host inShell.tsxTitleBar.tsx) and the window controls injected bytauri-plugin-frameEditorContextPopup.tsx) and the ProseMirror plugin that drives itArticleNavigator.tsx) and the sharedVirtualListit renders throughsrc/components/ui/, except where a wrapper breaks behavior Radix otherwise providesApp.csscolor tokensShared decisions
docs/accessibility.md. Key bindings and semantics stay in the files that already own them —decisions.md,specification.md,architecture.md,patterns.md, andreference.md. A dedicated document would only earn its place alongside a conformance story, which is out of scope here.patterns.mdapplies to any control introduced by the later sub-issues, including the article navigator's rewritten rows.Sequencing
Genuine dependency:
VirtualList.tsx— Keyboard focus is invisible or misplaced across hand-built chrome #118 adjusts the containment that clips row focus rings, Article navigator is not keyboard traversable and exposes no hierarchy #121 rewrites the component for the tree pattern.Shared files with no hard ordering, to coordinate rather than serialize:
decisions.md— written by Keyboard focus is invisible or misplaced across hand-built chrome #118 and Article navigator is not keyboard traversable and exposes no hierarchy #121patterns.md— written by Keyboard focus is invisible or misplaced across hand-built chrome #118 and Article navigator is not keyboard traversable and exposes no hierarchy #121specification.md— written by Editor context popup cannot be reached or operated by keyboard #120 and Article navigator is not keyboard traversable and exposes no hierarchy #121Recommended ordering, not a constraint: #118 → #119 → #120 → #121. #118 is pure presentation and tab order with no dependencies. #121 is the largest and the most conflict-prone.
Related context
Done when
Notes