fraim-framework 2.0.147 → 2.0.149

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,143 +353,143 @@ 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
- }
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
493
 
494
494
  .section-title {
495
495
  font-size: 13px;
@@ -524,11 +524,11 @@ button { font: inherit; cursor: pointer; }
524
524
 
525
525
  /* Progress is now a single-line status strip (was a tall card) so the
526
526
  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;
527
+ .progress {
528
+ background: rgba(255, 255, 255, 0.46);
529
+ border: 1px solid var(--line);
530
+ border-radius: 8px;
531
+ padding: 8px 12px;
532
532
  font-size: 13px;
533
533
  display: flex;
534
534
  align-items: center;
@@ -561,147 +561,147 @@ button { font: inherit; cursor: pointer; }
561
561
  }
562
562
  .progress.done .stage::before { background: #6cb39a; animation: none; }
563
563
  .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
- }
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
+ }
705
705
 
706
706
  /* Inline artifact pill that sits in the .conv-header next to the title.
707
707
  Compact so it never crowds Coach or Micro-manage. Hover reveals the
@@ -743,26 +743,26 @@ button { font: inherit; cursor: pointer; }
743
743
  }
744
744
  .artifact-where { display: none; } /* full path lives in tooltip via title attr */
745
745
 
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
- }
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
+ }
766
766
  .send-button {
767
767
  background: var(--accent);
768
768
  color: #fff;
@@ -988,7 +988,7 @@ button { font: inherit; cursor: pointer; }
988
988
  .install-status { color: var(--muted); flex: 1; font-size: 12px; }
989
989
  button.small { padding: 4px 10px; font-size: 12px; }
990
990
 
991
- @media (max-width: 820px) {
991
+ @media (max-width: 820px) {
992
992
  /* Single-column reflow — the rigid 100vh layout doesn't make sense at
993
993
  mobile width because the rail stacks above the conversation. Let the
994
994
  page scroll naturally and bound the messages section to keep the
@@ -1000,27 +1000,27 @@ button.small { padding: 4px 10px; font-size: 12px; }
1000
1000
  .rail { max-height: none; overflow-y: visible; }
1001
1001
  .conversation { height: auto; min-height: 60vh; overflow: visible; }
1002
1002
  #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
- }
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
+ }
1024
1024
 
1025
1025
  /* ---------------------------------------------------------------- */
1026
1026
  /* Issue #347 — Pizza tracker (R1), template picker (R2), totals (R4) */
@@ -1216,67 +1216,67 @@ button.small { padding: 4px 10px; font-size: 12px; }
1216
1216
  /* ── Issue #385: Team roster, Employee selector, Lock badges, Hire notice ── */
1217
1217
 
1218
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
- }
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
1280
  .roster-chip-add {
1281
1281
  width: 36px;
1282
1282
  height: 36px;