The app learns Appearance — Auto, Light, Dark from the View menu and a toolbar pull-down

View ▸ Appearance (11-command-nexus.md): three radio-exclusive rows,
app-wide, persisted, needing no window in front — the View menu's new
last group. AppearanceStore owns the override's rules (absent key =
Auto, lenient reads degrade to Auto, remove-at-default) with an
injectable apply seam so test hosts never touch NSApp; the one real
apply hands NSApp.appearance its answer in applicationDidFinishLaunching,
the global side effect KanbanApp.init must not carry. The board toolbar
gains its first .picker item — an NSMenuToolbarItem whose rows re-fetch
their spec fresh, checkmark read at menu-open like every other menu row —
and Appearance joins the search field as the second default item,
centered beside it (03-board-ui.md ▸ Toolbar, ratified 2026-08-07).

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-07 12:55:45 -04:00
parent c686242a14
commit b0ffff1aa1
14 changed files with 579 additions and 36 deletions
+7 -2
View File
@@ -240,9 +240,10 @@ struct KanbanApp: App {
ToolbarCommands()
// The View menu. `CommandGroupPlacement.toolbar` *is* View the menu the toolbar's own
// items live in which is where 11-command-nexus.md files Show Trash. Two dividers split it
// items live in which is where 11-command-nexus.md files Show Trash. Three dividers split it
// by scope, which is the only grouping the inventory implies: the board's toggle, then the
// board's zoom ladder, then the card window's view-state rows.
// board's zoom ladder, then the card window's view-state rows, then the app-wide appearance
// override last, because unlike everything above it, it needs no window in front at all.
//
// "Zoom In" / "Zoom Out" / "Actual Size" rather than a single "Zoom": the system's own Window
// menu already carries a row titled Zoom, and titles are the remapping mechanism's key, so a
@@ -257,6 +258,10 @@ struct KanbanApp: App {
Divider()
CardViewCommands()
Divider()
AppearanceCommands(appModel: appModel)
}
// The Board menu (11-command-nexus.md), complete and in its inventoried row order Open