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