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:
@@ -87,17 +87,17 @@ extension BoardStore {
|
||||
/// > enabled menu key equivalent fires before the field ever sees the key, and ⌘←/⌘→ are the
|
||||
/// > standard line-start/end caret chords.
|
||||
///
|
||||
/// Five text surfaces, answered four ways, and only three of them are here:
|
||||
/// Four text surfaces, answered three ways, and only two of them are here:
|
||||
///
|
||||
/// - **Inline title editors** are `acceptsBoardMutations`', through the focused-editor rule — a
|
||||
/// broader lockdown that already covers these two items.
|
||||
/// - **The board popover's fields** are covered by disabling while the popover is open at all —
|
||||
/// coarser than per-field focus, but it is a configuration surface (04's carve-out) and no lane
|
||||
/// move belongs under it.
|
||||
/// - **The board settings sheet's fields** are the popover's rule for the popover's reason, and the
|
||||
/// surface the 2026-07-31 split moved most of those fields *to* (branch name, commit identity, and
|
||||
/// pro-m2's remote URL and credentials): the sheet is the other half of 04's configuration
|
||||
/// carve-out, and a lane move under a modal settings surface is not a gesture that exists.
|
||||
/// move belongs under it. That clause covers **every** configuration field the app has again since
|
||||
/// 2026-08-07: the 2026-07-31 split moved most of them to a board settings sheet, whose flag this
|
||||
/// function read as a third disjunct, and the reversal brought them back — branch creation, commit
|
||||
/// identity, and pro-m2's remote URL and credentials all live in the popover's Git tab, under the
|
||||
/// popover's own open-at-all rule.
|
||||
/// - **The search field** is per-focus and exact (`BoardSearchPresentation.isFocused`), which it has
|
||||
/// to be: the field's own rule is that board commands *stay enabled* while it holds the keyboard
|
||||
/// (04 § Search), so these two are the narrow exception to it and nothing coarser would do.
|
||||
@@ -109,12 +109,9 @@ extension BoardStore {
|
||||
@MainActor
|
||||
func caretChordsYield(
|
||||
boardInfo: BoardInfoPresentation?,
|
||||
boardSettings: BoardSettingsPresentation?,
|
||||
search: BoardSearchPresentation?
|
||||
) -> Bool {
|
||||
boardInfo?.isPresented == true
|
||||
|| boardSettings?.isPresented == true
|
||||
|| search?.isFocused == true
|
||||
boardInfo?.isPresented == true || search?.isFocused == true
|
||||
}
|
||||
|
||||
// MARK: - Open Card
|
||||
@@ -286,13 +283,12 @@ struct MoveCardCommands: View {
|
||||
/// **Caret chords yield to any focused text control** (04-interactions.md ▸ Grammar, settled):
|
||||
/// ⌘←/⌘→ are the standard line-start/end chords, and an enabled key equivalent fires before a
|
||||
/// field ever sees the key. Which surfaces that covers, and how each is answered, is
|
||||
/// `caretChordsYield(boardInfo:boardSettings:search:)`'s doc comment — shared verbatim with the
|
||||
/// `caretChordsYield(boardInfo:search:)`'s doc comment — shared verbatim with the
|
||||
/// width pair below.
|
||||
struct MoveLaneCommands: View {
|
||||
|
||||
@FocusedValue(\.boardStore) private var store
|
||||
@FocusedValue(\.boardInfo) private var boardInfo
|
||||
@FocusedValue(\.boardSettings) private var boardSettings
|
||||
@FocusedValue(\.boardSearch) private var search
|
||||
|
||||
var body: some View {
|
||||
@@ -310,7 +306,7 @@ struct MoveLaneCommands: View {
|
||||
}
|
||||
|
||||
private var yieldsCaretChords: Bool {
|
||||
caretChordsYield(boardInfo: boardInfo, boardSettings: boardSettings, search: search)
|
||||
caretChordsYield(boardInfo: boardInfo, search: search)
|
||||
}
|
||||
|
||||
/// The sole selected live lane and the display slot one step would put it in — `nil` when there
|
||||
@@ -427,52 +423,6 @@ struct BoardInfoCommand: View {
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Board Settings
|
||||
|
||||
/// Board ▸ Board Settings… — no default chord (11-command-nexus.md: "— (no default)"), and the board
|
||||
/// settings sheet's second door, the popover's row being the first (03-board-ui.md ▸ Board settings
|
||||
/// sheet).
|
||||
///
|
||||
/// **"Remappable" asks nothing of this file.** The remapping mechanism is macOS's own — System
|
||||
/// Settings ▸ Keyboard ▸ App Shortcuts, keyed on the menu item's *title* (04-interactions.md ▸
|
||||
/// Configurable bindings) — so all a chordless row owes it is a stable title, which the Nexus fixes.
|
||||
/// A `Button` with no `keyboardShortcut` is therefore the whole implementation, exactly as File ▸
|
||||
/// Save as Template and Board ▸ Rename are.
|
||||
///
|
||||
/// ### It opens; it never toggles
|
||||
///
|
||||
/// Board Info ⌘I toggles because a popover reached by a chord would otherwise have no keyboard way
|
||||
/// out. A sheet has one built in (Done, and Escape through it), and the menu is behind the sheet
|
||||
/// while it is up — so a toggling row would be a second exit nobody can reach.
|
||||
///
|
||||
/// ### Validation: scope, then reachability — and never the lock
|
||||
///
|
||||
/// The row stays **visible and disabled** where the sheet cannot exist (`BoardSettingsAvailability`,
|
||||
/// which carries the reasoning): a board nested inside someone else's repository, one whose ancestor
|
||||
/// check was denied, and one whose own repository will not open. That is standard menu validation,
|
||||
/// and it is the deliberate asymmetry with the popover row, which is *absent* there instead — a menu
|
||||
/// is an inventory of the app, a popover section is a description of this board.
|
||||
///
|
||||
/// **The free tier used to be the fourth of those**, and is not since 12-editions.md ▸ PIVOT
|
||||
/// 2026-08-07: git is tier-independent, so what this row validates on is the board in front of the
|
||||
/// user and nothing about their subscription.
|
||||
///
|
||||
/// The read-only lock does not close it, for Board Info's reason: a settings sheet is *configuration*
|
||||
/// (04-interactions.md ▸ The map's carve-out), a locked board is exactly when a user may want to read
|
||||
/// its git setup, and the controls inside disable themselves in place (03 ▸ Board settings sheet).
|
||||
struct BoardSettingsCommand: View {
|
||||
|
||||
@FocusedValue(\.boardStore) private var store
|
||||
@FocusedValue(\.boardSettings) private var presentation
|
||||
|
||||
var body: some View {
|
||||
Button("Board Settings…") {
|
||||
presentation?.present()
|
||||
}
|
||||
.disabled(store == nil || presentation?.isReachable != true)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Rename
|
||||
|
||||
/// Board ▸ Rename — no default chord, deliberately (11-command-nexus.md: "— (cards: Return in
|
||||
@@ -549,7 +499,6 @@ struct LaneWidthCommands: View {
|
||||
|
||||
@FocusedValue(\.boardStore) private var store
|
||||
@FocusedValue(\.boardInfo) private var boardInfo
|
||||
@FocusedValue(\.boardSettings) private var boardSettings
|
||||
@FocusedValue(\.boardSearch) private var search
|
||||
|
||||
var body: some View {
|
||||
@@ -567,7 +516,7 @@ struct LaneWidthCommands: View {
|
||||
}
|
||||
|
||||
private var yieldsCaretChords: Bool {
|
||||
caretChordsYield(boardInfo: boardInfo, boardSettings: boardSettings, search: search)
|
||||
caretChordsYield(boardInfo: boardInfo, search: search)
|
||||
}
|
||||
|
||||
/// The selected live lanes, in snapshot order — the batch, and the items' validation.
|
||||
|
||||
Reference in New Issue
Block a user