The strip grows a Sync tab — a standing placeholder, nothing in it yet

BoardInfoTab gains .sync last in the strip, rendering BoardSyncTabView's one
honest caption. The tab claims the position where 07's remote half will
live without ruling where its setup surfaces land — that stays the open
Redesign card's question.

Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
2026-08-07 22:00:19 -04:00
parent 7414fc8400
commit c67c1037f1
4 changed files with 56 additions and 15 deletions
+15 -8
View File
@@ -313,15 +313,19 @@ func boardInfoTitlebarAccessory(
// MARK: - Tabs
/// The popover's three aspects, one tab each (03-board-ui.md § Board popover, the 2026-08-07 tab
/// restructure all three sessions settled): **Info** (`BoardInfoTabView`), **Theme**
/// (`BoardThemeTabView`), **Git** (`BoardGitTabView`). The raw values are the segmented control's own
/// labels, so the strip needs no separate label function.
/// The popover's aspects, one tab each (03-board-ui.md § Board popover, the 2026-08-07 tab
/// restructure all three original sessions settled): **Info** (`BoardInfoTabView`), **Theme**
/// (`BoardThemeTabView`), **Git** (`BoardGitTabView`) and **Sync** (`BoardSyncTabView`), added
/// 2026-08-07 as a standing placeholder: the strip claims the position now, the surface says
/// honestly that nothing lives there yet, and 07-sync-collab.md's cards are where its contents get
/// ruled. The raw values are the segmented control's own labels, so the strip needs no separate
/// label function.
enum BoardInfoTab: String, CaseIterable, Identifiable {
case info = "Info"
case theme = "Theme"
case git = "Git"
case sync = "Sync"
var id: Self { self }
@@ -334,7 +338,7 @@ enum BoardInfoTab: String, CaseIterable, Identifiable {
// absent posture is unreachable and every board carries all three tabs. The membership rule
// stands structurally the strip still asks the posture it just never hears 'absent'
// anymore." So there is no `available()` filter here to ask it with: membership is `allCases`,
// in `allCases`' own order (Info, Theme, Git), which is what the filter answered anyway.
// in `allCases`' own order (Info, Theme, Git, Sync), which is what the filter answered anyway.
}
// MARK: - The popover's content
@@ -424,7 +428,7 @@ struct BoardInfoView: View {
// the control's accessibility name. It iterates `allCases` the strip's membership is
// still the board's git posture in principle (the Git session's ruling), and since
// 12-editions.md PIVOT 2026-08-07 that posture is never "absent", so every board
// carries all three tabs (03-board-ui.md Board popover, the same-day pivot note).
// carries the whole strip (03-board-ui.md Board popover, the same-day pivot note).
Picker("Board configuration", selection: $tab) {
ForEach(BoardInfoTab.allCases) { tab in
Text(tab.rawValue)
@@ -435,8 +439,9 @@ struct BoardInfoView: View {
.padding(.horizontal, inset)
.padding(.top, inset)
// The selected tab's surface all three settled 2026-08-07, each in its own dedicated
// session and its own file. Each pads itself by `inset`, so the switch adds nothing.
// The selected tab's surface the first three settled 2026-08-07, each in its own
// dedicated session and its own file; Sync is that day's standing placeholder. Each pads
// itself by `inset`, so the switch adds nothing.
switch tab {
case .info:
BoardInfoTabView(store: store, inset: inset)
@@ -444,6 +449,8 @@ struct BoardInfoView: View {
BoardThemeTabView(store: store, inset: inset)
case .git:
BoardGitTabView(store: store, git: git, inset: inset)
case .sync:
BoardSyncTabView(inset: inset)
}
}
// The style editor's popover width, taken from the editor rather than restated the number