The Background tab becomes Theme — solid colors or patterns, presets only, chevron-paged

Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
2026-08-07 18:03:06 -04:00
parent fb96e30df0
commit 3d231d6454
10 changed files with 895 additions and 440 deletions
+24 -20
View File
@@ -5,14 +5,15 @@ import SwiftUI
/// widget in the window's titlebar that opens it.
///
/// **Restructuring in progress (2026-08-07): the popover is going tabbed.** The symbol/name header
/// stays at the top; below it sit three tabs **Info**, **Background**, **Git** each a settings
/// stays at the top; below it sit three tabs **Info**, **Theme**, **Git** each a settings
/// surface for one aspect of board configuration, each settled in its own dedicated design session.
/// **Info and Background are settled** (both 2026-08-07 `BoardInfoTabView`, the metrics dossier;
/// `BoardBackgroundTabView`, the re-homed style editor plus the generated-background picker); Git
/// remains deliberately empty until its own session. The former body's mode-aware git section is
/// unrendered for the interim but parked in this file (see the "Parked" mark below), because its
/// pure seams (`BoardGitSection`, the posture notes, `BoardSettingsAvailability`'s caller) are
/// settled design and will rehome into the Git tab once that session rules.
/// **Info and Theme are settled** (both 2026-08-07 `BoardInfoTabView`, the metrics dossier;
/// `BoardThemeTabView`, the Solid color / Pattern picker the Background tab's original name, before
/// the same session widened it past the generated-only picker and folded manual styling back out to
/// Style S); Git remains deliberately empty until its own session. The former body's mode-aware
/// git section is unrendered for the interim but parked in this file (see the "Parked" mark below),
/// because its pure seams (`BoardGitSection`, the posture notes, `BoardSettingsAvailability`'s
/// caller) are settled design and will rehome into the Git tab once that session rules.
///
/// ### One home, deliberately
///
@@ -257,13 +258,13 @@ func boardInfoTitlebarAccessory(
// MARK: - Tabs
/// The popover's three aspects, one tab each (03-board-ui.md § Board popover, the 2026-08-07 tab
/// restructure): **Info**, **Background**, **Git**. Info and Background are settled
/// (`BoardInfoTabView`, `BoardBackgroundTabView`); Git is a placeholder empty on purpose until
/// restructure): **Info**, **Theme**, **Git**. Info and Theme are settled
/// (`BoardInfoTabView`, `BoardThemeTabView`); Git is a placeholder empty on purpose until
/// its own dedicated design session, which then only has to fill its case in.
enum BoardInfoTab: String, CaseIterable, Identifiable {
case info = "Info"
case background = "Background"
case theme = "Theme"
case git = "Git"
var id: Self { self }
@@ -276,7 +277,7 @@ enum BoardInfoTab: String, CaseIterable, Identifiable {
///
/// Width is the style editor's the number that keeps the Style popover narrow enough to sit
/// beside a card kept through the restructure so the popover's footprint doesn't wander while Git
/// is still a placeholder; both tabs settled so far (Info, Background) kept it too, so whether the
/// is still a placeholder; both tabs settled so far (Info, Theme) kept it too, so whether the
/// tabbed surface ever wants its own width remains open, but nothing has needed one yet.
struct BoardInfoView: View {
@@ -375,16 +376,16 @@ struct BoardInfoView: View {
.padding(.horizontal, inset)
.padding(.top, inset)
// The selected tab's surface. Info and Background are settled (2026-08-07
// `BoardInfoTabView`, `BoardBackgroundTabView`); Git stays a placeholder until its own
// The selected tab's surface. Info and Theme are settled (2026-08-07
// `BoardInfoTabView`, `BoardThemeTabView`); Git stays a placeholder until its own
// session, holding a fixed height so an empty tab reads as a surface awaiting content
// rather than a collapsed sliver `Color.clear`, because an `EmptyView` inside a frame
// renders nothing at all.
switch tab {
case .info:
BoardInfoTabView(store: store, inset: inset)
case .background:
BoardBackgroundTabView(store: store, recents: recents, inset: inset)
case .theme:
BoardThemeTabView(store: store, inset: inset)
case .git:
Color.clear.frame(height: 120)
}
@@ -397,11 +398,14 @@ struct BoardInfoView: View {
// MARK: Parked pending the Git tab session (2026-08-07)
//
// Nothing below this mark renders today. The style-editor embed that once lived here has
// rehomed to `BoardBackgroundTabView`; what is left is the git section postures, notes, and
// the Board Settings row waiting for the Git tab's own session. Parked rather than deleted
// because every seam it hangs on is settled, test-pinned design (`BoardGitSectionTests`,
// `BoardSettingsAvailabilityTests`), and the tab sessions rehome surfaces, not rulings.
// Nothing below this mark renders today. The style-editor embed that once lived here briefly
// rehomed to `BoardThemeTabView` and has since moved back out of the popover entirely manual
// board styling is reachable through Style S, and the Theme tab's Solid color / Pattern picker
// covers the same ground its "Board" background grid did. What is left below is the git section
// postures, notes, and the Board Settings row waiting for the Git tab's own session. Parked
// rather than deleted because every seam it hangs on is settled, test-pinned design
// (`BoardGitSectionTests`, `BoardSettingsAvailabilityTests`), and the tab sessions rehome
// surfaces, not rulings.
/// The popover's closing section, whichever of the six postures this board is in see
/// `BoardGitSection`.