1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
//! The workspace tab-bar view-model (DESIGN §11 altitude 0, §15 Z9).
//!
//! Workspaces are regime walls — almost invisible: one tab per **named**
//! workspace under the top right, pinned first (in pin order), then name
//! order. Foreign and replay workspaces are real but not regimes, so they
//! live behind the overflow menu rather than widening the wall row; pinning
//! hoists one into the tabs. Pure over injected facts; the shell paints the
//! [`TabBar`] and the `new` name form beside it.
//!
//! **It folds an answer; it derives nothing** (REMOTE §9.7 class 2, bl-296f).
//! The bar is built out of [`WsRow`] — the `Query::Workspaces` reply, which has
//! carried the §6 rollups since bl-6233 and the §4.1 pin *rank* since this ball
//! — so the altitude-0 chrome is `nav::convs::visible`'s own shape one surface
//! over: the derivation is the boundary's, the ordering and the folding are the
//! seat's. It is the shape bl-7407 named as the one thing left between this bar
//! and the wire, and the reason it was refused until now was the join it would
//! have cost: painting off a reply while resolving each name back through the
//! engine's own table is two sources for one fact. Nothing here resolves
//! anything — a row arrives named, classified, counted and ranked.
use crateWorkspaceKind;
use crateWsRow;
/// The §6 attention-strip total (§11 altitude 0): attention-bearing agents
/// across every workspace, summed off the **same answer** the bar beside it is
/// built from — one standing question, two surfaces, and no chance of a strip
/// that counts a workspace the tabs do not show.
/// Which of the §3.1 kinds a tab stands for — [`WorkspaceKind`] without its
/// payload (the tab's `name` already carries the minted name). **One field, not
/// a pair of `named`/`replay` bools**: bools admit a state that cannot exist and
/// no match over them is exhaustive, which is exactly what the §11 badge-seat
/// pattern forbids. The §3.6 delete seat reads it too (yog may not delete what
/// it did not place, and the tab menu is pointer-targeted, so the fact rides the
/// tab rather than the focus).
/// One tab or overflow entry (§11): the workspace **name** — the operator's own
/// name, or the auto-id leaf for foreign/replay, which §3.1 makes the identity
/// either way — its attention count, whether it is the focused workspace,
/// whether it is pinned (hoisted), and which §3.1 [`Kind`] it is.
///
/// **It carries no path** (REMOTE §9.7 class 2, bl-7407). The name is what a
/// click hands back to the focus, what a gesture addresses and what a reply
/// would spell, so a tab that also carried a path would be a second source for
/// one fact the moment these rows come off the wire. The two doors that need a
/// path resolve at the click: the focus ([`AppModel::focus_workspace`]) and
/// the pin key ([`AppModel::toggle_pin`], which resolves it).
/// The full derived tab bar (§11): the wall-row `tabs` (pinned hoists + named
/// workspaces) and the `overflow` menu entries (**every** foreign + replay
/// workspace, pinned or not).
/// Build the §11 tab bar: pinned first (pin order), then named workspaces
/// (name order); foreign and replay entries into the overflow (path order — the
/// enumeration's derived order, I9). `focused` marks selection.
///
/// **A pinned foreign/replay entry appears in both** (bl-7e32): pinning changes
/// where an entry *also* appears, never where it lives, so the overflow keeps
/// listing it with `pinned` set — that is what makes the menu's ★ the visible
/// pin/unpin toggle and the tab's context-menu unpin a mere accelerator (§11
/// context-menu doctrine, which a menu-only unpin violated).
/// **A stale pin dissolves rather than being dropped** (bl-296f): a key naming
/// no enumerated workspace ranks no row, so there is nothing here to skip.
/// Project one answered row to a [`Tab`]. The name is the row's own — §3.1's
/// leaf, minted once at the boundary ([`crate::naming::leaf`]) and shared with
/// the addressing every gesture uses, so a tab and a gesture cannot disagree
/// about what this workspace is called.