Comments, phase 3 — search, the thread find, announcements, and a11y
Board search reaches comment bodies through a search-owned transient
index: the first live-query keystroke sweeps comments/*/index.md
off-actor (.draft and comments/.trash excluded), keystrokes re-filter
in memory, the index discards on clear — the snapshot stays O(cards).
⌘F routes by focus: the comments pane gets an app-owned find bar
spanning the whole rendered thread (next/prev cross rows with
wraparound); body and composer keep NSTextFinder; Find Next/Previous
graduate from FutureCommands. Foreign comment changes speak
path-shaped beside the announcer's ladder ("New comment on 'X'",
plural folds), narrowed by EchoLedger receipts consumed through
CommentPath.classify — and that read fixed a latent footprint bug
where a comment receipt resolved against the card's attachment
listing, read .absent, and classified the user's own write as
foreign. The pane completes its a11y story: flattened comment
elements with Edit/Delete/Reveal custom actions (un-flattening
during inline edit), phrase-table vocabulary, labeled composer and
sort control, and an audit over the open pane on a comment-seeded
fixture (runnable only where automation permission exists).
Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
@@ -125,6 +125,28 @@ final class AccessibilityAuditTests: XCTestCase {
|
||||
try app.performAccessibilityAudit()
|
||||
}
|
||||
|
||||
/// **The comments pane**, over the fixture's seeded thread (10-accessibility.md ▸ Comments: the
|
||||
/// labeled container, the flattened comment elements with their three custom actions, the labeled
|
||||
/// composer and the Tab-reachable sort control).
|
||||
///
|
||||
/// The pane is on screen already — View ▸ Show Comments is one persisted app-wide bit and its
|
||||
/// shipped default is on (05-card-window.md ▸ The comments column) — so this test's navigation is
|
||||
/// the card window's, plus a wait on the container's own label to prove the pane rendered rather
|
||||
/// than auditing a body column that happened to be alone.
|
||||
///
|
||||
/// The thread is three comments, one of them unattributed and one edited (`UITestLaunch`), which
|
||||
/// is what makes this an audit of the *rows* rather than of an empty invitation.
|
||||
@MainActor
|
||||
func testCardWindowCommentsPane() throws {
|
||||
let app = XCUIApplication.launchedWithFixtureBoard()
|
||||
try app.openRichCardWindow()
|
||||
XCTAssertTrue(
|
||||
app.element(labeled: Phrase.comments(3)).waitForExistence(timeout: XCUIApplication.uiTimeout),
|
||||
"the comments pane did not appear"
|
||||
)
|
||||
try app.performAccessibilityAudit()
|
||||
}
|
||||
|
||||
// MARK: - Welcome, the template chooser, the board popover
|
||||
|
||||
/// The welcome window, reached by its own Window-menu row — and reached *after* the fixture board
|
||||
|
||||
Reference in New Issue
Block a user