Build the styling system and shared style editor

One style-editor component, anchor-agnostic: a background grid (None
well plus the 12 palette colors) and a curated symbol grid (the
pathfinder's five-dozen set, leading well removing the icon key for
the level default), selection-aware across cards, lanes, and the
board itself. Batch edits compute per-dimension state — uniform,
mixed (no well selected), or an off-palette value labeled verbatim
outside the grids — and choosing a well applies to the whole target
set as one write bracket, skipping no-ops per field. The popover
tracks its target set live per the freshly ratified rule: targets
re-resolve by UUID on every reload, a vanished target leaves the set,
an emptied set dismisses the editor, and nothing ever silently
retargets to the board. Anchors landing now: Board > Style
(Opt-Cmd-S) and the card/lane context menus, which also carry the
quick-style recents row (app-wide, persisted, capped at six, None
never recorded) and the lane's width control twinning the menu
chords. The styling system's other two renders arrive with it: a
lane's background paints the C7 top-edge band, the board's paints
the window content background — malformed values paint nothing and
stay byte-identical on disk. 31 new tests.

Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
2026-07-27 14:47:26 -04:00
parent bea6d02d1d
commit c6298c2e41
15 changed files with 1943 additions and 13 deletions
+3 -2
View File
@@ -121,12 +121,13 @@ struct KanbanApp: App {
.keyboardShortcut("o", modifiers: .command)
}
// The Board menu (11-command-nexus.md), in its inventoried order Rename precedes the
// width pair, with Open Card, Style and the Move items still owed. Its items act on the
// The Board menu (11-command-nexus.md), in its inventoried order Rename, then Style,
// then the width pair, with Open Card and the Move items still owed. Its items act on the
// frontmost board window, which they reach through the focus system rather than through the
// app model see `BoardCommands.swift`, which also owns their validation.
CommandMenu("Board") {
BoardRenameCommand()
BoardStyleCommand()
Divider()