fraim-framework 2.0.151 → 2.0.153

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: #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
+ --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,12 +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: "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%);
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%);
35
35
  line-height: 1.5;
36
36
  font-size: 15px;
37
37
  /* Issue #339 fix: bound the page to the viewport. The conversation
@@ -41,10 +41,10 @@ body {
41
41
 
42
42
  button { font: inherit; cursor: pointer; }
43
43
 
44
- .page {
45
- max-width: none;
46
- width: 100%;
47
- margin: 0;
44
+ .page {
45
+ max-width: none;
46
+ width: 100%;
47
+ margin: 0;
48
48
  padding: 24px;
49
49
  display: flex;
50
50
  flex-direction: column;
@@ -54,38 +54,38 @@ button { font: inherit; cursor: pointer; }
54
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 {
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 {
82
82
  display: inline-flex;
83
83
  align-items: center;
84
84
  gap: 8px;
85
- background: rgba(255, 255, 255, 0.5);
86
- border: 1px solid var(--line);
87
- border-radius: 14px;
88
- padding: 10px 16px;
85
+ background: rgba(255, 255, 255, 0.5);
86
+ border: 1px solid var(--line);
87
+ border-radius: 14px;
88
+ padding: 10px 16px;
89
89
  color: var(--text);
90
90
  box-shadow: var(--shadow);
91
91
  max-width: 360px;
@@ -101,11 +101,11 @@ button { font: inherit; cursor: pointer; }
101
101
  }
102
102
 
103
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;
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
109
  box-shadow: var(--shadow);
110
110
  font-size: 15px;
111
111
  line-height: 1.7;
@@ -197,94 +197,94 @@ button { font: inherit; cursor: pointer; }
197
197
  }
198
198
 
199
199
  /* 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
- }
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
+ }
208
208
 
209
209
  /* 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
- }
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
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
- }
281
+ .conv-body {
282
+ flex: 1;
283
+ min-width: 0;
284
+ display: flex;
285
+ flex-direction: column;
286
+ gap: 4px;
287
+ }
288
288
  .conv-persona-name {
289
289
  font-size: 10px;
290
290
  font-weight: 700;
@@ -295,24 +295,24 @@ button { font: inherit; cursor: pointer; }
295
295
  overflow: hidden;
296
296
  text-overflow: ellipsis;
297
297
  }
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
- }
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
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);
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);
316
316
  display: flex;
317
317
  align-items: center;
318
318
  justify-content: center;
@@ -323,28 +323,28 @@ button { font: inherit; cursor: pointer; }
323
323
  line-height: 1;
324
324
  text-transform: uppercase;
325
325
  }
326
- .conv-persona-chip img { width: 100%; height: 100%; object-fit: cover; border-radius: 16px; }
326
+ .conv-persona-chip img { width: 100%; height: 100%; object-fit: cover; border-radius: 16px; }
327
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
- }
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
+ }
336
336
  .conv-status.running { color: var(--accent); }
337
337
  .conv-status.attention { color: var(--warn); }
338
338
  .conv-status.failed { color: var(--danger); }
339
339
 
340
340
  /* Conversation pane — fills the layout column vertically. Inner regions
341
341
  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;
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;
348
348
  display: flex;
349
349
  flex-direction: column;
350
350
  gap: 14px;
@@ -353,148 +353,205 @@ button { font: inherit; cursor: pointer; }
353
353
  height: 100%;
354
354
  overflow: hidden;
355
355
  }
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; }
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; }
378
378
  .empty-state p { margin: 0; max-width: 320px; }
379
379
 
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
- }
493
-
494
- .section-title {
495
- font-size: 13px;
496
- font-weight: 600;
497
- color: var(--muted);
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);
498
555
  text-transform: uppercase;
499
556
  letter-spacing: 0.05em;
500
557
  margin-bottom: 8px;
@@ -524,11 +581,11 @@ button { font: inherit; cursor: pointer; }
524
581
 
525
582
  /* Progress is now a single-line status strip (was a tall card) so the
526
583
  messages region gets the vertical space it needs. */
527
- .progress {
528
- background: rgba(255, 255, 255, 0.46);
529
- border: 1px solid var(--line);
530
- border-radius: 8px;
531
- padding: 8px 12px;
584
+ .progress {
585
+ background: rgba(255, 255, 255, 0.46);
586
+ border: 1px solid var(--line);
587
+ border-radius: 8px;
588
+ padding: 8px 12px;
532
589
  font-size: 13px;
533
590
  display: flex;
534
591
  align-items: center;
@@ -561,147 +618,156 @@ button { font: inherit; cursor: pointer; }
561
618
  }
562
619
  .progress.done .stage::before { background: #6cb39a; animation: none; }
563
620
  .progress.attention .stage::before { background: var(--warn); animation: none; }
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
- }
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
+ }
705
771
 
706
772
  /* Inline artifact pill that sits in the .conv-header next to the title.
707
773
  Compact so it never crowds Coach or Micro-manage. Hover reveals the
@@ -743,26 +809,32 @@ button { font: inherit; cursor: pointer; }
743
809
  }
744
810
  .artifact-where { display: none; } /* full path lives in tooltip via title attr */
745
811
 
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
- }
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
+ }
766
838
  .send-button {
767
839
  background: var(--accent);
768
840
  color: #fff;
@@ -775,10 +847,13 @@ button { font: inherit; cursor: pointer; }
775
847
  .send-button:focus-visible { outline: 2px solid var(--accent-strong); outline-offset: 2px; }
776
848
  .send-button:disabled { background: #c5d2cb; cursor: not-allowed; }
777
849
 
778
- .micro {
779
- border-top: 1px solid var(--line);
780
- padding-top: 16px;
781
- }
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
+ }
782
857
  .micro summary {
783
858
  cursor: pointer;
784
859
  color: var(--muted);
@@ -795,10 +870,10 @@ button { font: inherit; cursor: pointer; }
795
870
  transition: transform 100ms;
796
871
  }
797
872
  .micro[open] summary::before { transform: rotate(90deg); }
798
- .micro-log {
799
- margin-top: 12px;
800
- background: #1f2a24;
801
- color: #c5d2cb;
873
+ .micro-log {
874
+ margin: 0 16px 16px;
875
+ background: #1f2a24;
876
+ color: #c5d2cb;
802
877
  border-radius: 8px;
803
878
  padding: 12px 14px;
804
879
  font-family: Consolas, Menlo, monospace;
@@ -988,7 +1063,7 @@ button { font: inherit; cursor: pointer; }
988
1063
  .install-status { color: var(--muted); flex: 1; font-size: 12px; }
989
1064
  button.small { padding: 4px 10px; font-size: 12px; }
990
1065
 
991
- @media (max-width: 820px) {
1066
+ @media (max-width: 820px) {
992
1067
  /* Single-column reflow — the rigid 100vh layout doesn't make sense at
993
1068
  mobile width because the rail stacks above the conversation. Let the
994
1069
  page scroll naturally and bound the messages section to keep the
@@ -1000,27 +1075,30 @@ button.small { padding: 4px 10px; font-size: 12px; }
1000
1075
  .rail { max-height: none; overflow-y: visible; }
1001
1076
  .conversation { height: auto; min-height: 60vh; overflow: visible; }
1002
1077
  #active-conv { flex: initial; }
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
- }
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
+ }
1024
1102
 
1025
1103
  /* ---------------------------------------------------------------- */
1026
1104
  /* Issue #347 — Pizza tracker (R1), template picker (R2), totals (R4) */
@@ -1200,14 +1278,14 @@ button.small { padding: 4px 10px; font-size: 12px; }
1200
1278
 
1201
1279
  /* Totals line (R4). 12px muted, no border, single row that wraps if it
1202
1280
  absolutely must. Discoverable via hover tooltips per spec R4.4. */
1203
- .totals {
1204
- font-size: 12px;
1205
- color: var(--muted);
1206
- padding-top: 4px;
1207
- display: flex;
1208
- gap: 14px;
1209
- flex-wrap: wrap;
1210
- }
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
+ }
1211
1289
  .totals span { cursor: help; }
1212
1290
  .totals .sep { color: var(--line); }
1213
1291
  .totals strong { color: var(--text); font-weight: 600; }
@@ -1216,67 +1294,67 @@ button.small { padding: 4px 10px; font-size: 12px; }
1216
1294
  /* ── Issue #385: Team roster, Employee selector, Lock badges, Hire notice ── */
1217
1295
 
1218
1296
  /* 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
- }
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
+ }
1280
1358
  .roster-chip-add {
1281
1359
  width: 36px;
1282
1360
  height: 36px;