The whole board-name area opens the popover — the chevron alone was the trigger

The titlebar widget grows from a 20×18 chevron into one button saying
the board's name and, on a git-mode Pro board, its branch — click
anywhere across it and the popover opens as before, anchored to the
widget. BoardInfoTitlebarSummary is the pure seam for both strings
(title falls back to the folder name per 01's naming rule; branch only
under pro + git mode, live off the observable HistoryStore.branch).
Board windows now hide the system title display through the same
hideTitle slot card windows adopted — the widget says the name, so the
chrome would only repeat it — while navigationTitle keeps feeding
window.title to the Window menu, Exposé, VoiceOver and restoration.

The widget also refreshes the branch eagerly at appearance: it used to
populate only once the popover had been opened, which would have left
the new branch line empty on a freshly opened board.

Claude-Session: https://claude.ai/code/session_01CqjXB7ASoWtbyoGod68k97
This commit is contained in:
2026-08-01 08:28:53 -04:00
parent 6f2e0d15da
commit 94e60cd444
6 changed files with 253 additions and 34 deletions
+7
View File
@@ -300,6 +300,13 @@ struct BoardWindowHost: View {
presentation: boardInfo
)
)
// The widget above now says the board's name (and, on a git-mode Pro board, its branch)
// itself, so the system title display would only repeat it the card-window seam
// (`CardWindowHost.configureWindow`, `HostedWindowController.hideTitle`), applied here for
// the same reason. `.navigationTitle(windowTitle)` a few lines up in `body` is untouched
// `window.title` keeps feeding the Window menu, Exposé, VoiceOver and restoration; only the
// title bar's own rendering of that string is suppressed.
windowController.hideTitle()
// The board's customizable toolbar (03-board-ui.md Toolbar) installed here for the
// accessory's reason exactly: it carries the store, and it is a board window's, not every
+4 -2
View File
@@ -857,8 +857,10 @@ struct CardWindowHost: View {
// on this view still sets it every time the card renames or a new card's window opens so
// the Window menu, Mission Control/Exposé, VoiceOver and state restoration all keep naming
// this window correctly; only the title *bar's* rendering of that string is suppressed
// (`HostedWindowController.hideTitle`). Board windows call no such thing and keep AppKit's
// default (`.visible`), which is where their title lives.
// (`HostedWindowController.hideTitle`). Board windows call the same thing now, for the same
// reason, once their board-popover widget has a name of its own to say
// (`BoardWindowHost.configureWindow`) only the restore-bootstrap window still keeps
// AppKit's `.visible` default.
windowController.hideTitle()
// **This window's own stack** (13-native-undo.md Rules two levels, re-ruled 2026-07-31
+12 -8
View File
@@ -91,12 +91,14 @@ final class HostedWindowController: NSObject, NSWindowDelegate {
/// their board has loaded.
private var toolbarController: WindowToolbarController?
/// Whether this window's title is hidden from the title bar **card windows only**
/// (05-card-window.md Window: the card's name is shown as part of the card's body, not the
/// chrome). `nil` leaves AppKit's own default (`.visible`) untouched, which is what every board
/// window keeps without a call of its own the same "nothing to do" posture `titlebarAccessory`
/// has on welcome, the bootstrap and card windows, mirrored here for the one window kind that
/// *does* have an opinion.
/// Whether this window's title is hidden from the title bar **card and board windows**: the
/// card's name is shown as part of the card's body instead of the chrome (05-card-window.md
/// Window), and the board's is said by the board-popover widget in the titlebar instead
/// (03-board-ui.md Board popover; `BoardWindowHost.configureWindow`). `nil` leaves AppKit's own
/// default (`.visible`) untouched the restore-bootstrap window's posture, the one
/// `HostedWindowController`-hosted window with no opinion here, the same "nothing to do" posture
/// `titlebarAccessory` has on welcome (which never attaches a controller at all), the bootstrap
/// window, and now for that slot specifically card windows too.
///
/// A slot, not a one-shot write, for the accessory and toolbar's own reason: the value has to
/// survive the provisional-window swap (`detach()`'s doc comment) and reapply itself when the
@@ -212,8 +214,10 @@ final class HostedWindowController: NSObject, NSWindowDelegate {
// MARK: Title visibility
/// Hides this window's title from the title bar, leaving the toolbar exactly as it renders today
/// the card-window seam (`CardWindowHost`, 05-card-window.md Window). `window.title` is
/// untouched by this call on purpose; see the property's doc comment for why.
/// the card-window seam (`CardWindowHost`, 05-card-window.md Window) and, since the
/// board-popover widget grew to say the board's name itself, the board-window one too
/// (`BoardWindowHost`, 03-board-ui.md Board popover). `window.title` is untouched by this call
/// on purpose; see the property's doc comment for why.
///
/// Safe to call whenever the caller learns it wants this before the window exists (the value is
/// held and applied at `attach`) or after (applied immediately) and safe to call more than once,