@kontourai/survey 1.11.0 → 1.13.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.
@@ -1,79 +1,63 @@
1
- /* Survey Review Workbench — "forensic review console" aesthetic.
2
- Reviewers judge whether a proposed value should overwrite a verified one;
3
- the visual language is built to highlight the value diff, the decision, the
4
- confidence, and the provenance — in that order. */
5
-
6
- @import url("https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,600;9..144,700;9..144,900&family=Hanken+Grotesk:wght@400;500;600;700;800&family=IBM+Plex+Mono:wght@400;500;600&display=swap");
1
+ /* Survey Review Workbench — field-diff review UI.
2
+ Reviewers judge, field by field, whether a proposed value should replace a
3
+ current one. The visual language leads with the value diff, then confidence,
4
+ then provenance, then the decision — plain language on the primary surface,
5
+ audit/trace detail tucked behind one collapsed <details> per field.
6
+
7
+ Token contract: every color/radius/shadow/font below resolves through --k-*
8
+ custom properties so a host app can re-skin the whole surface by overriding
9
+ tokens alone (see the "Theming" section of docs/consumer-integration-guide.md).
10
+ The aliases declared here (--k-muted, --k-raised, --k-sunken, --k-brand-ink,
11
+ --k-brand-wash, --k-positive-wash, --k-caution-wash, --k-negative-wash,
12
+ --k-radius) derive from Survey's existing --k-text-muted / --k-panel-raised /
13
+ --k-brand-contrast / --k-*-soft / --k-radius-md tokens so overriding the base
14
+ token a host already knows about re-skins these too — a host can also override
15
+ any alias directly for finer control. */
7
16
 
8
17
  :root {
9
18
  color-scheme: dark;
10
19
 
11
- /* Local aliases preserve the existing workbench selectors while the values
12
- come from the shared Console Kit token contract. */
13
- --ink-1000: var(--k-bg);
14
- --ink-900: color-mix(in srgb, var(--k-bg) 60%, var(--k-panel));
15
- --ink-850: color-mix(in srgb, var(--k-bg) 40%, var(--k-panel));
16
- --ink-800: var(--k-panel);
17
- --ink-750: var(--k-panel-raised);
18
- --ink-700: color-mix(in srgb, var(--k-panel-raised) 80%, var(--k-line-strong));
19
- --paper: var(--k-text);
20
- --paper-dim: var(--k-text-muted);
21
- --paper-faint: var(--k-text-faint);
22
- --line: var(--k-line);
23
- --line-strong: var(--k-line-strong);
24
- --accent: var(--k-brand);
25
- --accent-deep: color-mix(in srgb, var(--k-brand) 34%, var(--k-bg));
26
- --proposed: var(--k-active);
27
- --verify: var(--k-positive);
28
- --hold: var(--k-caution);
29
- --reject: var(--k-negative);
30
- --radius: var(--k-radius-md);
31
- --radius-sm: var(--k-radius-sm);
32
-
33
- /* Panel surface alpha — stronger contrast in light mode, subtle in dark */
34
- --surface-alpha: 0.55;
35
- /* Overlay tint alpha for brand-coloured gradient overlays */
36
- --overlay-alpha: 0.10;
37
- /* Grain overlay: visible dark only, 0 in light */
38
- --grain-opacity: 0.04;
39
- /* VS marker bg */
40
- --vs-bg: var(--ink-750);
20
+ --k-muted: var(--k-text-muted);
21
+ --k-faint: var(--k-text-faint);
22
+ --k-raised: var(--k-panel-raised);
23
+ --k-sunken: color-mix(in srgb, var(--k-bg) 55%, var(--k-panel) 45%);
24
+ --k-brand-ink: var(--k-brand-contrast);
25
+ --k-brand-wash: color-mix(in srgb, var(--k-brand) 14%, transparent);
26
+ --k-positive-wash: var(--k-positive-soft, color-mix(in srgb, var(--k-positive) 14%, transparent));
27
+ --k-caution-wash: var(--k-caution-soft, color-mix(in srgb, var(--k-caution) 14%, transparent));
28
+ --k-negative-wash: var(--k-negative-soft, color-mix(in srgb, var(--k-negative) 14%, transparent));
29
+ --k-radius: var(--k-radius-md);
41
30
 
42
31
  font-family: var(--k-font-ui);
43
- background: var(--ink-1000);
44
- color: var(--paper);
45
- }
46
-
47
- /* ---- Light mode token overrides --------------------------------------- */
48
- /* The token sheet already flips --k-bg/panel/text etc. for [data-theme="light"].
49
- Here we tune the workbench-specific overlay and surface alphas so the
50
- grain/gradient overlays are invisible in light mode, and panel surfaces
51
- have enough contrast without the dark alpha tricks. */
32
+ background: var(--k-bg);
33
+ color: var(--k-text);
34
+ }
35
+
36
+ /* Re-assert the base structural tokens for light mode. themes.css's `.theme-*`
37
+ preset classes hardcode a dark --k-bg/--k-panel/etc (so the preset "just
38
+ works" without requiring [data-theme] to be set), and a bare class selector
39
+ ties with the `[data-theme="light"]` selector in tokens.css on specificity —
40
+ so source order decides, and themes.css loads after tokens.css. Re-declaring
41
+ the light values here (loaded after themes.css) wins that tie-break. Presets
42
+ still control --k-brand (and theme-console's fuller palette) via their own,
43
+ more specific `[data-theme="light"].theme-*` rules in themes.css. */
52
44
  [data-theme="light"] {
53
45
  color-scheme: light;
54
- /* Structural tokens: override .theme-survey which hardcodes dark values.
55
- These match the [data-theme="light"] block in tokens.css. */
56
46
  --k-bg: #f5f4ef;
57
47
  --k-panel: #ffffff;
58
48
  --k-panel-raised: #fbfaf7;
59
49
  --k-line: rgba(36, 40, 46, 0.12);
60
50
  --k-line-strong: rgba(36, 40, 46, 0.20);
51
+ --k-shadow: 0 18px 50px -30px rgba(0, 0, 0, 0.25);
61
52
  --k-text: #202124;
62
53
  --k-text-muted: #5b626b;
63
54
  --k-text-faint: #707782;
55
+ --k-brand-contrast: #ffffff;
64
56
  --k-positive: #168257;
65
57
  --k-caution: #8a5a00;
66
58
  --k-negative: #c83b3b;
59
+ --k-neutral: #5f6975;
67
60
  --k-active: #3f6fd6;
68
- /* Workbench-specific overlay and surface alphas */
69
- --grain-opacity: 0;
70
- --overlay-alpha: 0.06;
71
- --surface-alpha: 0.70;
72
- --vs-bg: var(--ink-750);
73
- /* In light mode the brand accent is remapped by themes.css — ensure the
74
- ink aliases derive cleanly from the token bg/panel values. */
75
- --ink-900: color-mix(in srgb, var(--k-bg) 60%, var(--k-panel));
76
- --ink-850: color-mix(in srgb, var(--k-bg) 40%, var(--k-panel));
77
61
  }
78
62
 
79
63
  * {
@@ -83,30 +67,21 @@
83
67
  body {
84
68
  margin: 0;
85
69
  min-width: 320px;
86
- position: relative;
87
- background:
88
- radial-gradient(1100px 620px at 12% -8%, color-mix(in srgb, var(--k-brand) 10%, transparent), transparent 60%),
89
- radial-gradient(900px 560px at 100% 0%, color-mix(in srgb, var(--k-active) 10%, transparent), transparent 55%),
90
- radial-gradient(800px 800px at 88% 110%, color-mix(in srgb, var(--k-caution) 7%, transparent), transparent 60%),
91
- linear-gradient(180deg, var(--ink-1000), var(--ink-900) 55%, var(--ink-1000));
92
- background-attachment: fixed;
93
70
  }
94
71
 
95
- /* Grain + faint engineering grid for control-room atmosphere.
96
- Grain opacity is 0 in light mode via --grain-opacity. */
97
- body::before {
98
- content: "";
99
- position: fixed;
100
- inset: 0;
101
- z-index: 0;
102
- pointer-events: none;
103
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.55'/%3E%3C/svg%3E");
104
- opacity: var(--grain-opacity);
105
- mix-blend-mode: screen;
72
+ button,
73
+ textarea,
74
+ input {
75
+ font: inherit;
76
+ color: inherit;
106
77
  }
107
78
 
108
- /* ---- Demo page chrome -------------------------------------------------- */
109
- /* Light/dark toggle button on the demo wrapper around the workbench */
79
+ h1, h2, h3, p {
80
+ margin: 0;
81
+ }
82
+
83
+ /* ---------- demo page chrome (host page only, not part of the component) ---------- */
84
+
110
85
  .demo-toolbar {
111
86
  position: fixed;
112
87
  top: 12px;
@@ -123,23 +98,20 @@ body::before {
123
98
  gap: 6px;
124
99
  height: 32px;
125
100
  padding: 0 12px;
126
- border: 1px solid var(--line-strong);
101
+ border: 1px solid var(--k-line-strong);
127
102
  border-radius: 999px;
128
- background: color-mix(in srgb, var(--k-panel) 90%, transparent);
129
- color: var(--paper-dim);
103
+ background: var(--k-panel);
104
+ color: var(--k-muted);
130
105
  cursor: pointer;
131
- font-family: var(--k-font-mono, "IBM Plex Mono", monospace);
132
- font-size: 11px;
106
+ font-size: 12px;
133
107
  font-weight: 600;
134
- letter-spacing: 0.06em;
135
- backdrop-filter: blur(6px);
108
+ letter-spacing: 0.02em;
136
109
  transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease;
137
110
  }
138
111
 
139
112
  .theme-toggle:hover {
140
- background: color-mix(in srgb, var(--k-panel) 100%, transparent);
141
- border-color: var(--accent);
142
- color: var(--accent);
113
+ border-color: var(--k-brand);
114
+ color: var(--k-brand);
143
115
  }
144
116
 
145
117
  .theme-toggle-icon {
@@ -147,775 +119,672 @@ body::before {
147
119
  line-height: 1;
148
120
  }
149
121
 
150
- button,
151
- textarea {
152
- font: inherit;
153
- }
154
-
155
- h1,
156
- h2,
157
- h3,
158
- p {
159
- margin: 0;
160
- }
122
+ /* ---------- outer containers ---------- */
161
123
 
162
124
  .workbench {
163
125
  position: relative;
164
- z-index: 1;
165
126
  container-type: inline-size;
166
127
  min-height: 100vh;
167
- padding: 22px 22px 50px;
128
+ padding: 28px 20px 80px;
168
129
  }
169
130
 
170
131
  .workbench-shell {
171
- display: grid;
172
- grid-template-rows: auto minmax(0, 1fr);
173
- gap: 16px;
174
- max-width: 1360px;
132
+ max-width: 940px;
175
133
  margin: 0 auto;
176
134
  }
177
135
 
178
- /* ---- Shared label vocabulary ------------------------------------------ */
136
+ /* ---------- review panel + header ---------- */
179
137
 
180
- .eyebrow,
181
- .field-label,
182
- .state-label {
183
- color: var(--accent);
184
- font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
185
- font-size: 10.5px;
186
- font-weight: 600;
187
- letter-spacing: 0.18em;
188
- text-transform: uppercase;
138
+ .review {
139
+ background: var(--k-panel);
140
+ border: 1px solid var(--k-line);
141
+ border-radius: var(--k-radius);
142
+ box-shadow: var(--k-shadow);
143
+ overflow: hidden;
189
144
  }
190
145
 
191
- .field-label {
192
- color: var(--paper-faint);
193
- letter-spacing: 0.14em;
146
+ .rhead {
147
+ padding: 20px 22px;
148
+ border-bottom: 1px solid var(--k-line);
149
+ display: grid;
150
+ gap: 14px;
194
151
  }
195
152
 
196
- .field-value,
197
- .meta-value {
198
- overflow-wrap: anywhere;
199
- word-break: break-word;
200
- line-height: 1.4;
201
- color: var(--paper);
153
+ .rhead .top {
154
+ display: flex;
155
+ align-items: flex-start;
156
+ gap: 14px;
157
+ flex-wrap: wrap;
202
158
  }
203
159
 
204
- /* ---- Top command bar -------------------------------------------------- */
160
+ .rhead .eyebrow {
161
+ font-size: 12px;
162
+ letter-spacing: 0.08em;
163
+ text-transform: uppercase;
164
+ color: var(--k-faint);
165
+ }
205
166
 
206
- .topbar {
207
- display: grid;
208
- grid-template-columns: minmax(0, 1fr);
209
- gap: 12px;
210
- align-items: center;
211
- padding: 15px 17px;
212
- border: 1px solid var(--line-strong);
213
- border-radius: var(--radius);
214
- background:
215
- linear-gradient(135deg, color-mix(in srgb, var(--k-brand) 8%, transparent), transparent 42%),
216
- linear-gradient(180deg, var(--ink-800), var(--ink-850));
217
- box-shadow: var(--k-shadow, 0 24px 60px -34px rgba(0, 0, 0, 0.9)), inset 0 1px 0 var(--line);
218
- animation: rise 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
167
+ .rhead h1 {
168
+ margin: 2px 0 0;
169
+ font-size: 21px;
170
+ line-height: 1.2;
171
+ text-wrap: balance;
172
+ letter-spacing: -0.01em;
173
+ overflow-wrap: anywhere;
219
174
  }
220
175
 
221
- .topbar > div {
222
- min-width: 0;
176
+ .rhead .subj {
177
+ flex: 1;
178
+ min-width: 240px;
223
179
  }
224
180
 
225
- .topbar .eyebrow::before {
226
- content: "● ";
227
- color: var(--verify);
181
+ .meta {
182
+ display: flex;
183
+ gap: 18px;
184
+ flex-wrap: wrap;
185
+ font-size: 12.5px;
186
+ color: var(--k-muted);
228
187
  }
229
188
 
230
- h1 {
231
- margin-top: 6px;
232
- font-family: "Fraunces", Georgia, "Times New Roman", serif;
233
- font-optical-sizing: auto;
189
+ .meta b {
190
+ color: var(--k-text);
234
191
  font-weight: 600;
235
- font-size: clamp(21px, 2vw, 27px);
236
- line-height: 1.08;
237
- letter-spacing: -0.01em;
238
- overflow-wrap: anywhere;
239
- color: var(--paper);
192
+ font-variant-numeric: tabular-nums;
240
193
  }
241
194
 
242
- .review-question {
243
- max-width: 720px;
244
- margin-top: 7px;
245
- color: var(--paper-dim);
246
- font-size: 13px;
247
- line-height: 1.4;
248
- }
195
+ /* progress + apply */
249
196
 
250
- .review-question strong {
251
- color: var(--paper);
252
- font-family: "IBM Plex Mono", ui-monospace, monospace;
253
- font-size: 0.95em;
197
+ .progress {
198
+ display: flex;
199
+ align-items: center;
200
+ gap: 14px;
201
+ flex-wrap: wrap;
254
202
  }
255
203
 
256
- .review-target-label {
257
- margin-top: 4px;
204
+ .bar {
205
+ flex: 1;
206
+ min-width: 80px;
207
+ height: 7px;
208
+ border-radius: 999px;
209
+ background: var(--k-sunken);
210
+ overflow: hidden;
211
+ border: 1px solid var(--k-line);
258
212
  }
259
213
 
260
- .review-target-label strong {
261
- color: var(--paper);
262
- font-family: "IBM Plex Mono", ui-monospace, monospace;
263
- font-size: 13px;
264
- font-weight: 600;
214
+ .bar > i {
215
+ display: block;
216
+ height: 100%;
217
+ background: var(--k-brand);
218
+ border-radius: 999px;
219
+ transition: width 0.35s cubic-bezier(0.2, 0.7, 0.3, 1);
265
220
  }
266
221
 
267
- .meta-grid {
268
- display: none;
269
- grid-template-columns: repeat(4, minmax(110px, 1fr));
270
- gap: 10px;
271
- width: 100%;
222
+ .ptext {
223
+ font-size: 13px;
224
+ color: var(--k-muted);
225
+ font-variant-numeric: tabular-nums;
226
+ white-space: nowrap;
272
227
  }
273
228
 
274
- .meta-item,
275
- .field {
276
- min-width: 0;
229
+ .ptext b {
230
+ color: var(--k-text);
277
231
  }
278
232
 
279
- .meta-item {
280
- padding: 11px 12px;
281
- border: 1px solid var(--line);
282
- border-radius: var(--radius-sm);
283
- background: color-mix(in srgb, var(--k-bg) 55%, var(--k-panel));
233
+ .apply {
234
+ border: 0;
235
+ background: var(--k-brand);
236
+ color: var(--k-brand-ink);
237
+ font-weight: 600;
238
+ font-size: 14px;
239
+ padding: 9px 18px;
240
+ border-radius: 999px;
241
+ cursor: pointer;
242
+ white-space: nowrap;
243
+ transition: transform 0.08s, filter 0.15s;
284
244
  }
285
245
 
286
- [data-theme="light"] .meta-item {
287
- background: color-mix(in srgb, var(--k-bg) 70%, var(--k-panel));
246
+ .apply:hover {
247
+ filter: brightness(1.06);
288
248
  }
289
249
 
290
- .meta-value {
291
- margin-top: 6px;
292
- font-family: "IBM Plex Mono", ui-monospace, monospace;
293
- font-size: 12px;
294
- font-weight: 500;
295
- line-height: 1.45;
296
- color: var(--paper);
250
+ .apply:active {
251
+ transform: translateY(1px);
297
252
  }
298
253
 
299
- /* Status reads as a signal in the command bar. */
300
- .meta-item:nth-child(2) .meta-value {
301
- color: var(--accent);
302
- font-weight: 600;
254
+ .apply:disabled {
255
+ opacity: 0.45;
256
+ cursor: not-allowed;
257
+ filter: none;
303
258
  }
304
259
 
305
- /* ---- Layout scaffold -------------------------------------------------- */
260
+ /* ---------- field cards ---------- */
306
261
 
307
- .queue-layout {
308
- display: grid;
309
- grid-template-columns: 280px minmax(0, 1fr);
310
- gap: 16px;
311
- align-items: start;
262
+ .fields {
263
+ display: flex;
264
+ flex-direction: column;
312
265
  }
313
266
 
314
- .queue-panel {
267
+ .field {
315
268
  display: grid;
316
- gap: 14px;
317
- position: sticky;
318
- top: 18px;
269
+ grid-template-columns: 4px 1fr;
270
+ gap: 0;
271
+ border-top: 1px solid var(--k-line);
319
272
  }
320
273
 
321
- .active-review-strip {
322
- display: none;
274
+ .field:first-child {
275
+ border-top: 0;
323
276
  }
324
277
 
325
- /* ---- Mobile queue progress bar (mobile only) -------------------------- */
326
-
327
- .mobile-queue-bar {
328
- display: none;
278
+ .stripe {
279
+ background: var(--k-line);
280
+ transition: background 0.25s;
329
281
  }
330
282
 
331
- /* ---- Queue drawer backdrop -------------------------------------------- */
283
+ .field[data-state="accepted"] .stripe { background: var(--k-positive); }
284
+ .field[data-state="kept"] .stripe { background: var(--k-faint); }
285
+ .field[data-state="rejected"] .stripe { background: var(--k-negative); }
286
+ .field[data-state="review"] .stripe { background: var(--k-brand); }
332
287
 
333
- .queue-drawer-backdrop {
334
- display: none;
335
- position: fixed;
336
- inset: 0;
337
- z-index: 40;
338
- background: color-mix(in srgb, var(--k-bg) 55%, transparent);
339
- backdrop-filter: blur(2px);
340
- opacity: 0;
341
- transition: opacity 0.22s ease;
342
- pointer-events: none;
288
+ .fbody {
289
+ padding: 18px 22px 20px;
290
+ display: grid;
291
+ gap: 13px;
292
+ min-width: 0;
343
293
  }
344
294
 
345
- .queue-drawer-backdrop.is-visible {
346
- opacity: 1;
347
- pointer-events: auto;
295
+ .frow1 {
296
+ display: flex;
297
+ align-items: center;
298
+ gap: 10px;
299
+ flex-wrap: wrap;
348
300
  }
349
301
 
350
- /* ---- Queue drawer close button (mobile only) -------------------------- */
351
-
352
- .queue-drawer-close {
353
- display: none;
354
- position: absolute;
355
- top: 12px;
356
- right: 12px;
357
- width: 30px;
358
- height: 30px;
359
- border: 1px solid var(--line-strong);
360
- border-radius: 999px;
361
- background: color-mix(in srgb, var(--k-bg) 80%, transparent);
362
- color: var(--paper-faint);
363
- cursor: pointer;
364
- font-size: 14px;
365
- line-height: 1;
366
- align-items: center;
367
- justify-content: center;
368
- z-index: 2;
302
+ .fname {
303
+ font-size: 15.5px;
304
+ font-weight: 650;
305
+ letter-spacing: -0.005em;
369
306
  }
370
307
 
371
- .queue-list,
372
- .session-summary,
373
- .session-audit {
374
- border: 1px solid var(--line);
375
- border-radius: var(--radius);
376
- background: linear-gradient(180deg, var(--ink-800), var(--ink-850));
377
- padding: 14px;
378
- box-shadow: var(--k-shadow, 0 22px 50px -38px rgba(0, 0, 0, 0.9));
379
- animation: rise 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
380
- animation-delay: 0.05s;
308
+ .fkind {
309
+ font-size: 11px;
310
+ letter-spacing: 0.05em;
311
+ text-transform: uppercase;
312
+ color: var(--k-faint);
313
+ border: 1px solid var(--k-line-strong);
314
+ padding: 1px 7px;
315
+ border-radius: 999px;
381
316
  }
382
317
 
383
- .queue-head {
384
- display: grid;
385
- grid-template-columns: minmax(0, 1fr) auto;
386
- gap: 8px;
318
+ .chip {
319
+ font-size: 12px;
320
+ font-weight: 600;
321
+ padding: 3px 10px;
322
+ border-radius: 999px;
323
+ display: inline-flex;
387
324
  align-items: center;
388
- margin-bottom: 14px;
325
+ gap: 6px;
389
326
  }
390
327
 
391
- .queue-head h2,
392
- .session-summary h2,
393
- .session-audit h2 {
394
- font-family: "Fraunces", Georgia, serif;
395
- font-weight: 600;
396
- font-size: 16px;
397
- line-height: 1.1;
398
- letter-spacing: -0.01em;
328
+ .chip::before {
329
+ content: "";
330
+ width: 6px;
331
+ height: 6px;
332
+ border-radius: 999px;
333
+ background: currentColor;
399
334
  }
400
335
 
401
- /* ---- Queue rows: status carried on data-queue-status ------------------ */
336
+ .chip.review { color: var(--k-brand); background: var(--k-brand-wash); }
337
+ .chip.accepted { color: var(--k-positive); background: var(--k-positive-wash); }
338
+ .chip.kept { color: var(--k-muted); background: var(--k-sunken); }
339
+ .chip.rejected { color: var(--k-negative); background: var(--k-negative-wash); }
402
340
 
403
- .queue-row {
404
- display: grid;
405
- grid-template-columns: minmax(0, 1fr) auto;
406
- gap: 10px;
407
- align-items: center;
408
- width: 100%;
409
- min-height: 54px;
410
- border: 1px solid var(--line);
411
- border-left: 3px solid var(--paper-faint);
412
- border-radius: var(--radius-sm);
413
- margin-top: 8px;
414
- padding: 9px 10px;
415
- background: color-mix(in srgb, var(--k-bg) 50%, var(--k-panel));
416
- color: var(--paper);
417
- cursor: pointer;
418
- text-align: left;
419
- transition: transform 0.16s ease, border-color 0.16s ease, background 0.16s ease;
341
+ .frow1 .push {
342
+ margin-left: auto;
420
343
  }
421
344
 
422
- .queue-row:hover {
423
- transform: translateX(2px);
424
- border-color: var(--line-strong);
425
- background: color-mix(in srgb, var(--k-bg) 20%, var(--k-panel));
426
- }
345
+ /* the diff */
427
346
 
428
- .queue-row.is-active {
429
- border-left-width: 3px;
430
- background: color-mix(in srgb, var(--k-brand) 8%, var(--k-panel));
431
- box-shadow: inset 0 0 0 1px var(--line-strong);
347
+ .diff {
348
+ display: grid;
349
+ grid-template-columns: 1fr auto 1fr;
350
+ gap: 12px;
351
+ align-items: stretch;
432
352
  }
433
353
 
434
- .queue-row[data-queue-status="resolved"] { border-left-color: var(--verify); }
435
- .queue-row[data-queue-status="rejected"] { border-left-color: var(--reject); }
436
- .queue-row[data-queue-status="escalated"] { border-left-color: var(--hold); }
437
- .queue-row[data-queue-status="in-review"] { border-left-color: var(--accent); }
438
- .queue-row[data-queue-status="pending"] { border-left-color: var(--paper-faint); }
354
+ /* narrow-width collapse for .diff lives in the responsive section at the foot. */
439
355
 
440
- .queue-row-main {
441
- display: grid;
442
- gap: 4px;
356
+ .val {
357
+ border: 1px solid var(--k-line);
358
+ border-radius: var(--k-radius-sm);
359
+ padding: 10px 12px;
360
+ background: var(--k-raised);
443
361
  min-width: 0;
444
362
  }
445
363
 
446
- .queue-row-title,
447
- .queue-row-target {
448
- overflow-wrap: anywhere;
449
- word-break: break-word;
364
+ .val .vlbl {
365
+ font-size: 11px;
366
+ letter-spacing: 0.06em;
367
+ text-transform: uppercase;
368
+ color: var(--k-faint);
369
+ margin-bottom: 4px;
450
370
  }
451
371
 
452
- .queue-row-title {
453
- font-family: "IBM Plex Mono", ui-monospace, monospace;
454
- font-size: 12.5px;
455
- font-weight: 600;
456
- letter-spacing: -0.01em;
457
- color: var(--paper);
372
+ .val .vtext {
373
+ font-size: 14.5px;
374
+ word-break: break-word;
375
+ white-space: pre-wrap;
458
376
  }
459
377
 
460
- .queue-row-target {
461
- color: var(--paper-dim);
462
- font-size: 12px;
378
+ .val.current {
379
+ background: var(--k-sunken);
463
380
  }
464
381
 
465
- /* ---- Status pills ----------------------------------------------------- */
466
-
467
- .state-label {
468
- min-width: 78px;
469
- padding: 4px 9px;
470
- border: 1px solid var(--line-strong);
471
- border-radius: 999px;
472
- text-align: center;
473
- color: var(--paper-dim);
474
- background: color-mix(in srgb, var(--k-bg) 60%, var(--k-panel));
475
- letter-spacing: 0.08em;
476
- font-size: 9.5px;
382
+ .val.current .vtext {
383
+ color: var(--k-muted);
477
384
  }
478
385
 
479
- .queue-row[data-queue-status="resolved"] .state-label { color: var(--verify); border-color: color-mix(in srgb, var(--verify) 40%, transparent); }
480
- .queue-row[data-queue-status="rejected"] .state-label { color: var(--reject); border-color: color-mix(in srgb, var(--reject) 40%, transparent); }
481
- .queue-row[data-queue-status="escalated"] .state-label { color: var(--hold); border-color: color-mix(in srgb, var(--hold) 40%, transparent); }
482
- .queue-row[data-queue-status="in-review"] .state-label { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 40%, transparent); }
483
-
484
- .next-button {
485
- min-height: 34px;
486
- padding: 0 14px;
487
- border: 1px solid var(--line-strong);
488
- border-radius: 999px;
489
- background: color-mix(in srgb, var(--k-brand) 8%, transparent);
490
- color: var(--accent);
491
- cursor: pointer;
492
- font-family: "IBM Plex Mono", ui-monospace, monospace;
493
- font-size: 11px;
494
- font-weight: 600;
495
- letter-spacing: 0.06em;
496
- transition: background 0.16s ease, border-color 0.16s ease;
386
+ .val.proposed {
387
+ border-color: color-mix(in srgb, var(--k-brand) 45%, var(--k-line));
497
388
  }
498
389
 
499
- .next-button:hover {
500
- background: color-mix(in srgb, var(--k-brand) 16%, transparent);
501
- border-color: var(--accent);
390
+ .val.empty .vtext {
391
+ color: var(--k-faint);
392
+ font-style: italic;
502
393
  }
503
394
 
504
- /* ---- Session summary: scoreboard tiles -------------------------------- */
505
-
506
- .summary-grid {
507
- display: grid;
508
- grid-template-columns: repeat(2, minmax(0, 1fr));
509
- gap: 10px;
510
- margin-top: 12px;
395
+ .arrow {
396
+ align-self: center;
397
+ color: var(--k-faint);
511
398
  }
512
399
 
513
- .summary-grid .meta-item {
514
- display: grid;
515
- gap: 2px;
516
- padding: 10px;
517
- background: color-mix(in srgb, var(--k-bg) 60%, var(--k-panel));
400
+ .editrow {
401
+ display: flex;
402
+ align-items: center;
403
+ gap: 8px;
404
+ margin-top: 8px;
518
405
  }
519
406
 
520
- .summary-grid .meta-value {
521
- font-family: "Fraunces", Georgia, serif;
522
- font-size: 20px;
523
- font-weight: 700;
524
- line-height: 1;
525
- color: var(--paper);
407
+ .editrow input,
408
+ .editrow select {
409
+ flex: 1;
410
+ min-width: 0;
411
+ font-size: 13.5px;
412
+ color: var(--k-text);
413
+ background: var(--k-panel);
414
+ border: 1px solid var(--k-line-strong);
415
+ border-radius: 6px;
416
+ padding: 6px 9px;
526
417
  }
527
418
 
528
- /* ---- Session audit: replayable resource trail ------------------------- */
529
-
530
- .session-audit {
531
- display: grid;
532
- gap: 14px;
533
- animation-delay: 0.08s;
419
+ .editrow input:focus-visible,
420
+ .editrow select:focus-visible {
421
+ outline: 2px solid var(--k-brand);
422
+ outline-offset: 1px;
423
+ border-color: var(--k-brand);
534
424
  }
535
425
 
536
- .session-audit-head {
537
- display: grid;
538
- grid-template-columns: minmax(0, 1fr) auto;
539
- gap: 8px;
540
- align-items: start;
426
+ .editrow .ehint {
427
+ font-size: 11.5px;
428
+ color: var(--k-faint);
429
+ white-space: nowrap;
541
430
  }
542
431
 
543
- .session-audit-head h2 {
432
+ /* Validation message for a typed proposed-value edit (hidden until the mount
433
+ handler blocks a "Use proposed" on an out-of-shape value). */
434
+ .verr {
435
+ display: block;
544
436
  margin-top: 5px;
545
- overflow-wrap: anywhere;
437
+ font-size: 11.5px;
438
+ font-weight: 600;
439
+ color: var(--k-negative);
546
440
  }
547
441
 
548
- .audit-grid {
549
- grid-template-columns: repeat(2, minmax(0, 1fr));
442
+ .verr[hidden] {
443
+ display: none;
550
444
  }
551
445
 
552
- .audit-grid .meta-value {
553
- font-family: "IBM Plex Mono", ui-monospace, monospace;
554
- font-size: 11px;
555
- line-height: 1.3;
556
- }
446
+ /* confidence + provenance */
557
447
 
558
- .session-event-list {
448
+ .prov {
559
449
  display: grid;
560
- gap: 8px;
561
- margin: 0;
562
- padding: 0;
563
- list-style: none;
450
+ gap: 9px;
451
+ padding: 11px 13px;
452
+ border-radius: var(--k-radius-sm);
453
+ background: var(--k-sunken);
454
+ border: 1px solid var(--k-line);
564
455
  }
565
456
 
566
- .session-event-list li {
567
- display: grid;
568
- grid-template-columns: 24px minmax(0, 1fr);
569
- gap: 8px;
570
- min-width: 0;
571
- border: 1px solid var(--line);
572
- border-radius: var(--radius-sm);
573
- padding: 8px;
574
- background: color-mix(in srgb, var(--k-bg) 45%, transparent);
457
+ .conf {
458
+ display: flex;
459
+ align-items: center;
460
+ gap: 10px;
461
+ font-size: 12.5px;
462
+ color: var(--k-muted);
463
+ flex-wrap: wrap;
575
464
  }
576
465
 
577
- .event-sequence {
578
- display: grid;
579
- place-items: center;
580
- width: 24px;
581
- height: 24px;
582
- border: 1px solid var(--line-strong);
466
+ .conf .meter {
467
+ width: 84px;
468
+ height: 6px;
583
469
  border-radius: 999px;
584
- color: var(--accent);
585
- font-family: "IBM Plex Mono", ui-monospace, monospace;
586
- font-size: 10px;
587
- font-weight: 700;
470
+ background: var(--k-line-strong);
471
+ overflow: hidden;
588
472
  }
589
473
 
590
- .session-event-list strong,
591
- .session-event-list small {
474
+ .conf .meter > i {
592
475
  display: block;
593
- min-width: 0;
594
- overflow-wrap: anywhere;
476
+ height: 100%;
477
+ border-radius: 999px;
478
+ background: var(--k-positive);
595
479
  }
596
480
 
597
- .session-event-list strong {
598
- color: var(--paper);
599
- font-family: "IBM Plex Mono", ui-monospace, monospace;
600
- font-size: 11px;
481
+ .conf .meter.mid > i {
482
+ background: var(--k-caution);
601
483
  }
602
484
 
603
- .session-event-list small {
604
- margin-top: 3px;
605
- color: var(--paper-faint);
606
- font-size: 10.5px;
607
- line-height: 1.35;
485
+ .conf .pct {
486
+ font-variant-numeric: tabular-nums;
487
+ font-weight: 600;
488
+ color: var(--k-text);
489
+ font-family: var(--k-font-mono);
490
+ font-size: 12px;
608
491
  }
609
492
 
610
- .session-export {
611
- border-top: 1px solid var(--line);
612
- padding-top: 12px;
493
+ .excerpt {
494
+ font-size: 13px;
495
+ color: var(--k-text);
613
496
  }
614
497
 
615
- .session-export summary {
616
- cursor: pointer;
617
- color: var(--accent);
618
- font-family: "IBM Plex Mono", ui-monospace, monospace;
619
- font-size: 11px;
620
- font-weight: 700;
621
- letter-spacing: 0.06em;
498
+ .excerpt q {
499
+ color: var(--k-text);
622
500
  }
623
501
 
624
- .session-export pre {
625
- max-height: 300px;
626
- }
502
+ .excerpt q::before { content: "\201C"; }
503
+ .excerpt q::after { content: "\201D"; }
627
504
 
628
- /* ---- Content grid ----------------------------------------------------- */
505
+ .excerpt .from {
506
+ display: inline-flex;
507
+ align-items: center;
508
+ gap: 5px;
509
+ margin-top: 5px;
510
+ font-size: 12px;
511
+ color: var(--k-muted);
512
+ flex-wrap: wrap;
513
+ }
629
514
 
630
- .content-grid {
631
- display: grid;
632
- grid-template-columns: minmax(0, 1fr);
633
- grid-template-areas:
634
- "focus"
635
- "decision"
636
- "candidates";
637
- gap: 14px;
638
- align-items: start;
515
+ .excerpt .from a {
516
+ color: var(--k-brand);
517
+ text-decoration: underline;
518
+ text-underline-offset: 2px;
639
519
  }
640
520
 
641
- .review-main {
642
- display: grid;
643
- gap: 14px;
644
- min-width: 0;
521
+ .noprov {
522
+ display: flex;
523
+ align-items: center;
524
+ gap: 8px;
525
+ font-size: 13px;
526
+ color: var(--k-caution);
527
+ flex-wrap: wrap;
645
528
  }
646
529
 
647
- /* ---- Active review focus ---------------------------------------------- */
530
+ .noprov svg {
531
+ flex: none;
532
+ }
648
533
 
649
- .review-focus {
650
- grid-area: focus;
651
- display: grid;
652
- gap: 12px;
653
- min-width: 0;
654
- border: 1px solid color-mix(in srgb, var(--k-brand) 28%, transparent);
655
- border-radius: var(--radius);
656
- padding: 14px;
657
- background:
658
- linear-gradient(135deg, color-mix(in srgb, var(--k-brand) 12%, transparent), transparent 34%),
659
- linear-gradient(180deg, var(--ink-800), var(--ink-850));
660
- box-shadow: var(--k-shadow, 0 26px 60px -42px rgba(0, 0, 0, 0.95)), inset 0 1px 0 var(--line);
534
+ .noprov .tag {
535
+ background: var(--k-caution-wash);
536
+ color: var(--k-caution);
537
+ font-weight: 600;
538
+ padding: 2px 8px;
539
+ border-radius: 999px;
540
+ font-size: 12px;
661
541
  }
662
542
 
663
- .focus-head,
664
- .focus-values {
665
- display: grid;
543
+ /* decisions */
544
+
545
+ /* The decision row is the point of the card, so it sits on its own line,
546
+ right-aligned and prominent. The quiet calibration toggle is pushed to the
547
+ far left so the two primary actions read as the clear call to action. */
548
+ .decide {
549
+ display: flex;
666
550
  gap: 10px;
551
+ flex-wrap: wrap;
552
+ align-items: center;
553
+ justify-content: flex-end;
554
+ margin-top: 2px;
667
555
  }
668
556
 
669
- .focus-head {
670
- grid-template-columns: minmax(0, 1fr) auto;
557
+ .btn {
558
+ border: 1px solid var(--k-line-strong);
559
+ background: var(--k-raised);
560
+ color: var(--k-text);
561
+ font-size: 14px;
562
+ font-weight: 600;
563
+ padding: 0 18px;
564
+ min-height: 42px;
565
+ border-radius: 9px;
566
+ cursor: pointer;
567
+ display: inline-flex;
671
568
  align-items: center;
569
+ justify-content: center;
570
+ gap: 7px;
571
+ transition: background 0.12s, border-color 0.12s, color 0.12s, filter 0.12s;
672
572
  }
673
573
 
674
- .focus-values {
675
- grid-template-columns: repeat(2, minmax(0, 1fr));
574
+ .btn:hover {
575
+ background: var(--k-sunken);
576
+ border-color: var(--k-line-strong);
676
577
  }
677
578
 
678
- .focus-value {
679
- min-width: 0;
680
- border: 1px solid var(--line);
681
- border-radius: var(--radius-sm);
682
- padding: 10px 12px;
683
- background: color-mix(in srgb, var(--k-bg) 56%, var(--k-panel));
579
+ .btn:focus-visible {
580
+ outline: 2px solid var(--k-brand);
581
+ outline-offset: 2px;
684
582
  }
685
583
 
686
- .focus-value strong {
687
- display: block;
688
- margin-top: 6px;
689
- color: var(--paper);
690
- font-family: "IBM Plex Mono", ui-monospace, monospace;
691
- font-size: clamp(18px, 1.8vw, 25px);
692
- line-height: 1.14;
693
- overflow-wrap: anywhere;
584
+ /* Use proposed — the filled positive primary, the loudest thing on the card. */
585
+ .btn.use {
586
+ background: var(--k-positive);
587
+ border-color: var(--k-positive);
588
+ color: #ffffff;
694
589
  }
695
590
 
696
- .focus-value span:last-child {
697
- display: block;
698
- margin-top: 6px;
699
- color: var(--paper-faint);
700
- font-family: "IBM Plex Mono", ui-monospace, monospace;
701
- font-size: 11px;
591
+ .btn.use:hover {
592
+ background: var(--k-positive);
593
+ border-color: var(--k-positive);
594
+ color: #ffffff;
595
+ filter: brightness(1.07);
702
596
  }
703
597
 
704
- .focus-value.is-proposed {
705
- border-color: color-mix(in srgb, var(--k-active) 34%, transparent);
706
- background: color-mix(in srgb, var(--k-active) 10%, color-mix(in srgb, var(--k-bg) 56%, var(--k-panel)));
598
+ /* Keep current — a strong neutral secondary; still prominent, clearly not the accept. */
599
+ .btn.keep {
600
+ border-color: var(--k-line-strong);
601
+ background: var(--k-panel-raised, var(--k-raised));
707
602
  }
708
603
 
709
- .focus-value.is-proposed strong {
710
- color: var(--proposed);
604
+ /* "Suggestion was wrong" — optional quiet calibration toggle on Keep current.
605
+ Ticking it turns a keep-current decision into the reject signal. Not a third action. */
606
+ .wrong {
607
+ order: -1;
608
+ margin-right: auto;
609
+ display: inline-flex;
610
+ align-items: center;
611
+ gap: 7px;
612
+ font-size: 12.5px;
613
+ color: var(--k-faint);
614
+ cursor: pointer;
615
+ user-select: none;
616
+ padding: 8px 4px;
617
+ min-height: 40px;
711
618
  }
712
619
 
713
- .focus-evidence {
714
- display: grid;
715
- grid-template-columns: minmax(110px, 0.65fr) minmax(0, 1.2fr) minmax(0, 1.4fr);
716
- gap: 10px;
717
- margin: 0;
620
+ .wrong:hover {
621
+ color: var(--k-negative);
718
622
  }
719
623
 
720
- .focus-evidence .field {
721
- border-top: 1px solid var(--line);
722
- padding-top: 10px;
723
- }
724
-
725
- /* ---- Candidate comparison: the hero of the console -------------------- */
726
-
727
- .candidate-grid {
728
- grid-area: candidates;
729
- display: grid;
730
- grid-template-columns: repeat(2, minmax(0, 1fr));
731
- gap: 12px;
732
- position: relative;
624
+ .wrong input {
625
+ width: 15px;
626
+ height: 15px;
627
+ accent-color: var(--k-negative);
628
+ cursor: pointer;
629
+ margin: 0;
733
630
  }
734
631
 
735
- /* "VS" diff marker between the two candidates. */
736
- .candidate-grid::before {
737
- content: "vs";
738
- position: absolute;
739
- top: 18px;
740
- left: 50%;
741
- transform: translateX(-50%);
742
- z-index: 3;
743
- width: 30px;
744
- height: 30px;
745
- display: grid;
746
- place-items: center;
747
- border-radius: 999px;
748
- border: 1px solid var(--line-strong);
749
- background: var(--vs-bg);
750
- color: var(--paper-faint);
751
- font-family: "Fraunces", Georgia, serif;
752
- font-style: italic;
632
+ .decided {
633
+ display: none;
634
+ align-items: center;
635
+ justify-content: flex-end;
636
+ gap: 10px;
753
637
  font-size: 13px;
754
- box-shadow: var(--k-shadow, 0 10px 26px -12px rgba(0, 0, 0, 0.9));
638
+ color: var(--k-muted);
755
639
  }
756
640
 
757
- .candidate-card,
758
- .payload-panel,
759
- .surface-preview,
760
- .decision-row {
761
- border: 1px solid var(--line);
762
- border-radius: var(--radius);
763
- background: linear-gradient(180deg, var(--ink-800), var(--ink-850));
764
- box-shadow: var(--k-shadow, 0 26px 60px -42px rgba(0, 0, 0, 0.95));
641
+ .field[data-decided="1"] .decide {
642
+ display: none;
765
643
  }
766
644
 
767
- .candidate-card {
768
- display: grid;
769
- grid-template-rows: auto auto minmax(0, 1fr) auto;
770
- gap: 11px;
771
- min-height: auto;
772
- padding: 14px;
773
- position: relative;
774
- overflow: hidden;
775
- animation: rise 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
776
- animation-delay: 0.1s;
645
+ .field[data-decided="1"] .decided {
646
+ display: flex;
777
647
  }
778
648
 
779
- /* The proposed candidate (2nd card) is the incoming change — flag it. */
780
- .candidate-card:nth-child(2) {
781
- border-color: color-mix(in srgb, var(--k-active) 32%, transparent);
649
+ .undo {
650
+ border: 0;
651
+ background: none;
652
+ color: var(--k-brand);
653
+ font-size: 13px;
654
+ cursor: pointer;
655
+ text-decoration: underline;
656
+ text-underline-offset: 2px;
657
+ padding: 0;
782
658
  }
783
659
 
784
- .candidate-card:nth-child(2)::after {
785
- content: "";
786
- position: absolute;
787
- inset: 0;
788
- pointer-events: none;
789
- background: radial-gradient(420px 200px at 80% -10%, color-mix(in srgb, var(--k-active) 12%, transparent), transparent 70%);
660
+ /* footer tally */
661
+
662
+ .foot {
663
+ padding: 16px 22px;
664
+ border-top: 1px solid var(--k-line);
665
+ display: flex;
666
+ align-items: center;
667
+ gap: 16px;
668
+ flex-wrap: wrap;
669
+ background: var(--k-raised);
790
670
  }
791
671
 
792
- .candidate-card.is-selected {
793
- border-color: color-mix(in srgb, var(--k-positive) 55%, transparent);
794
- box-shadow: 0 26px 60px -36px rgba(0, 0, 0, 0.95), inset 0 0 0 1px color-mix(in srgb, var(--k-positive) 35%, transparent), inset 0 0 60px -30px color-mix(in srgb, var(--k-positive) 60%, transparent);
672
+ .tally {
673
+ display: flex;
674
+ gap: 16px;
675
+ font-size: 13px;
676
+ color: var(--k-muted);
677
+ flex-wrap: wrap;
795
678
  }
796
679
 
797
- .candidate-card.is-unselected {
798
- opacity: 0.5;
799
- filter: saturate(0.7);
680
+ .tally b {
681
+ color: var(--k-text);
682
+ font-variant-numeric: tabular-nums;
800
683
  }
801
684
 
802
- .card-head {
803
- display: flex;
804
- gap: 10px;
805
- justify-content: space-between;
806
- align-items: flex-start;
807
- position: relative;
808
- z-index: 1;
685
+ /* ---------- audit details: the single collapsed power-user surface per field ---------- */
686
+
687
+ .audit-details {
688
+ border-top: 1px dashed var(--k-line);
689
+ padding-top: 4px;
809
690
  }
810
691
 
811
- .card-head .eyebrow {
812
- color: var(--paper-faint);
813
- font-size: 10px;
814
- letter-spacing: 0.1em;
692
+ .audit-details summary {
693
+ cursor: pointer;
694
+ padding: 6px 0;
695
+ color: var(--k-faint);
696
+ font-size: 12px;
697
+ letter-spacing: 0.04em;
815
698
  text-transform: uppercase;
816
- overflow-wrap: anywhere;
817
- word-break: break-word;
699
+ font-weight: 600;
818
700
  }
819
701
 
820
- .role {
821
- margin-top: 3px;
822
- font-family: "Fraunces", Georgia, serif;
823
- font-weight: 600;
824
- font-size: 18px;
825
- letter-spacing: -0.01em;
826
- color: var(--paper);
702
+ .audit-details summary:hover {
703
+ color: var(--k-muted);
827
704
  }
828
705
 
829
- .candidate-card:nth-child(2) .role {
830
- color: var(--proposed);
706
+ .audit-details[open] summary {
707
+ color: var(--k-brand);
831
708
  }
832
709
 
833
- .is-selected .state-label {
834
- color: var(--verify);
835
- border-color: color-mix(in srgb, var(--verify) 50%, transparent);
836
- background: color-mix(in srgb, var(--verify) 12%, transparent);
710
+ .audit-body {
711
+ display: grid;
712
+ gap: 14px;
713
+ padding: 4px 0 6px;
837
714
  }
838
715
 
839
- /* The value — the single most important datapoint on the screen. */
840
- .candidate-value {
841
- position: relative;
842
- z-index: 1;
843
- border-block: 1px solid var(--line);
844
- padding: 10px 0;
716
+ .note-field {
717
+ display: grid;
718
+ gap: 6px;
845
719
  }
846
720
 
847
- .candidate-value .field-value {
848
- margin-top: 7px;
849
- font-family: "IBM Plex Mono", ui-monospace, monospace;
850
- font-size: clamp(16px, 1.35vw, 20px);
721
+ .field-label {
722
+ color: var(--k-faint);
723
+ font-size: 11px;
851
724
  font-weight: 600;
852
- line-height: 1.22;
853
- letter-spacing: 0;
854
- color: var(--paper);
725
+ letter-spacing: 0.06em;
726
+ text-transform: uppercase;
727
+ }
728
+
729
+ .field-value {
730
+ overflow-wrap: anywhere;
731
+ word-break: break-word;
732
+ line-height: 1.4;
733
+ color: var(--k-text);
734
+ font-size: 12.5px;
855
735
  }
856
736
 
857
- .candidate-card:nth-child(2) .candidate-value .field-value {
858
- color: var(--proposed);
737
+ .note-field textarea {
738
+ display: block;
739
+ width: 100%;
740
+ min-height: 60px;
741
+ resize: vertical;
742
+ border: 1px solid var(--k-line-strong);
743
+ border-radius: var(--k-radius-sm);
744
+ padding: 8px 10px;
745
+ color: var(--k-text);
746
+ background: var(--k-sunken);
747
+ font-family: var(--k-font-mono);
748
+ font-size: 12px;
749
+ line-height: 1.5;
859
750
  }
860
751
 
861
- .is-selected .candidate-value .field-value {
862
- color: var(--verify);
752
+ .note-field textarea:focus-visible {
753
+ outline: none;
754
+ border-color: var(--k-brand);
755
+ box-shadow: 0 0 0 3px var(--k-brand-wash);
863
756
  }
864
757
 
865
758
  .field-stack {
866
759
  display: grid;
867
760
  gap: 9px;
868
- position: relative;
869
- z-index: 1;
870
- align-content: start;
871
761
  }
872
762
 
873
- .field-value {
874
- margin-top: 4px;
875
- font-size: 12.5px;
763
+ .field-stack.compact {
764
+ gap: 6px;
876
765
  }
877
766
 
878
- /* Source refs / locators / ids read as data. */
879
- .candidate-card .field-stack .field-value {
880
- font-family: "IBM Plex Mono", ui-monospace, monospace;
881
- font-size: 11.5px;
882
- color: var(--paper-dim);
767
+ .kv {
768
+ min-width: 0;
883
769
  }
884
770
 
885
- /* Highlight extraction confidence (5th field in the stack) as a chip. */
886
- .candidate-card .field-stack > .field:nth-child(5) .field-value {
887
- display: inline-block;
888
- margin-top: 5px;
889
- padding: 4px 9px;
890
- border: 1px solid color-mix(in srgb, var(--k-brand) 35%, transparent);
891
- border-radius: 999px;
892
- background: color-mix(in srgb, var(--k-brand) 10%, transparent);
893
- color: var(--accent);
771
+ .kv .field-value {
772
+ margin-top: 3px;
773
+ font-family: var(--k-font-mono);
894
774
  font-size: 11.5px;
895
- font-weight: 600;
896
- }
897
-
898
- .excerpt {
899
- border-left: 2px solid var(--accent-deep);
900
- padding-left: 12px;
901
- }
902
-
903
- .excerpt .field-value {
904
- font-style: italic;
905
- color: var(--paper-dim) !important;
775
+ color: var(--k-muted);
906
776
  }
907
777
 
908
- /* ---- Excerpt / rationale 3-line clamp with inline expander ----------- */
909
- /* Applied to .field-value inside .excerpt or .excerpt-clamp containers,
910
- and to .rationale-clamp for reviewer rationale fields.
911
- The "more / less" toggle is a <button class="clamp-toggle"> sibling. */
912
-
913
- .excerpt-clamp .field-value,
914
- .rationale-clamp .field-value {
778
+ /* Excerpt / rationale 3-line clamp with inline "more / less" expander. */
779
+ .kv.excerpt .field-value,
780
+ .kv.rationale-clamp .field-value {
915
781
  display: -webkit-box;
916
782
  -webkit-box-orient: vertical;
917
783
  -webkit-line-clamp: 3;
918
784
  overflow: hidden;
785
+ font-family: var(--k-font-ui);
786
+ font-style: italic;
787
+ color: var(--k-muted);
919
788
  }
920
789
 
921
790
  .excerpt-clamp.is-expanded .field-value,
@@ -931,9 +800,9 @@ h1 {
931
800
  padding: 0;
932
801
  border: none;
933
802
  background: none;
934
- color: var(--accent);
803
+ color: var(--k-brand);
935
804
  cursor: pointer;
936
- font-family: "IBM Plex Mono", ui-monospace, monospace;
805
+ font-family: var(--k-font-mono);
937
806
  font-size: 10.5px;
938
807
  font-weight: 600;
939
808
  letter-spacing: 0.04em;
@@ -943,13 +812,10 @@ h1 {
943
812
  }
944
813
 
945
814
  .clamp-toggle:hover {
946
- color: var(--paper);
815
+ color: var(--k-text);
947
816
  }
948
817
 
949
- /* ---- Candidate history expander -------------------------------------- */
950
- /* When there are >3 unselected candidates the UI renders the first 3 and
951
- hides the rest behind a "view all (N)" expander. */
952
-
818
+ /* Candidate history expander: >3 unselected candidates hide behind "view all (N)". */
953
819
  .history-overflow {
954
820
  display: none;
955
821
  }
@@ -964,21 +830,19 @@ h1 {
964
830
  gap: 4px;
965
831
  margin-top: 6px;
966
832
  padding: 3px 10px;
967
- border: 1px solid var(--line-strong);
833
+ border: 1px solid var(--k-line-strong);
968
834
  border-radius: 999px;
969
- background: color-mix(in srgb, var(--k-brand) 6%, transparent);
970
- color: var(--accent);
835
+ background: var(--k-brand-wash);
836
+ color: var(--k-brand);
971
837
  cursor: pointer;
972
- font-family: "IBM Plex Mono", ui-monospace, monospace;
973
- font-size: 10px;
838
+ font-size: 10.5px;
974
839
  font-weight: 600;
975
- letter-spacing: 0.06em;
840
+ letter-spacing: 0.04em;
976
841
  transition: background 0.14s ease, border-color 0.14s ease;
977
842
  }
978
843
 
979
844
  .history-expand-btn:hover {
980
- background: color-mix(in srgb, var(--k-brand) 14%, transparent);
981
- border-color: var(--accent);
845
+ border-color: var(--k-brand);
982
846
  }
983
847
 
984
848
  .history-expander.is-expanded .history-expand-btn .expand-label {
@@ -993,273 +857,46 @@ h1 {
993
857
  display: none;
994
858
  }
995
859
 
996
- /* ---- Decision column -------------------------------------------------- */
997
-
998
- .decision-column {
999
- grid-area: decision;
1000
- display: grid;
1001
- grid-template-columns: minmax(0, 1fr);
1002
- gap: 12px;
1003
- animation: rise 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
1004
- animation-delay: 0.15s;
1005
- }
1006
-
1007
- .decision-row,
1008
- .payload-panel,
1009
- .surface-preview {
1010
- padding: 14px;
1011
- }
1012
-
1013
- textarea {
1014
- display: block;
1015
- width: 100%;
1016
- min-height: 74px;
1017
- margin-top: 8px;
1018
- resize: vertical;
1019
- border: 1px solid var(--line-strong);
1020
- border-radius: var(--radius-sm);
1021
- padding: 10px;
1022
- color: var(--paper);
1023
- background: color-mix(in srgb, var(--k-bg) 70%, var(--k-panel));
1024
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1025
- font-size: 12px;
1026
- line-height: 1.5;
1027
- }
1028
-
1029
- textarea::placeholder {
1030
- color: var(--paper-faint);
1031
- }
1032
-
1033
- textarea:focus {
1034
- border-color: var(--accent);
1035
- outline: none;
1036
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--k-brand) 18%, transparent);
1037
- }
1038
-
1039
- /* Decision actions — color-coded to outcome (accept / keep / reject). */
1040
- .decision-buttons {
1041
- display: grid;
1042
- grid-template-columns: repeat(3, minmax(0, 1fr));
1043
- gap: 8px;
1044
- margin-top: 0;
1045
- }
1046
-
1047
- .decision-button {
1048
- min-height: 42px;
1049
- border: 1px solid var(--line-strong);
1050
- border-radius: var(--radius-sm);
1051
- background: color-mix(in srgb, var(--k-bg) 60%, var(--k-panel));
1052
- color: var(--paper);
1053
- cursor: pointer;
1054
- font-weight: 700;
1055
- font-size: 12px;
1056
- letter-spacing: 0.01em;
1057
- transition: transform 0.14s ease, border-color 0.14s ease, background 0.14s ease, box-shadow 0.14s ease;
1058
- }
1059
-
1060
- .decision-button:hover,
1061
- .decision-button:focus {
1062
- transform: translateY(-2px);
1063
- outline: none;
1064
- }
1065
-
1066
- .decision-button:nth-child(1):hover { border-color: var(--verify); box-shadow: 0 10px 24px -14px color-mix(in srgb, var(--verify) 80%, transparent); }
1067
- .decision-button:nth-child(2):hover { border-color: var(--hold); box-shadow: 0 10px 24px -14px color-mix(in srgb, var(--hold) 80%, transparent); }
1068
- .decision-button:nth-child(3):hover { border-color: var(--reject); box-shadow: 0 10px 24px -14px color-mix(in srgb, var(--reject) 80%, transparent); }
1069
-
1070
- .decision-button.is-active {
1071
- color: var(--k-bg);
1072
- border-color: transparent;
1073
- }
1074
-
1075
- .decision-button:nth-child(1).is-active { background: var(--verify); box-shadow: 0 14px 30px -14px color-mix(in srgb, var(--verify) 90%, transparent); }
1076
- .decision-button:nth-child(2).is-active { background: var(--hold); box-shadow: 0 14px 30px -14px color-mix(in srgb, var(--hold) 90%, transparent); }
1077
- .decision-button:nth-child(3).is-active { background: var(--reject); box-shadow: 0 14px 30px -14px color-mix(in srgb, var(--reject) 90%, transparent); }
1078
-
1079
- .effect {
1080
- display: grid;
1081
- gap: 7px;
1082
- margin-top: 12px;
1083
- border-top: 1px solid var(--line);
1084
- padding-top: 11px;
1085
- }
1086
-
1087
- .effect .field-value {
1088
- font-size: 12.5px;
1089
- line-height: 1.45;
1090
- color: var(--paper-dim);
1091
- }
1092
-
1093
- .feedback-tags {
1094
- display: grid;
1095
- gap: 8px;
1096
- margin-top: 12px;
1097
- border-top: 1px solid var(--line);
1098
- padding-top: 11px;
1099
- }
1100
-
1101
- .tag-row {
1102
- display: flex;
1103
- flex-wrap: wrap;
1104
- gap: 7px;
1105
- }
1106
-
1107
- .tag {
1108
- border: 1px solid var(--line-strong);
1109
- border-radius: 999px;
1110
- padding: 5px 11px;
1111
- background: color-mix(in srgb, var(--k-active) 8%, transparent);
1112
- color: var(--proposed);
1113
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1114
- font-size: 11px;
1115
- font-weight: 500;
1116
- }
1117
-
1118
- .tag.is-empty {
1119
- background: color-mix(in srgb, var(--k-bg) 60%, var(--k-panel));
1120
- color: var(--paper-faint);
1121
- }
1122
-
1123
- /* ---- Surface preview dossier ------------------------------------------ */
1124
-
1125
- .surface-preview {
1126
- display: grid;
1127
- gap: 11px;
1128
- }
1129
-
1130
- /* When surface-preview is a <details> element */
1131
- details.surface-preview {
1132
- display: block;
1133
- }
1134
-
1135
- details.surface-preview[open] {
1136
- display: grid;
1137
- gap: 11px;
1138
- }
1139
-
1140
- .surface-summary {
1141
- display: flex;
1142
- gap: 12px;
1143
- justify-content: space-between;
1144
- align-items: center;
1145
- cursor: pointer;
1146
- list-style: none;
1147
- padding: 0;
1148
- }
1149
-
1150
- .surface-summary::-webkit-details-marker {
1151
- display: none;
1152
- }
1153
-
1154
- .surface-summary::before {
1155
- content: none;
1156
- }
1157
-
1158
- .surface-summary-label {
1159
- font-family: "Fraunces", Georgia, serif;
1160
- font-weight: 600;
1161
- font-size: 16px;
1162
- letter-spacing: -0.01em;
1163
- color: var(--paper);
1164
- }
1165
-
1166
- .surface-summary-label::before {
1167
- content: "› ";
1168
- color: var(--accent);
1169
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1170
- font-size: 13px;
1171
- }
1172
-
1173
- details.surface-preview[open] .surface-summary-label::before {
1174
- content: "⌄ ";
1175
- }
1176
-
1177
- .surface-head {
1178
- display: flex;
1179
- gap: 12px;
1180
- justify-content: space-between;
1181
- align-items: flex-start;
1182
- }
1183
-
1184
- .surface-head h2 {
1185
- font-family: "Fraunces", Georgia, serif;
1186
- font-weight: 600;
1187
- font-size: 16px;
1188
- letter-spacing: -0.01em;
1189
- }
1190
-
1191
- .preview-disclaimer {
1192
- border-left: 2px solid var(--hold);
1193
- padding: 2px 0 2px 12px;
1194
- color: var(--paper-dim);
1195
- font-size: 12.5px;
1196
- line-height: 1.5;
1197
- }
1198
-
1199
- .preview-disclaimer-footer {
1200
- margin-top: 4px;
1201
- border-left-color: var(--line);
1202
- font-size: 11.5px;
1203
- color: var(--paper-faint);
1204
- }
1205
-
1206
860
  .preview-section-grid {
1207
861
  display: grid;
1208
- grid-template-columns: repeat(2, minmax(0, 1fr));
1209
- gap: 8px;
862
+ gap: 10px;
1210
863
  }
1211
864
 
1212
865
  .preview-section {
1213
- min-width: 0;
1214
- border: 1px solid var(--line);
1215
- border-radius: var(--radius-sm);
1216
- padding: 10px 11px;
1217
- background: color-mix(in srgb, var(--k-bg) 55%, var(--k-panel));
866
+ border: 1px solid var(--k-line);
867
+ border-radius: var(--k-radius-sm);
868
+ padding: 10px 12px;
869
+ background: var(--k-sunken);
1218
870
  }
1219
871
 
1220
872
  .preview-section h3 {
1221
- margin-bottom: 7px;
1222
- color: var(--accent);
1223
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1224
- font-size: 10px;
873
+ margin-bottom: 6px;
874
+ color: var(--k-faint);
875
+ font-size: 11px;
1225
876
  font-weight: 600;
1226
- letter-spacing: 0.1em;
877
+ letter-spacing: 0.06em;
1227
878
  text-transform: uppercase;
1228
879
  }
1229
880
 
1230
- .field-stack.compact {
1231
- gap: 9px;
1232
- }
1233
-
1234
- .compact .field-value {
1235
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1236
- font-size: 12px;
1237
- color: var(--paper-dim);
1238
- }
1239
-
1240
881
  .preview-section.is-neutral {
1241
- border-style: dashed;
1242
- border-color: var(--line);
1243
- background: color-mix(in srgb, var(--k-bg) 35%, var(--k-panel));
882
+ background: var(--k-raised);
1244
883
  }
1245
884
 
1246
885
  .preview-section.is-neutral h3 {
1247
- color: var(--paper-faint);
886
+ color: var(--k-faint);
1248
887
  }
1249
888
 
1250
889
  .reference-details {
1251
- margin-top: 10px;
1252
- border-top: 1px solid var(--line);
1253
- padding-top: 8px;
890
+ margin-top: 8px;
1254
891
  }
1255
892
 
1256
893
  .reference-details summary {
1257
894
  cursor: pointer;
1258
- color: var(--paper-faint);
1259
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1260
- font-size: 10px;
895
+ list-style: none;
896
+ color: var(--k-faint);
897
+ font-size: 10.5px;
1261
898
  font-weight: 600;
1262
- letter-spacing: 0.08em;
899
+ letter-spacing: 0.04em;
1263
900
  text-transform: uppercase;
1264
901
  }
1265
902
 
@@ -1268,580 +905,140 @@ details.surface-preview[open] .surface-summary-label::before {
1268
905
  }
1269
906
 
1270
907
  .reference-details summary::before {
1271
- content: "› ";
1272
- color: var(--paper-faint);
1273
- }
1274
-
1275
- .reference-details[open] summary {
1276
- color: var(--accent);
908
+ content: "▸ ";
1277
909
  }
1278
910
 
1279
911
  .reference-details[open] summary::before {
1280
- content: "⌄ ";
1281
- color: var(--accent);
912
+ content: "▾ ";
1282
913
  }
1283
914
 
1284
915
  .reference-details .field-stack {
1285
916
  margin-top: 8px;
1286
917
  }
1287
918
 
1288
- /* ---- Decision payload: terminal readout, intentionally demoted -------- */
1289
-
1290
- .payload-panel {
1291
- background: linear-gradient(180deg, var(--ink-850), var(--ink-900));
1292
- }
1293
-
1294
- .payload-panel summary.field-label {
1295
- cursor: pointer;
1296
- list-style: none;
1297
- }
1298
-
1299
- .payload-panel summary.field-label::-webkit-details-marker {
1300
- display: none;
919
+ .preview-disclaimer {
920
+ font-size: 11.5px;
921
+ color: var(--k-faint);
922
+ line-height: 1.5;
1301
923
  }
1302
924
 
1303
- .payload-panel summary.field-label::before {
1304
- content: "› ";
1305
- color: var(--verify);
925
+ .preview-disclaimer-footer {
926
+ border-top: 1px solid var(--k-line);
927
+ padding-top: 10px;
1306
928
  }
1307
929
 
1308
- pre {
1309
- max-height: 280px;
1310
- margin: 12px 0 0;
930
+ /* ReviewDecision payload — deliberately the deepest, last thing in the audit details. */
931
+ .reference-details pre,
932
+ pre[data-testid="decision-payload"] {
933
+ margin: 8px 0 0;
934
+ max-height: 260px;
1311
935
  overflow: auto;
1312
- border: 1px solid var(--line);
1313
- border-radius: var(--radius-sm);
1314
- background: var(--ink-1000);
1315
- padding: 11px;
1316
- color: color-mix(in srgb, var(--k-positive) 80%, var(--k-text));
1317
- font-family: "IBM Plex Mono", ui-monospace, monospace;
936
+ padding: 10px;
937
+ border: 1px solid var(--k-line);
938
+ border-radius: var(--k-radius-sm);
939
+ background: var(--k-bg);
940
+ color: var(--k-muted);
941
+ font-family: var(--k-font-mono);
1318
942
  font-size: 11px;
1319
- line-height: 1.55;
943
+ line-height: 1.5;
1320
944
  white-space: pre-wrap;
1321
- word-break: break-word;
1322
- }
1323
-
1324
- /* ---- Motion ----------------------------------------------------------- */
1325
-
1326
- @keyframes rise {
1327
- from {
1328
- opacity: 0;
1329
- transform: translateY(14px);
1330
- }
1331
- to {
1332
- opacity: 1;
1333
- transform: translateY(0);
1334
- }
1335
945
  }
1336
946
 
1337
- @media (prefers-reduced-motion: reduce) {
1338
- * {
1339
- animation: none !important;
1340
- transition: none !important;
1341
- }
1342
- }
1343
-
1344
- /* ---- Responsive ------------------------------------------------------- */
1345
-
1346
- @media (max-width: 980px) {
1347
- .topbar,
1348
- .focus-evidence,
1349
- .candidate-grid {
1350
- grid-template-columns: 1fr;
1351
- }
1352
-
1353
- .content-grid {
1354
- grid-template-columns: 1fr;
1355
- grid-template-areas:
1356
- "focus"
1357
- "decision"
1358
- "candidates";
1359
- }
1360
-
1361
- .queue-layout {
1362
- display: block;
1363
- position: relative;
1364
- }
1365
-
1366
- .active-review-strip {
1367
- display: grid;
1368
- grid-template-columns: minmax(0, 1fr) auto;
1369
- gap: 12px;
1370
- align-items: center;
1371
- border: 1px solid var(--line-strong);
1372
- border-left: 3px solid var(--accent);
1373
- border-radius: var(--radius);
1374
- padding: 13px 14px;
1375
- background:
1376
- linear-gradient(90deg, color-mix(in srgb, var(--k-brand) 12%, transparent), transparent 46%),
1377
- linear-gradient(180deg, var(--ink-800), var(--ink-850));
1378
- box-shadow: var(--k-shadow, 0 18px 44px -36px rgba(0, 0, 0, 0.9));
1379
- }
1380
-
1381
- .active-review-copy,
1382
- .active-review-actions,
1383
- .active-review-decisions {
1384
- min-width: 0;
1385
- }
1386
-
1387
- .active-review-copy {
1388
- display: grid;
1389
- gap: 4px;
1390
- }
1391
-
1392
- .active-review-copy strong {
1393
- overflow-wrap: anywhere;
1394
- color: var(--paper);
1395
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1396
- font-size: 13px;
1397
- }
1398
-
1399
- .active-review-copy span:last-child {
1400
- overflow-wrap: anywhere;
1401
- color: var(--paper-dim);
1402
- font-size: 13px;
1403
- }
1404
-
1405
- .active-review-actions {
1406
- display: grid;
1407
- gap: 8px;
1408
- justify-items: end;
1409
- }
1410
-
1411
- .active-review-decisions {
1412
- grid-column: 1 / -1;
1413
- display: grid;
1414
- grid-template-columns: repeat(3, minmax(0, 1fr));
1415
- gap: 8px;
1416
- }
1417
-
1418
- .active-review-decisions .decision-button {
1419
- min-height: 38px;
1420
- padding: 7px 8px;
1421
- font-size: 11px;
1422
- }
1423
-
1424
- .queue-drawer-backdrop {
1425
- display: block;
1426
- }
1427
-
1428
- .queue-drawer-close {
1429
- display: flex;
1430
- }
1431
-
1432
- .mobile-queue-bar {
1433
- display: grid;
1434
- grid-template-columns: minmax(0, 1fr) auto;
1435
- gap: 12px;
1436
- align-items: center;
1437
- border: 1px solid var(--line-strong);
1438
- border-left: 3px solid var(--accent);
1439
- border-radius: var(--radius);
1440
- padding: 11px 14px;
1441
- margin-bottom: 14px;
1442
- background:
1443
- linear-gradient(90deg, color-mix(in srgb, var(--k-brand) 8%, transparent), transparent 46%),
1444
- linear-gradient(180deg, var(--ink-800), var(--ink-850));
1445
- animation: rise 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
1446
- }
1447
-
1448
- .mobile-queue-progress {
1449
- display: grid;
1450
- gap: 3px;
1451
- min-width: 0;
1452
- }
1453
-
1454
- .mobile-queue-item-label {
1455
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1456
- font-size: 13px;
1457
- font-weight: 600;
1458
- color: var(--paper);
1459
- overflow-wrap: anywhere;
1460
- word-break: break-word;
1461
- }
1462
-
1463
- .mobile-queue-open {
1464
- flex-shrink: 0;
1465
- min-height: 34px;
1466
- padding: 0 14px;
1467
- border: 1px solid var(--line-strong);
1468
- border-radius: 999px;
1469
- background: color-mix(in srgb, var(--k-brand) 8%, transparent);
1470
- color: var(--accent);
1471
- cursor: pointer;
1472
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1473
- font-size: 11px;
1474
- font-weight: 600;
1475
- letter-spacing: 0.06em;
1476
- transition: background 0.16s ease, border-color 0.16s ease;
1477
- }
1478
-
1479
- .mobile-queue-open:hover {
1480
- background: color-mix(in srgb, var(--k-brand) 16%, transparent);
1481
- border-color: var(--accent);
1482
- }
1483
-
1484
- /* Higher specificity than the @container stacked-layout fallback below:
1485
- on a narrow viewport the drawer must win even inside a narrow container. */
1486
- .queue-layout .queue-panel {
1487
- position: fixed;
1488
- top: 0;
1489
- left: 0;
1490
- bottom: 0;
1491
- width: min(320px, 90vw);
1492
- z-index: 50;
1493
- overflow-y: auto;
1494
- overflow-x: hidden;
1495
- transform: translateX(-105%);
1496
- transition: transform 0.26s cubic-bezier(0.22, 1, 0.36, 1);
1497
- border-radius: 0 var(--radius) var(--radius) 0;
1498
- padding-top: 50px;
1499
- }
1500
-
1501
- .queue-layout .queue-panel.is-open {
1502
- transform: translateX(0);
1503
- }
1504
-
1505
- .content-grid {
1506
- grid-area: content;
1507
- }
1508
-
1509
- .candidate-grid::before {
1510
- display: none;
1511
- }
1512
-
1513
- .content-grid,
1514
- .review-main,
1515
- .candidate-grid,
1516
- .decision-column {
1517
- min-width: 0;
1518
- }
1519
-
1520
- .meta-grid {
1521
- grid-template-columns: repeat(2, minmax(0, 1fr));
1522
- }
1523
-
1524
- .candidate-card {
1525
- min-height: auto;
1526
- }
1527
- }
1528
-
1529
- @container (max-width: 1100px) {
1530
- .topbar,
1531
- .queue-layout,
1532
- .focus-evidence {
1533
- grid-template-columns: 1fr;
1534
- }
1535
-
1536
- .queue-layout {
1537
- grid-template-areas:
1538
- "content"
1539
- "queue";
1540
- }
1541
-
1542
- .queue-panel {
1543
- grid-area: queue;
1544
- position: static;
1545
- }
1546
-
1547
- .content-grid {
1548
- grid-area: content;
1549
- grid-template-columns: 1fr;
1550
- grid-template-areas:
1551
- "focus"
1552
- "decision"
1553
- "candidates";
1554
- }
1555
-
1556
- .content-grid,
1557
- .review-main,
1558
- .candidate-grid,
1559
- .decision-column {
1560
- min-width: 0;
1561
- }
947
+ .caption {
948
+ text-align: center;
949
+ margin-top: 24px;
950
+ font-size: 12.5px;
951
+ color: var(--k-faint);
1562
952
  }
1563
953
 
1564
- @container (max-width: 860px) {
1565
- .candidate-grid,
1566
- .focus-values,
1567
- .preview-section-grid {
1568
- grid-template-columns: 1fr;
1569
- }
1570
-
1571
- .candidate-grid::before {
1572
- display: none;
1573
- }
1574
-
1575
- .candidate-card {
1576
- min-height: auto;
1577
- }
1578
- }
954
+ /* ---------- responsive ----------
955
+ The workbench sets `container-type: inline-size`, so these breakpoints fire on
956
+ the component's own width — correct whether it renders full-bleed on a phone or
957
+ in a narrow column on a wide desktop. Mobile is the primary context, so tap
958
+ targets stay comfortable and nothing forces a horizontal scroll. */
1579
959
 
1580
960
  @container (max-width: 620px) {
1581
- .topbar .meta-grid {
1582
- display: none;
1583
- }
1584
-
1585
- .decision-buttons,
1586
- .summary-grid,
1587
- .audit-grid {
1588
- grid-template-columns: 1fr;
1589
- }
1590
- }
1591
-
1592
- @media (max-width: 560px) {
1593
961
  .workbench {
1594
- padding: 14px 10px 36px;
962
+ padding: 16px 12px 56px;
1595
963
  }
1596
964
 
1597
- .workbench-shell {
1598
- gap: 14px;
965
+ .fbody {
966
+ padding: 16px 15px 18px;
1599
967
  }
1600
968
 
1601
- .topbar,
1602
- .active-review-strip,
1603
- .queue-list,
1604
- .session-summary,
1605
- .session-audit,
1606
- .candidate-card,
1607
- .decision-row,
1608
- .payload-panel,
1609
- .surface-preview {
1610
- border-radius: 10px;
1611
- padding: 14px;
969
+ .rhead {
970
+ padding: 16px;
1612
971
  }
1613
972
 
1614
- .topbar {
1615
- gap: 14px;
973
+ .foot {
974
+ padding: 14px 15px;
1616
975
  }
1617
976
 
1618
- .topbar .meta-grid {
1619
- display: none;
977
+ .rhead h1 {
978
+ font-size: 19px;
1620
979
  }
1621
980
 
1622
- .active-review-strip {
981
+ /* current → proposed stack vertically; the arrow rotates to point down. */
982
+ .diff {
1623
983
  grid-template-columns: 1fr;
1624
984
  gap: 10px;
1625
985
  }
1626
986
 
1627
- .active-review-actions {
1628
- grid-template-columns: minmax(0, 1fr);
1629
- justify-items: stretch;
1630
- }
1631
-
1632
- .active-review-actions .state-label {
987
+ .diff .arrow {
988
+ transform: rotate(90deg);
1633
989
  justify-self: start;
990
+ margin: 1px 0;
1634
991
  }
1635
992
 
1636
- .review-question {
1637
- font-size: 13px;
1638
- }
1639
-
1640
- h1 {
1641
- font-size: 25px;
1642
- line-height: 1.08;
1643
- }
1644
-
1645
- .summary-grid,
1646
- .focus-values,
1647
- .decision-buttons {
1648
- grid-template-columns: 1fr;
1649
- }
1650
-
1651
- .queue-head,
1652
- .queue-row,
1653
- .surface-head,
1654
- .card-head {
1655
- display: grid;
1656
- grid-template-columns: 1fr;
1657
- }
1658
-
1659
- .queue-head {
1660
- align-items: stretch;
1661
- }
1662
-
1663
- .next-button {
1664
- width: 100%;
1665
- }
1666
-
1667
- .queue-row {
1668
- justify-items: start;
1669
- }
1670
-
1671
- .state-label {
1672
- min-width: 0;
1673
- max-width: 100%;
1674
- justify-self: start;
1675
- white-space: normal;
1676
- }
1677
-
1678
- .role {
1679
- font-size: 19px;
1680
- }
1681
-
1682
- .review-focus {
1683
- border-radius: 10px;
1684
- padding: 14px;
1685
- }
1686
-
1687
- .focus-head {
1688
- grid-template-columns: 1fr;
1689
- }
1690
-
1691
- .focus-value strong {
1692
- font-size: clamp(16px, 5cqi, 22px);
1693
- }
1694
-
1695
- .candidate-value .field-value {
1696
- font-size: clamp(15px, 4.5cqi, 20px);
1697
- line-height: 1.12;
1698
- }
1699
-
1700
- .candidate-card .field-stack .field-value,
1701
- .compact .field-value,
1702
- pre {
1703
- font-size: 11.5px;
1704
- }
1705
-
1706
- .field-label,
1707
- .eyebrow {
1708
- letter-spacing: 0.09em;
1709
- }
1710
-
1711
- .decision-button {
993
+ /* Apply spans the header row as an easy thumb target. */
994
+ .apply {
995
+ flex: 1;
1712
996
  min-height: 44px;
1713
997
  }
1714
-
1715
- pre {
1716
- max-height: 360px;
1717
- padding: 11px;
1718
- }
1719
- }
1720
-
1721
- /* ---- Type legibility: serif → UI sans below 480px -------------------- */
1722
- /* At small container sizes the Fraunces display font reads poorly; fall back
1723
- to the UI sans-serif stack for headings while keeping serif on desktop. */
1724
- @media (max-width: 480px) {
1725
- h1,
1726
- h2,
1727
- h3,
1728
- .role,
1729
- .surface-summary-label,
1730
- .queue-head h2,
1731
- .session-summary h2,
1732
- .session-audit h2,
1733
- .surface-head h2,
1734
- .summary-grid .meta-value {
1735
- font-family: var(--k-font-ui, "Hanken Grotesk", system-ui, sans-serif);
1736
- letter-spacing: -0.01em;
1737
- }
1738
998
  }
1739
999
 
1740
1000
  @container (max-width: 480px) {
1741
- h1,
1742
- h2,
1743
- h3,
1744
- .role,
1745
- .surface-summary-label,
1746
- .queue-head h2,
1747
- .session-summary h2,
1748
- .session-audit h2,
1749
- .surface-head h2,
1750
- .summary-grid .meta-value {
1751
- font-family: var(--k-font-ui, "Hanken Grotesk", system-ui, sans-serif);
1752
- letter-spacing: -0.01em;
1753
- }
1754
- }
1755
-
1756
- @media (max-width: 420px) {
1757
- h1 {
1758
- font-size: 23px;
1759
- line-height: 1.1;
1760
- }
1761
-
1762
- .topbar {
1763
- padding: 12px;
1764
- }
1765
-
1766
- .topbar .meta-grid {
1001
+ /* The two primary actions go full-width and tall so they're the obvious,
1002
+ thumb-friendly call to action; the calibration toggle sits below them. */
1003
+ .decide {
1004
+ flex-direction: column;
1005
+ align-items: stretch;
1767
1006
  gap: 8px;
1768
1007
  }
1769
1008
 
1770
- .topbar .meta-item {
1771
- padding: 9px 10px;
1009
+ .btn {
1010
+ width: 100%;
1011
+ min-height: 46px;
1012
+ font-size: 15px;
1772
1013
  }
1773
1014
 
1774
- .candidate-card .field-stack .field-value,
1775
- .compact .field-value {
1776
- display: block;
1777
- text-align: left;
1015
+ .wrong {
1016
+ order: 0;
1017
+ margin-right: 0;
1018
+ justify-content: flex-start;
1019
+ min-height: 44px;
1778
1020
  }
1779
1021
 
1780
- .decision-buttons {
1022
+ .frow1 {
1781
1023
  gap: 8px;
1782
1024
  }
1783
-
1784
- .decision-button {
1785
- min-height: 40px;
1786
- padding: 8px 10px;
1787
- font-size: 12px;
1788
- }
1789
-
1790
- .candidate-card .field-stack > .field:nth-child(5) .field-value {
1791
- display: inline-block;
1792
- }
1793
1025
  }
1794
1026
 
1795
- @media (max-width: 360px) {
1796
- .workbench {
1797
- padding-inline: 8px;
1798
- }
1799
-
1800
- .topbar,
1801
- .active-review-strip,
1802
- .queue-list,
1803
- .session-summary,
1804
- .session-audit,
1805
- .review-focus,
1806
- .candidate-card,
1807
- .decision-row,
1808
- .payload-panel,
1809
- .surface-preview {
1810
- padding: 12px;
1811
- }
1812
-
1813
- h1 {
1814
- font-size: 20px;
1815
- }
1816
-
1817
- .review-question {
1818
- font-size: 12px;
1819
- line-height: 1.35;
1820
- }
1821
-
1822
- .topbar .meta-grid {
1823
- display: none;
1824
- }
1825
-
1826
- .review-focus {
1827
- gap: 10px;
1828
- }
1829
-
1830
- .focus-value {
1831
- padding: 10px;
1832
- }
1833
-
1834
- .focus-value strong {
1835
- margin-top: 6px;
1836
- font-size: 18px;
1837
- line-height: 1.05;
1027
+ /* The diff-collapse must also hold in host contexts without a query container
1028
+ (e.g. an embed that doesn't establish `container-type`): fall back to viewport. */
1029
+ @media (max-width: 620px) {
1030
+ .diff {
1031
+ grid-template-columns: 1fr;
1838
1032
  }
1839
1033
 
1840
- .focus-value span:last-child {
1841
- margin-top: 6px;
1034
+ .diff .arrow {
1035
+ transform: rotate(90deg);
1036
+ justify-self: start;
1842
1037
  }
1038
+ }
1843
1039
 
1844
- .candidate-value .field-value {
1845
- font-size: 17px;
1040
+ @media (prefers-reduced-motion: reduce) {
1041
+ * {
1042
+ transition: none !important;
1846
1043
  }
1847
1044
  }