fraim-framework 2.0.154 → 2.0.159

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,19 +1,20 @@
1
- :root {
2
- color-scheme: light;
3
- --bg: #ebe4d7;
4
- --surface: #f8f4eb;
5
- --soft: #f1ebde;
6
- --line: #d7cdbf;
7
- --text: #231e17;
8
- --muted: #7c6f61;
9
- --accent: #1f437d;
10
- --accent-strong: #16345f;
11
- --accent-soft: #dfe7f5;
12
- --warn: #b08442;
13
- --warn-soft: #fffaf0;
14
- --danger: #a24747;
15
- --shadow: 0 1px 2px rgba(35, 30, 23, 0.05);
16
- --shadow-lg: 0 18px 48px rgba(35, 30, 23, 0.16);
1
+ :root {
2
+ color-scheme: light;
3
+ --bg: #ebe4d7;
4
+ --surface: #f8f4eb;
5
+ --soft: #f1ebde;
6
+ --line: #d7cdbf;
7
+ --text: #231e17;
8
+ --muted: #7c6f61;
9
+ --accent: #1f437d;
10
+ --accent-strong: #16345f;
11
+ --accent-soft: #dfe7f5;
12
+ --warn: #b08442;
13
+ --warn-soft: #fffaf0;
14
+ --done: #2e7d32;
15
+ --danger: #a24747;
16
+ --shadow: 0 1px 2px rgba(35, 30, 23, 0.05);
17
+ --shadow-lg: 0 18px 48px rgba(35, 30, 23, 0.16);
17
18
  /* Issue #347 — picker group dots. Decorative only; the picker uses
18
19
  these to scan groups by color without adding semantic weight. Kept
19
20
  as variables so future themes flow through here. */
@@ -26,12 +27,12 @@ html, body { margin: 0; padding: 0; }
26
27
  [hidden] { display: none !important; }
27
28
 
28
29
  html, body { height: 100%; }
29
- body {
30
- font-family: "Avenir Next", "Segoe UI", "Helvetica Neue", Arial, sans-serif;
31
- color: var(--text);
32
- background:
33
- radial-gradient(circle at top left, rgba(255, 255, 255, 0.45), transparent 28%),
34
- linear-gradient(180deg, #efe8dc 0%, var(--bg) 100%);
30
+ body {
31
+ font-family: "Avenir Next", "Segoe UI", "Helvetica Neue", Arial, sans-serif;
32
+ color: var(--text);
33
+ background:
34
+ radial-gradient(circle at top left, rgba(255, 255, 255, 0.45), transparent 28%),
35
+ linear-gradient(180deg, #efe8dc 0%, var(--bg) 100%);
35
36
  line-height: 1.5;
36
37
  font-size: 15px;
37
38
  /* Issue #339 fix: bound the page to the viewport. The conversation
@@ -41,51 +42,41 @@ body {
41
42
 
42
43
  button { font: inherit; cursor: pointer; }
43
44
 
44
- .page {
45
- max-width: none;
46
- width: 100%;
47
- margin: 0;
48
- padding: 24px;
45
+ .page {
46
+ max-width: none;
47
+ width: 100%;
48
+ margin: 0;
49
+ padding: 20px 24px 16px;
49
50
  display: flex;
50
51
  flex-direction: column;
51
- gap: 20px;
52
+ gap: 14px;
52
53
  height: 100vh;
53
54
  min-height: 0;
54
55
  }
55
56
 
56
- /* Header */
57
- .header {
58
- display: flex;
59
- align-items: center;
60
- justify-content: space-between;
61
- gap: 16px;
62
- }
63
- .header-copy {
64
- display: flex;
65
- flex-direction: column;
66
- gap: 4px;
67
- }
68
- .header-eyebrow {
69
- font-size: 11px;
70
- font-weight: 700;
71
- letter-spacing: 0.08em;
72
- text-transform: uppercase;
73
- color: var(--muted);
74
- }
75
- .header h1 {
76
- font-size: 34px;
77
- font-weight: 700;
78
- margin: 0;
79
- letter-spacing: -0.03em;
80
- }
81
- .project-button {
57
+ /* Header — single-row strip: title | welcome text | project button */
58
+ .header {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 16px;
62
+ }
63
+ .header-title {
64
+ font-size: 20px;
65
+ font-weight: 700;
66
+ margin: 0;
67
+ letter-spacing: -0.02em;
68
+ white-space: nowrap;
69
+ flex-shrink: 0;
70
+ color: var(--text);
71
+ }
72
+ .project-button {
82
73
  display: inline-flex;
83
74
  align-items: center;
84
75
  gap: 8px;
85
- background: rgba(255, 255, 255, 0.5);
86
- border: 1px solid var(--line);
87
- border-radius: 14px;
88
- padding: 10px 16px;
76
+ background: rgba(255, 255, 255, 0.5);
77
+ border: 1px solid var(--line);
78
+ border-radius: 14px;
79
+ padding: 10px 16px;
89
80
  color: var(--text);
90
81
  box-shadow: var(--shadow);
91
82
  max-width: 360px;
@@ -100,15 +91,12 @@ button { font: inherit; cursor: pointer; }
100
91
  text-overflow: ellipsis;
101
92
  }
102
93
 
103
- /* Welcome line */
104
- .welcome {
105
- background: rgba(248, 244, 235, 0.86);
106
- border: 1px solid var(--line);
107
- border-radius: 20px;
108
- padding: 20px 24px;
109
- box-shadow: var(--shadow);
110
- font-size: 15px;
111
- line-height: 1.7;
94
+ /* Welcome inline in the header strip, no card styling */
95
+ .welcome {
96
+ flex: 1;
97
+ min-width: 0;
98
+ font-size: 13px;
99
+ line-height: 1.55;
112
100
  color: var(--muted);
113
101
  }
114
102
  .welcome strong.you { color: var(--text); font-weight: 600; }
@@ -197,94 +185,94 @@ button { font: inherit; cursor: pointer; }
197
185
  }
198
186
 
199
187
  /* Layout */
200
- .layout {
201
- display: grid;
202
- grid-template-columns: 326px minmax(0, 1fr);
203
- gap: 20px;
204
- align-items: stretch;
205
- flex: 1;
206
- min-height: 0;
207
- }
188
+ .layout {
189
+ display: grid;
190
+ grid-template-columns: 326px minmax(0, 1fr);
191
+ gap: 20px;
192
+ align-items: stretch;
193
+ flex: 1;
194
+ min-height: 0;
195
+ }
208
196
 
209
197
  /* Left rail */
210
- .rail {
211
- display: grid;
212
- grid-template-columns: minmax(0, 1fr);
213
- grid-auto-rows: min-content;
214
- gap: 14px;
215
- min-width: 0;
216
- align-self: start;
217
- max-height: 100%;
218
- overflow-y: auto;
219
- border-radius: 28px;
220
- background: rgba(248, 244, 235, 0.84);
221
- box-shadow: var(--shadow);
222
- }
223
- .new-conv {
224
- width: 100%;
225
- background: var(--accent);
226
- color: #fff;
227
- border: none;
228
- border-radius: 14px;
229
- padding: 13px 16px;
230
- font-weight: 600;
231
- box-shadow: var(--shadow);
232
- }
233
- .rail-note {
234
- padding: 0 2px;
235
- font-size: 12px;
236
- color: var(--muted);
237
- line-height: 1.45;
238
- }
239
- .rail-section {
240
- display: grid;
241
- gap: 10px;
242
- }
243
- .rail-section-label {
244
- font-size: 11px;
245
- font-weight: 700;
246
- letter-spacing: 0.14em;
247
- text-transform: uppercase;
248
- color: var(--muted);
249
- padding: 0 2px;
250
- }
251
- .new-conv:hover { background: var(--accent-strong); }
252
- .new-conv:focus-visible { outline: 2px solid var(--accent-strong); outline-offset: 2px; }
253
- .conv-list {
254
- display: grid;
255
- grid-template-columns: minmax(0, 1fr);
256
- gap: 10px;
257
- margin-top: 0;
258
- min-width: 0;
259
- }
260
- .conv-item {
261
- width: 100%;
262
- text-align: left;
263
- background: rgba(255, 255, 255, 0.44);
264
- border: 1px solid rgba(31, 67, 125, 0.08);
265
- border-radius: 22px;
266
- padding: 14px;
267
- display: flex;
268
- align-items: flex-start;
269
- justify-content: space-between;
270
- gap: 12px;
271
- color: var(--text);
272
- box-shadow: 0 10px 24px rgba(35, 30, 23, 0.04);
273
- }
274
- .conv-item:hover { background: var(--soft); }
275
- .conv-item.active {
276
- background: rgba(229, 236, 248, 0.92);
277
- border-color: rgba(31, 67, 125, 0.2);
278
- box-shadow: 0 14px 28px rgba(31, 67, 125, 0.12);
279
- }
198
+ .rail {
199
+ display: grid;
200
+ grid-template-columns: minmax(0, 1fr);
201
+ grid-auto-rows: min-content;
202
+ gap: 14px;
203
+ min-width: 0;
204
+ align-self: start;
205
+ max-height: 100%;
206
+ overflow-y: auto;
207
+ border-radius: 28px;
208
+ background: rgba(248, 244, 235, 0.84);
209
+ box-shadow: var(--shadow);
210
+ }
211
+ .new-conv {
212
+ width: 100%;
213
+ background: var(--accent);
214
+ color: #fff;
215
+ border: none;
216
+ border-radius: 14px;
217
+ padding: 13px 16px;
218
+ font-weight: 600;
219
+ box-shadow: var(--shadow);
220
+ }
221
+ .rail-note {
222
+ padding: 0 2px;
223
+ font-size: 12px;
224
+ color: var(--muted);
225
+ line-height: 1.45;
226
+ }
227
+ .rail-section {
228
+ display: grid;
229
+ gap: 10px;
230
+ }
231
+ .rail-section-label {
232
+ font-size: 11px;
233
+ font-weight: 700;
234
+ letter-spacing: 0.14em;
235
+ text-transform: uppercase;
236
+ color: var(--muted);
237
+ padding: 0 2px;
238
+ }
239
+ .new-conv:hover { background: var(--accent-strong); }
240
+ .new-conv:focus-visible { outline: 2px solid var(--accent-strong); outline-offset: 2px; }
241
+ .conv-list {
242
+ display: grid;
243
+ grid-template-columns: minmax(0, 1fr);
244
+ gap: 10px;
245
+ margin-top: 0;
246
+ min-width: 0;
247
+ }
248
+ .conv-item {
249
+ width: 100%;
250
+ text-align: left;
251
+ background: rgba(255, 255, 255, 0.44);
252
+ border: 1px solid rgba(31, 67, 125, 0.08);
253
+ border-radius: 22px;
254
+ padding: 14px;
255
+ display: flex;
256
+ align-items: flex-start;
257
+ justify-content: space-between;
258
+ gap: 12px;
259
+ color: var(--text);
260
+ box-shadow: 0 10px 24px rgba(35, 30, 23, 0.04);
261
+ }
262
+ .conv-item:hover { background: var(--soft); }
263
+ .conv-item.active {
264
+ background: rgba(229, 236, 248, 0.92);
265
+ border-color: rgba(31, 67, 125, 0.2);
266
+ box-shadow: 0 14px 28px rgba(31, 67, 125, 0.12);
267
+ }
280
268
  /* Text column: stacks persona name label above job title */
281
- .conv-body {
282
- flex: 1;
283
- min-width: 0;
284
- display: flex;
285
- flex-direction: column;
286
- gap: 4px;
287
- }
269
+ .conv-body {
270
+ flex: 1;
271
+ min-width: 0;
272
+ display: flex;
273
+ flex-direction: column;
274
+ gap: 4px;
275
+ }
288
276
  .conv-persona-name {
289
277
  font-size: 10px;
290
278
  font-weight: 700;
@@ -295,24 +283,24 @@ button { font: inherit; cursor: pointer; }
295
283
  overflow: hidden;
296
284
  text-overflow: ellipsis;
297
285
  }
298
- .conv-title {
299
- font-size: 17px;
300
- font-weight: 700;
301
- min-width: 0;
302
- line-height: 1.3;
303
- overflow: hidden;
304
- display: -webkit-box;
305
- -webkit-line-clamp: 2;
306
- -webkit-box-orient: vertical;
307
- }
286
+ .conv-title {
287
+ font-size: 17px;
288
+ font-weight: 700;
289
+ min-width: 0;
290
+ line-height: 1.3;
291
+ overflow: hidden;
292
+ display: -webkit-box;
293
+ -webkit-line-clamp: 2;
294
+ -webkit-box-orient: vertical;
295
+ }
308
296
  /* Persona avatar chip — enlarged to 34px to serve as a clear visual anchor */
309
- .conv-persona-chip {
310
- flex-shrink: 0;
311
- width: 48px;
312
- height: 48px;
313
- border-radius: 16px;
314
- background: #ffffff;
315
- border: 2px solid rgba(31, 67, 125, 0.14);
297
+ .conv-persona-chip {
298
+ flex-shrink: 0;
299
+ width: 48px;
300
+ height: 48px;
301
+ border-radius: 16px;
302
+ background: #ffffff;
303
+ border: 2px solid rgba(31, 67, 125, 0.14);
316
304
  display: flex;
317
305
  align-items: center;
318
306
  justify-content: center;
@@ -323,28 +311,28 @@ button { font: inherit; cursor: pointer; }
323
311
  line-height: 1;
324
312
  text-transform: uppercase;
325
313
  }
326
- .conv-persona-chip img { width: 100%; height: 100%; object-fit: cover; border-radius: 16px; }
314
+ .conv-persona-chip img { width: 100%; height: 100%; object-fit: cover; border-radius: 16px; }
327
315
  .conv-persona-chip--free { background: transparent; border-color: var(--line); color: var(--muted); }
328
- .conv-status {
329
- font-size: 11px;
330
- color: var(--muted);
331
- font-weight: 500;
332
- flex-shrink: 0;
333
- white-space: nowrap;
334
- padding-top: 4px;
335
- }
316
+ .conv-status {
317
+ font-size: 11px;
318
+ color: var(--muted);
319
+ font-weight: 500;
320
+ flex-shrink: 0;
321
+ white-space: nowrap;
322
+ padding-top: 4px;
323
+ }
336
324
  .conv-status.running { color: var(--accent); }
337
325
  .conv-status.attention { color: var(--warn); }
338
326
  .conv-status.failed { color: var(--danger); }
339
327
 
340
328
  /* Conversation pane — fills the layout column vertically. Inner regions
341
329
  manage their own height; the .messages list is the only scrollable area. */
342
- .conversation {
343
- background: rgba(248, 244, 235, 0.94);
344
- border: 1px solid var(--line);
345
- border-radius: 30px;
346
- box-shadow: var(--shadow-lg);
347
- padding: 24px 26px;
330
+ .conversation {
331
+ background: rgba(248, 244, 235, 0.94);
332
+ border: 1px solid var(--line);
333
+ border-radius: 30px;
334
+ box-shadow: var(--shadow-lg);
335
+ padding: 24px 26px;
348
336
  display: flex;
349
337
  flex-direction: column;
350
338
  gap: 14px;
@@ -353,225 +341,291 @@ button { font: inherit; cursor: pointer; }
353
341
  height: 100%;
354
342
  overflow: hidden;
355
343
  }
356
- .empty-state {
357
- display: grid;
358
- gap: 8px;
359
- place-items: center;
360
- text-align: center;
361
- color: var(--muted);
362
- padding: 80px 16px;
363
- }
364
- .empty-state::before {
365
- content: "F";
366
- width: 56px;
367
- height: 56px;
368
- border-radius: 18px;
369
- display: inline-flex;
370
- align-items: center;
371
- justify-content: center;
372
- background: var(--accent-soft);
373
- color: var(--accent-strong);
374
- font-weight: 700;
375
- font-size: 24px;
376
- }
377
- .empty-state h3 { margin: 0; color: var(--text); font-weight: 600; font-size: 17px; }
344
+ .empty-state {
345
+ display: grid;
346
+ gap: 8px;
347
+ place-items: center;
348
+ text-align: center;
349
+ color: var(--muted);
350
+ padding: 80px 16px;
351
+ }
352
+ .empty-state::before {
353
+ content: "F";
354
+ width: 56px;
355
+ height: 56px;
356
+ border-radius: 18px;
357
+ display: inline-flex;
358
+ align-items: center;
359
+ justify-content: center;
360
+ background: var(--accent-soft);
361
+ color: var(--accent-strong);
362
+ font-weight: 700;
363
+ font-size: 24px;
364
+ }
365
+ .empty-state h3 { margin: 0; color: var(--text); font-weight: 600; font-size: 17px; }
378
366
  .empty-state p { margin: 0; max-width: 320px; }
379
367
 
380
- #active-conv {
381
- display: flex;
382
- flex-direction: column;
383
- gap: 14px;
384
- min-width: 0;
385
- flex: 1;
386
- min-height: 0;
387
- overflow: hidden;
388
- }
389
-
390
- .conv-header,
391
- .support-stack,
392
- .panel-details,
393
- .micro {
394
- flex-shrink: 0;
395
- }
396
- .conv-topline {
397
- display: flex;
398
- align-items: center;
399
- justify-content: space-between;
400
- gap: 12px;
401
- }
402
- .employee-identity {
403
- display: inline-flex;
404
- align-items: center;
405
- gap: 12px;
406
- min-width: 0;
407
- }
408
- .identity-avatar {
409
- width: 52px;
410
- height: 52px;
411
- border-radius: 18px;
412
- background: #ffffff;
413
- border: 1px solid rgba(31, 67, 125, 0.14);
414
- display: inline-flex;
415
- align-items: center;
416
- justify-content: center;
417
- overflow: hidden;
418
- font-size: 16px;
419
- font-weight: 700;
420
- color: var(--accent-strong);
421
- flex-shrink: 0;
422
- }
423
- .identity-avatar img {
424
- width: 100%;
425
- height: 100%;
426
- object-fit: cover;
427
- }
428
- .identity-copy {
429
- display: flex;
430
- flex-direction: column;
431
- min-width: 0;
432
- }
433
- .identity-copy strong {
434
- font-size: 16px;
435
- font-weight: 700;
436
- color: var(--text);
437
- }
438
- .identity-copy small {
439
- font-size: 13px;
440
- color: var(--muted);
441
- }
442
- .run-state-pill {
443
- display: inline-flex;
444
- align-items: center;
445
- justify-content: center;
446
- padding: 7px 12px;
447
- border-radius: 999px;
448
- font-size: 11px;
449
- font-weight: 700;
450
- letter-spacing: 0.08em;
451
- text-transform: uppercase;
452
- background: rgba(31, 67, 125, 0.1);
453
- color: var(--accent-strong);
454
- }
455
- .run-state-pill.running {
456
- background: rgba(31, 67, 125, 0.14);
457
- }
458
- .run-state-pill.failed {
459
- background: #fbebeb;
460
- color: var(--danger);
461
- }
462
- .run-state-pill.completed {
463
- background: #e4f0ea;
464
- color: #2c6b4e;
465
- }
466
- .conv-header {
467
- display: flex;
468
- flex-wrap: wrap;
469
- align-items: baseline;
470
- column-gap: 12px;
471
- row-gap: 4px;
472
- }
473
- .title-block {
474
- display: flex;
475
- flex-direction: column;
476
- gap: 4px;
477
- min-width: 0;
478
- flex: 1 1 auto;
479
- }
480
- .conv-header h2 { flex: 1 1 auto; min-width: 0; }
481
- #artifact-slot { flex: 0 0 auto; }
482
-
483
- .conv-header h2 { margin: 0; font-size: 34px; font-weight: 700; letter-spacing: -0.03em; }
484
- .conv-job { color: var(--muted); font-size: 14px; margin-top: 2px; }
485
- .conversation-status {
486
- display: flex;
487
- align-items: flex-start;
488
- gap: 12px;
489
- min-width: 0;
490
- flex-shrink: 0;
491
- }
492
- .conversation-status > * {
493
- min-width: 0;
494
- }
495
- .status-stack {
496
- display: grid;
497
- gap: 10px;
498
- min-width: 0;
499
- flex: 1 1 auto;
500
- }
501
- .support-stack {
502
- display: grid;
503
- gap: 8px;
504
- }
505
- .panel-details {
506
- background: rgba(255, 255, 255, 0.4);
507
- border: 1px solid rgba(31, 67, 125, 0.08);
508
- border-radius: 22px;
509
- overflow: hidden;
510
- }
511
- .panel-details > summary {
512
- cursor: pointer;
513
- list-style: none;
514
- display: flex;
515
- align-items: center;
516
- gap: 10px;
517
- padding: 10px 14px;
518
- }
519
- .panel-details > summary::-webkit-details-marker { display: none; }
520
- .panel-details > summary::before {
521
- content: "▸";
522
- font-size: 11px;
523
- color: var(--muted);
524
- transition: transform 100ms ease;
525
- flex-shrink: 0;
526
- }
527
- .panel-details[open] > summary::before { transform: rotate(90deg); }
528
- .panel-summary-copy {
529
- display: flex;
530
- flex-direction: column;
531
- gap: 2px;
532
- min-width: 0;
533
- }
534
- .panel-kicker {
535
- font-size: 11px;
536
- font-weight: 700;
537
- letter-spacing: 0.12em;
538
- text-transform: uppercase;
539
- color: var(--muted);
540
- }
541
- .panel-summary-text {
542
- font-size: 13px;
543
- color: var(--text);
544
- white-space: nowrap;
545
- overflow: hidden;
546
- text-overflow: ellipsis;
547
- }
548
- .panel-body {
549
- padding: 0 14px 12px;
550
- }
551
- .section-title {
552
- font-size: 13px;
553
- font-weight: 600;
554
- color: var(--muted);
368
+ #active-conv {
369
+ display: flex;
370
+ flex-direction: column;
371
+ gap: 14px;
372
+ min-width: 0;
373
+ flex: 1;
374
+ min-height: 0;
375
+ overflow: hidden;
376
+ }
377
+
378
+ .conv-header,
379
+ .support-stack,
380
+ .panel-details:not(.panel-details--thread),
381
+ .micro {
382
+ flex-shrink: 0;
383
+ }
384
+ .conv-topline {
385
+ display: flex;
386
+ align-items: center;
387
+ gap: 12px;
388
+ }
389
+ /* Job title inline with employee avatar — replaces the old separate h2 row */
390
+ .conv-job-title {
391
+ flex: 1;
392
+ min-width: 0;
393
+ font-size: 15px;
394
+ font-weight: 600;
395
+ color: var(--text);
396
+ white-space: nowrap;
397
+ overflow: hidden;
398
+ text-overflow: ellipsis;
399
+ }
400
+ .employee-identity {
401
+ display: inline-flex;
402
+ align-items: center;
403
+ gap: 12px;
404
+ min-width: 0;
405
+ }
406
+ .identity-avatar {
407
+ width: 52px;
408
+ height: 52px;
409
+ border-radius: 18px;
410
+ background: #ffffff;
411
+ border: 1px solid rgba(31, 67, 125, 0.14);
412
+ display: inline-flex;
413
+ align-items: center;
414
+ justify-content: center;
415
+ overflow: hidden;
416
+ font-size: 16px;
417
+ font-weight: 700;
418
+ color: var(--accent-strong);
419
+ flex-shrink: 0;
420
+ }
421
+ .identity-avatar img {
422
+ width: 100%;
423
+ height: 100%;
424
+ object-fit: cover;
425
+ }
426
+ .identity-copy {
427
+ display: flex;
428
+ flex-direction: column;
429
+ min-width: 0;
430
+ }
431
+ .identity-copy strong {
432
+ font-size: 16px;
433
+ font-weight: 700;
434
+ color: var(--text);
435
+ }
436
+ .identity-copy small {
437
+ font-size: 13px;
438
+ color: var(--muted);
439
+ }
440
+ .run-state-pill {
441
+ display: inline-flex;
442
+ align-items: center;
443
+ justify-content: center;
444
+ padding: 7px 12px;
445
+ border-radius: 999px;
446
+ font-size: 11px;
447
+ font-weight: 700;
448
+ letter-spacing: 0.08em;
555
449
  text-transform: uppercase;
556
- letter-spacing: 0.05em;
557
- margin-bottom: 8px;
450
+ background: rgba(31, 67, 125, 0.1);
451
+ color: var(--accent-strong);
452
+ }
453
+ .run-state-pill.running {
454
+ background: rgba(31, 67, 125, 0.14);
455
+ }
456
+ .run-state-pill.failed {
457
+ background: #fbebeb;
458
+ color: var(--danger);
459
+ }
460
+ .run-state-pill.completed {
461
+ background: #e4f0ea;
462
+ color: #2c6b4e;
558
463
  }
464
+ .conv-header {
465
+ display: flex;
466
+ flex-wrap: wrap;
467
+ align-items: baseline;
468
+ column-gap: 12px;
469
+ row-gap: 4px;
470
+ }
471
+ .title-block {
472
+ display: flex;
473
+ flex-direction: column;
474
+ gap: 4px;
475
+ min-width: 0;
476
+ flex: 1 1 auto;
477
+ }
478
+ .conv-header h2 { flex: 1 1 auto; min-width: 0; }
479
+ #artifact-slot { flex: 0 0 auto; }
559
480
 
560
- .coach-title-row {
481
+ .conv-header h2 { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: -0.02em; }
482
+ .conv-job { color: var(--muted); font-size: 14px; margin-top: 2px; }
483
+ .conversation-status {
484
+ display: flex;
485
+ align-items: flex-start;
486
+ gap: 12px;
487
+ min-width: 0;
488
+ flex-shrink: 0;
489
+ }
490
+ .conversation-status > * {
491
+ min-width: 0;
492
+ }
493
+ .status-stack {
494
+ display: grid;
495
+ gap: 10px;
496
+ min-width: 0;
497
+ flex: 1 1 auto;
498
+ }
499
+ .support-stack {
500
+ display: grid;
501
+ gap: 8px;
502
+ flex-shrink: 0;
503
+ }
504
+ .panel-details {
505
+ background: rgba(255, 255, 255, 0.4);
506
+ border: 1px solid rgba(31, 67, 125, 0.08);
507
+ border-radius: 22px;
508
+ overflow: hidden;
509
+ }
510
+ .panel-details > summary {
511
+ cursor: pointer;
512
+ list-style: none;
561
513
  display: flex;
562
514
  align-items: center;
563
- justify-content: space-between;
515
+ gap: 10px;
516
+ padding: 10px 14px;
517
+ }
518
+ .panel-details > summary::-webkit-details-marker { display: none; }
519
+ .panel-details > summary::before {
520
+ content: "▸";
521
+ font-size: 11px;
522
+ color: var(--muted);
523
+ transition: transform 100ms ease;
524
+ flex-shrink: 0;
525
+ }
526
+ .panel-details[open] > summary::before { transform: rotate(90deg); }
527
+ .panel-summary-copy {
528
+ display: flex;
529
+ flex-direction: column;
530
+ gap: 2px;
531
+ min-width: 0;
532
+ }
533
+ .panel-kicker {
534
+ font-size: 11px;
535
+ font-weight: 700;
536
+ letter-spacing: 0.12em;
537
+ text-transform: uppercase;
538
+ color: var(--muted);
539
+ }
540
+ .panel-summary-text {
541
+ font-size: 13px;
542
+ color: var(--text);
543
+ white-space: nowrap;
544
+ overflow: hidden;
545
+ text-overflow: ellipsis;
546
+ }
547
+ .panel-body {
548
+ padding: 0 14px 12px;
549
+ }
550
+ .section-title {
551
+ font-size: 13px;
552
+ font-weight: 600;
553
+ color: var(--muted);
554
+ text-transform: uppercase;
555
+ letter-spacing: 0.05em;
564
556
  margin-bottom: 8px;
565
557
  }
566
- .coach-title-row .section-title { margin-bottom: 0; }
558
+
559
+ /* Employee row now lives in the coach summary (inline with kicker).
560
+ .coach-title-row no longer exists in HTML — kept only for browser cache safety. */
567
561
  .active-employee-row {
568
562
  display: flex;
569
563
  align-items: center;
570
564
  gap: 6px;
565
+ margin-left: auto;
566
+ flex-shrink: 0;
571
567
  }
572
568
  .active-employee-label {
569
+ display: inline-flex;
570
+ align-items: center;
571
+ gap: 5px;
573
572
  font-size: 12px;
574
- color: var(--muted);
573
+ font-weight: 600;
574
+ color: var(--text);
575
+ cursor: default;
576
+ }
577
+ /* Hide the name text span — only badge + dropdown shown in the summary */
578
+ .coach-label-name { display: none; }
579
+ .coach-employee-badge {
580
+ display: inline-flex;
581
+ align-items: center;
582
+ justify-content: center;
583
+ width: 20px; height: 20px;
584
+ border-radius: 6px;
585
+ background: var(--accent);
586
+ color: #fff;
587
+ font-size: 10px;
588
+ font-weight: 700;
589
+ flex-shrink: 0;
590
+ }
591
+ img.coach-employee-avatar { object-fit: cover; border-radius: 4px; }
592
+ /* R3.3: hide coach-summary hint when the panel is open. */
593
+ #coach-panel[open] #coach-summary { display: none; }
594
+ /* R5: quick-access coaching buttons row. */
595
+ .quick-coach-row {
596
+ display: flex;
597
+ flex-wrap: wrap;
598
+ gap: 6px;
599
+ margin-bottom: 8px;
600
+ }
601
+ .quick-coach-btn {
602
+ font-size: 12px;
603
+ padding: 4px 10px;
604
+ border-radius: 8px;
605
+ }
606
+ /* Thread panel fills the available space between tracker and coach.
607
+ The panel itself is the scroll container — the summary stays sticky at the
608
+ top so it's always visible, and tracker + coach below are never obscured. */
609
+ .panel-details--thread {
610
+ border-radius: 28px;
611
+ border: 1px solid rgba(31, 67, 125, 0.1);
612
+ background:
613
+ linear-gradient(180deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.5)),
614
+ radial-gradient(circle at top left, rgba(31, 67, 125, 0.06), transparent 34%);
615
+ overflow-y: auto;
616
+ overflow-x: hidden;
617
+ flex: 1;
618
+ min-height: 0;
619
+ }
620
+ .panel-details--thread > summary {
621
+ padding: 12px 22px;
622
+ cursor: pointer;
623
+ list-style: none;
624
+ flex-shrink: 0;
625
+ }
626
+ .panel-details--thread > summary::-webkit-details-marker { display: none; }
627
+ .panel-details--thread .messages {
628
+ padding: 8px 22px 18px;
575
629
  }
576
630
  .employee-select.inline {
577
631
  font-size: 12px;
@@ -581,11 +635,11 @@ button { font: inherit; cursor: pointer; }
581
635
 
582
636
  /* Progress is now a single-line status strip (was a tall card) so the
583
637
  messages region gets the vertical space it needs. */
584
- .progress {
585
- background: rgba(255, 255, 255, 0.46);
586
- border: 1px solid var(--line);
587
- border-radius: 8px;
588
- padding: 8px 12px;
638
+ .progress {
639
+ background: rgba(255, 255, 255, 0.46);
640
+ border: 1px solid var(--line);
641
+ border-radius: 8px;
642
+ padding: 8px 12px;
589
643
  font-size: 13px;
590
644
  display: flex;
591
645
  align-items: center;
@@ -618,156 +672,153 @@ button { font: inherit; cursor: pointer; }
618
672
  }
619
673
  .progress.done .stage::before { background: #6cb39a; animation: none; }
620
674
  .progress.attention .stage::before { background: var(--warn); animation: none; }
621
- .progress.failed .stage::before { background: var(--danger); animation: none; }
622
- @keyframes pulse {
623
- 0%, 100% { opacity: 1; transform: scale(1); }
624
- 50% { opacity: 0.5; transform: scale(0.8); }
625
- }
626
- .progress-inline {
627
- flex: 1 1 auto;
628
- }
629
- .tracker-inline {
630
- background: rgba(255, 255, 255, 0.42);
631
- border: 1px solid rgba(31, 67, 125, 0.08);
632
- border-radius: 18px;
633
- padding: 8px 12px;
634
- }
635
-
636
- .thread-surface {
637
- display: flex;
638
- flex-direction: column;
639
- gap: 14px;
640
- min-height: 0;
641
- flex: 1;
642
- padding: 22px 22px 18px;
643
- border-radius: 28px;
644
- border: 1px solid rgba(31, 67, 125, 0.1);
645
- background:
646
- linear-gradient(180deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.5)),
647
- radial-gradient(circle at top left, rgba(31, 67, 125, 0.06), transparent 34%);
648
- }
649
-
650
- .thread-surface-label {
651
- font-size: 11px;
652
- font-weight: 700;
653
- letter-spacing: 0.14em;
654
- text-transform: uppercase;
655
- color: var(--muted);
656
- }
657
-
658
- .messages {
659
- display: grid;
660
- grid-template-columns: minmax(0, 1fr);
661
- gap: 24px;
662
- margin-top: 0;
663
- min-width: 0;
664
- /* Scroll messages here, not the page. */
665
- flex: 1;
666
- min-height: 0;
667
- overflow-y: auto;
668
- padding: 8px 8px 8px 2px;
669
- scroll-behavior: smooth;
670
- }
671
- .message {
672
- word-wrap: break-word;
673
- overflow-wrap: anywhere;
674
- max-width: 100%;
675
- width: 100%;
676
- display: grid;
677
- gap: 10px;
678
- animation: slidein 280ms ease;
679
- }
680
- @keyframes slidein {
681
- from { opacity: 0; transform: translateY(6px); }
682
- to { opacity: 1; transform: translateY(0); }
683
- }
684
- .message.manager {
685
- justify-items: end;
686
- padding-left: 30%;
687
- }
688
- .message.employee {
689
- justify-items: start;
690
- padding-right: 30%;
691
- }
692
- .message.system {
693
- justify-items: stretch;
694
- padding-right: 16%;
695
- }
696
- .message-meta {
697
- display: inline-flex;
698
- align-items: center;
699
- gap: 8px;
700
- margin-bottom: 0;
701
- }
702
- .message.manager .message-meta {
703
- justify-content: flex-end;
704
- }
705
- .message-avatar {
706
- width: 28px;
707
- height: 28px;
708
- border-radius: 10px;
709
- display: inline-flex;
710
- align-items: center;
711
- justify-content: center;
712
- overflow: hidden;
713
- font-size: 11px;
714
- font-weight: 700;
715
- border: 1px solid rgba(31, 67, 125, 0.1);
716
- }
717
- .message-avatar.manager {
718
- background: rgba(31, 67, 125, 0.12);
719
- color: var(--accent-strong);
720
- }
721
- .message-avatar.employee {
722
- background: #ffffff;
723
- color: var(--accent-strong);
724
- }
725
- .message-avatar.system {
726
- background: rgba(35, 30, 23, 0.08);
727
- color: var(--muted);
728
- }
729
- .message-avatar img {
730
- width: 100%;
731
- height: 100%;
732
- object-fit: cover;
733
- }
734
- .message .who {
735
- font-size: 11px;
736
- font-weight: 700;
737
- text-transform: uppercase;
738
- letter-spacing: 0.08em;
739
- color: var(--muted);
740
- }
741
- .message .lane-label {
742
- font-size: 11px;
743
- color: var(--muted);
744
- opacity: 0.88;
745
- }
746
- .transport-raw {
747
- display: none;
748
- }
749
- .bubble {
750
- border-radius: 26px;
751
- padding: 14px 16px;
752
- font-size: 14px;
753
- line-height: 1.55;
754
- box-shadow: 0 12px 26px rgba(35, 30, 23, 0.05);
755
- max-width: min(620px, 100%);
756
- }
757
- .message.manager .bubble {
758
- background: var(--accent);
759
- color: #fff;
760
- }
761
- .message.employee .bubble {
762
- background: rgba(255, 255, 255, 0.86);
763
- border: 1px solid rgba(31, 67, 125, 0.1);
764
- color: var(--text);
765
- }
766
- .message.system .bubble {
767
- background: rgba(255, 255, 255, 0.6);
768
- border: 1px solid rgba(35, 30, 23, 0.08);
769
- color: var(--text);
770
- }
675
+ .progress.failed .stage::before { background: var(--danger); animation: none; }
676
+ @keyframes pulse {
677
+ 0%, 100% { opacity: 1; transform: scale(1); }
678
+ 50% { opacity: 0.5; transform: scale(0.8); }
679
+ }
680
+ .progress-inline {
681
+ flex: 1 1 auto;
682
+ }
683
+ .tracker-inline {
684
+ background: rgba(255, 255, 255, 0.42);
685
+ border: 1px solid rgba(31, 67, 125, 0.08);
686
+ border-radius: 18px;
687
+ padding: 8px 12px;
688
+ }
689
+
690
+ .thread-surface {
691
+ display: flex;
692
+ flex-direction: column;
693
+ gap: 14px;
694
+ min-height: 0;
695
+ flex: 1;
696
+ padding: 22px 22px 18px;
697
+ border-radius: 28px;
698
+ border: 1px solid rgba(31, 67, 125, 0.1);
699
+ background:
700
+ linear-gradient(180deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.5)),
701
+ radial-gradient(circle at top left, rgba(31, 67, 125, 0.06), transparent 34%);
702
+ }
703
+
704
+ .thread-surface-label {
705
+ font-size: 11px;
706
+ font-weight: 700;
707
+ letter-spacing: 0.14em;
708
+ text-transform: uppercase;
709
+ color: var(--muted);
710
+ }
711
+
712
+ .messages {
713
+ display: grid;
714
+ grid-template-columns: minmax(0, 1fr);
715
+ gap: 14px;
716
+ margin-top: 0;
717
+ min-width: 0;
718
+ /* Scroll messages here, not the page. */
719
+ flex: 1;
720
+ min-height: 0;
721
+ overflow-y: auto;
722
+ padding: 8px 8px 8px 2px;
723
+ scroll-behavior: smooth;
724
+ }
725
+ .message {
726
+ word-wrap: break-word;
727
+ overflow-wrap: anywhere;
728
+ max-width: 100%;
729
+ width: 100%;
730
+ display: grid;
731
+ gap: 6px;
732
+ animation: slidein 280ms ease;
733
+ }
734
+ @keyframes slidein {
735
+ from { opacity: 0; transform: translateY(6px); }
736
+ to { opacity: 1; transform: translateY(0); }
737
+ }
738
+ .message.manager {
739
+ justify-items: end;
740
+ }
741
+ .message.employee {
742
+ justify-items: start;
743
+ }
744
+ .message.system {
745
+ justify-items: stretch;
746
+ }
747
+ .message-meta {
748
+ display: inline-flex;
749
+ align-items: center;
750
+ gap: 8px;
751
+ margin-bottom: 0;
752
+ }
753
+ .message.manager .message-meta {
754
+ justify-content: flex-end;
755
+ }
756
+ .message-avatar {
757
+ width: 28px;
758
+ height: 28px;
759
+ border-radius: 10px;
760
+ display: inline-flex;
761
+ align-items: center;
762
+ justify-content: center;
763
+ overflow: hidden;
764
+ font-size: 11px;
765
+ font-weight: 700;
766
+ border: 1px solid rgba(31, 67, 125, 0.1);
767
+ }
768
+ .message-avatar.manager {
769
+ background: rgba(31, 67, 125, 0.12);
770
+ color: var(--accent-strong);
771
+ }
772
+ .message-avatar.employee {
773
+ background: #ffffff;
774
+ color: var(--accent-strong);
775
+ }
776
+ .message-avatar.system {
777
+ background: rgba(35, 30, 23, 0.08);
778
+ color: var(--muted);
779
+ }
780
+ .message-avatar img {
781
+ width: 100%;
782
+ height: 100%;
783
+ object-fit: cover;
784
+ }
785
+ .message .who {
786
+ font-size: 11px;
787
+ font-weight: 700;
788
+ text-transform: uppercase;
789
+ letter-spacing: 0.08em;
790
+ color: var(--muted);
791
+ }
792
+ .message .lane-label {
793
+ font-size: 11px;
794
+ color: var(--muted);
795
+ opacity: 0.88;
796
+ }
797
+ .transport-raw {
798
+ display: none;
799
+ }
800
+ .bubble {
801
+ border-radius: 18px;
802
+ padding: 9px 14px;
803
+ font-size: 14px;
804
+ line-height: 1.5;
805
+ box-shadow: 0 4px 12px rgba(35, 30, 23, 0.04);
806
+ max-width: min(720px, 100%);
807
+ }
808
+ .message.manager .bubble {
809
+ background: var(--accent);
810
+ color: #fff;
811
+ }
812
+ .message.employee .bubble {
813
+ background: rgba(255, 255, 255, 0.86);
814
+ border: 1px solid rgba(31, 67, 125, 0.1);
815
+ color: var(--text);
816
+ }
817
+ .message.system .bubble {
818
+ background: rgba(255, 255, 255, 0.6);
819
+ border: 1px solid rgba(35, 30, 23, 0.08);
820
+ color: var(--text);
821
+ }
771
822
 
772
823
  /* Inline artifact pill that sits in the .conv-header next to the title.
773
824
  Compact so it never crowds Coach or Micro-manage. Hover reveals the
@@ -809,32 +860,52 @@ button { font: inherit; cursor: pointer; }
809
860
  }
810
861
  .artifact-where { display: none; } /* full path lives in tooltip via title attr */
811
862
 
812
- .coach textarea {
813
- width: 100%;
814
- min-height: 48px;
815
- max-height: 22vh;
816
- resize: vertical;
817
- border: 1px solid var(--line);
818
- border-radius: 18px;
819
- padding: 13px 15px;
820
- font: inherit;
821
- color: var(--text);
822
- background: var(--surface);
823
- }
824
- .coach textarea:focus { outline: none; border-color: var(--accent); }
825
- .coach {
826
- background: transparent;
827
- border: none;
828
- border-radius: 0;
829
- padding: 0;
830
- }
831
- .coach-actions { display: flex; justify-content: flex-end; margin-top: 8px; }
832
- .coach-note {
833
- margin-top: 8px;
834
- color: var(--muted);
835
- font-size: 11px;
836
- line-height: 1.4;
837
- }
863
+ .coach {
864
+ background: transparent;
865
+ border: none;
866
+ border-radius: 0;
867
+ padding: 0;
868
+ }
869
+ /* Send button embedded inside the textarea wrapper */
870
+ .coach-input {
871
+ position: relative;
872
+ }
873
+ .coach-input textarea {
874
+ width: 100%;
875
+ min-height: 52px;
876
+ max-height: 22vh;
877
+ resize: vertical;
878
+ border: 1px solid var(--line);
879
+ border-radius: 18px;
880
+ padding: 13px 52px 13px 15px;
881
+ font: inherit;
882
+ color: var(--text);
883
+ background: var(--surface);
884
+ display: block;
885
+ }
886
+ .coach-input textarea:focus { outline: none; border-color: var(--accent); }
887
+ .coach-input #send,
888
+ .coach-input #ab-direct-send {
889
+ position: absolute;
890
+ bottom: 8px;
891
+ right: 8px;
892
+ width: 34px;
893
+ height: 34px;
894
+ padding: 0;
895
+ border-radius: 10px;
896
+ font-size: 18px;
897
+ line-height: 1;
898
+ display: flex;
899
+ align-items: center;
900
+ justify-content: center;
901
+ border: none;
902
+ }
903
+ .coach-note {
904
+ margin-top: 6px;
905
+ color: var(--muted);
906
+ font-size: 11px;
907
+ line-height: 1.4;
908
+ }
838
909
  .send-button {
839
910
  background: var(--accent);
840
911
  color: #fff;
@@ -847,13 +918,12 @@ button { font: inherit; cursor: pointer; }
847
918
  .send-button:focus-visible { outline: 2px solid var(--accent-strong); outline-offset: 2px; }
848
919
  .send-button:disabled { background: #c5d2cb; cursor: not-allowed; }
849
920
 
850
- .micro {
851
- margin-top: 0;
852
- position: sticky;
853
- bottom: 0;
854
- z-index: 2;
855
- background: rgba(255, 255, 255, 0.4);
856
- }
921
+ .micro {
922
+ margin-top: 0;
923
+ /* Removed: position:sticky / bottom:0 / z-index:2 — sticky caused the
924
+ micro-manage label to float over the coach section in the flex column.
925
+ It's now a normal flow element at the bottom of the support-stack. */
926
+ }
857
927
  .micro summary {
858
928
  cursor: pointer;
859
929
  color: var(--muted);
@@ -870,10 +940,10 @@ button { font: inherit; cursor: pointer; }
870
940
  transition: transform 100ms;
871
941
  }
872
942
  .micro[open] summary::before { transform: rotate(90deg); }
873
- .micro-log {
874
- margin: 0 16px 16px;
875
- background: #1f2a24;
876
- color: #c5d2cb;
943
+ .micro-log {
944
+ margin: 0 16px 16px;
945
+ background: #1f2a24;
946
+ color: #c5d2cb;
877
947
  border-radius: 8px;
878
948
  padding: 12px 14px;
879
949
  font-family: Consolas, Menlo, monospace;
@@ -1063,42 +1133,47 @@ button { font: inherit; cursor: pointer; }
1063
1133
  .install-status { color: var(--muted); flex: 1; font-size: 12px; }
1064
1134
  button.small { padding: 4px 10px; font-size: 12px; }
1065
1135
 
1066
- @media (max-width: 820px) {
1136
+ @media (max-width: 820px) {
1067
1137
  /* Single-column reflow — the rigid 100vh layout doesn't make sense at
1068
1138
  mobile width because the rail stacks above the conversation. Let the
1069
1139
  page scroll naturally and bound the messages section to keep the
1070
1140
  coach + micro-manage reachable at the bottom. */
1071
1141
  html, body { height: auto; }
1072
1142
  body { overflow: auto; }
1073
- .page { height: auto; min-height: 100vh; }
1143
+ .page { height: auto; min-height: 100vh; padding: 16px; gap: 14px; }
1074
1144
  .layout { grid-template-columns: 1fr; flex: initial; }
1075
1145
  .rail { max-height: none; overflow-y: visible; }
1076
- .conversation { height: auto; min-height: 60vh; overflow: visible; }
1077
- #active-conv { flex: initial; }
1078
- .conv-stream { flex: initial; }
1079
- .messages { flex: initial; max-height: 60vh; }
1080
- .header { flex-wrap: wrap; }
1081
- .conv-topline { align-items: flex-start; flex-direction: column; }
1082
- .conv-header h2 { font-size: 28px; }
1083
- .thread-surface {
1084
- padding: 16px 14px 14px;
1085
- }
1086
- .panel-summary-text {
1087
- white-space: normal;
1088
- }
1089
- .message,
1090
- .message.manager,
1091
- .message.employee,
1092
- .message.system {
1093
- max-width: 100%;
1094
- padding-left: 0;
1095
- padding-right: 0;
1096
- }
1097
- .team-roster {
1098
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1099
- }
1100
- .popover { width: min(320px, calc(100vw - 60px)); }
1101
- }
1146
+ .conversation { height: auto; min-height: auto; overflow: visible; }
1147
+ #active-conv { flex: initial; overflow-y: visible; }
1148
+ .conv-stream { flex: initial; }
1149
+ /* Mobile: thread panel reverts to normal block flow; page scrolls naturally */
1150
+ .panel-details--thread { flex: initial; min-height: auto; display: block; max-height: 45vh; }
1151
+ .panel-details--thread .messages { flex: initial; min-height: auto; max-height: calc(45vh - 44px); overflow-y: auto; }
1152
+ .header { flex-wrap: wrap; gap: 10px; }
1153
+ /* Welcome inline: allow wrapping on mobile */
1154
+ .welcome { flex: 1 1 100%; font-size: 12px; }
1155
+ .conv-topline { align-items: flex-start; flex-direction: column; }
1156
+ .conv-job-title { font-size: 14px; }
1157
+ .thread-surface {
1158
+ padding: 16px 14px 14px;
1159
+ }
1160
+ .panel-summary-text {
1161
+ white-space: normal;
1162
+ }
1163
+ .team-roster {
1164
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1165
+ }
1166
+ .popover { width: min(320px, calc(100vw - 60px)); }
1167
+ .quick-coach-row { flex-wrap: wrap; }
1168
+ .quick-coach-btn { font-size: 11px; }
1169
+ }
1170
+
1171
+ @media (max-width: 480px) {
1172
+ /* Very narrow: hide welcome text to give maximum space to conversations */
1173
+ .welcome { display: none; }
1174
+ .page { padding: 12px; gap: 10px; }
1175
+ .header-title { font-size: 17px; }
1176
+ }
1102
1177
 
1103
1178
  /* ---------------------------------------------------------------- */
1104
1179
  /* Issue #347 — Pizza tracker (R1), template picker (R2), totals (R4) */
@@ -1145,8 +1220,8 @@ button.small { padding: 4px 10px; font-size: 12px; }
1145
1220
  z-index: 0;
1146
1221
  }
1147
1222
  .tracker .tracker-row .stage:first-child::before { display: none; }
1148
- .tracker .stage.done::before,
1149
- .tracker .stage.current::before { background: var(--accent); }
1223
+ .tracker .stage.done::before { background: var(--done); }
1224
+ .tracker .stage.current::before { background: var(--warn); }
1150
1225
  .tracker .stage-circle {
1151
1226
  width: 26px; height: 26px;
1152
1227
  border-radius: 50%;
@@ -1162,15 +1237,15 @@ button.small { padding: 4px 10px; font-size: 12px; }
1162
1237
  z-index: 2;
1163
1238
  }
1164
1239
  .tracker .stage.done .stage-circle {
1165
- background: var(--accent);
1166
- border-color: var(--accent);
1240
+ background: var(--done);
1241
+ border-color: var(--done);
1167
1242
  color: #fff;
1168
1243
  }
1169
1244
  .tracker .stage.current .stage-circle {
1170
- background: var(--accent-soft);
1171
- border-color: var(--accent);
1172
- color: var(--accent-strong);
1173
- box-shadow: 0 0 0 4px rgba(61, 138, 110, 0.10);
1245
+ background: var(--warn);
1246
+ border-color: var(--warn);
1247
+ color: #fff;
1248
+ box-shadow: 0 0 0 4px rgba(176, 132, 66, 0.15);
1174
1249
  }
1175
1250
  .tracker .stage-label {
1176
1251
  font-size: 11px;
@@ -1214,22 +1289,19 @@ button.small { padding: 4px 10px; font-size: 12px; }
1214
1289
  .tracker-active-label { display: block; }
1215
1290
  }
1216
1291
 
1217
- /* Template picker popover (R2). Absolute-positioned inside .coach-actions
1218
- so opening it does not push the textarea down. */
1219
- .coach-actions { position: relative; }
1292
+ /* Template picker popover. Fixed-position so it escapes overflow:hidden/auto
1293
+ ancestors (#active-conv, .panel-details). JS sets right/bottom on open. */
1220
1294
  .template-popover {
1221
- position: absolute;
1222
- bottom: 44px;
1223
- right: 0;
1295
+ position: fixed;
1224
1296
  width: 320px;
1225
1297
  max-height: 360px;
1226
- overflow: auto;
1298
+ overflow-y: auto;
1227
1299
  background: var(--surface);
1228
1300
  border: 1px solid var(--line);
1229
1301
  border-radius: 12px;
1230
1302
  box-shadow: var(--shadow-lg);
1231
1303
  padding: 12px;
1232
- z-index: 10;
1304
+ z-index: 200;
1233
1305
  }
1234
1306
  .template-popover .group {
1235
1307
  padding: 6px 0;
@@ -1276,16 +1348,17 @@ button.small { padding: 4px 10px; font-size: 12px; }
1276
1348
  .template-popover .template-row strong { font-size: 13px; font-weight: 500; }
1277
1349
  .template-popover .template-row span { font-size: 12px; color: var(--muted); }
1278
1350
 
1279
- /* Totals line (R4). 12px muted, no border, single row that wraps if it
1280
- absolutely must. Discoverable via hover tooltips per spec R4.4. */
1281
- .totals {
1282
- font-size: 11px;
1283
- color: var(--muted);
1284
- padding-top: 2px;
1285
- display: flex;
1286
- gap: 10px;
1287
- flex-wrap: wrap;
1288
- }
1351
+ /* Totals line now inside the tracker inline section, below tracker-note. */
1352
+ .totals {
1353
+ font-size: 11px;
1354
+ color: var(--muted);
1355
+ padding-top: 6px;
1356
+ margin-top: 6px;
1357
+ border-top: 1px solid var(--line);
1358
+ display: flex;
1359
+ gap: 10px;
1360
+ flex-wrap: wrap;
1361
+ }
1289
1362
  .totals span { cursor: help; }
1290
1363
  .totals .sep { color: var(--line); }
1291
1364
  .totals strong { color: var(--text); font-weight: 600; }
@@ -1294,67 +1367,67 @@ button.small { padding: 4px 10px; font-size: 12px; }
1294
1367
  /* ── Issue #385: Team roster, Employee selector, Lock badges, Hire notice ── */
1295
1368
 
1296
1369
  /* Team roster — horizontal chip row above conv list */
1297
- .team-roster {
1298
- display: grid;
1299
- gap: 10px;
1300
- }
1301
- .roster-chip {
1302
- display: grid;
1303
- grid-template-columns: 48px minmax(0, 1fr);
1304
- align-items: center;
1305
- gap: 12px;
1306
- width: 100%;
1307
- min-height: 74px;
1308
- border-radius: 22px;
1309
- background: rgba(255, 255, 255, 0.5);
1310
- border: 1px solid rgba(31, 67, 125, 0.1);
1311
- font-size: 12px;
1312
- color: var(--text);
1313
- cursor: pointer;
1314
- overflow: hidden;
1315
- padding: 12px 14px;
1316
- text-align: left;
1317
- box-shadow: 0 10px 24px rgba(35, 30, 23, 0.04);
1318
- }
1319
- .roster-chip.active {
1320
- border-color: rgba(31, 67, 125, 0.22);
1321
- background: rgba(223, 231, 245, 0.92);
1322
- box-shadow: 0 14px 28px rgba(31, 67, 125, 0.1);
1323
- }
1324
- .roster-avatar {
1325
- width: 48px;
1326
- height: 48px;
1327
- border-radius: 16px;
1328
- display: inline-flex;
1329
- align-items: center;
1330
- justify-content: center;
1331
- background: #ffffff;
1332
- color: var(--accent-strong);
1333
- font-size: 12px;
1334
- font-weight: 700;
1335
- border: 1px solid rgba(31, 67, 125, 0.1);
1336
- overflow: hidden;
1337
- }
1338
- .roster-avatar img { width: 100%; height: 100%; object-fit: cover; }
1339
- .roster-copy {
1340
- display: flex;
1341
- flex-direction: column;
1342
- min-width: 0;
1343
- }
1344
- .roster-copy strong {
1345
- font-size: 16px;
1346
- font-weight: 700;
1347
- color: var(--text);
1348
- line-height: 1.25;
1349
- }
1350
- .roster-copy small {
1351
- font-size: 13px;
1352
- color: var(--muted);
1353
- line-height: 1.4;
1354
- }
1355
- .roster-chip--all .roster-avatar {
1356
- background: var(--accent-soft);
1357
- }
1370
+ .team-roster {
1371
+ display: grid;
1372
+ gap: 10px;
1373
+ }
1374
+ .roster-chip {
1375
+ display: grid;
1376
+ grid-template-columns: 48px minmax(0, 1fr);
1377
+ align-items: center;
1378
+ gap: 12px;
1379
+ width: 100%;
1380
+ min-height: 74px;
1381
+ border-radius: 22px;
1382
+ background: rgba(255, 255, 255, 0.5);
1383
+ border: 1px solid rgba(31, 67, 125, 0.1);
1384
+ font-size: 12px;
1385
+ color: var(--text);
1386
+ cursor: pointer;
1387
+ overflow: hidden;
1388
+ padding: 12px 14px;
1389
+ text-align: left;
1390
+ box-shadow: 0 10px 24px rgba(35, 30, 23, 0.04);
1391
+ }
1392
+ .roster-chip.active {
1393
+ border-color: rgba(31, 67, 125, 0.22);
1394
+ background: rgba(223, 231, 245, 0.92);
1395
+ box-shadow: 0 14px 28px rgba(31, 67, 125, 0.1);
1396
+ }
1397
+ .roster-avatar {
1398
+ width: 48px;
1399
+ height: 48px;
1400
+ border-radius: 16px;
1401
+ display: inline-flex;
1402
+ align-items: center;
1403
+ justify-content: center;
1404
+ background: #ffffff;
1405
+ color: var(--accent-strong);
1406
+ font-size: 12px;
1407
+ font-weight: 700;
1408
+ border: 1px solid rgba(31, 67, 125, 0.1);
1409
+ overflow: hidden;
1410
+ }
1411
+ .roster-avatar img { width: 100%; height: 100%; object-fit: cover; }
1412
+ .roster-copy {
1413
+ display: flex;
1414
+ flex-direction: column;
1415
+ min-width: 0;
1416
+ }
1417
+ .roster-copy strong {
1418
+ font-size: 16px;
1419
+ font-weight: 700;
1420
+ color: var(--text);
1421
+ line-height: 1.25;
1422
+ }
1423
+ .roster-copy small {
1424
+ font-size: 13px;
1425
+ color: var(--muted);
1426
+ line-height: 1.4;
1427
+ }
1428
+ .roster-chip--all .roster-avatar {
1429
+ background: var(--accent-soft);
1430
+ }
1358
1431
  .roster-chip-add {
1359
1432
  width: 36px;
1360
1433
  height: 36px;
@@ -1482,3 +1555,113 @@ button.small { padding: 4px 10px; font-size: 12px; }
1482
1555
  }
1483
1556
  #hire-notice p { margin: 0 0 12px; font-size: 14px; color: var(--text); }
1484
1557
  .hire-notice-actions { display: flex; align-items: center; gap: 10px; }
1558
+
1559
+ /* ── Issue #442: A/B Testing Mode ─────────────────────────────────────── */
1560
+
1561
+ /* Modal step 2 — A/B toggle */
1562
+ #ab-toggle-wrap {
1563
+ margin-top: 12px;
1564
+ padding: 10px 12px;
1565
+ background: var(--accent-soft);
1566
+ border-radius: 8px;
1567
+ border: 1px solid var(--line);
1568
+ }
1569
+ .ab-toggle-label {
1570
+ display: flex;
1571
+ align-items: center;
1572
+ gap: 8px;
1573
+ font-size: 13px;
1574
+ font-weight: 500;
1575
+ color: var(--text);
1576
+ cursor: pointer;
1577
+ }
1578
+ .ab-toggle-label input[type="checkbox"] { cursor: pointer; }
1579
+ #ab-toggle-explanation {
1580
+ margin: 8px 0 0;
1581
+ font-size: 12px;
1582
+ color: var(--muted);
1583
+ line-height: 1.5;
1584
+ }
1585
+
1586
+ /* Rail badge */
1587
+ .ab-badge {
1588
+ margin-left: auto;
1589
+ padding: 1px 6px;
1590
+ font-size: 10px;
1591
+ font-weight: 600;
1592
+ letter-spacing: 0.04em;
1593
+ border-radius: 4px;
1594
+ background: var(--accent-soft);
1595
+ color: var(--accent);
1596
+ border: 1px solid var(--accent-soft);
1597
+ flex-shrink: 0;
1598
+ }
1599
+
1600
+ /* Full-panel A/B split: #conversation becomes a flex row */
1601
+ #conversation.ab-mode {
1602
+ display: flex;
1603
+ flex-direction: row;
1604
+ overflow: hidden;
1605
+ }
1606
+
1607
+ #conversation.ab-mode #active-conv {
1608
+ flex: 1;
1609
+ min-width: 0;
1610
+ overflow-y: auto;
1611
+ border-right: 1px solid var(--line);
1612
+ }
1613
+
1614
+ /* Direct (B) panel — flex column matching #active-conv so topline/status/reply
1615
+ stay pinned and only the log area scrolls. */
1616
+ #ab-direct-panel {
1617
+ flex: 1;
1618
+ min-width: 0;
1619
+ display: flex;
1620
+ flex-direction: column;
1621
+ gap: 14px;
1622
+ overflow: hidden;
1623
+ background: var(--bg);
1624
+ }
1625
+
1626
+ /* Identity label in conv-topline */
1627
+ .ab-direct-identity {
1628
+ display: flex;
1629
+ align-items: center;
1630
+ gap: 8px;
1631
+ }
1632
+
1633
+ .ab-direct-label {
1634
+ font-size: 11px;
1635
+ font-weight: 700;
1636
+ text-transform: uppercase;
1637
+ letter-spacing: 0.06em;
1638
+ color: var(--muted);
1639
+ }
1640
+
1641
+ /* Simple Running → Done progress row in the tracker area */
1642
+ .ab-direct-progress {
1643
+ font-size: 12px;
1644
+ font-weight: 600;
1645
+ padding: 2px 8px 4px 0;
1646
+ color: var(--muted);
1647
+ }
1648
+ .ab-direct-progress.running { color: var(--accent); }
1649
+ .ab-direct-progress.done { color: var(--done); }
1650
+ .ab-direct-progress.failed { color: var(--danger); }
1651
+
1652
+ /* Raw event log — scrolls inside the thread <details> the same way
1653
+ .messages does in A (the <details> itself has overflow-y: auto). */
1654
+ #ab-direct-log {
1655
+ margin: 0;
1656
+ padding: 4px 16px 12px;
1657
+ font-size: 11px;
1658
+ font-family: var(--mono, monospace);
1659
+ white-space: pre-wrap;
1660
+ word-break: break-all;
1661
+ color: var(--muted);
1662
+ line-height: 1.5;
1663
+ }
1664
+
1665
+ @media (max-width: 900px) {
1666
+ #conversation.ab-mode { flex-direction: column; }
1667
+ }