The combo's trigger retires — each picker is one rectangle again, taller, and Style becomes Appearance in the sidebar

Both the symbol picker and the background color control give up the two-zone combo chrome from the 2026-08-09 rework: no more face/trigger split, no more trailing chevron square. Each is now a single bordered rectangle with one hit zone, 2.1em tall and 1.5x that wide (a 4:6 ratio, 50% taller than the retired chrome's 18pt). A click anywhere opens the same curated popover the trigger used to gate.

The background rectangle's popover is new: a None-plus-sixteen palette grid mirroring the Style… popover's own wells, with an Other… row onto the shared, pre-debounced Colors panel session — replacing the old NSMenu dropdown outright. The symbol rectangle keeps its existing popover (search, curated grid, tint colors, More Symbols…) verbatim; only its entry point collapsed to one zone.

ComboFieldControl/ComboFieldMetrics (ComboField.swift) are replaced by PickerRectControl/PickerRectMetrics (PickerRect.swift). ColorComboView and its NSMenu-building pure model are retired wholesale in favor of ColorSwatchPicker. SymbolComboControl becomes SymbolGlyphControl. PaletteSwatch.rectImage, the last caller of which was the retired dropdown's menu rows, goes with it.

In the card window sidebar, the "Style" section header becomes "Appearance" (sidebar only — the board context menu's Style… item and StyleEditorView's own naming are untouched), and the symbol and background controls move from stacked rows to side-by-side columns, each captioned above rather than leading. CardStyleSection no longer carries its own debounce Task for background panel picks — the shared Colors-panel session now delivers an already-settled value.

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-09 20:44:47 -04:00
parent 01aa9a0c94
commit 4210bbe0a7
17 changed files with 964 additions and 1321 deletions
+10 -8
View File
@@ -341,10 +341,10 @@ struct StyleEditorView: View {
var showsSymbols: Bool = true
/// Whether the background section appears at all. On everywhere but the card window sidebar,
/// where the labeled `ColorComboView` row is the background story (03 Styling Controls,
/// the 2026-08-06 anchor-ownership rule): the sidebar is the narrow context the combo was
/// built for, and grid-plus-combo over one value read as two settings `showsSymbols`'
/// reasoning, pointed the other way.
/// where the captioned `ColorSwatchPicker` column is the background story (03 Styling
/// Controls, the 2026-08-06 anchor-ownership rule): the sidebar is the narrow context that
/// rectangle was built for, and grid-plus-rectangle over one value read as two settings
/// `showsSymbols`' reasoning, pointed the other way.
var showsBackground: Bool = true
/// The live body metric, read here rather than passed in `CardStyleSection`'s pattern, so
@@ -404,10 +404,12 @@ struct StyleEditorView: View {
/// BackgroundField.swift's original "there is no image picker and none is planned").
///
/// **"Palette-only in-app" is the sentence that changed**, and it changed before this card:
/// `ColorComboView` shipped an **Other** row of its own, so the card window's sidebar could
/// already write an arbitrary hex while the Style popover the *primary* styling surface
/// could not. This closes that gap rather than opening a new one. Seventeen wells at seven
/// columns is three rows where the old twelve made two, which is the other half of the same change.
/// the card sidebar's background control shipped an **Other** row of its own, so the card
/// window's sidebar could already write an arbitrary hex while the Style popover the
/// *primary* styling surface could not. This closes that gap rather than opening a new one.
/// Seventeen wells at seven columns is three rows where the old twelve made two, which is the
/// other half of the same change and, since 2026-08-10, the same 7-wide fit `ColorSwatchPicker`
/// reuses for its own popover grid.
///
/// **Choose Image is absent, not disabled, off the board.** `background.image` is a board-root
/// field alone a lane or a card has a colour well and nothing else to point an image subkey at