@nynb/sandpaper 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,472 @@
1
+ @import "theme.css";
2
+ /* brain.css — Sandpaper project log book / service manual.
3
+ Identity: a shop manual, not an editorial blog. Mono leads the structure; Fraunces is reserved for the
4
+ plate title only; status colour is semantic, never decorative. Backward-compatible with the existing pages. */
5
+ /* All design tokens now live in theme.css (imported above) — the single file to re-skin a Sandpaper.
6
+ brain.css only CONSUMES them via var(), so a theme.css override propagates everywhere. */
7
+ *{box-sizing:border-box}
8
+ /* the drafting table: a gridded ground the sheet lies on */
9
+ body{margin:0;color:var(--ink);font-family:var(--sans);font-size:15.5px;line-height:1.62;
10
+ -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
11
+ background:
12
+ repeating-linear-gradient(0deg,transparent 0 39px,rgba(28,80,133,.07) 39px 40px),
13
+ repeating-linear-gradient(90deg,transparent 0 39px,rgba(28,80,133,.07) 39px 40px),
14
+ var(--paper)}
15
+ ::selection{background:var(--tint-clay-sel)}
16
+ a{color:var(--clay);text-underline-offset:3px;text-decoration-thickness:1px}
17
+ code{font-family:var(--mono);font-size:.84em;background:var(--tint-ink-code);padding:1px 5px;border-radius:var(--radius-sm)}
18
+ /* the sheet: every page is one white drawing laid on the table */
19
+ .wrap{max-width:980px;margin:0 auto 34px;padding:0 34px 8px;background:var(--white);
20
+ border:1px solid var(--rule);border-top:0;box-shadow:0 14px 34px rgba(10,20,40,.10)}
21
+ .col{max-width:760px}
22
+ .eyebrow{display:inline-flex;align-items:center;gap:7px;font-family:var(--mono);text-transform:uppercase;letter-spacing:.13em;
23
+ font-size:10.5px;color:var(--clay);font-weight:700;border:1px solid var(--rule);background:var(--white);padding:5px 10px}
24
+ .eyebrow .badge{margin-left:8px}
25
+ h1,h2,h3{font-family:var(--serif);font-weight:600;letter-spacing:-.005em;margin:0}
26
+ h1,h2.h,.phase-title{font-variation-settings:"wdth" 78;font-weight:760;letter-spacing:.002em}
27
+ h3{font-variation-settings:"wdth" 88;font-weight:700} /* the h3 tier joins the width ramp */
28
+ .muted{color:var(--mute)}
29
+ .mono{font-family:var(--mono)}
30
+
31
+ /* ---- binder-tab nav (the manual's section tabs) ---- */
32
+ .brain-nav{display:flex;flex-wrap:wrap;align-items:flex-end;gap:2px;padding:14px 0 0;font-family:var(--mono);
33
+ font-size:11.5px;letter-spacing:.04em;border-bottom:2px solid var(--ink)}
34
+ .brain-nav a{color:var(--mute);text-decoration:none;padding:7px 12px 6px;border:1px solid transparent;border-bottom:0;
35
+ border-radius:6px 6px 0 0;text-transform:uppercase}
36
+ .brain-nav a:hover{color:var(--ink);background:var(--paper-2)}
37
+ .brain-nav a.here{color:var(--paper);background:var(--ink);position:relative;top:2px}
38
+ .brain-nav .home{font-weight:600;color:var(--ink)}
39
+ .brain-nav .home.here{color:var(--paper)}
40
+ .brain-nav .grow{margin-left:auto}
41
+ .brain-nav .ext{color:var(--clay)}
42
+
43
+ /* ---- cover: dark drafting plate — the blueprint inset ---- */
44
+ .plate{margin:16px 0 14px;background:var(--plate);color:var(--paper);border-radius:var(--radius-md);padding:13px 20px;
45
+ background-image:linear-gradient(var(--tint-paper-grid) 1px,transparent 1px),linear-gradient(90deg,var(--tint-paper-grid) 1px,transparent 1px);
46
+ background-size:40px 40px}
47
+ .plate .pl-top{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap}
48
+ .brain-mark{font-family:var(--serif);font-weight:600;font-size:clamp(40px,8vw,68px);line-height:.92;letter-spacing:-.04em;color:var(--paper)}
49
+ .brain-mark .a{color:var(--clay)}
50
+ .pl-meta{font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--on-plate-meta);margin-top:0}
51
+ .pl-meta a{color:var(--on-plate-link)}
52
+ .health{display:inline-flex;align-items:center;gap:8px;font-family:var(--mono);font-size:11.5px;letter-spacing:.06em;
53
+ text-transform:uppercase;text-decoration:none;color:var(--paper);border:1px solid var(--tint-paper-border);
54
+ border-radius:999px;padding:7px 13px;white-space:nowrap}
55
+ .health:hover{border-color:var(--moss)}
56
+ .health .dot{width:9px;height:9px;border-radius:50%;background:var(--moss);box-shadow:0 0 0 3px var(--tint-moss-glow)}
57
+
58
+ /* NOW — a slim dark dateline above the canvas (no longer the hero) */
59
+ .now-line{font-family:var(--serif);font-weight:500;font-size:15.5px;line-height:1.42;color:var(--paper);margin:5px 0 0;max-width:64em}
60
+ .now-line strong{color:var(--paper);font-weight:600}
61
+ .now-line em{font-style:italic;color:var(--on-plate-em)}
62
+ .now-line a{color:var(--on-plate-link)} /* ANY link on the dark plate — --clay is unreadable there */
63
+ .now-line .ref{font-family:var(--mono);font-size:13px;color:var(--on-plate-em);white-space:nowrap}
64
+
65
+ /* ---- vitals row ---- */
66
+ .vitals{display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;margin-top:18px;font-family:var(--mono);font-size:12px}
67
+ .roadbar{display:inline-flex;gap:3px;align-items:center;text-decoration:none}
68
+ .roadbar .seg{font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:var(--mute);border:1px solid var(--rule);
69
+ border-radius:4px;padding:4px 8px;background:var(--paper-2)}
70
+ .roadbar .seg.on{background:var(--clay);color:var(--paper);border-color:var(--clay);font-weight:600}
71
+ .roadbar:hover .seg.on{background:var(--ink)}
72
+ .vital{color:var(--ink);text-decoration:none;border-bottom:1px solid var(--rule)}
73
+ .vital b{font-family:var(--serif);font-size:16px}
74
+ .vital:hover{border-color:var(--clay);color:var(--clay)}
75
+
76
+ /* ---- generic bands / sections (newspaper rhythm: a hairline rule + generous air) ---- */
77
+ .zone{padding:34px 0;border-top:1px solid var(--rule)}
78
+ .zone.flush{border-top:0;padding-top:22px}
79
+ .lens-hero + .zone{border-top:0;padding-top:22px} /* don't double a rule right under a hero card */
80
+ .band{border-top:1px solid var(--rule);padding:34px 0}
81
+ h2.h{font-size:22px;margin:0 0 4px}
82
+ h2.h .pn{font-family:var(--mono);font-size:13px;color:var(--clay);margin-right:10px;font-weight:600}
83
+
84
+ /* ---- status primitive (never colour-only) ---- */
85
+ .sdot{display:inline-block;width:9px;height:9px;border-radius:1px;background:var(--idle);margin-right:7px;vertical-align:baseline;flex:none}
86
+ .sdot.ok{background:var(--ok)} .sdot.wip{background:var(--wip)} .sdot.open{background:var(--open)} .sdot.blocked{background:var(--blocked)} .sdot.idle{background:var(--idle)}
87
+
88
+ /* ---- badges — outlined drawing labels, not tinted washes ---- */
89
+ .badge{font-family:var(--mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;font-weight:700;padding:3px 8px;
90
+ border-radius:var(--radius-sm);white-space:nowrap;background:var(--white);border:1.5px solid currentColor}
91
+ .badge.done,.badge.accepted,.badge.verified{color:var(--badge-done-ink)}
92
+ .badge.wip,.badge.fixed{color:var(--clay)}
93
+ .badge.open,.badge.soon{color:var(--badge-open-ink)}
94
+ .badge.blocked{color:var(--rust)}
95
+ .badge.stub,.badge.superseded{color:var(--mute);border-style:dashed}
96
+ /* distinct status glyphs, rendered through ONE system — identical box, size + baseline —
97
+ so they read as a family (shape = status, colour from the badge's own currentColor) */
98
+ .badge.done::before,.badge.accepted::before,.badge.verified::before,.badge.wip::before,.badge.fixed::before,.badge.open::before,.badge.soon::before,.badge.blocked::before,.badge.stub::before,.badge.superseded::before{display:inline-block;width:1.05em;margin-right:4px;text-align:center;font-size:.92em;line-height:1;vertical-align:middle;position:relative;top:-.5px}
99
+ .badge.done::before,.badge.accepted::before,.badge.verified::before{content:"✓"}
100
+ .badge.wip::before,.badge.fixed::before{content:"●"}
101
+ .badge.open::before{content:"○"}
102
+ .badge.soon::before{content:"◷"}
103
+ .badge.blocked::before{content:"▲"}
104
+ .badge.stub::before,.badge.superseded::before{content:"–"}
105
+
106
+ /* ---- progress bar (agent stamps data-done/data-total; brain.js derives the rest) ---- */
107
+ .prog{display:flex;align-items:center;gap:10px;font-family:var(--mono);font-size:11.5px;color:var(--mute)}
108
+ .prog .track{flex:1;height:7px;background:var(--paper-3);border-radius:var(--radius-sm);overflow:hidden;min-width:80px}
109
+ .prog .fill{height:100%;width:var(--pct,0%);background:var(--clay);border-radius:0;transition:width .5s ease}
110
+ .bar-mini{height:5px;background:var(--paper-3);border-radius:var(--radius-sm);overflow:hidden;width:100%}
111
+ .bar-mini i{display:block;height:100%;width:var(--pct,0%);background:var(--clay)}
112
+
113
+ /* ---- needs-you ---- */
114
+ .needs{list-style:none;margin:8px 0 0;padding:0}
115
+ .needs li{display:flex;align-items:center;gap:9px;padding:9px 0;border-bottom:1px solid var(--rule-2);font-size:14.5px}
116
+ .needs li:last-child{border-bottom:0}
117
+ .needs a.q{flex:1;color:var(--ink);text-decoration:none}
118
+ .needs a.q:hover{color:var(--clay)}
119
+ .needs .go{font-family:var(--mono);color:var(--clay);flex:none;transition:transform .15s}
120
+ .needs li:hover .go{transform:translateX(2px)}
121
+
122
+ /* ---- log timeline ---- */
123
+ .timeline{list-style:none;margin:10px 0 0;padding:0 0 0 28px;position:relative}
124
+ .timeline::before{content:"";position:absolute;left:7px;top:8px;bottom:8px;width:2px;background:var(--rule)}
125
+ .timeline li{position:relative;padding:11px 0 11px 4px;border-bottom:1px solid var(--rule-2)}
126
+ .timeline li:last-child{border-bottom:0}
127
+ /* the node sits exactly on the spine — shared centre at x=8; hollow ring = already seen */
128
+ .timeline li::before{content:"";position:absolute;left:-26px;top:15px;width:11px;height:11px;box-sizing:border-box;border-radius:1px;background:var(--white);border:2px solid var(--mute)}
129
+ /* filled ochre + ring = new since your last visit (reads with the "N NEW" badge above) */
130
+ .timeline li.unseen::before{border-color:var(--ochre);background:var(--ochre);box-shadow:0 0 0 3px var(--tint-ochre-badge)}
131
+ .tl-row{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
132
+ .tl-when{font-family:var(--mono);font-size:11px;color:var(--mute);min-width:42px}
133
+ .tl-what{font-size:14.5px;color:var(--ink);flex:1;min-width:160px}
134
+ .tl-link{font-family:var(--mono);font-size:11.5px}
135
+ .tl-day{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--mute);margin:14px 0 2px;padding-left:4px}
136
+
137
+ /* ---- status matrix ---- */
138
+ table.matrix{width:100%;border-collapse:collapse;margin-top:10px;font-size:13.5px}
139
+ .matrix th{font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--mute);text-align:left;font-weight:600;padding:8px 10px;border-bottom:1px solid var(--ink)}
140
+ .matrix td{padding:10px 10px;border-bottom:1px solid var(--rule-2);vertical-align:middle}
141
+ .matrix tr:last-child td{border-bottom:0}
142
+ .matrix td.st{white-space:nowrap;font-family:var(--mono);font-size:12px}
143
+ .matrix .nm{font-family:var(--mono);font-size:13px;color:var(--ink)}
144
+ .matrix .cov{width:120px}
145
+ @media(max-width:600px){.matrix .cov{display:none}}
146
+
147
+ /* ---- the universal .entry (records) ---- */
148
+ .entry{padding:15px 0;border-bottom:1px solid var(--rule-2)}
149
+ .entry:last-child{border-bottom:0}
150
+ .entry-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:5px}
151
+ .entry-id{font-family:var(--mono);font-size:10px;letter-spacing:.06em;background:var(--ink);color:var(--paper);padding:2px 6px;border-radius:3px}
152
+ .entry-head h3{margin:0;flex:1;min-width:0;font-size:16px}
153
+ .entry-fields > div{display:grid;grid-template-columns:92px 1fr;gap:10px;padding:3px 0}
154
+ .entry-fields dt{font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--clay)}
155
+ .entry-fields dd{margin:0;font-size:14.5px;color:var(--text)}
156
+ .entry p{font-size:14.5px;color:var(--text)}
157
+ .entry-foot{margin-top:5px}
158
+ .ref{font-family:var(--mono);font-size:12px;white-space:nowrap}
159
+ /* status spine: instant triage */
160
+ .entry--decision,.entry--component{padding-left:14px;position:relative}
161
+ .entry--decision::before,.entry--component::before{content:"";position:absolute;left:0;top:15px;bottom:15px;width:3px;border-radius:2px;background:var(--idle)}
162
+ .entry--decision[data-status="accepted"]::before,.entry--component[data-status="verified"]::before,.entry--component[data-status="built"]::before{background:var(--ok)}
163
+ .entry--decision[data-status="open"]::before{background:var(--open)}
164
+ .entry--component[data-status="wip"]::before{background:var(--wip)}
165
+ .entry--decision[data-status="superseded"]{opacity:.6}
166
+ .entry--question{padding-left:14px;position:relative}
167
+ .entry--question::before{content:"";position:absolute;left:0;top:15px;bottom:15px;width:3px;border-radius:2px;background:var(--open)}
168
+
169
+ /* worklog (legacy flat list still used on cover teaser if needed) */
170
+ .loglist{list-style:none;margin:0;padding:0}
171
+
172
+ /* glossary */
173
+ .entry--glossary{display:grid;grid-template-columns:170px 1fr;gap:14px;padding:11px 0;border-bottom:1px solid var(--rule-2)}
174
+ .g-term{font-family:var(--mono);font-weight:600;color:var(--clay)}
175
+ .g-def{margin:0;font-size:14px;color:var(--text)}
176
+ @media(max-width:600px){.entry--glossary{grid-template-columns:1fr;gap:2px}}
177
+
178
+ /* ---- callouts (semantic variants) ---- */
179
+ .callout{border:1px solid var(--rule);border-left:3px solid var(--mute);background:var(--white);padding:13px 16px;border-radius:0;margin:0 0 12px}
180
+ .callout .eyebrow{margin-bottom:3px}
181
+ .callout p{font-size:14.5px;color:var(--text);margin:5px 0 0}
182
+ .callout.gotcha{border-left-color:var(--rust)} .callout.gotcha .eyebrow{color:var(--rust)}
183
+ .callout.verdict{border-left-color:var(--pine)} .callout.verdict .eyebrow{color:var(--pine)}
184
+ .callout.note{border-left-color:var(--ochre)} .callout.note .eyebrow{color:var(--ochre)}
185
+ .callout.warn{border-left-color:var(--clay)} .callout.warn .eyebrow{color:var(--clay)}
186
+
187
+ /* ---- data tables (reused from the docs) ---- */
188
+ table.tbl{width:100%;border-collapse:collapse;margin-top:8px;font-size:13.5px}
189
+ .tbl th{font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--mute);text-align:left;font-weight:600;padding:8px 10px;border-bottom:1px solid var(--ink)}
190
+ .tbl td{padding:9px 10px;border-bottom:1px solid var(--rule-2);vertical-align:top}
191
+ .tbl tr:last-child td{border-bottom:0}
192
+ .tbl td.m{font-family:var(--mono);font-size:12px}
193
+
194
+ /* ---- ledger (two-column comparison, from the spec) ---- */
195
+ .ledger{display:grid;grid-template-columns:1fr 1px 1fr;gap:0 26px;margin-top:8px}
196
+ .ledger .rule{background:var(--rule)}
197
+ .ledger h4{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;margin:0 0 10px}
198
+ .ledger .a h4{color:var(--mute)} .ledger .b h4{color:var(--clay)}
199
+ .ledger ul{list-style:none;margin:0;padding:0}
200
+ .ledger li{padding:9px 0;border-bottom:1px solid var(--rule-2);font-size:14px}
201
+ .ledger .a li{color:var(--text-muted)} .ledger li:last-child{border-bottom:0}
202
+ @media(max-width:620px){.ledger{grid-template-columns:1fr}.ledger .rule{display:none}.ledger .b{margin-top:14px;border-top:1px solid var(--rule);padding-top:14px}}
203
+
204
+ /* ---- diagram (3-node, from the docs) ---- */
205
+ .diagram{border:1px solid var(--rule);border-radius:7px;background:var(--paper-2);padding:20px 16px;margin-top:8px;font-family:var(--mono);font-size:12px}
206
+ .diagram .row{display:flex;align-items:center;flex-wrap:wrap;gap:8px;justify-content:center}
207
+ .diagram .node{border:1px solid var(--rule);border-radius:5px;background:var(--paper);padding:9px 12px;font-weight:600}
208
+ .diagram .ar{color:var(--clay);font-weight:700}
209
+ .diagram .foundation{margin-top:12px;border:1px dashed var(--rule);border-radius:5px;padding:9px;text-align:center;color:var(--pine);background:var(--paper)}
210
+ @media(max-width:560px){.diagram .row{flex-direction:column}.diagram .ar{transform:rotate(90deg)}}
211
+
212
+ /* ---- cards ---- */
213
+ .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:11px;margin-top:8px}
214
+ .card{border:1px solid var(--rule);border-radius:var(--radius-md);padding:15px;background:var(--white);text-decoration:none;color:inherit;display:block}
215
+ .card:hover{border-color:var(--clay)}
216
+ .card .k{font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--clay)}
217
+ .card h3{margin:7px 0 3px;font-size:16px}
218
+ .card p{font-size:12.5px;color:var(--mute);margin:0}
219
+ .card--feature{grid-column:1/-1;border-left:3px solid var(--clay);background:var(--card-feature)}
220
+ .card--feature h3{font-size:19px}
221
+
222
+ /* ---- wiki: sticky toc + prose ---- */
223
+ .doc{display:grid;grid-template-columns:200px 1fr;gap:36px;margin-top:8px}
224
+ .toc{position:sticky;top:18px;align-self:start;font-family:var(--mono);font-size:12px;border-left:2px solid var(--ink);padding-left:14px}
225
+ .toc .lab{font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--mute);margin-bottom:8px}
226
+ .toc a{display:block;color:var(--ink);text-decoration:none;padding:4px 0}
227
+ .toc a:hover{color:var(--clay)}
228
+ .toc a .pn{color:var(--clay)}
229
+ .prose h2.h{margin-top:30px}
230
+ .prose p{font-size:15.5px;color:var(--text-prose);max-width:38em}
231
+ .prose .lead{font-size:18px;color:var(--text-prose)}
232
+ .deeper{font-family:var(--mono);font-size:12px;color:var(--mute);border-top:1px solid var(--rule);margin-top:20px;padding-top:10px}
233
+ @media(max-width:760px){.doc{grid-template-columns:1fr}.toc{position:static;border-left:0;border-top:2px solid var(--ink);padding:10px 0 0;display:flex;flex-wrap:wrap;gap:4px 14px}}
234
+
235
+ /* ---- search ---- */
236
+ .brain-search{margin:10px 0 0;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
237
+ #brain-q{flex:1;min-width:160px;height:34px;border:1px solid var(--rule);border-radius:var(--radius-sm);background:var(--white);padding:0 12px;font:inherit;font-size:14px}
238
+ #brain-q:focus{outline:2px solid var(--tint-clay-focus);border-color:var(--clay)}
239
+ .facet{font-family:var(--mono);font-size:11px;letter-spacing:.05em;text-transform:uppercase;border:1px solid var(--rule);background:var(--white);border-radius:var(--radius-sm);padding:4px 11px;cursor:pointer;color:var(--ink)}
240
+ .facet.on{background:var(--ink);color:var(--paper);border-color:var(--ink)}
241
+ .entry.hidden{display:none}
242
+ .searchnote{font-family:var(--mono);font-size:11px;color:var(--mute)}
243
+
244
+ /* ---- plan board: initiatives → tasks → DERIVED progress (brain.js fills the bars) ---- */
245
+ .plan-overall{display:flex;align-items:center;gap:12px;margin:6px 0 20px;font-family:var(--mono);font-size:12px;color:var(--pine)}
246
+ .plan-overall .track{flex:1;max-width:360px;height:8px;background:var(--paper-3);border-radius:var(--radius-sm);overflow:hidden}
247
+ .plan-overall .track i{display:block;height:100%;width:0;background:var(--clay);transition:width .5s ease}
248
+ .entry--initiative{padding:16px 0;border-bottom:1px solid var(--rule)}
249
+ .entry--initiative:last-child{border-bottom:0}
250
+ .ini-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
251
+ .ini-head h3{flex:1;min-width:150px;margin:0;font-size:16px}
252
+ .ini-rung{font-family:var(--mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--mute);border:1px solid var(--rule);border-radius:4px;padding:2px 6px}
253
+ .ini-bar{display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:11px;color:var(--mute)}
254
+ .ini-bar .track{width:84px;height:6px;background:var(--paper-3);border-radius:var(--radius-sm);overflow:hidden}
255
+ .ini-bar .track i{display:block;height:100%;width:0;background:var(--clay);transition:width .5s ease}
256
+ ol.tasks{list-style:none;margin:9px 0 0;padding:0 0 0 2px}
257
+ ol.tasks .task{display:flex;align-items:baseline;gap:9px;padding:5px 0;font-size:14px;color:var(--text)}
258
+ .task .t-what{flex:1}
259
+ .task[data-status="done"] .t-what{color:var(--mute);text-decoration:line-through;text-decoration-color:var(--tint-ink-strike)}
260
+ .task[data-status="done"] .sdot{background:transparent;border:1.5px solid var(--moss)} /* hollow = settled; solid green stays for live DONE badges */
261
+ .task .t-sess{font-family:var(--mono);font-size:10px;color:var(--mute);white-space:nowrap}
262
+ @media(prefers-reduced-motion:reduce){.plan-overall .track i,.ini-bar .track i{transition:none}}
263
+
264
+ /* phase grouping headers — the build organises under Phase 0 (make it work) / Phase 1 (package) */
265
+ .phase-head{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;margin:30px 0 16px;padding-bottom:11px;border-bottom:2px solid var(--ink)}
266
+ .zone > .phase-head:first-child{margin-top:0} /* no unexplained void between the filter row and the first phase */
267
+ .phase-title{display:flex;align-items:center;gap:11px;font-size:20px;letter-spacing:-.01em;margin:0}
268
+ .phase-n{font-family:var(--mono);font-size:11px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--paper);background:var(--clay);padding:4px 10px;border-radius:var(--radius-pill)}
269
+ .phase-bar{display:flex;align-items:center;gap:10px;font-family:var(--mono);font-size:11px;color:var(--mute)}
270
+ .phase-bar .track{width:140px;height:7px;background:var(--paper-3);border-radius:var(--radius-sm);overflow:hidden}
271
+ .phase-bar .track i{display:block;height:100%;width:0;background:var(--clay);transition:width .5s ease}
272
+ @media(prefers-reduced-motion:reduce){.phase-bar .track i{transition:none}}
273
+
274
+ .wrap > footer{padding:30px 0 56px;font-family:var(--mono);font-size:11px;color:var(--mute);letter-spacing:.04em;border-top:2px solid var(--ink);margin-top:26px} /* scoped: a bare `footer` leaked 56px of padding into every <footer class="board-foot"> */
275
+ @media(prefers-reduced-motion:reduce){.prog .fill{transition:none}}
276
+
277
+ /* ============================================================
278
+ PORTAL COVER (t-0005) — persistent shell, 3 lens doors (die-cut
279
+ thumb-index tabs), 3-column footer, lens-landing template.
280
+ Tokens only (theme.css var()), no hardcoded hex. file://-safe.
281
+ ============================================================ */
282
+
283
+ /* ---- persistent shell (sticky, LIGHT; replaces .brain-nav) ---- */
284
+ .shell{position:sticky;top:0;z-index:50;background:var(--white);
285
+ border-bottom:2px solid var(--ink);margin:0 -34px;padding:6px 34px 0}
286
+ .shell-id{display:flex;align-items:center;justify-content:space-between;
287
+ gap:12px 18px;flex-wrap:wrap;padding:8px 0 7px}
288
+ .shell-mark{display:inline-flex;align-items:center;gap:9px;font-family:var(--font-display);
289
+ font-variation-settings:"wdth" 72;font-weight:800;font-size:18.5px;letter-spacing:.045em;
290
+ text-transform:uppercase;line-height:1;color:var(--ink);text-decoration:none}
291
+ .shell-mark svg{flex:none}
292
+ .shell-mark .a{color:var(--clay)}
293
+ .shell-state{display:flex;align-items:center;gap:8px 14px;flex-wrap:wrap;
294
+ font-family:var(--font-mono);font-size:11px;letter-spacing:.05em;color:var(--text-muted)}
295
+ .shell-state a{color:var(--text-muted);text-decoration:none;border-bottom:1px solid transparent}
296
+ .shell-state a:hover,.shell-state a:focus-visible{color:var(--clay);border-color:var(--clay)}
297
+ .shell-health{display:inline-flex;align-items:center;gap:7px;text-transform:uppercase}
298
+ .shell-health .dot{width:8px;height:8px;border-radius:var(--radius-pill);
299
+ background:var(--moss);box-shadow:0 0 0 3px var(--tint-moss-glow)}
300
+ .shell-rail{display:flex;align-items:center;gap:2px;flex-wrap:nowrap;
301
+ overflow-x:auto;-webkit-overflow-scrolling:touch;
302
+ font-family:var(--font-mono);font-size:12px;font-weight:600;letter-spacing:.09em;text-transform:uppercase}
303
+ .shell-rail a{color:var(--text);text-decoration:none;padding:9px 13px;
304
+ white-space:nowrap;border-bottom:2px solid transparent}
305
+ .shell-rail a:hover{color:var(--clay);border-bottom-color:var(--rule)}
306
+ .shell-rail a.here{color:var(--ink);border-bottom-color:var(--clay);font-weight:700}
307
+ .shell-rail .dim{color:var(--mute);opacity:.6;padding:9px 13px;
308
+ white-space:nowrap;pointer-events:none}
309
+ @media(max-width:760px){.shell-id{padding:8px 0 6px}.shell-rail{font-size:11px}}
310
+ @media(max-width:680px){.wrap{padding:0 18px 8px;margin-bottom:16px}.shell{margin:0 -18px;padding:6px 18px 0}.canvas{margin:0 -18px;padding:20px 18px 16px}}
311
+
312
+ /* ===== CANVAS — the live working surface: Claude's distilled/elevated boards (THE HERO) =====
313
+ the working layer is a recessed drafting-table band inset into the sheet — fresh drawings
314
+ get pinned on the table; the settled books stay on plain white */
315
+ .canvas{margin:0 -34px;padding:22px 34px 20px;border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);
316
+ background:
317
+ repeating-linear-gradient(0deg,transparent 0 39px,rgba(28,80,133,.10) 39px 40px),
318
+ repeating-linear-gradient(90deg,transparent 0 39px,rgba(28,80,133,.10) 39px 40px),
319
+ var(--panel)}
320
+ .canvas-rail{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:13px}
321
+ .canvas-sub{color:var(--mute);font-weight:400;text-transform:none;letter-spacing:0}
322
+ .canvas-count{font-family:var(--font-mono);font-size:11px;color:var(--mute);flex:none}
323
+ /* the whiteboard: a white CONTAINER whose content scrolls inside it (a long board scrolls here);
324
+ everything else — this box, Earlier, the portal, the footer — is one normal page scroll.
325
+ fold-fit: brain.js measures the real offset and sets an exact max-height; min() is the JS-off fallback */
326
+ .whiteboard{background:var(--white);border:var(--hairline);border-radius:var(--radius-md);box-shadow:var(--shadow-panel);
327
+ padding:18px 22px;min-height:240px;max-height:min(56vh,600px);overflow-y:auto;overscroll-behavior:contain}
328
+ /* an out-link on a detached deploy with no source base configured — visibly inert, never a silent 404 */
329
+ .ref-detached{opacity:.5;cursor:help;text-decoration-style:dotted}
330
+ .whiteboard>.board{background:transparent;border:0;border-radius:0;box-shadow:none;padding:0}
331
+ /* a board = a sheet laid on the drafting table */
332
+ .board{background:var(--white);border:var(--hairline);border-radius:var(--radius-md);padding:18px 20px 15px;box-shadow:var(--shadow-panel)}
333
+ .board--live{border-color:var(--clay);box-shadow:0 0 0 1px var(--tint-clay-badge),var(--shadow-panel)}
334
+ .board-head{display:flex;align-items:center;gap:9px;margin-bottom:10px}
335
+ .board-dot{width:7px;height:7px;border-radius:1px;background:var(--mute);flex:none}
336
+ .board--live .board-dot{background:var(--clay);box-shadow:0 0 0 3px var(--tint-clay-badge)}
337
+ .board-title{font-family:var(--font-display);font-variation-settings:"wdth" 82;font-size:19px;font-weight:720;letter-spacing:0;margin:0;flex:1;min-width:0}
338
+ .board-when{font-family:var(--font-mono);font-size:10.5px;color:var(--mute);flex:none}
339
+ .board-body{color:var(--text);font-size:14.5px;line-height:1.6}
340
+ .board-body p{margin:0 0 10px}
341
+ .board-body p:last-child{margin-bottom:0}
342
+ .board-body strong{color:var(--ink)}
343
+ .board-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-top:13px;padding-top:10px;border-top:1px solid var(--rule-2)}
344
+ .board-tag{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;text-transform:uppercase;color:var(--mute)}
345
+ /* a self-contained flow diagram inside a board */
346
+ .pipeline{display:flex;align-items:stretch;gap:9px;margin:13px 0;flex-wrap:wrap}
347
+ .pl-node{flex:1;min-width:118px;border:var(--hairline);border-radius:var(--radius);padding:9px 12px;display:flex;flex-direction:column;gap:2px}
348
+ .pl-k{font-family:var(--font-mono);font-size:12px;font-weight:600;color:var(--ink)}
349
+ .pl-d{font-family:var(--font-mono);font-size:10.5px;color:var(--mute)}
350
+ .pl-term,.pl-brain{background:var(--panel)}
351
+ .pl-canvas{background:var(--card-feature);border-color:var(--clay)}
352
+ .pl-arrow{align-self:center;color:var(--mute);font-size:15px;flex:none}
353
+ /* a numbered step list inside a board (e.g. the handoff chain) */
354
+ .handoff{display:flex;flex-direction:column;gap:8px;margin:13px 0}
355
+ .ho-step{display:flex;gap:11px;align-items:flex-start}
356
+ .ho-n{flex:none;width:22px;height:22px;border-radius:var(--radius-sm);background:var(--ink);color:var(--paper);
357
+ font-family:var(--font-mono);font-size:11px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;margin-top:1px}
358
+ .ho-step>div b{display:block;font-size:13px;color:var(--ink)}
359
+ .ho-step>div span{display:block;font-family:var(--font-mono);font-size:11px;color:var(--mute);line-height:1.45}
360
+ /* a two-layer diagram (canvas working / brain settled) */
361
+ .layers{display:flex;flex-direction:column;gap:6px;margin:13px 0}
362
+ .layer{border:var(--hairline);border-radius:var(--radius);padding:10px 13px;display:flex;flex-direction:column;gap:2px}
363
+ .layer-k{font-family:var(--font-mono);font-size:12px;font-weight:600;color:var(--ink)}
364
+ .layer-d{font-family:var(--font-mono);font-size:11px;color:var(--mute);line-height:1.45}
365
+ .layer--canvas{background:var(--card-feature);border-color:var(--clay)}
366
+ .layer--brain{background:var(--panel)}
367
+ .layer-link{align-self:center;font-family:var(--font-mono);font-size:10.5px;color:var(--mute);letter-spacing:.04em}
368
+ /* a two-column "what goes where" split inside a board */
369
+ .split{display:flex;gap:10px;margin:13px 0;flex-wrap:wrap}
370
+ .split-col{flex:1;min-width:170px;border:var(--hairline);border-radius:var(--radius);padding:10px 13px;display:flex;flex-direction:column;gap:3px}
371
+ .split-col{background:var(--panel)}
372
+ .split-col.hot{background:var(--card-feature);border-color:var(--clay)} /* emphasis is a CLASS, not a position — mark the star fact `hot` */
373
+ .split-k{font-family:var(--font-mono);font-size:12px;font-weight:600;color:var(--ink)}
374
+ .split-d{font-family:var(--font-mono);font-size:10.5px;color:var(--mute);line-height:1.5}
375
+
376
+ /* ----- the "earlier" stack: current board stays full; older ones fold into quiet rows that reopen ----- */
377
+ .canvas-earlier{display:flex;flex-direction:column;margin-top:16px}
378
+ .earlier-label{display:flex;align-items:center;gap:9px;font-family:var(--font-mono);font-size:10px;letter-spacing:.16em;
379
+ text-transform:uppercase;color:var(--mute);margin:2px 2px 2px}
380
+ .earlier-label::before{content:"";width:14px;height:2px;background:var(--rule);border-radius:2px}
381
+ .earlier-label .n{color:var(--text-muted)}
382
+ /* collapsed = a thin index row; open = it becomes a sheet like the current board */
383
+ .board--past{background:transparent;border:0;border-top:1px solid var(--rule-2);border-radius:0;box-shadow:none;padding:0}
384
+ .board--past:first-of-type{border-top:0}
385
+ .board-row{display:flex;align-items:center;gap:11px;padding:10px 4px;cursor:pointer;list-style:none}
386
+ .board-row::-webkit-details-marker{display:none}
387
+ .board-row-dot{width:6px;height:6px;border-radius:1px;background:var(--mute);flex:none}
388
+ .board-row-when{font-family:var(--font-mono);font-size:10.5px;color:var(--mute);flex:none}
389
+ .board-row-title{font-family:var(--font-display);font-size:15px;color:var(--ink);flex:1;min-width:0;
390
+ overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
391
+ .board-row:hover .board-row-title{color:var(--clay)}
392
+ .board-row-chev{font-family:var(--font-mono);font-size:14px;color:var(--mute);transition:transform .18s ease;flex:none}
393
+ .board--past[open]{background:var(--white);border:var(--hairline);border-radius:var(--radius-md);
394
+ padding:2px 18px 14px;margin:7px 0;box-shadow:var(--shadow-panel)}
395
+ .board--past[open]>.board-row{padding-left:0;padding-right:0}
396
+ .board--past[open] .board-row-chev{transform:rotate(90deg);color:var(--clay)}
397
+ .board--past[open] .board-row-title{color:var(--ink)}
398
+ .board--past .board-body{padding-top:2px}
399
+ /* nothing on the canvas yet — a warm, plain-language welcome inside the whiteboard */
400
+ .canvas-empty{color:var(--text-muted);font-size:14.5px;line-height:1.6;max-width:48em}
401
+ .canvas-empty p{margin:0 0 8px}
402
+ .canvas-empty p:last-child{margin-bottom:0}
403
+ .canvas-empty-lead{font-family:var(--font-display);font-size:20px;color:var(--ink);letter-spacing:-.01em}
404
+ @media(max-width:620px){.pipeline{flex-direction:column}.pl-arrow{transform:rotate(90deg)}}
405
+
406
+ /* ---- the 3 lens doors (navigation, below the canvas) ---- */
407
+ .doors{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:26px}
408
+ .door{position:relative;display:flex;flex-direction:column;gap:9px;min-height:188px;
409
+ background:var(--panel);border:var(--hairline);border-radius:var(--radius-md);
410
+ padding:26px 18px 16px;text-decoration:none;color:var(--ink);
411
+ transition:transform .16s ease,border-color .16s ease,box-shadow .16s ease}
412
+ .door:hover{transform:translateY(-2px);border-color:var(--lens);box-shadow:var(--shadow-panel)}
413
+ .door:focus-visible{outline:2px solid var(--tint-clay-focus);outline-offset:2px}
414
+ .door--on{box-shadow:inset 3px 0 0 var(--lens)}
415
+ .door--product{--lens:var(--ochre)}
416
+ .door--engineering{--lens:var(--pine)}
417
+ .door--project{--lens:var(--clay)}
418
+ /* THE DIE-CUT THUMB-INDEX TAB — the signature */
419
+ .door .tab{position:absolute;top:-1px;left:18px;transform:translateY(-46%);
420
+ background:var(--panel);color:var(--mute);
421
+ font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.14em;
422
+ text-transform:uppercase;padding:5px 12px 6px;
423
+ clip-path:polygon(0 0,100% 0,calc(100% - 9px) 100%,9px 100%)}
424
+ .door--product .tab{background:var(--ochre);color:var(--ink)}
425
+ .door--engineering .tab{background:var(--pine);color:var(--paper)}
426
+ .door--project .tab{background:var(--clay);color:var(--paper)}
427
+ .door-desc{font-family:var(--font-mono);font-size:11.5px;line-height:1.5;color:var(--text-muted)}
428
+ .door-stat{display:flex;align-items:center;gap:7px;flex-wrap:wrap;
429
+ font-family:var(--font-mono);font-size:13px;color:var(--ink)}
430
+ .door-stat b{font-family:var(--font-display);font-size:17px;font-weight:600;letter-spacing:-.01em}
431
+ .door-stat-sub{color:var(--mute);font-size:11.5px}
432
+ .door .bar-mini{margin-top:2px}
433
+ .door-latest{font-family:var(--font-mono);font-size:11px;color:var(--mute)}
434
+ .door-go{margin-top:auto;font-family:var(--font-mono);font-size:11.5px;
435
+ letter-spacing:.04em;color:var(--lens)}
436
+ .door:hover .door-go{text-decoration:underline}
437
+ @media(max-width:760px){.doors{grid-template-columns:1fr}}
438
+ @media(prefers-reduced-motion:reduce){.door{transition:none}.door:hover{transform:none}}
439
+
440
+ /* ---- 3-column portal footer (replaces the one-liner + BROWSE) ---- */
441
+ .portal-foot{display:grid;grid-template-columns:1fr 1fr 1.1fr;gap:20px 26px;
442
+ border-top:2px solid var(--ink);margin-top:26px;padding:24px 0 56px;
443
+ font-family:var(--font-mono);font-size:11px;letter-spacing:.04em;color:var(--mute)}
444
+ .portal-foot .foot-h{display:flex;align-items:center;gap:8px;font-size:11px;letter-spacing:.14em;text-transform:uppercase;
445
+ color:var(--ink);font-weight:600;margin-bottom:10px}
446
+ .portal-foot .foot-h::before{content:"";width:14px;height:2px;background:var(--clay);border-radius:2px;flex:none} /* same clay "kicker" rule as section labels */
447
+ .portal-foot a{display:block;color:var(--text);text-decoration:none;padding:2.5px 0}
448
+ .portal-foot a:hover{color:var(--clay)}
449
+ .portal-foot a.ext{color:var(--clay)}
450
+ .portal-foot .dim{display:block;opacity:.6;padding:2.5px 0}
451
+ .portal-foot .foot-meta{margin-top:10px;line-height:1.6;color:var(--mute)}
452
+ @media(max-width:600px){.portal-foot{grid-template-columns:1fr;gap:18px}}
453
+
454
+ /* the NOW "dateline" pill — a clay anchor on the dark plate (matches the Project door tab) */
455
+ .now-tag{display:inline-block;font-family:var(--font-mono);font-size:10px;font-weight:600;letter-spacing:.16em;
456
+ text-transform:uppercase;color:var(--on-plate-em);background:transparent;border:1px solid rgba(255,154,139,.5);
457
+ padding:2px 8px;border-radius:var(--radius-sm);margin-right:5px;vertical-align:baseline} /* one grammar with the landing's NOW chip */
458
+
459
+ /* ---- lens-landing template (product/ · engineering/) ---- */
460
+ .lens--product{--lens:var(--ochre)}
461
+ .lens--engineering{--lens:var(--pine)}
462
+ .lens--project{--lens:var(--clay)}
463
+ .lens-hero{border:var(--hairline);border-left:3px solid var(--lens);
464
+ border-radius:var(--radius-md);background:var(--white);
465
+ padding:20px 22px;margin-top:18px}
466
+ .lens-hero .eyebrow{color:var(--lens)}
467
+ .lens-hero h1{font-family:var(--font-display);font-size:30px;letter-spacing:-.02em;
468
+ margin:6px 0 6px;line-height:1.12}
469
+ .lens-hero p{font-size:15.5px;color:var(--text-prose);max-width:42em;margin:0}
470
+ .lens-views{margin-top:4px}
471
+
472
+ /* (cover-tight retired — the plate now breathes; the class is harmless if still present) */