@kontourai/survey 1.10.0 → 1.12.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,656 @@ 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 ------------------------------------------ */
179
-
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;
189
- }
190
-
191
- .field-label {
192
- color: var(--paper-faint);
193
- letter-spacing: 0.14em;
194
- }
136
+ /* ---------- review panel + header ---------- */
195
137
 
196
- .field-value,
197
- .meta-value {
198
- overflow-wrap: anywhere;
199
- word-break: break-word;
200
- line-height: 1.4;
201
- color: var(--paper);
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;
202
144
  }
203
145
 
204
- /* ---- Top command bar -------------------------------------------------- */
205
-
206
- .topbar {
146
+ .rhead {
147
+ padding: 20px 22px;
148
+ border-bottom: 1px solid var(--k-line);
207
149
  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;
150
+ gap: 14px;
219
151
  }
220
152
 
221
- .topbar > div {
222
- min-width: 0;
153
+ .rhead .top {
154
+ display: flex;
155
+ align-items: flex-start;
156
+ gap: 14px;
157
+ flex-wrap: wrap;
223
158
  }
224
159
 
225
- .topbar .eyebrow::before {
226
- content: "● ";
227
- color: var(--verify);
160
+ .rhead .eyebrow {
161
+ font-size: 12px;
162
+ letter-spacing: 0.08em;
163
+ text-transform: uppercase;
164
+ color: var(--k-faint);
228
165
  }
229
166
 
230
- h1 {
231
- margin-top: 6px;
232
- font-family: "Fraunces", Georgia, "Times New Roman", serif;
233
- font-optical-sizing: auto;
234
- font-weight: 600;
235
- font-size: clamp(21px, 2vw, 27px);
236
- line-height: 1.08;
167
+ .rhead h1 {
168
+ margin: 2px 0 0;
169
+ font-size: 21px;
170
+ line-height: 1.2;
171
+ text-wrap: balance;
237
172
  letter-spacing: -0.01em;
238
173
  overflow-wrap: anywhere;
239
- color: var(--paper);
240
- }
241
-
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
174
  }
249
175
 
250
- .review-question strong {
251
- color: var(--paper);
252
- font-family: "IBM Plex Mono", ui-monospace, monospace;
253
- font-size: 0.95em;
176
+ .rhead .subj {
177
+ flex: 1;
178
+ min-width: 240px;
254
179
  }
255
180
 
256
- .review-target-label {
257
- margin-top: 4px;
181
+ .meta {
182
+ display: flex;
183
+ gap: 18px;
184
+ flex-wrap: wrap;
185
+ font-size: 12.5px;
186
+ color: var(--k-muted);
258
187
  }
259
188
 
260
- .review-target-label strong {
261
- color: var(--paper);
262
- font-family: "IBM Plex Mono", ui-monospace, monospace;
263
- font-size: 13px;
189
+ .meta b {
190
+ color: var(--k-text);
264
191
  font-weight: 600;
192
+ font-variant-numeric: tabular-nums;
265
193
  }
266
194
 
267
- .meta-grid {
268
- display: none;
269
- grid-template-columns: repeat(4, minmax(110px, 1fr));
270
- gap: 10px;
271
- width: 100%;
195
+ /* progress + apply */
196
+
197
+ .progress {
198
+ display: flex;
199
+ align-items: center;
200
+ gap: 14px;
201
+ flex-wrap: wrap;
272
202
  }
273
203
 
274
- .meta-item,
275
- .field {
276
- min-width: 0;
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);
277
212
  }
278
213
 
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));
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);
284
220
  }
285
221
 
286
- [data-theme="light"] .meta-item {
287
- background: color-mix(in srgb, var(--k-bg) 70%, var(--k-panel));
222
+ .ptext {
223
+ font-size: 13px;
224
+ color: var(--k-muted);
225
+ font-variant-numeric: tabular-nums;
226
+ white-space: nowrap;
288
227
  }
289
228
 
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);
229
+ .ptext b {
230
+ color: var(--k-text);
297
231
  }
298
232
 
299
- /* Status reads as a signal in the command bar. */
300
- .meta-item:nth-child(2) .meta-value {
301
- color: var(--accent);
233
+ .apply {
234
+ border: 0;
235
+ background: var(--k-brand);
236
+ color: var(--k-brand-ink);
302
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;
303
244
  }
304
245
 
305
- /* ---- Layout scaffold -------------------------------------------------- */
306
-
307
- .queue-layout {
308
- display: grid;
309
- grid-template-columns: 280px minmax(0, 1fr);
310
- gap: 16px;
311
- align-items: start;
246
+ .apply:hover {
247
+ filter: brightness(1.06);
312
248
  }
313
249
 
314
- .queue-panel {
315
- display: grid;
316
- gap: 14px;
317
- position: sticky;
318
- top: 18px;
250
+ .apply:active {
251
+ transform: translateY(1px);
319
252
  }
320
253
 
321
- .active-review-strip {
322
- display: none;
254
+ .apply:disabled {
255
+ opacity: 0.45;
256
+ cursor: not-allowed;
257
+ filter: none;
323
258
  }
324
259
 
325
- /* ---- Mobile queue progress bar (mobile only) -------------------------- */
260
+ /* ---------- field cards ---------- */
326
261
 
327
- .mobile-queue-bar {
328
- display: none;
262
+ .fields {
263
+ display: flex;
264
+ flex-direction: column;
329
265
  }
330
266
 
331
- /* ---- Queue drawer backdrop -------------------------------------------- */
332
-
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;
267
+ .field {
268
+ display: grid;
269
+ grid-template-columns: 4px 1fr;
270
+ gap: 0;
271
+ border-top: 1px solid var(--k-line);
343
272
  }
344
273
 
345
- .queue-drawer-backdrop.is-visible {
346
- opacity: 1;
347
- pointer-events: auto;
274
+ .field:first-child {
275
+ border-top: 0;
348
276
  }
349
277
 
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;
278
+ .stripe {
279
+ background: var(--k-line);
280
+ transition: background 0.25s;
369
281
  }
370
282
 
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;
381
- }
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); }
382
287
 
383
- .queue-head {
288
+ .fbody {
289
+ padding: 18px 22px 20px;
384
290
  display: grid;
385
- grid-template-columns: minmax(0, 1fr) auto;
386
- gap: 8px;
387
- align-items: center;
388
- margin-bottom: 14px;
389
- }
390
-
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;
291
+ gap: 13px;
292
+ min-width: 0;
399
293
  }
400
294
 
401
- /* ---- Queue rows: status carried on data-queue-status ------------------ */
402
-
403
- .queue-row {
404
- display: grid;
405
- grid-template-columns: minmax(0, 1fr) auto;
406
- gap: 10px;
295
+ .frow1 {
296
+ display: flex;
407
297
  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;
298
+ gap: 10px;
299
+ flex-wrap: wrap;
420
300
  }
421
301
 
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));
302
+ .fname {
303
+ font-size: 15.5px;
304
+ font-weight: 650;
305
+ letter-spacing: -0.005em;
426
306
  }
427
307
 
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);
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;
432
316
  }
433
317
 
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); }
439
-
440
- .queue-row-main {
441
- display: grid;
442
- gap: 4px;
443
- min-width: 0;
318
+ .chip {
319
+ font-size: 12px;
320
+ font-weight: 600;
321
+ padding: 3px 10px;
322
+ border-radius: 999px;
323
+ display: inline-flex;
324
+ align-items: center;
325
+ gap: 6px;
444
326
  }
445
327
 
446
- .queue-row-title,
447
- .queue-row-target {
448
- overflow-wrap: anywhere;
449
- word-break: break-word;
328
+ .chip::before {
329
+ content: "";
330
+ width: 6px;
331
+ height: 6px;
332
+ border-radius: 999px;
333
+ background: currentColor;
450
334
  }
451
335
 
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);
458
- }
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); }
459
340
 
460
- .queue-row-target {
461
- color: var(--paper-dim);
462
- font-size: 12px;
341
+ .frow1 .push {
342
+ margin-left: auto;
463
343
  }
464
344
 
465
- /* ---- Status pills ----------------------------------------------------- */
345
+ /* the diff */
466
346
 
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;
347
+ .diff {
348
+ display: grid;
349
+ grid-template-columns: 1fr auto 1fr;
350
+ gap: 12px;
351
+ align-items: stretch;
477
352
  }
478
353
 
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); }
354
+ /* narrow-width collapse for .diff lives in the responsive section at the foot. */
483
355
 
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;
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);
361
+ min-width: 0;
362
+ }
363
+
364
+ .val .vlbl {
493
365
  font-size: 11px;
494
- font-weight: 600;
495
366
  letter-spacing: 0.06em;
496
- transition: background 0.16s ease, border-color 0.16s ease;
367
+ text-transform: uppercase;
368
+ color: var(--k-faint);
369
+ margin-bottom: 4px;
497
370
  }
498
371
 
499
- .next-button:hover {
500
- background: color-mix(in srgb, var(--k-brand) 16%, transparent);
501
- border-color: var(--accent);
372
+ .val .vtext {
373
+ font-size: 14.5px;
374
+ word-break: break-word;
375
+ white-space: pre-wrap;
502
376
  }
503
377
 
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;
378
+ .val.current {
379
+ background: var(--k-sunken);
511
380
  }
512
381
 
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));
382
+ .val.current .vtext {
383
+ color: var(--k-muted);
518
384
  }
519
385
 
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);
386
+ .val.proposed {
387
+ border-color: color-mix(in srgb, var(--k-brand) 45%, var(--k-line));
526
388
  }
527
389
 
528
- /* ---- Session audit: replayable resource trail ------------------------- */
390
+ .val.empty .vtext {
391
+ color: var(--k-faint);
392
+ font-style: italic;
393
+ }
529
394
 
530
- .session-audit {
531
- display: grid;
532
- gap: 14px;
533
- animation-delay: 0.08s;
395
+ .arrow {
396
+ align-self: center;
397
+ color: var(--k-faint);
534
398
  }
535
399
 
536
- .session-audit-head {
537
- display: grid;
538
- grid-template-columns: minmax(0, 1fr) auto;
400
+ .editrow {
401
+ display: flex;
402
+ align-items: center;
539
403
  gap: 8px;
540
- align-items: start;
404
+ margin-top: 8px;
541
405
  }
542
406
 
543
- .session-audit-head h2 {
544
- margin-top: 5px;
545
- overflow-wrap: anywhere;
407
+ .editrow input {
408
+ flex: 1;
409
+ min-width: 0;
410
+ font-size: 13.5px;
411
+ color: var(--k-text);
412
+ background: var(--k-panel);
413
+ border: 1px solid var(--k-line-strong);
414
+ border-radius: 6px;
415
+ padding: 6px 9px;
546
416
  }
547
417
 
548
- .audit-grid {
549
- grid-template-columns: repeat(2, minmax(0, 1fr));
418
+ .editrow input:focus-visible {
419
+ outline: 2px solid var(--k-brand);
420
+ outline-offset: 1px;
421
+ border-color: var(--k-brand);
550
422
  }
551
423
 
552
- .audit-grid .meta-value {
553
- font-family: "IBM Plex Mono", ui-monospace, monospace;
554
- font-size: 11px;
555
- line-height: 1.3;
424
+ .editrow .ehint {
425
+ font-size: 11.5px;
426
+ color: var(--k-faint);
427
+ white-space: nowrap;
556
428
  }
557
429
 
558
- .session-event-list {
430
+ /* confidence + provenance */
431
+
432
+ .prov {
559
433
  display: grid;
560
- gap: 8px;
561
- margin: 0;
562
- padding: 0;
563
- list-style: none;
434
+ gap: 9px;
435
+ padding: 11px 13px;
436
+ border-radius: var(--k-radius-sm);
437
+ background: var(--k-sunken);
438
+ border: 1px solid var(--k-line);
564
439
  }
565
440
 
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);
441
+ .conf {
442
+ display: flex;
443
+ align-items: center;
444
+ gap: 10px;
445
+ font-size: 12.5px;
446
+ color: var(--k-muted);
447
+ flex-wrap: wrap;
575
448
  }
576
449
 
577
- .event-sequence {
578
- display: grid;
579
- place-items: center;
580
- width: 24px;
581
- height: 24px;
582
- border: 1px solid var(--line-strong);
450
+ .conf .meter {
451
+ width: 84px;
452
+ height: 6px;
583
453
  border-radius: 999px;
584
- color: var(--accent);
585
- font-family: "IBM Plex Mono", ui-monospace, monospace;
586
- font-size: 10px;
587
- font-weight: 700;
454
+ background: var(--k-line-strong);
455
+ overflow: hidden;
588
456
  }
589
457
 
590
- .session-event-list strong,
591
- .session-event-list small {
458
+ .conf .meter > i {
592
459
  display: block;
593
- min-width: 0;
594
- overflow-wrap: anywhere;
460
+ height: 100%;
461
+ border-radius: 999px;
462
+ background: var(--k-positive);
595
463
  }
596
464
 
597
- .session-event-list strong {
598
- color: var(--paper);
599
- font-family: "IBM Plex Mono", ui-monospace, monospace;
600
- font-size: 11px;
465
+ .conf .meter.mid > i {
466
+ background: var(--k-caution);
601
467
  }
602
468
 
603
- .session-event-list small {
604
- margin-top: 3px;
605
- color: var(--paper-faint);
606
- font-size: 10.5px;
607
- line-height: 1.35;
469
+ .conf .pct {
470
+ font-variant-numeric: tabular-nums;
471
+ font-weight: 600;
472
+ color: var(--k-text);
473
+ font-family: var(--k-font-mono);
474
+ font-size: 12px;
608
475
  }
609
476
 
610
- .session-export {
611
- border-top: 1px solid var(--line);
612
- padding-top: 12px;
477
+ .excerpt {
478
+ font-size: 13px;
479
+ color: var(--k-text);
613
480
  }
614
481
 
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;
482
+ .excerpt q {
483
+ color: var(--k-text);
622
484
  }
623
485
 
624
- .session-export pre {
625
- max-height: 300px;
626
- }
486
+ .excerpt q::before { content: "\201C"; }
487
+ .excerpt q::after { content: "\201D"; }
627
488
 
628
- /* ---- Content grid ----------------------------------------------------- */
489
+ .excerpt .from {
490
+ display: inline-flex;
491
+ align-items: center;
492
+ gap: 5px;
493
+ margin-top: 5px;
494
+ font-size: 12px;
495
+ color: var(--k-muted);
496
+ flex-wrap: wrap;
497
+ }
629
498
 
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;
499
+ .excerpt .from a {
500
+ color: var(--k-brand);
501
+ text-decoration: underline;
502
+ text-underline-offset: 2px;
639
503
  }
640
504
 
641
- .review-main {
642
- display: grid;
643
- gap: 14px;
644
- min-width: 0;
505
+ .noprov {
506
+ display: flex;
507
+ align-items: center;
508
+ gap: 8px;
509
+ font-size: 13px;
510
+ color: var(--k-caution);
511
+ flex-wrap: wrap;
645
512
  }
646
513
 
647
- /* ---- Active review focus ---------------------------------------------- */
514
+ .noprov svg {
515
+ flex: none;
516
+ }
648
517
 
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);
518
+ .noprov .tag {
519
+ background: var(--k-caution-wash);
520
+ color: var(--k-caution);
521
+ font-weight: 600;
522
+ padding: 2px 8px;
523
+ border-radius: 999px;
524
+ font-size: 12px;
661
525
  }
662
526
 
663
- .focus-head,
664
- .focus-values {
665
- display: grid;
527
+ /* decisions */
528
+
529
+ /* The decision row is the point of the card, so it sits on its own line,
530
+ right-aligned and prominent. The quiet calibration toggle is pushed to the
531
+ far left so the two primary actions read as the clear call to action. */
532
+ .decide {
533
+ display: flex;
666
534
  gap: 10px;
535
+ flex-wrap: wrap;
536
+ align-items: center;
537
+ justify-content: flex-end;
538
+ margin-top: 2px;
667
539
  }
668
540
 
669
- .focus-head {
670
- grid-template-columns: minmax(0, 1fr) auto;
541
+ .btn {
542
+ border: 1px solid var(--k-line-strong);
543
+ background: var(--k-raised);
544
+ color: var(--k-text);
545
+ font-size: 14px;
546
+ font-weight: 600;
547
+ padding: 0 18px;
548
+ min-height: 42px;
549
+ border-radius: 9px;
550
+ cursor: pointer;
551
+ display: inline-flex;
671
552
  align-items: center;
553
+ justify-content: center;
554
+ gap: 7px;
555
+ transition: background 0.12s, border-color 0.12s, color 0.12s, filter 0.12s;
672
556
  }
673
557
 
674
- .focus-values {
675
- grid-template-columns: repeat(2, minmax(0, 1fr));
558
+ .btn:hover {
559
+ background: var(--k-sunken);
560
+ border-color: var(--k-line-strong);
676
561
  }
677
562
 
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));
563
+ .btn:focus-visible {
564
+ outline: 2px solid var(--k-brand);
565
+ outline-offset: 2px;
684
566
  }
685
567
 
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;
568
+ /* Use proposed — the filled positive primary, the loudest thing on the card. */
569
+ .btn.use {
570
+ background: var(--k-positive);
571
+ border-color: var(--k-positive);
572
+ color: #ffffff;
694
573
  }
695
574
 
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;
575
+ .btn.use:hover {
576
+ background: var(--k-positive);
577
+ border-color: var(--k-positive);
578
+ color: #ffffff;
579
+ filter: brightness(1.07);
702
580
  }
703
581
 
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)));
582
+ /* Keep current — a strong neutral secondary; still prominent, clearly not the accept. */
583
+ .btn.keep {
584
+ border-color: var(--k-line-strong);
585
+ background: var(--k-panel-raised, var(--k-raised));
707
586
  }
708
587
 
709
- .focus-value.is-proposed strong {
710
- color: var(--proposed);
588
+ /* "Suggestion was wrong" — optional quiet calibration toggle on Keep current.
589
+ Ticking it turns a keep-current decision into the reject signal. Not a third action. */
590
+ .wrong {
591
+ order: -1;
592
+ margin-right: auto;
593
+ display: inline-flex;
594
+ align-items: center;
595
+ gap: 7px;
596
+ font-size: 12.5px;
597
+ color: var(--k-faint);
598
+ cursor: pointer;
599
+ user-select: none;
600
+ padding: 8px 4px;
601
+ min-height: 40px;
711
602
  }
712
603
 
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;
604
+ .wrong:hover {
605
+ color: var(--k-negative);
718
606
  }
719
607
 
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;
608
+ .wrong input {
609
+ width: 15px;
610
+ height: 15px;
611
+ accent-color: var(--k-negative);
612
+ cursor: pointer;
613
+ margin: 0;
733
614
  }
734
615
 
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;
616
+ .decided {
617
+ display: none;
618
+ align-items: center;
619
+ justify-content: flex-end;
620
+ gap: 10px;
753
621
  font-size: 13px;
754
- box-shadow: var(--k-shadow, 0 10px 26px -12px rgba(0, 0, 0, 0.9));
622
+ color: var(--k-muted);
755
623
  }
756
624
 
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));
625
+ .field[data-decided="1"] .decide {
626
+ display: none;
765
627
  }
766
628
 
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;
629
+ .field[data-decided="1"] .decided {
630
+ display: flex;
777
631
  }
778
632
 
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);
633
+ .undo {
634
+ border: 0;
635
+ background: none;
636
+ color: var(--k-brand);
637
+ font-size: 13px;
638
+ cursor: pointer;
639
+ text-decoration: underline;
640
+ text-underline-offset: 2px;
641
+ padding: 0;
782
642
  }
783
643
 
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%);
644
+ /* footer tally */
645
+
646
+ .foot {
647
+ padding: 16px 22px;
648
+ border-top: 1px solid var(--k-line);
649
+ display: flex;
650
+ align-items: center;
651
+ gap: 16px;
652
+ flex-wrap: wrap;
653
+ background: var(--k-raised);
790
654
  }
791
655
 
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);
656
+ .tally {
657
+ display: flex;
658
+ gap: 16px;
659
+ font-size: 13px;
660
+ color: var(--k-muted);
661
+ flex-wrap: wrap;
795
662
  }
796
663
 
797
- .candidate-card.is-unselected {
798
- opacity: 0.5;
799
- filter: saturate(0.7);
664
+ .tally b {
665
+ color: var(--k-text);
666
+ font-variant-numeric: tabular-nums;
800
667
  }
801
668
 
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;
669
+ /* ---------- audit details: the single collapsed power-user surface per field ---------- */
670
+
671
+ .audit-details {
672
+ border-top: 1px dashed var(--k-line);
673
+ padding-top: 4px;
809
674
  }
810
675
 
811
- .card-head .eyebrow {
812
- color: var(--paper-faint);
813
- font-size: 10px;
814
- letter-spacing: 0.1em;
676
+ .audit-details summary {
677
+ cursor: pointer;
678
+ padding: 6px 0;
679
+ color: var(--k-faint);
680
+ font-size: 12px;
681
+ letter-spacing: 0.04em;
815
682
  text-transform: uppercase;
816
- overflow-wrap: anywhere;
817
- word-break: break-word;
683
+ font-weight: 600;
818
684
  }
819
685
 
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);
686
+ .audit-details summary:hover {
687
+ color: var(--k-muted);
827
688
  }
828
689
 
829
- .candidate-card:nth-child(2) .role {
830
- color: var(--proposed);
690
+ .audit-details[open] summary {
691
+ color: var(--k-brand);
831
692
  }
832
693
 
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);
694
+ .audit-body {
695
+ display: grid;
696
+ gap: 14px;
697
+ padding: 4px 0 6px;
837
698
  }
838
699
 
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;
700
+ .note-field {
701
+ display: grid;
702
+ gap: 6px;
845
703
  }
846
704
 
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);
705
+ .field-label {
706
+ color: var(--k-faint);
707
+ font-size: 11px;
851
708
  font-weight: 600;
852
- line-height: 1.22;
853
- letter-spacing: 0;
854
- color: var(--paper);
709
+ letter-spacing: 0.06em;
710
+ text-transform: uppercase;
711
+ }
712
+
713
+ .field-value {
714
+ overflow-wrap: anywhere;
715
+ word-break: break-word;
716
+ line-height: 1.4;
717
+ color: var(--k-text);
718
+ font-size: 12.5px;
855
719
  }
856
720
 
857
- .candidate-card:nth-child(2) .candidate-value .field-value {
858
- color: var(--proposed);
721
+ .note-field textarea {
722
+ display: block;
723
+ width: 100%;
724
+ min-height: 60px;
725
+ resize: vertical;
726
+ border: 1px solid var(--k-line-strong);
727
+ border-radius: var(--k-radius-sm);
728
+ padding: 8px 10px;
729
+ color: var(--k-text);
730
+ background: var(--k-sunken);
731
+ font-family: var(--k-font-mono);
732
+ font-size: 12px;
733
+ line-height: 1.5;
859
734
  }
860
735
 
861
- .is-selected .candidate-value .field-value {
862
- color: var(--verify);
736
+ .note-field textarea:focus-visible {
737
+ outline: none;
738
+ border-color: var(--k-brand);
739
+ box-shadow: 0 0 0 3px var(--k-brand-wash);
863
740
  }
864
741
 
865
742
  .field-stack {
866
743
  display: grid;
867
744
  gap: 9px;
868
- position: relative;
869
- z-index: 1;
870
- align-content: start;
871
745
  }
872
746
 
873
- .field-value {
874
- margin-top: 4px;
875
- font-size: 12.5px;
747
+ .field-stack.compact {
748
+ gap: 6px;
876
749
  }
877
750
 
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);
751
+ .kv {
752
+ min-width: 0;
883
753
  }
884
754
 
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);
755
+ .kv .field-value {
756
+ margin-top: 3px;
757
+ font-family: var(--k-font-mono);
894
758
  font-size: 11.5px;
895
- font-weight: 600;
759
+ color: var(--k-muted);
896
760
  }
897
761
 
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;
906
- }
907
-
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 {
762
+ /* Excerpt / rationale 3-line clamp with inline "more / less" expander. */
763
+ .kv.excerpt .field-value,
764
+ .kv.rationale-clamp .field-value {
915
765
  display: -webkit-box;
916
766
  -webkit-box-orient: vertical;
917
767
  -webkit-line-clamp: 3;
918
768
  overflow: hidden;
769
+ font-family: var(--k-font-ui);
770
+ font-style: italic;
771
+ color: var(--k-muted);
919
772
  }
920
773
 
921
774
  .excerpt-clamp.is-expanded .field-value,
@@ -931,9 +784,9 @@ h1 {
931
784
  padding: 0;
932
785
  border: none;
933
786
  background: none;
934
- color: var(--accent);
787
+ color: var(--k-brand);
935
788
  cursor: pointer;
936
- font-family: "IBM Plex Mono", ui-monospace, monospace;
789
+ font-family: var(--k-font-mono);
937
790
  font-size: 10.5px;
938
791
  font-weight: 600;
939
792
  letter-spacing: 0.04em;
@@ -943,13 +796,10 @@ h1 {
943
796
  }
944
797
 
945
798
  .clamp-toggle:hover {
946
- color: var(--paper);
799
+ color: var(--k-text);
947
800
  }
948
801
 
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
-
802
+ /* Candidate history expander: >3 unselected candidates hide behind "view all (N)". */
953
803
  .history-overflow {
954
804
  display: none;
955
805
  }
@@ -964,21 +814,19 @@ h1 {
964
814
  gap: 4px;
965
815
  margin-top: 6px;
966
816
  padding: 3px 10px;
967
- border: 1px solid var(--line-strong);
817
+ border: 1px solid var(--k-line-strong);
968
818
  border-radius: 999px;
969
- background: color-mix(in srgb, var(--k-brand) 6%, transparent);
970
- color: var(--accent);
819
+ background: var(--k-brand-wash);
820
+ color: var(--k-brand);
971
821
  cursor: pointer;
972
- font-family: "IBM Plex Mono", ui-monospace, monospace;
973
- font-size: 10px;
822
+ font-size: 10.5px;
974
823
  font-weight: 600;
975
- letter-spacing: 0.06em;
824
+ letter-spacing: 0.04em;
976
825
  transition: background 0.14s ease, border-color 0.14s ease;
977
826
  }
978
827
 
979
828
  .history-expand-btn:hover {
980
- background: color-mix(in srgb, var(--k-brand) 14%, transparent);
981
- border-color: var(--accent);
829
+ border-color: var(--k-brand);
982
830
  }
983
831
 
984
832
  .history-expander.is-expanded .history-expand-btn .expand-label {
@@ -993,273 +841,46 @@ h1 {
993
841
  display: none;
994
842
  }
995
843
 
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
844
  .preview-section-grid {
1207
845
  display: grid;
1208
- grid-template-columns: repeat(2, minmax(0, 1fr));
1209
- gap: 8px;
846
+ gap: 10px;
1210
847
  }
1211
848
 
1212
849
  .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));
850
+ border: 1px solid var(--k-line);
851
+ border-radius: var(--k-radius-sm);
852
+ padding: 10px 12px;
853
+ background: var(--k-sunken);
1218
854
  }
1219
855
 
1220
856
  .preview-section h3 {
1221
- margin-bottom: 7px;
1222
- color: var(--accent);
1223
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1224
- font-size: 10px;
857
+ margin-bottom: 6px;
858
+ color: var(--k-faint);
859
+ font-size: 11px;
1225
860
  font-weight: 600;
1226
- letter-spacing: 0.1em;
861
+ letter-spacing: 0.06em;
1227
862
  text-transform: uppercase;
1228
863
  }
1229
864
 
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
865
  .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));
866
+ background: var(--k-raised);
1244
867
  }
1245
868
 
1246
869
  .preview-section.is-neutral h3 {
1247
- color: var(--paper-faint);
870
+ color: var(--k-faint);
1248
871
  }
1249
872
 
1250
873
  .reference-details {
1251
- margin-top: 10px;
1252
- border-top: 1px solid var(--line);
1253
- padding-top: 8px;
874
+ margin-top: 8px;
1254
875
  }
1255
876
 
1256
877
  .reference-details summary {
1257
878
  cursor: pointer;
1258
- color: var(--paper-faint);
1259
- font-family: "IBM Plex Mono", ui-monospace, monospace;
1260
- font-size: 10px;
879
+ list-style: none;
880
+ color: var(--k-faint);
881
+ font-size: 10.5px;
1261
882
  font-weight: 600;
1262
- letter-spacing: 0.08em;
883
+ letter-spacing: 0.04em;
1263
884
  text-transform: uppercase;
1264
885
  }
1265
886
 
@@ -1268,580 +889,140 @@ details.surface-preview[open] .surface-summary-label::before {
1268
889
  }
1269
890
 
1270
891
  .reference-details summary::before {
1271
- content: "› ";
1272
- color: var(--paper-faint);
1273
- }
1274
-
1275
- .reference-details[open] summary {
1276
- color: var(--accent);
892
+ content: "▸ ";
1277
893
  }
1278
894
 
1279
895
  .reference-details[open] summary::before {
1280
- content: "⌄ ";
1281
- color: var(--accent);
896
+ content: "▾ ";
1282
897
  }
1283
898
 
1284
899
  .reference-details .field-stack {
1285
900
  margin-top: 8px;
1286
901
  }
1287
902
 
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;
903
+ .preview-disclaimer {
904
+ font-size: 11.5px;
905
+ color: var(--k-faint);
906
+ line-height: 1.5;
1301
907
  }
1302
908
 
1303
- .payload-panel summary.field-label::before {
1304
- content: "› ";
1305
- color: var(--verify);
909
+ .preview-disclaimer-footer {
910
+ border-top: 1px solid var(--k-line);
911
+ padding-top: 10px;
1306
912
  }
1307
913
 
1308
- pre {
1309
- max-height: 280px;
1310
- margin: 12px 0 0;
914
+ /* ReviewDecision payload — deliberately the deepest, last thing in the audit details. */
915
+ .reference-details pre,
916
+ pre[data-testid="decision-payload"] {
917
+ margin: 8px 0 0;
918
+ max-height: 260px;
1311
919
  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;
920
+ padding: 10px;
921
+ border: 1px solid var(--k-line);
922
+ border-radius: var(--k-radius-sm);
923
+ background: var(--k-bg);
924
+ color: var(--k-muted);
925
+ font-family: var(--k-font-mono);
1318
926
  font-size: 11px;
1319
- line-height: 1.55;
927
+ line-height: 1.5;
1320
928
  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
- }
1336
-
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
929
  }
1528
930
 
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
- }
931
+ .caption {
932
+ text-align: center;
933
+ margin-top: 24px;
934
+ font-size: 12.5px;
935
+ color: var(--k-faint);
1562
936
  }
1563
937
 
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
- }
938
+ /* ---------- responsive ----------
939
+ The workbench sets `container-type: inline-size`, so these breakpoints fire on
940
+ the component's own width — correct whether it renders full-bleed on a phone or
941
+ in a narrow column on a wide desktop. Mobile is the primary context, so tap
942
+ targets stay comfortable and nothing forces a horizontal scroll. */
1579
943
 
1580
944
  @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
945
  .workbench {
1594
- padding: 14px 10px 36px;
946
+ padding: 16px 12px 56px;
1595
947
  }
1596
948
 
1597
- .workbench-shell {
1598
- gap: 14px;
949
+ .fbody {
950
+ padding: 16px 15px 18px;
1599
951
  }
1600
952
 
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;
953
+ .rhead {
954
+ padding: 16px;
1612
955
  }
1613
956
 
1614
- .topbar {
1615
- gap: 14px;
957
+ .foot {
958
+ padding: 14px 15px;
1616
959
  }
1617
960
 
1618
- .topbar .meta-grid {
1619
- display: none;
961
+ .rhead h1 {
962
+ font-size: 19px;
1620
963
  }
1621
964
 
1622
- .active-review-strip {
965
+ /* current → proposed stack vertically; the arrow rotates to point down. */
966
+ .diff {
1623
967
  grid-template-columns: 1fr;
1624
968
  gap: 10px;
1625
969
  }
1626
970
 
1627
- .active-review-actions {
1628
- grid-template-columns: minmax(0, 1fr);
1629
- justify-items: stretch;
1630
- }
1631
-
1632
- .active-review-actions .state-label {
1633
- justify-self: start;
1634
- }
1635
-
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%;
971
+ .diff .arrow {
972
+ transform: rotate(90deg);
1674
973
  justify-self: start;
1675
- white-space: normal;
974
+ margin: 1px 0;
1676
975
  }
1677
976
 
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 {
977
+ /* Apply spans the header row as an easy thumb target. */
978
+ .apply {
979
+ flex: 1;
1712
980
  min-height: 44px;
1713
981
  }
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
982
  }
1739
983
 
1740
984
  @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 {
985
+ /* The two primary actions go full-width and tall so they're the obvious,
986
+ thumb-friendly call to action; the calibration toggle sits below them. */
987
+ .decide {
988
+ flex-direction: column;
989
+ align-items: stretch;
1767
990
  gap: 8px;
1768
991
  }
1769
992
 
1770
- .topbar .meta-item {
1771
- padding: 9px 10px;
993
+ .btn {
994
+ width: 100%;
995
+ min-height: 46px;
996
+ font-size: 15px;
1772
997
  }
1773
998
 
1774
- .candidate-card .field-stack .field-value,
1775
- .compact .field-value {
1776
- display: block;
1777
- text-align: left;
999
+ .wrong {
1000
+ order: 0;
1001
+ margin-right: 0;
1002
+ justify-content: flex-start;
1003
+ min-height: 44px;
1778
1004
  }
1779
1005
 
1780
- .decision-buttons {
1006
+ .frow1 {
1781
1007
  gap: 8px;
1782
1008
  }
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
1009
  }
1794
1010
 
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;
1011
+ /* The diff-collapse must also hold in host contexts without a query container
1012
+ (e.g. an embed that doesn't establish `container-type`): fall back to viewport. */
1013
+ @media (max-width: 620px) {
1014
+ .diff {
1015
+ grid-template-columns: 1fr;
1838
1016
  }
1839
1017
 
1840
- .focus-value span:last-child {
1841
- margin-top: 6px;
1018
+ .diff .arrow {
1019
+ transform: rotate(90deg);
1020
+ justify-self: start;
1842
1021
  }
1022
+ }
1843
1023
 
1844
- .candidate-value .field-value {
1845
- font-size: 17px;
1024
+ @media (prefers-reduced-motion: reduce) {
1025
+ * {
1026
+ transition: none !important;
1846
1027
  }
1847
1028
  }