The combo drops its padding and turns portrait — a 4:5 field puts the symbol dead center
Owner's first review of the combo rework (2026-08-09): remove the face padding, make the field taller and narrower at about a 4:5 width:height ratio, and center the symbol glyph in its face. All three land in ComboFieldMetrics, so ColorComboControl and SymbolComboControl stay the identical shape they were built to share. - ComboFieldMetrics grows a width figure (height * widthToHeightRatio, 0.8), replacing NSView.noIntrinsicMetric — every combo now carries its own taller, narrower intrinsic size instead of stretching to whatever a caller's frame proposed. - facePaddingH/facePaddingV/glyphPadding are gone; a face fills its zone edge to edge. glyphPointSize is now whichever of the face's own width/height is smaller, with nothing subtracted for padding that no longer exists. - SymbolComboControl.drawFace centers the glyph on both axes — it only ever centered vertically before, despite its own doc comment claiming otherwise. - ComboFieldControl.drawTrigger bounds its chevron square by the smaller of the trigger strip's own width/height, not height alone, since the strip is no longer close to square once the field is much taller than it is wide. - CardSidebarSections drops the sidebar's old '* 0.55' fixed-width frame on both combo rows; each control now sizes itself, and both anchors (card sidebar, board popover) compose the narrower field with no other changes needed. - ComboFieldMetricsTests updated for the new figures, plus a ratio-holds-at-every-size test and a rewritten glyph-fit test matching the no-padding rule. Verification: xcodebuild build succeeded; xcodebuild test -only-testing:KanbanTests — 3220 tests in 559 suites, 3 failures, all PointerLatencyTests (documented locked-screen environmental mode, confirmed unrelated by isolated rerun). Pixel verification unexercised — same locked-screen constraint the first pass hit. Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
@@ -108,8 +108,12 @@ struct CardStyleSection: View {
|
||||
/// The labeled **Background** row, above the well grid — a narrower, single-value alternative
|
||||
/// to it (`ColorCombo.swift`'s own doc comment): an inspector row, caption leading and a
|
||||
/// compact combo trailing, the arrangement every Xcode inspector uses for exactly this control.
|
||||
/// The combo takes just over half the row rather than filling it — sized off the same metric
|
||||
/// the sidebar's own width comes from, so the pair holds its proportions at every text size.
|
||||
///
|
||||
/// **No explicit width since 2026-08-09** — the combo used to be stretched to just over half the
|
||||
/// row (`CardWindowMetrics.sidebarContentWidth(...) * 0.55`), which was the wide-bar shape the
|
||||
/// owner's iteration undid. `ComboFieldMetrics` now carries its own taller, narrower intrinsic
|
||||
/// width, so the row hands the combo no frame at all and lets it size itself; the leading
|
||||
/// `Spacer(minLength: 8)` still pins it to the row's trailing edge.
|
||||
private var backgroundComboRow: some View {
|
||||
HStack(spacing: 0) {
|
||||
Text("Background")
|
||||
@@ -123,7 +127,6 @@ struct CardStyleSection: View {
|
||||
onChange: { commitBackground($0) },
|
||||
onPanelChange: { debounceBackground($0) }
|
||||
)
|
||||
.frame(width: CardWindowMetrics.sidebarContentWidth(bodyPointSize: pointSize) * 0.55)
|
||||
}
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
}
|
||||
@@ -175,14 +178,14 @@ struct CardStyleSection: View {
|
||||
// MARK: - Symbol
|
||||
|
||||
/// The labeled **Symbol** row, below the background combo — `backgroundComboRow`'s own
|
||||
/// inspector-row shape, restated: caption leading, the combo trailing, **at the same width**.
|
||||
/// inspector-row shape, restated: caption leading, the combo trailing, **at the same size**.
|
||||
///
|
||||
/// That width used to be the difference between the two rows. The picker was a 20pt bordered
|
||||
/// That size used to be the difference between the two rows. The picker was a 20pt bordered
|
||||
/// square with one hit zone sitting under a wide two-zone colour combo, and this is the sidebar
|
||||
/// where the mismatch was most visible — two adjacent rows setting two adjacent keys, looking
|
||||
/// like different kinds of control. Since the 2026-08-09 rework `SymbolPicker` *is* a combo
|
||||
/// (`ComboField.swift`), so the row hands it the identical `* 0.55` frame and the pair reads as
|
||||
/// one inspector.
|
||||
/// (`ComboField.swift`), so the two rows need no frame of their own to agree — both controls read
|
||||
/// their geometry off the identical `ComboFieldMetrics`, `backgroundComboRow`'s own note.
|
||||
private var symbolRow: some View {
|
||||
HStack(spacing: 0) {
|
||||
Text("Symbol")
|
||||
@@ -197,7 +200,6 @@ struct CardStyleSection: View {
|
||||
currentColor: currentIconColor,
|
||||
onSelectColor: { applyIconColor($0) }
|
||||
)
|
||||
.frame(width: CardWindowMetrics.sidebarContentWidth(bodyPointSize: pointSize) * 0.55)
|
||||
// The same lock `StyleEditorView`'s whole body disabled under
|
||||
// (`.disabled(!store.acceptsBoardMutations)`, `StyleEditor.swift`) — the read-only lock
|
||||
// and the board's inline-editing rule alike, preserved exactly across the control swap
|
||||
|
||||
Reference in New Issue
Block a user