fraim-framework 2.0.145 → 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,83 +197,154 @@ 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;
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
+ }
280
+ /* 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
+ }
288
+ .conv-persona-name {
289
+ font-size: 10px;
290
+ font-weight: 700;
291
+ color: var(--accent-strong);
292
+ letter-spacing: 0.06em;
293
+ text-transform: uppercase;
294
+ white-space: nowrap;
295
+ overflow: hidden;
296
+ text-overflow: ellipsis;
223
297
  }
224
- .conv-item {
225
- width: 100%;
226
- text-align: left;
227
- background: transparent;
228
- border: 1px solid transparent;
229
- border-radius: 10px;
230
- padding: 10px 12px;
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
+ }
308
+ /* 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);
231
316
  display: flex;
232
317
  align-items: center;
233
- justify-content: space-between;
234
- gap: 8px;
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
- }
243
- .conv-title { font-weight: 500; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
244
- .conv-status {
245
- font-size: 12px;
246
- color: var(--muted);
247
- font-weight: 500;
248
- flex-shrink: 0;
318
+ justify-content: center;
319
+ font-size: 11px;
320
+ font-weight: 700;
321
+ color: var(--accent-strong);
322
+ overflow: hidden;
323
+ line-height: 1;
324
+ text-transform: uppercase;
249
325
  }
326
+ .conv-persona-chip img { width: 100%; height: 100%; object-fit: cover; border-radius: 16px; }
327
+ .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
+ }
250
336
  .conv-status.running { color: var(--accent); }
251
337
  .conv-status.attention { color: var(--warn); }
252
338
  .conv-status.failed { color: var(--danger); }
253
339
 
254
340
  /* Conversation pane — fills the layout column vertically. Inner regions
255
341
  manage their own height; the .messages list is the only scrollable area. */
256
- .conversation {
257
- background: var(--surface);
258
- border: 1px solid var(--line);
259
- border-radius: 14px;
260
- box-shadow: var(--shadow);
261
- 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;
262
348
  display: flex;
263
349
  flex-direction: column;
264
350
  gap: 14px;
@@ -267,44 +353,143 @@ button { font: inherit; cursor: pointer; }
267
353
  height: 100%;
268
354
  overflow: hidden;
269
355
  }
270
- .empty-state {
271
- display: grid;
272
- gap: 8px;
273
- place-items: center;
274
- text-align: center;
275
- color: var(--muted);
276
- padding: 80px 16px;
277
- }
278
- .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; }
279
378
  .empty-state p { margin: 0; max-width: 320px; }
280
379
 
281
- #active-conv {
282
- display: flex;
283
- flex-direction: column;
284
- gap: 12px;
285
- min-width: 0;
286
- flex: 1;
287
- min-height: 0;
288
- }
289
-
290
- .conv-header,
291
- .coach,
292
- .micro,
293
- .progress {
294
- flex-shrink: 0;
295
- }
296
- .conv-header {
297
- display: flex;
298
- flex-wrap: wrap;
299
- align-items: baseline;
300
- column-gap: 12px;
301
- row-gap: 4px;
302
- }
303
- .conv-header h2 { flex: 1 1 auto; min-width: 0; }
304
- #artifact-slot { flex: 0 0 auto; }
305
-
306
- .conv-header h2 { margin: 0; font-size: 18px; font-weight: 600; }
307
- .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
+ }
308
493
 
309
494
  .section-title {
310
495
  font-size: 13px;
@@ -339,11 +524,11 @@ button { font: inherit; cursor: pointer; }
339
524
 
340
525
  /* Progress is now a single-line status strip (was a tall card) so the
341
526
  messages region gets the vertical space it needs. */
342
- .progress {
343
- background: var(--soft);
344
- border: 1px solid var(--line);
345
- border-radius: 8px;
346
- 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;
347
532
  font-size: 13px;
348
533
  display: flex;
349
534
  align-items: center;
@@ -376,55 +561,147 @@ button { font: inherit; cursor: pointer; }
376
561
  }
377
562
  .progress.done .stage::before { background: #6cb39a; animation: none; }
378
563
  .progress.attention .stage::before { background: var(--warn); animation: none; }
379
- .progress.failed .stage::before { background: var(--danger); animation: none; }
380
- @keyframes pulse {
381
- 0%, 100% { opacity: 1; transform: scale(1); }
382
- 50% { opacity: 0.5; transform: scale(0.8); }
383
- }
384
-
385
- .messages {
386
- display: grid;
387
- grid-template-columns: minmax(0, 1fr);
388
- gap: 10px;
389
- margin-top: 12px;
390
- min-width: 0;
391
- /* Scroll messages here, not the page. */
392
- flex: 1;
393
- min-height: 0;
394
- overflow-y: auto;
395
- padding-right: 4px;
396
- }
397
- .message { word-wrap: break-word; overflow-wrap: anywhere; }
398
- .message {
399
- border-radius: 10px;
400
- padding: 10px 14px;
401
- font-size: 14px;
402
- line-height: 1.5;
403
- animation: slidein 280ms ease;
404
- }
405
- @keyframes slidein {
406
- from { opacity: 0; transform: translateY(6px); }
407
- to { opacity: 1; transform: translateY(0); }
408
- }
409
- .message.manager {
410
- background: var(--accent-soft);
411
- border: 1px solid #c5dcd0;
412
- color: var(--text);
413
- }
414
- .message.employee {
415
- background: var(--soft);
416
- border: 1px solid var(--line);
417
- color: var(--text);
418
- }
419
- .message .who {
420
- font-size: 11px;
421
- font-weight: 600;
422
- text-transform: uppercase;
423
- letter-spacing: 0.04em;
424
- color: var(--muted);
425
- display: block;
426
- margin-bottom: 4px;
427
- }
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
+ }
428
705
 
429
706
  /* Inline artifact pill that sits in the .conv-header next to the title.
430
707
  Compact so it never crowds Coach or Micro-manage. Hover reveals the
@@ -466,20 +743,26 @@ button { font: inherit; cursor: pointer; }
466
743
  }
467
744
  .artifact-where { display: none; } /* full path lives in tooltip via title attr */
468
745
 
469
- .coach textarea {
470
- width: 100%;
471
- min-height: 56px;
472
- max-height: 30vh;
473
- resize: vertical;
474
- border: 1px solid var(--line);
475
- border-radius: 10px;
476
- padding: 10px 14px;
477
- font: inherit;
478
- color: var(--text);
479
- background: var(--surface);
480
- }
481
- .coach textarea:focus { outline: none; border-color: var(--accent); }
482
- .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
+ }
483
766
  .send-button {
484
767
  background: var(--accent);
485
768
  color: #fff;
@@ -705,7 +988,7 @@ button { font: inherit; cursor: pointer; }
705
988
  .install-status { color: var(--muted); flex: 1; font-size: 12px; }
706
989
  button.small { padding: 4px 10px; font-size: 12px; }
707
990
 
708
- @media (max-width: 820px) {
991
+ @media (max-width: 820px) {
709
992
  /* Single-column reflow — the rigid 100vh layout doesn't make sense at
710
993
  mobile width because the rail stacks above the conversation. Let the
711
994
  page scroll naturally and bound the messages section to keep the
@@ -717,11 +1000,27 @@ button.small { padding: 4px 10px; font-size: 12px; }
717
1000
  .rail { max-height: none; overflow-y: visible; }
718
1001
  .conversation { height: auto; min-height: 60vh; overflow: visible; }
719
1002
  #active-conv { flex: initial; }
720
- .conv-stream { flex: initial; }
721
- .messages { flex: initial; max-height: 60vh; }
722
- .header { flex-wrap: wrap; }
723
- .popover { width: min(320px, calc(100vw - 60px)); }
724
- }
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
+ }
725
1024
 
726
1025
  /* ---------------------------------------------------------------- */
727
1026
  /* Issue #347 — Pizza tracker (R1), template picker (R2), totals (R4) */
@@ -912,3 +1211,196 @@ button.small { padding: 4px 10px; font-size: 12px; }
912
1211
  .totals span { cursor: help; }
913
1212
  .totals .sep { color: var(--line); }
914
1213
  .totals strong { color: var(--text); font-weight: 600; }
1214
+
1215
+
1216
+ /* ── Issue #385: Team roster, Employee selector, Lock badges, Hire notice ── */
1217
+
1218
+ /* Team roster — horizontal chip row above conv list */
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
+ }
1280
+ .roster-chip-add {
1281
+ width: 36px;
1282
+ height: 36px;
1283
+ border-radius: 50%;
1284
+ border: 2px dashed var(--line);
1285
+ background: none;
1286
+ font-size: 18px;
1287
+ color: var(--muted);
1288
+ cursor: pointer;
1289
+ display: flex;
1290
+ align-items: center;
1291
+ justify-content: center;
1292
+ text-decoration: none;
1293
+ }
1294
+ .roster-chip-add:hover { border-color: var(--accent); color: var(--accent); }
1295
+
1296
+ /* Employee selector */
1297
+ .employee-selector { padding: 4px 8px; position: relative; }
1298
+ .emp-select-btn {
1299
+ display: flex;
1300
+ align-items: center;
1301
+ gap: 6px;
1302
+ width: 100%;
1303
+ background: var(--soft);
1304
+ border: 1px solid var(--line);
1305
+ border-radius: 8px;
1306
+ padding: 7px 10px;
1307
+ font: inherit;
1308
+ font-size: 13px;
1309
+ color: var(--text);
1310
+ cursor: pointer;
1311
+ text-align: left;
1312
+ }
1313
+ .emp-select-btn:hover { background: var(--accent-soft); border-color: var(--accent); }
1314
+ .emp-avatar-sm {
1315
+ width: 20px;
1316
+ height: 20px;
1317
+ border-radius: 50%;
1318
+ background: var(--accent-soft);
1319
+ font-size: 9px;
1320
+ font-weight: 700;
1321
+ color: var(--accent-strong);
1322
+ display: inline-flex;
1323
+ align-items: center;
1324
+ justify-content: center;
1325
+ flex-shrink: 0;
1326
+ overflow: hidden;
1327
+ }
1328
+ .emp-avatar-sm img { width: 100%; height: 100%; object-fit: cover; }
1329
+ .emp-caret { margin-left: auto; color: var(--muted); font-size: 11px; }
1330
+ .emp-dropdown {
1331
+ position: absolute;
1332
+ top: calc(100% + 2px);
1333
+ left: 8px;
1334
+ right: 8px;
1335
+ background: var(--surface);
1336
+ border: 1px solid var(--line);
1337
+ border-radius: 8px;
1338
+ box-shadow: var(--shadow-lg);
1339
+ z-index: 100;
1340
+ overflow: hidden;
1341
+ }
1342
+ .emp-option {
1343
+ display: flex;
1344
+ align-items: center;
1345
+ gap: 8px;
1346
+ padding: 8px 12px;
1347
+ font-size: 13px;
1348
+ color: var(--text);
1349
+ cursor: pointer;
1350
+ background: none;
1351
+ border: none;
1352
+ width: 100%;
1353
+ text-align: left;
1354
+ font: inherit;
1355
+ }
1356
+ .emp-option:hover { background: var(--soft); }
1357
+ .emp-option.active { background: var(--accent-soft); color: var(--accent-strong); font-weight: 600; }
1358
+
1359
+ /* Lock badge — inline after job title */
1360
+ .lock-badge {
1361
+ font-size: 11px;
1362
+ font-weight: 600;
1363
+ color: var(--warn);
1364
+ margin-left: 6px;
1365
+ white-space: nowrap;
1366
+ }
1367
+ .job-option.locked { opacity: 0.85; }
1368
+ .job-option.locked:hover { background: var(--warn-soft) !important; }
1369
+
1370
+ /* Persona job filter bar inside New Job modal */
1371
+ #job-persona-filter {
1372
+ display: flex;
1373
+ flex-wrap: wrap;
1374
+ gap: 6px;
1375
+ margin-bottom: 12px;
1376
+ }
1377
+ .jf-chip {
1378
+ display: inline-flex;
1379
+ align-items: center;
1380
+ gap: 5px;
1381
+ padding: 4px 10px 4px 6px;
1382
+ border: 1.5px solid var(--line);
1383
+ border-radius: 20px;
1384
+ background: transparent;
1385
+ cursor: pointer;
1386
+ font-size: 13px;
1387
+ font-weight: 500;
1388
+ color: var(--text);
1389
+ transition: border-color 0.15s, background 0.15s;
1390
+ white-space: nowrap;
1391
+ }
1392
+ .jf-chip:hover { border-color: var(--accent); }
1393
+ .jf-chip.active { border-color: var(--accent); background: var(--accent-soft); color: var(--accent-strong); }
1394
+ .jf-chip img { width: 20px; height: 20px; border-radius: 50%; object-fit: cover; }
1395
+
1396
+ /* Hire-required notice */
1397
+ #hire-notice {
1398
+ margin: 0 0 0;
1399
+ border-left: 3px solid var(--warn);
1400
+ border-radius: 8px;
1401
+ background: var(--warn-soft);
1402
+ padding: 16px 18px;
1403
+ margin: 0 0 12px;
1404
+ }
1405
+ #hire-notice p { margin: 0 0 12px; font-size: 14px; color: var(--text); }
1406
+ .hire-notice-actions { display: flex; align-items: center; gap: 10px; }