Build the board popover — title widget, rename, styling, git slot

The window-title widget arrives as a leading titlebar accessory — a
quiet chevron on board windows only, installed and removed by the
window controller's own attach lifecycle — anchoring the one
board-level surface as a transient popover (the board window
deliberately grows no toolbar item for it). Inside: board rename
editing frontmatter title only (the folder is never renamed; an empty
commit removes the key and the window title falls back to the folder
name), the embedded shared style editor permanently targeting the
board, and the labeled Git section that this milestone only reserves
— a mode-none explanation and a disabled stub where m7's add-git,
branch, remote, and authentication controls land. Cmd-I (File >
Board Info) toggles it per window through a focused scene value,
kept apart from board-scoped transient state since a titlebar
popover belongs to one window, not to the board. Escape reverts a
dirty rename field and falls through to dismiss otherwise; a foreign
rename resyncs the field only while unfocused. 12 new tests.

Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
2026-07-27 15:08:06 -04:00
parent c6298c2e41
commit aa6aaf2a11
8 changed files with 745 additions and 11 deletions
+7 -2
View File
@@ -108,8 +108,9 @@ struct KanbanApp: App {
@CommandsBuilder
private var menuCommands: some Commands {
// The File group, in 11-command-nexus.md's own row order: New Card, New Lane, (New Board,
// still owed), Open. The creation pair validates against the frontmost board through the
// focus system, so both are simply absent-of-effect when no board is in front.
// still owed), Open, (Open Recent, still owed), Board Info. The creation pair and Board
// Info all validate against the frontmost board through the focus system, so each is simply
// absent-of-effect when no board is in front.
CommandGroup(after: .newItem) {
BoardCreationCommands()
@@ -119,6 +120,10 @@ struct KanbanApp: App {
appModel.presentOpenPanel()
}
.keyboardShortcut("o", modifiers: .command)
Divider()
BoardInfoCommand()
}
// The Board menu (11-command-nexus.md), in its inventoried order Rename, then Style,