Remove the lane header's "+" new-card control

The lane header no longer draws a new-card button. Every other
creation path is untouched: File > New Card (Cmd-N), Return on a
selected lane, and double-click on lane empty space.

- LaneView: drop the button and its overlay slot, leaving the
  collapse chevron as the header's one piece of trailing chrome.
- NewCardTarget: drop the button's click-names-target carve-out over
  the Cmd-N target rule (Return on a selected lane is now the only
  direct-target path left).
- AccessibilityPhrases: drop the button's spoken label.
- BoardMetrics: drop its width reserve; laneHeaderTrailingReserve now
  reduces to the collapse chevron's own reserve.
- DESIGN/03, 04, 10, 11: update the lane title-bar inventory, the
  Cmd-N override clause and search-clearing mechanism list, the
  accessibility tree-shape sentence, and the pointer-grammar row that
  described the button.
- Tests: drop the two pinned accessibility-label tests and the
  newCardButtonReserve assertions; retarget the truncation-headroom
  test at the now-solo laneHeaderTrailingReserve; fix stale doc-quote
  comments and the manual accessibility-verification checklist.

Full KanbanTests suite: 2807 tests, 482 suites, all passing.

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-08 23:28:05 -04:00
parent b09c4bd5c0
commit eb950ee881
16 changed files with 76 additions and 126 deletions
+3 -10
View File
@@ -8,7 +8,7 @@ import Foundation
/// ### Why the strings live here and not at the modifiers
///
/// 10-accessibility.md states the board's tree as *sentences*: a lane container is
/// "title, lane, N cards", the header button is "New card in lane", a card's value carries its
/// "title, lane, N cards", its collapse chevron is "Collapse lane", a card's value carries its
/// attachment count and, when it is cut-pending, "cut, pending paste". Those are rules about text
/// which placeholder an untitled item wears, how a count folds its plural, what order two value
/// fragments join in and a rule about text is only checkable if there is a function to ask. Split
@@ -100,16 +100,9 @@ enum AccessibilityPhrases {
return "\(displayTitle(title)), lane, \(state)\(cardCount(count))"
}
/// The lane header's new-card button "New card in lane", the one labeled child
/// 10-accessibility.md gives the header.
static func newCardLabel(lane title: String?) -> String {
"New card in \(displayTitle(title))"
}
/// The lane header's **collapse chevron** "Collapse lane" (03-board-ui.md § Lane Collapsed
/// lanes), the header's second labeled child and the new-card button's twin in every respect: a
/// glyph-only control needs a word, and the word names the lane so the label stands on its own out
/// of context.
/// lanes), the header's one labeled child: a glyph-only control needs a word, and the word names
/// the lane so the label stands on its own out of context.
static func collapseLaneLabel(lane title: String?) -> String {
"Collapse \(displayTitle(title))"
}