fraim-framework 2.0.146 → 2.0.147

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,19 @@
1
- :root {
2
- color-scheme: light;
3
- --bg: #f4f6f2;
4
- --surface: #ffffff;
5
- --soft: #f7faf6;
6
- --line: #e3e8df;
7
- --text: #1f2a24;
8
- --muted: #6b7a72;
9
- --accent: #3d8a6e;
10
- --accent-strong: #2f7359;
11
- --accent-soft: #eaf3ee;
12
- --warn: #b08442;
13
- --warn-soft: #fffaf0;
14
- --danger: #a24747;
15
- --shadow: 0 1px 2px rgba(20, 40, 30, 0.04);
16
- --shadow-lg: 0 12px 36px rgba(20, 40, 30, 0.18);
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);
17
17
  /* Issue #347 — picker group dots. Decorative only; the picker uses
18
18
  these to scan groups by color without adding semantic weight. Kept
19
19
  as variables so future themes flow through here. */
@@ -26,10 +26,12 @@ html, body { margin: 0; padding: 0; }
26
26
  [hidden] { display: none !important; }
27
27
 
28
28
  html, body { height: 100%; }
29
- body {
30
- font-family: -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
31
- color: var(--text);
32
- background: var(--bg);
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%);
33
35
  line-height: 1.5;
34
36
  font-size: 15px;
35
37
  /* Issue #339 fix: bound the page to the viewport. The conversation
@@ -39,9 +41,10 @@ body {
39
41
 
40
42
  button { font: inherit; cursor: pointer; }
41
43
 
42
- .page {
43
- max-width: 1080px;
44
- margin: 0 auto;
44
+ .page {
45
+ max-width: none;
46
+ width: 100%;
47
+ margin: 0;
45
48
  padding: 24px;
46
49
  display: flex;
47
50
  flex-direction: column;
@@ -51,26 +54,38 @@ button { font: inherit; cursor: pointer; }
51
54
  }
52
55
 
53
56
  /* Header */
54
- .header {
55
- display: flex;
56
- align-items: center;
57
- justify-content: space-between;
58
- gap: 16px;
59
- }
60
- .header h1 {
61
- font-size: 22px;
62
- font-weight: 600;
63
- margin: 0;
64
- letter-spacing: -0.01em;
65
- }
66
- .project-button {
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 {
67
82
  display: inline-flex;
68
83
  align-items: center;
69
84
  gap: 8px;
70
- background: var(--surface);
71
- border: 1px solid var(--line);
72
- border-radius: 10px;
73
- padding: 8px 14px;
85
+ background: rgba(255, 255, 255, 0.5);
86
+ border: 1px solid var(--line);
87
+ border-radius: 14px;
88
+ padding: 10px 16px;
74
89
  color: var(--text);
75
90
  box-shadow: var(--shadow);
76
91
  max-width: 360px;
@@ -86,11 +101,11 @@ button { font: inherit; cursor: pointer; }
86
101
  }
87
102
 
88
103
  /* Welcome line */
89
- .welcome {
90
- background: var(--surface);
91
- border: 1px solid var(--line);
92
- border-radius: 14px;
93
- padding: 18px 24px;
104
+ .welcome {
105
+ background: rgba(248, 244, 235, 0.86);
106
+ border: 1px solid var(--line);
107
+ border-radius: 20px;
108
+ padding: 20px 24px;
94
109
  box-shadow: var(--shadow);
95
110
  font-size: 15px;
96
111
  line-height: 1.7;
@@ -182,72 +197,94 @@ button { font: inherit; cursor: pointer; }
182
197
  }
183
198
 
184
199
  /* Layout */
185
- .layout {
186
- display: grid;
187
- grid-template-columns: 260px minmax(0, 1fr);
188
- gap: 20px;
189
- align-items: stretch;
190
- flex: 1;
191
- min-height: 0;
192
- }
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
+ }
193
208
 
194
209
  /* Left rail */
195
- .rail {
196
- display: grid;
197
- grid-template-columns: minmax(0, 1fr);
198
- grid-auto-rows: min-content;
199
- gap: 8px;
200
- min-width: 0;
201
- align-self: start;
202
- max-height: 100%;
203
- overflow-y: auto;
204
- }
205
- .new-conv {
206
- width: 100%;
207
- background: var(--accent);
208
- color: #fff;
209
- border: none;
210
- border-radius: 10px;
211
- padding: 10px 14px;
212
- font-weight: 600;
213
- box-shadow: var(--shadow);
214
- }
215
- .new-conv:hover { background: var(--accent-strong); }
216
- .new-conv:focus-visible { outline: 2px solid var(--accent-strong); outline-offset: 2px; }
217
- .conv-list {
218
- display: grid;
219
- grid-template-columns: minmax(0, 1fr);
220
- gap: 4px;
221
- margin-top: 4px;
222
- min-width: 0;
223
- }
224
- .conv-item {
225
- width: 100%;
226
- text-align: left;
227
- background: transparent;
228
- border: 1px solid transparent;
229
- border-radius: 10px;
230
- padding: 8px 10px;
231
- display: flex;
232
- align-items: center;
233
- justify-content: space-between;
234
- gap: 10px;
235
- color: var(--text);
236
- }
237
- .conv-item:hover { background: var(--soft); }
238
- .conv-item.active {
239
- background: var(--surface);
240
- border-color: var(--line);
241
- box-shadow: var(--shadow);
242
- }
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
+ }
243
280
  /* Text column: stacks persona name label above job title */
244
- .conv-body {
245
- flex: 1;
246
- min-width: 0;
247
- display: flex;
248
- flex-direction: column;
249
- gap: 1px;
250
- }
281
+ .conv-body {
282
+ flex: 1;
283
+ min-width: 0;
284
+ display: flex;
285
+ flex-direction: column;
286
+ gap: 4px;
287
+ }
251
288
  .conv-persona-name {
252
289
  font-size: 10px;
253
290
  font-weight: 700;
@@ -258,15 +295,24 @@ button { font: inherit; cursor: pointer; }
258
295
  overflow: hidden;
259
296
  text-overflow: ellipsis;
260
297
  }
261
- .conv-title { font-size: 13px; font-weight: 500; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
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
+ }
262
308
  /* Persona avatar chip — enlarged to 34px to serve as a clear visual anchor */
263
- .conv-persona-chip {
264
- flex-shrink: 0;
265
- width: 34px;
266
- height: 34px;
267
- border-radius: 50%;
268
- background: var(--accent-soft);
269
- border: 1.5px solid var(--accent);
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);
270
316
  display: flex;
271
317
  align-items: center;
272
318
  justify-content: center;
@@ -277,26 +323,28 @@ button { font: inherit; cursor: pointer; }
277
323
  line-height: 1;
278
324
  text-transform: uppercase;
279
325
  }
280
- .conv-persona-chip img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; }
326
+ .conv-persona-chip img { width: 100%; height: 100%; object-fit: cover; border-radius: 16px; }
281
327
  .conv-persona-chip--free { background: transparent; border-color: var(--line); color: var(--muted); }
282
- .conv-status {
283
- font-size: 11px;
284
- color: var(--muted);
285
- font-weight: 500;
286
- flex-shrink: 0;
287
- }
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
+ }
288
336
  .conv-status.running { color: var(--accent); }
289
337
  .conv-status.attention { color: var(--warn); }
290
338
  .conv-status.failed { color: var(--danger); }
291
339
 
292
340
  /* Conversation pane — fills the layout column vertically. Inner regions
293
341
  manage their own height; the .messages list is the only scrollable area. */
294
- .conversation {
295
- background: var(--surface);
296
- border: 1px solid var(--line);
297
- border-radius: 14px;
298
- box-shadow: var(--shadow);
299
- padding: 18px 20px;
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;
300
348
  display: flex;
301
349
  flex-direction: column;
302
350
  gap: 14px;
@@ -305,44 +353,143 @@ button { font: inherit; cursor: pointer; }
305
353
  height: 100%;
306
354
  overflow: hidden;
307
355
  }
308
- .empty-state {
309
- display: grid;
310
- gap: 8px;
311
- place-items: center;
312
- text-align: center;
313
- color: var(--muted);
314
- padding: 80px 16px;
315
- }
316
- .empty-state h3 { margin: 0; color: var(--text); font-weight: 600; font-size: 17px; }
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; }
317
378
  .empty-state p { margin: 0; max-width: 320px; }
318
379
 
319
- #active-conv {
320
- display: flex;
321
- flex-direction: column;
322
- gap: 12px;
323
- min-width: 0;
324
- flex: 1;
325
- min-height: 0;
326
- }
327
-
328
- .conv-header,
329
- .coach,
330
- .micro,
331
- .progress {
332
- flex-shrink: 0;
333
- }
334
- .conv-header {
335
- display: flex;
336
- flex-wrap: wrap;
337
- align-items: baseline;
338
- column-gap: 12px;
339
- row-gap: 4px;
340
- }
341
- .conv-header h2 { flex: 1 1 auto; min-width: 0; }
342
- #artifact-slot { flex: 0 0 auto; }
343
-
344
- .conv-header h2 { margin: 0; font-size: 18px; font-weight: 600; }
345
- .conv-job { color: var(--muted); font-size: 14px; margin-top: 2px; }
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
+ }
388
+
389
+ .conv-header,
390
+ .coach,
391
+ .micro,
392
+ .progress {
393
+ flex-shrink: 0;
394
+ }
395
+ .conv-topline {
396
+ display: flex;
397
+ align-items: center;
398
+ justify-content: space-between;
399
+ gap: 12px;
400
+ }
401
+ .employee-identity {
402
+ display: inline-flex;
403
+ align-items: center;
404
+ gap: 12px;
405
+ min-width: 0;
406
+ }
407
+ .identity-avatar {
408
+ width: 52px;
409
+ height: 52px;
410
+ border-radius: 18px;
411
+ background: #ffffff;
412
+ border: 1px solid rgba(31, 67, 125, 0.14);
413
+ display: inline-flex;
414
+ align-items: center;
415
+ justify-content: center;
416
+ overflow: hidden;
417
+ font-size: 16px;
418
+ font-weight: 700;
419
+ color: var(--accent-strong);
420
+ flex-shrink: 0;
421
+ }
422
+ .identity-avatar img {
423
+ width: 100%;
424
+ height: 100%;
425
+ object-fit: cover;
426
+ }
427
+ .identity-copy {
428
+ display: flex;
429
+ flex-direction: column;
430
+ min-width: 0;
431
+ }
432
+ .identity-copy strong {
433
+ font-size: 16px;
434
+ font-weight: 700;
435
+ color: var(--text);
436
+ }
437
+ .identity-copy small {
438
+ font-size: 13px;
439
+ color: var(--muted);
440
+ }
441
+ .run-state-pill {
442
+ display: inline-flex;
443
+ align-items: center;
444
+ justify-content: center;
445
+ padding: 7px 12px;
446
+ border-radius: 999px;
447
+ font-size: 11px;
448
+ font-weight: 700;
449
+ letter-spacing: 0.08em;
450
+ text-transform: uppercase;
451
+ background: rgba(31, 67, 125, 0.1);
452
+ color: var(--accent-strong);
453
+ }
454
+ .run-state-pill.running {
455
+ background: rgba(31, 67, 125, 0.14);
456
+ }
457
+ .run-state-pill.failed {
458
+ background: #fbebeb;
459
+ color: var(--danger);
460
+ }
461
+ .run-state-pill.completed {
462
+ background: #e4f0ea;
463
+ color: #2c6b4e;
464
+ }
465
+ .conv-header {
466
+ display: flex;
467
+ flex-wrap: wrap;
468
+ align-items: baseline;
469
+ column-gap: 12px;
470
+ row-gap: 4px;
471
+ }
472
+ .title-block {
473
+ display: flex;
474
+ flex-direction: column;
475
+ gap: 4px;
476
+ min-width: 0;
477
+ flex: 1 1 auto;
478
+ }
479
+ .conv-header h2 { flex: 1 1 auto; min-width: 0; }
480
+ #artifact-slot { flex: 0 0 auto; }
481
+
482
+ .conv-header h2 { margin: 0; font-size: 34px; font-weight: 700; letter-spacing: -0.03em; }
483
+ .conv-job { color: var(--muted); font-size: 14px; margin-top: 2px; }
484
+ .summary-strip {
485
+ background: rgba(255, 255, 255, 0.56);
486
+ border: 1px solid rgba(31, 67, 125, 0.08);
487
+ border-radius: 18px;
488
+ padding: 14px 16px;
489
+ color: var(--text);
490
+ font-size: 14px;
491
+ line-height: 1.55;
492
+ }
346
493
 
347
494
  .section-title {
348
495
  font-size: 13px;
@@ -377,11 +524,11 @@ button { font: inherit; cursor: pointer; }
377
524
 
378
525
  /* Progress is now a single-line status strip (was a tall card) so the
379
526
  messages region gets the vertical space it needs. */
380
- .progress {
381
- background: var(--soft);
382
- border: 1px solid var(--line);
383
- border-radius: 8px;
384
- padding: 8px 12px;
527
+ .progress {
528
+ background: rgba(255, 255, 255, 0.46);
529
+ border: 1px solid var(--line);
530
+ border-radius: 8px;
531
+ padding: 8px 12px;
385
532
  font-size: 13px;
386
533
  display: flex;
387
534
  align-items: center;
@@ -414,55 +561,147 @@ button { font: inherit; cursor: pointer; }
414
561
  }
415
562
  .progress.done .stage::before { background: #6cb39a; animation: none; }
416
563
  .progress.attention .stage::before { background: var(--warn); animation: none; }
417
- .progress.failed .stage::before { background: var(--danger); animation: none; }
418
- @keyframes pulse {
419
- 0%, 100% { opacity: 1; transform: scale(1); }
420
- 50% { opacity: 0.5; transform: scale(0.8); }
421
- }
422
-
423
- .messages {
424
- display: grid;
425
- grid-template-columns: minmax(0, 1fr);
426
- gap: 10px;
427
- margin-top: 12px;
428
- min-width: 0;
429
- /* Scroll messages here, not the page. */
430
- flex: 1;
431
- min-height: 0;
432
- overflow-y: auto;
433
- padding-right: 4px;
434
- }
435
- .message { word-wrap: break-word; overflow-wrap: anywhere; }
436
- .message {
437
- border-radius: 10px;
438
- padding: 10px 14px;
439
- font-size: 14px;
440
- line-height: 1.5;
441
- animation: slidein 280ms ease;
442
- }
443
- @keyframes slidein {
444
- from { opacity: 0; transform: translateY(6px); }
445
- to { opacity: 1; transform: translateY(0); }
446
- }
447
- .message.manager {
448
- background: var(--accent-soft);
449
- border: 1px solid #c5dcd0;
450
- color: var(--text);
451
- }
452
- .message.employee {
453
- background: var(--soft);
454
- border: 1px solid var(--line);
455
- color: var(--text);
456
- }
457
- .message .who {
458
- font-size: 11px;
459
- font-weight: 600;
460
- text-transform: uppercase;
461
- letter-spacing: 0.04em;
462
- color: var(--muted);
463
- display: block;
464
- margin-bottom: 4px;
465
- }
564
+ .progress.failed .stage::before { background: var(--danger); animation: none; }
565
+ @keyframes pulse {
566
+ 0%, 100% { opacity: 1; transform: scale(1); }
567
+ 50% { opacity: 0.5; transform: scale(0.8); }
568
+ }
569
+
570
+ .thread-surface {
571
+ display: flex;
572
+ flex-direction: column;
573
+ gap: 14px;
574
+ min-height: 280px;
575
+ flex: 1;
576
+ padding: 18px 18px 16px;
577
+ border-radius: 28px;
578
+ border: 1px solid rgba(31, 67, 125, 0.1);
579
+ background:
580
+ linear-gradient(180deg, rgba(255, 255, 255, 0.74), rgba(255, 255, 255, 0.5)),
581
+ radial-gradient(circle at top left, rgba(31, 67, 125, 0.06), transparent 34%);
582
+ }
583
+
584
+ .thread-surface-label {
585
+ font-size: 11px;
586
+ font-weight: 700;
587
+ letter-spacing: 0.14em;
588
+ text-transform: uppercase;
589
+ color: var(--muted);
590
+ }
591
+
592
+ .messages {
593
+ display: grid;
594
+ grid-template-columns: minmax(0, 1fr);
595
+ gap: 24px;
596
+ margin-top: 0;
597
+ min-width: 0;
598
+ /* Scroll messages here, not the page. */
599
+ flex: 1;
600
+ min-height: 180px;
601
+ overflow-y: auto;
602
+ padding: 8px 8px 8px 2px;
603
+ scroll-behavior: smooth;
604
+ }
605
+ .message {
606
+ word-wrap: break-word;
607
+ overflow-wrap: anywhere;
608
+ max-width: 100%;
609
+ width: 100%;
610
+ display: grid;
611
+ gap: 10px;
612
+ animation: slidein 280ms ease;
613
+ }
614
+ @keyframes slidein {
615
+ from { opacity: 0; transform: translateY(6px); }
616
+ to { opacity: 1; transform: translateY(0); }
617
+ }
618
+ .message.manager {
619
+ justify-items: end;
620
+ padding-left: 24%;
621
+ }
622
+ .message.employee {
623
+ justify-items: start;
624
+ padding-right: 24%;
625
+ }
626
+ .message.system {
627
+ justify-items: stretch;
628
+ padding-right: 16%;
629
+ }
630
+ .message-meta {
631
+ display: inline-flex;
632
+ align-items: center;
633
+ gap: 8px;
634
+ margin-bottom: 0;
635
+ }
636
+ .message.manager .message-meta {
637
+ justify-content: flex-end;
638
+ }
639
+ .message-avatar {
640
+ width: 28px;
641
+ height: 28px;
642
+ border-radius: 10px;
643
+ display: inline-flex;
644
+ align-items: center;
645
+ justify-content: center;
646
+ overflow: hidden;
647
+ font-size: 11px;
648
+ font-weight: 700;
649
+ border: 1px solid rgba(31, 67, 125, 0.1);
650
+ }
651
+ .message-avatar.manager {
652
+ background: rgba(31, 67, 125, 0.12);
653
+ color: var(--accent-strong);
654
+ }
655
+ .message-avatar.employee {
656
+ background: #ffffff;
657
+ color: var(--accent-strong);
658
+ }
659
+ .message-avatar.system {
660
+ background: rgba(35, 30, 23, 0.08);
661
+ color: var(--muted);
662
+ }
663
+ .message-avatar img {
664
+ width: 100%;
665
+ height: 100%;
666
+ object-fit: cover;
667
+ }
668
+ .message .who {
669
+ font-size: 11px;
670
+ font-weight: 700;
671
+ text-transform: uppercase;
672
+ letter-spacing: 0.08em;
673
+ color: var(--muted);
674
+ }
675
+ .message .lane-label {
676
+ font-size: 11px;
677
+ color: var(--muted);
678
+ opacity: 0.88;
679
+ }
680
+ .transport-raw {
681
+ display: none;
682
+ }
683
+ .bubble {
684
+ border-radius: 26px;
685
+ padding: 16px 18px;
686
+ font-size: 14px;
687
+ line-height: 1.6;
688
+ box-shadow: 0 12px 26px rgba(35, 30, 23, 0.05);
689
+ max-width: min(760px, 100%);
690
+ }
691
+ .message.manager .bubble {
692
+ background: var(--accent);
693
+ color: #fff;
694
+ }
695
+ .message.employee .bubble {
696
+ background: rgba(255, 255, 255, 0.86);
697
+ border: 1px solid rgba(31, 67, 125, 0.1);
698
+ color: var(--text);
699
+ }
700
+ .message.system .bubble {
701
+ background: rgba(255, 255, 255, 0.6);
702
+ border: 1px solid rgba(35, 30, 23, 0.08);
703
+ color: var(--text);
704
+ }
466
705
 
467
706
  /* Inline artifact pill that sits in the .conv-header next to the title.
468
707
  Compact so it never crowds Coach or Micro-manage. Hover reveals the
@@ -504,20 +743,26 @@ button { font: inherit; cursor: pointer; }
504
743
  }
505
744
  .artifact-where { display: none; } /* full path lives in tooltip via title attr */
506
745
 
507
- .coach textarea {
508
- width: 100%;
509
- min-height: 56px;
510
- max-height: 30vh;
511
- resize: vertical;
512
- border: 1px solid var(--line);
513
- border-radius: 10px;
514
- padding: 10px 14px;
515
- font: inherit;
516
- color: var(--text);
517
- background: var(--surface);
518
- }
519
- .coach textarea:focus { outline: none; border-color: var(--accent); }
520
- .coach-actions { display: flex; justify-content: flex-end; margin-top: 10px; }
746
+ .coach textarea {
747
+ width: 100%;
748
+ min-height: 56px;
749
+ max-height: 30vh;
750
+ resize: vertical;
751
+ border: 1px solid var(--line);
752
+ border-radius: 18px;
753
+ padding: 13px 15px;
754
+ font: inherit;
755
+ color: var(--text);
756
+ background: var(--surface);
757
+ }
758
+ .coach textarea:focus { outline: none; border-color: var(--accent); }
759
+ .coach-actions { display: flex; justify-content: flex-end; margin-top: 10px; }
760
+ .coach-note {
761
+ margin-top: 10px;
762
+ color: var(--muted);
763
+ font-size: 12px;
764
+ line-height: 1.5;
765
+ }
521
766
  .send-button {
522
767
  background: var(--accent);
523
768
  color: #fff;
@@ -743,7 +988,7 @@ button { font: inherit; cursor: pointer; }
743
988
  .install-status { color: var(--muted); flex: 1; font-size: 12px; }
744
989
  button.small { padding: 4px 10px; font-size: 12px; }
745
990
 
746
- @media (max-width: 820px) {
991
+ @media (max-width: 820px) {
747
992
  /* Single-column reflow — the rigid 100vh layout doesn't make sense at
748
993
  mobile width because the rail stacks above the conversation. Let the
749
994
  page scroll naturally and bound the messages section to keep the
@@ -755,11 +1000,27 @@ button.small { padding: 4px 10px; font-size: 12px; }
755
1000
  .rail { max-height: none; overflow-y: visible; }
756
1001
  .conversation { height: auto; min-height: 60vh; overflow: visible; }
757
1002
  #active-conv { flex: initial; }
758
- .conv-stream { flex: initial; }
759
- .messages { flex: initial; max-height: 60vh; }
760
- .header { flex-wrap: wrap; }
761
- .popover { width: min(320px, calc(100vw - 60px)); }
762
- }
1003
+ .conv-stream { flex: initial; }
1004
+ .messages { flex: initial; max-height: 60vh; }
1005
+ .header { flex-wrap: wrap; }
1006
+ .conv-topline { align-items: flex-start; flex-direction: column; }
1007
+ .conv-header h2 { font-size: 28px; }
1008
+ .thread-surface {
1009
+ padding: 16px 14px 14px;
1010
+ }
1011
+ .message,
1012
+ .message.manager,
1013
+ .message.employee,
1014
+ .message.system {
1015
+ max-width: 100%;
1016
+ padding-left: 0;
1017
+ padding-right: 0;
1018
+ }
1019
+ .team-roster {
1020
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1021
+ }
1022
+ .popover { width: min(320px, calc(100vw - 60px)); }
1023
+ }
763
1024
 
764
1025
  /* ---------------------------------------------------------------- */
765
1026
  /* Issue #347 — Pizza tracker (R1), template picker (R2), totals (R4) */
@@ -955,31 +1216,67 @@ button.small { padding: 4px 10px; font-size: 12px; }
955
1216
  /* ── Issue #385: Team roster, Employee selector, Lock badges, Hire notice ── */
956
1217
 
957
1218
  /* Team roster — horizontal chip row above conv list */
958
- .team-roster {
959
- display: flex;
960
- align-items: center;
961
- gap: 6px;
962
- padding: 8px 10px 4px;
963
- flex-wrap: wrap;
964
- }
965
- .roster-chip {
966
- display: flex;
967
- align-items: center;
968
- justify-content: center;
969
- width: 36px;
970
- height: 36px;
971
- border-radius: 50%;
972
- background: var(--accent-soft);
973
- border: 2px solid var(--line);
974
- font-size: 11px;
975
- font-weight: 700;
976
- color: var(--accent-strong);
977
- cursor: pointer;
978
- overflow: hidden;
979
- flex-shrink: 0;
980
- }
981
- .roster-chip.active { border-color: var(--accent); }
982
- .roster-chip img { width: 100%; height: 100%; object-fit: cover; }
1219
+ .team-roster {
1220
+ display: grid;
1221
+ gap: 10px;
1222
+ }
1223
+ .roster-chip {
1224
+ display: grid;
1225
+ grid-template-columns: 48px minmax(0, 1fr);
1226
+ align-items: center;
1227
+ gap: 12px;
1228
+ width: 100%;
1229
+ min-height: 74px;
1230
+ border-radius: 22px;
1231
+ background: rgba(255, 255, 255, 0.5);
1232
+ border: 1px solid rgba(31, 67, 125, 0.1);
1233
+ font-size: 12px;
1234
+ color: var(--text);
1235
+ cursor: pointer;
1236
+ overflow: hidden;
1237
+ padding: 12px 14px;
1238
+ text-align: left;
1239
+ box-shadow: 0 10px 24px rgba(35, 30, 23, 0.04);
1240
+ }
1241
+ .roster-chip.active {
1242
+ border-color: rgba(31, 67, 125, 0.22);
1243
+ background: rgba(223, 231, 245, 0.92);
1244
+ box-shadow: 0 14px 28px rgba(31, 67, 125, 0.1);
1245
+ }
1246
+ .roster-avatar {
1247
+ width: 48px;
1248
+ height: 48px;
1249
+ border-radius: 16px;
1250
+ display: inline-flex;
1251
+ align-items: center;
1252
+ justify-content: center;
1253
+ background: #ffffff;
1254
+ color: var(--accent-strong);
1255
+ font-size: 12px;
1256
+ font-weight: 700;
1257
+ border: 1px solid rgba(31, 67, 125, 0.1);
1258
+ overflow: hidden;
1259
+ }
1260
+ .roster-avatar img { width: 100%; height: 100%; object-fit: cover; }
1261
+ .roster-copy {
1262
+ display: flex;
1263
+ flex-direction: column;
1264
+ min-width: 0;
1265
+ }
1266
+ .roster-copy strong {
1267
+ font-size: 16px;
1268
+ font-weight: 700;
1269
+ color: var(--text);
1270
+ line-height: 1.25;
1271
+ }
1272
+ .roster-copy small {
1273
+ font-size: 13px;
1274
+ color: var(--muted);
1275
+ line-height: 1.4;
1276
+ }
1277
+ .roster-chip--all .roster-avatar {
1278
+ background: var(--accent-soft);
1279
+ }
983
1280
  .roster-chip-add {
984
1281
  width: 36px;
985
1282
  height: 36px;