The popover/sheet split reverses — settings fold into the Git tab, the widget stacks name over branch
The titlebar widget becomes a two-line identity block: the board glyph at 22pt spanning both lines, the title over the branch (git-mode only, smaller and secondary), the em-dash retired. New Branch… returns to the switch menu behind a divider, revealing an inline name field — the pre-split shape. The board settings sheet retires whole: add-git and commit identity render inline in the Git tab's postures (BoardGitSetup.swift), the availability rule collapses into BoardGitSetupSection.resolve, and Board ▸ Board Settings… leaves the menu bar. Where 07's remote/credential setup surfaces land is deliberately left open — filed on the Redesign board. Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
@@ -57,12 +57,6 @@ struct BoardWindowHost: View {
|
||||
/// menu item through the focus system, like the store.
|
||||
@State private var boardInfo = BoardInfoPresentation()
|
||||
|
||||
/// This window's board settings sheet, open or not (03-board-ui.md § Board settings sheet).
|
||||
/// `@State` for `boardInfo`'s reason — one per window — and published the same way, because
|
||||
/// Board ▸ Board Settings… is a menu-bar item that has to reach the frontmost board window, and
|
||||
/// because the sheet is presented *on this window* and modal to it.
|
||||
@State private var boardSettings = BoardSettingsPresentation()
|
||||
|
||||
/// This window's purge alert, open or not (03-board-ui.md § Trash). `@State` for `boardInfo`'s
|
||||
/// reason and reaching the menu bar the same way: File ▸ Delete (landing on a trash selection)
|
||||
/// and Empty Trash… are menu-bar items, and a menu item cannot present anything of its own.
|
||||
@@ -229,17 +223,11 @@ struct BoardWindowHost: View {
|
||||
.onChange(of: BoardBackdrop.isCustom(store.snapshot, root: store.rootURL), initial: true) { _, custom in
|
||||
windowController.setExtendsContentUnderTitlebar(custom)
|
||||
}
|
||||
// **The board settings sheet** (03-board-ui.md ▸ Board settings sheet) — presented from
|
||||
// the board window's own content, which is what makes it modal to *this* board rather
|
||||
// than to the app: "a board-scoped, titled, sectioned sheet on the board window".
|
||||
// (**The board settings sheet was presented here** between 2026-07-31 and 2026-08-07,
|
||||
// when the popover/sheet split was reversed: the sheet retired, its contents rehomed
|
||||
// into the popover's Git tab, and this window has no modal configuration surface at all
|
||||
// now — 03-board-ui.md ▸ Board settings sheet, marked retired.)
|
||||
//
|
||||
// It hangs here rather than inside `BoardView` for the reason the popover's flag is a
|
||||
// window's: the two doors that open it are the titlebar popover's row and a menu-bar
|
||||
// item, neither of which is inside the board, and a sheet has to be presented by
|
||||
// something that outlives the surface that asked for it.
|
||||
.sheet(isPresented: $boardSettings.isPresented) {
|
||||
BoardSettingsSheet(store: store, presentation: boardSettings)
|
||||
}
|
||||
// "The board in front", for the menu items that act on it (`LaneWidthCommands`), and
|
||||
// beside it the window's own popover flag, which is what File ▸ Board Info toggles, its
|
||||
// purge-alert host, which the trash's two confirmed commands raise, and its search
|
||||
@@ -250,7 +238,6 @@ struct BoardWindowHost: View {
|
||||
// is keyed on the window rather than on the board it is showing.
|
||||
.focusedSceneValue(\.boardWindowRef, ref)
|
||||
.focusedSceneValue(\.boardInfo, boardInfo)
|
||||
.focusedSceneValue(\.boardSettings, boardSettings)
|
||||
.focusedSceneValue(\.trashConfirmations, trashConfirmations)
|
||||
// Board ▸ Open Card's second half — the same closure `BoardView` gets, so the menu item
|
||||
// and the double-click open one window per card by construction.
|
||||
@@ -742,21 +729,19 @@ struct BoardWindowHost: View {
|
||||
// **The tier is no longer passed down** (12 ▸ PIVOT 2026-08-07): git is tier-independent, so
|
||||
// every one of these surfaces reads the board's mode and nothing else. `BoardSession.tier`
|
||||
// still exists and is still recorded — it just has no git-facing consumer here.
|
||||
//
|
||||
// The settings sheet used to adopt the same fact here, so its two doors could validate on it
|
||||
// (2026-07-31 → 2026-08-07). The sheet is retired and the popover is the one configuration
|
||||
// home, so the git state is handed to exactly one surface again — this widget — and the
|
||||
// mid-session transition 06 sanctions (add-git flipping the mode) re-resolves the Git tab's
|
||||
// postures under it live, with no second reader to disagree.
|
||||
let session = appModel.session(for: ref)
|
||||
// The settings sheet's two doors validate on the same fact, so it is adopted here rather
|
||||
// than read again somewhere else: the popover's Board Settings… row and Board ▸ Board
|
||||
// Settings… must never disagree about whether this board has setup to show
|
||||
// (`BoardSettingsAvailability`). The mode *inside* the git state stays live — add-git flipping
|
||||
// it re-resolves the sheet's sections and both doors, which is the one mid-session transition
|
||||
// 06 sanctions.
|
||||
boardSettings.adopt(git: session?.git)
|
||||
windowController.installTitlebarAccessory(
|
||||
boardInfoTitlebarAccessory(
|
||||
store: store,
|
||||
recents: appModel.styleRecents,
|
||||
git: session?.git,
|
||||
presentation: boardInfo,
|
||||
settings: boardSettings
|
||||
presentation: boardInfo
|
||||
)
|
||||
)
|
||||
// The widget above now says the board's name (and, on a git-mode board, its branch)
|
||||
|
||||
Reference in New Issue
Block a user