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:
@@ -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
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
import SwiftUI
|
||||
|
||||
/// **The board popover's Sync tab — a standing placeholder** (03-board-ui.md § Board popover,
|
||||
/// added 2026-08-07, the same night the settings sheet retired).
|
||||
///
|
||||
/// The tab exists ahead of its contents, deliberately: the strip claims the position where the
|
||||
/// remote half of the git story will live — tracking, Pull/Push, the status badges, and whatever
|
||||
/// home the setup surfaces (remote, credentials, SSH) are ruled into — so that when
|
||||
/// 07-sync-collab.md's cards land they land *in* a surface rather than re-arguing the strip. None
|
||||
/// of that is ruled by this file: the open question is the Redesign board's
|
||||
/// ("Rule a home for 07's remote and credential setup surfaces"), and a placeholder that decided it
|
||||
/// by accident would be the worst way to answer it.
|
||||
///
|
||||
/// What renders meanwhile is one honest sentence in the posture notes' register
|
||||
/// (`BoardGitTabView`'s siblings): the fact, stated plainly — never a mock control, never a
|
||||
/// greyed-out preview of features that do not exist (06-history-undo.md ▸ Rules: teach, never look
|
||||
/// broken).
|
||||
struct BoardSyncTabView: View {
|
||||
|
||||
/// The popover's own padding figure (`BoardInfoView.inset`), matching every other tab's
|
||||
/// parameter — the tab pads by this amount instead of restating the derivation.
|
||||
let inset: CGFloat
|
||||
|
||||
var body: some View {
|
||||
Text("Nothing here yet.")
|
||||
.font(.caption)
|
||||
.foregroundStyle(.secondary)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
.padding(inset)
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user