@imenam/mcp-messenger 1.0.9 → 1.0.11

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,328 +1,1147 @@
1
- :root {
2
- --bg: #f6f7f9;
3
- --panel: #ffffff;
4
- --border: #e2e5ea;
5
- --text: #1c2024;
6
- --muted: #6b7280;
7
- --accent: #2f6feb;
8
- --accent-soft: #e8f0fe;
9
- --danger: #c8362f;
10
- --radius: 8px;
11
- }
12
-
13
- @media (prefers-color-scheme: dark) {
14
- :root {
15
- --bg: #14171c;
16
- --panel: #1b1f26;
17
- --border: #2b313b;
18
- --text: #e6e9ee;
19
- --muted: #98a1b0;
20
- --accent: #7aa2f7;
21
- --accent-soft: #223049;
22
- --danger: #f07178;
23
- }
24
- }
25
-
26
- * {
27
- box-sizing: border-box;
28
- }
29
-
30
- /* `hidden` doit l'emporter sur les `display` posés plus bas (barre de jeton). */
31
- [hidden] {
32
- display: none !important;
33
- }
34
-
35
- body {
36
- margin: 0;
37
- font: 14px/1.5 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
38
- background: var(--bg);
39
- color: var(--text);
40
- }
41
-
42
- .topbar {
43
- display: flex;
44
- align-items: center;
45
- justify-content: space-between;
46
- gap: 16px;
47
- padding: 12px 20px;
48
- background: var(--panel);
49
- border-bottom: 1px solid var(--border);
50
- }
51
-
52
- .brand {
53
- display: flex;
54
- align-items: baseline;
55
- gap: 12px;
56
- }
57
-
58
- .brand h1 {
59
- font-size: 16px;
60
- margin: 0;
61
- }
62
-
63
- .dot {
64
- width: 9px;
65
- height: 9px;
66
- border-radius: 50%;
67
- background: var(--muted);
68
- align-self: center;
69
- }
70
-
71
- .dot.ok {
72
- background: #2ea043;
73
- }
74
-
75
- .dot.ko {
76
- background: var(--danger);
77
- }
78
-
79
- .controls {
80
- display: flex;
81
- align-items: center;
82
- gap: 12px;
83
- }
84
-
85
- .auto {
86
- color: var(--muted);
87
- display: flex;
88
- align-items: center;
89
- gap: 6px;
90
- }
91
-
92
- button {
93
- font: inherit;
94
- padding: 6px 12px;
95
- border-radius: var(--radius);
96
- border: 1px solid var(--border);
97
- background: var(--panel);
98
- color: var(--text);
99
- cursor: pointer;
100
- }
101
-
102
- button:hover {
103
- border-color: var(--accent);
104
- }
105
-
106
- button.link {
107
- border: none;
108
- background: none;
109
- color: var(--accent);
110
- padding: 0;
111
- }
112
-
113
- input[type="search"],
114
- input[type="password"] {
115
- font: inherit;
116
- padding: 6px 10px;
117
- border-radius: var(--radius);
118
- border: 1px solid var(--border);
119
- background: var(--panel);
120
- color: var(--text);
121
- }
122
-
123
- .token-bar {
124
- margin: 0;
125
- display: flex;
126
- align-items: center;
127
- gap: 10px;
128
- padding: 12px 20px;
129
- background: var(--accent-soft);
130
- border-bottom: 1px solid var(--border);
131
- }
132
-
133
- .token-bar input {
134
- min-width: 320px;
135
- }
136
-
137
- main {
138
- display: grid;
139
- grid-template-columns: 260px minmax(320px, 1fr) minmax(320px, 1.2fr);
140
- gap: 12px;
141
- padding: 12px;
142
- align-items: start;
143
- height: calc(100vh - 58px);
144
- }
145
-
146
- .panel {
147
- background: var(--panel);
148
- border: 1px solid var(--border);
149
- border-radius: var(--radius);
150
- height: 100%;
151
- overflow: auto;
152
- padding: 12px;
153
- }
154
-
155
- .panel h2 {
156
- font-size: 12px;
157
- text-transform: uppercase;
158
- letter-spacing: 0.06em;
159
- color: var(--muted);
160
- margin: 0 0 8px;
161
- }
162
-
163
- ul {
164
- list-style: none;
165
- margin: 0;
166
- padding: 0;
167
- }
168
-
169
- .agents li {
170
- padding: 8px;
171
- border-radius: var(--radius);
172
- cursor: pointer;
173
- }
174
-
175
- .agents li:hover {
176
- background: var(--accent-soft);
177
- }
178
-
179
- .agents li.selected {
180
- background: var(--accent-soft);
181
- outline: 1px solid var(--accent);
182
- }
183
-
184
- .agents .name {
185
- font-weight: 600;
186
- }
187
-
188
- /* Le nom de la boîte, sous celui de l'agent : le sujet de la session, sans lui voler la vedette. */
189
- .agents .mailbox-name {
190
- font-size: 12px;
191
- }
192
-
193
- /* L'adresse reste lisible pour être recopiée, mais ne prend plus le pas sur le nom. */
194
- .agents .id {
195
- color: var(--muted);
196
- font-size: 11px;
197
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
198
- word-break: break-all;
199
- }
200
-
201
- .filters {
202
- display: flex;
203
- align-items: center;
204
- gap: 10px;
205
- margin-bottom: 10px;
206
- }
207
-
208
- .filters input {
209
- flex: 1;
210
- }
211
-
212
- .messages li {
213
- padding: 10px;
214
- border-radius: var(--radius);
215
- border: 1px solid transparent;
216
- cursor: pointer;
217
- }
218
-
219
- .messages li:hover {
220
- background: var(--accent-soft);
221
- }
222
-
223
- .messages li.selected {
224
- border-color: var(--accent);
225
- background: var(--accent-soft);
226
- }
227
-
228
- .messages .subject {
229
- font-weight: 600;
230
- }
231
-
232
- /* Nom du fil : au-dessus de l'expéditeur, en accent, pour rattacher le message d'un coup d'œil. */
233
- .messages .thread-name {
234
- color: var(--accent);
235
- font-size: 12px;
236
- margin-top: 2px;
237
- }
238
-
239
- .detail .thread-description {
240
- color: var(--muted);
241
- margin: 6px 0 10px;
242
- }
243
-
244
- .messages .route {
245
- color: var(--muted);
246
- font-size: 12px;
247
- word-break: break-all;
248
- }
249
-
250
- .messages .preview {
251
- color: var(--muted);
252
- margin-top: 4px;
253
- display: -webkit-box;
254
- -webkit-line-clamp: 2;
255
- -webkit-box-orient: vertical;
256
- overflow: hidden;
257
- }
258
-
259
- .muted {
260
- color: var(--muted);
261
- }
262
-
263
- .error {
264
- color: var(--danger);
265
- }
266
-
267
- .badge {
268
- display: inline-block;
269
- font-size: 11px;
270
- padding: 1px 6px;
271
- border-radius: 999px;
272
- border: 1px solid var(--border);
273
- color: var(--muted);
274
- margin-left: 6px;
275
- }
276
-
277
- .badge.unread {
278
- border-color: var(--accent);
279
- color: var(--accent);
280
- }
281
-
282
- .badge.high {
283
- border-color: var(--danger);
284
- color: var(--danger);
285
- }
286
-
287
- .detail h3 {
288
- margin: 0 0 4px;
289
- font-size: 16px;
290
- }
291
-
292
- .detail .meta {
293
- color: var(--muted);
294
- font-size: 12px;
295
- white-space: pre-line;
296
- margin-bottom: 12px;
297
- word-break: break-all;
298
- }
299
-
300
- .detail .body {
301
- white-space: pre-wrap;
302
- word-wrap: break-word;
303
- border-top: 1px solid var(--border);
304
- padding-top: 12px;
305
- }
306
-
307
- .detail .deliveries {
308
- margin-top: 16px;
309
- border-top: 1px solid var(--border);
310
- padding-top: 12px;
311
- }
312
-
313
- .detail .deliveries li {
314
- padding: 2px 0;
315
- color: var(--muted);
316
- }
317
-
318
- .thread-message {
319
- border-top: 1px solid var(--border);
320
- padding-top: 10px;
321
- margin-top: 10px;
322
- }
323
-
324
- .empty {
325
- color: var(--muted);
326
- padding: 24px 8px;
327
- text-align: center;
328
- }
1
+ :root {
2
+ --bg: #f6f7f9;
3
+ --panel: #ffffff;
4
+ --border: #e2e5ea;
5
+ --border-soft: #eef0f3;
6
+ --text: #1c2024;
7
+ --muted: #6b7280;
8
+ --accent: #2f6feb;
9
+ --accent-soft: #e8f0fe;
10
+ --accent-softer: #dbe6fb;
11
+ --ok: #1e7a34;
12
+ --ok-soft: #e6f4ea;
13
+ --warn: #b45309;
14
+ --warn-soft: #fff3e0;
15
+ --danger: #c8362f;
16
+ --danger-soft: #fdecea;
17
+ --neutral-soft: #eef0f3;
18
+ --radius: 8px;
19
+ --topbar-h: 56px;
20
+ }
21
+
22
+ @media (prefers-color-scheme: dark) {
23
+ :root {
24
+ --bg: #14171c;
25
+ --panel: #1b1f26;
26
+ --border: #2b313b;
27
+ --border-soft: #232831;
28
+ --text: #e6e9ee;
29
+ --muted: #98a1b0;
30
+ --accent: #7aa2f7;
31
+ --accent-soft: #223049;
32
+ --accent-softer: #2b3d5c;
33
+ --ok: #7ee2a0;
34
+ --ok-soft: #1d3327;
35
+ --warn: #f0b429;
36
+ --warn-soft: #3a2c14;
37
+ --danger: #f07178;
38
+ --danger-soft: #3a2023;
39
+ --neutral-soft: #262c35;
40
+ }
41
+ }
42
+
43
+ * {
44
+ box-sizing: border-box;
45
+ }
46
+
47
+ [hidden] {
48
+ display: none !important;
49
+ }
50
+
51
+ body {
52
+ margin: 0;
53
+ font: 14px/1.5 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
54
+ background: var(--bg);
55
+ color: var(--text);
56
+ }
57
+
58
+ .icon {
59
+ width: 16px;
60
+ height: 16px;
61
+ fill: none;
62
+ stroke: currentColor;
63
+ stroke-width: 2;
64
+ stroke-linecap: round;
65
+ stroke-linejoin: round;
66
+ flex: none;
67
+ }
68
+
69
+ .muted {
70
+ color: var(--muted);
71
+ }
72
+
73
+ /* --- Barre du haut -------------------------------------------------------- */
74
+
75
+ .topbar {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: 16px;
79
+ height: var(--topbar-h);
80
+ padding: 0 20px;
81
+ background: var(--panel);
82
+ border-bottom: 1px solid var(--border);
83
+ }
84
+
85
+ .brand {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 12px;
89
+ flex: none;
90
+ }
91
+
92
+ .brand-mark {
93
+ width: 20px;
94
+ height: 20px;
95
+ fill: none;
96
+ stroke: var(--accent);
97
+ stroke-width: 2;
98
+ stroke-linecap: round;
99
+ stroke-linejoin: round;
100
+ }
101
+
102
+ .brand h1 {
103
+ font-size: 16px;
104
+ margin: 0;
105
+ white-space: nowrap;
106
+ }
107
+
108
+ /* La pastille dit l'état du serveur d'un coup d'œil : couleur + mot, jamais la couleur seule. */
109
+ .pill {
110
+ display: inline-flex;
111
+ align-items: center;
112
+ gap: 6px;
113
+ padding: 2px 10px;
114
+ border-radius: 999px;
115
+ font-size: 12px;
116
+ white-space: nowrap;
117
+ background: var(--neutral-soft);
118
+ color: var(--muted);
119
+ }
120
+
121
+ .pill-dot {
122
+ width: 6px;
123
+ height: 6px;
124
+ border-radius: 50%;
125
+ background: currentColor;
126
+ }
127
+
128
+ .pill--ok {
129
+ background: var(--ok-soft);
130
+ color: var(--ok);
131
+ }
132
+
133
+ .pill--ko {
134
+ background: var(--danger-soft);
135
+ color: var(--danger);
136
+ }
137
+
138
+ .topbar-search {
139
+ display: flex;
140
+ align-items: center;
141
+ gap: 8px;
142
+ flex: 1;
143
+ max-width: 420px;
144
+ margin: 0 auto;
145
+ padding: 0 12px;
146
+ height: 32px;
147
+ border-radius: var(--radius);
148
+ border: 1px solid var(--border);
149
+ background: var(--bg);
150
+ color: var(--muted);
151
+ }
152
+
153
+ .topbar-search input {
154
+ flex: 1;
155
+ min-width: 0;
156
+ border: 0;
157
+ background: none;
158
+ font: inherit;
159
+ font-size: 13px;
160
+ color: var(--text);
161
+ outline: none;
162
+ }
163
+
164
+ .topbar-controls {
165
+ display: flex;
166
+ align-items: center;
167
+ gap: 12px;
168
+ flex: none;
169
+ margin-left: auto;
170
+ }
171
+
172
+ /* Interrupteur du rafraîchissement : la case native est masquée, pas retirée. */
173
+ .switch {
174
+ display: flex;
175
+ align-items: center;
176
+ gap: 8px;
177
+ cursor: pointer;
178
+ user-select: none;
179
+ }
180
+
181
+ .switch input {
182
+ position: absolute;
183
+ opacity: 0;
184
+ width: 0;
185
+ height: 0;
186
+ }
187
+
188
+ .switch-track {
189
+ width: 34px;
190
+ height: 18px;
191
+ border-radius: 999px;
192
+ background: var(--border);
193
+ padding: 2px;
194
+ transition: background 0.15s;
195
+ }
196
+
197
+ .switch-knob {
198
+ display: block;
199
+ width: 14px;
200
+ height: 14px;
201
+ border-radius: 50%;
202
+ background: var(--panel);
203
+ transition: transform 0.15s;
204
+ }
205
+
206
+ .switch input:checked + .switch-track {
207
+ background: var(--accent);
208
+ }
209
+
210
+ .switch input:checked + .switch-track .switch-knob {
211
+ transform: translateX(16px);
212
+ }
213
+
214
+ .switch input:focus-visible + .switch-track {
215
+ outline: 2px solid var(--accent);
216
+ outline-offset: 2px;
217
+ }
218
+
219
+ .switch-label {
220
+ font-size: 13px;
221
+ color: var(--muted);
222
+ }
223
+
224
+ /* --- Boutons -------------------------------------------------------------- */
225
+
226
+ .btn {
227
+ font: inherit;
228
+ font-size: 13px;
229
+ display: inline-flex;
230
+ align-items: center;
231
+ justify-content: center;
232
+ gap: 8px;
233
+ padding: 7px 12px;
234
+ border-radius: var(--radius);
235
+ border: 1px solid var(--border);
236
+ background: var(--panel);
237
+ color: var(--text);
238
+ cursor: pointer;
239
+ }
240
+
241
+ .btn:hover {
242
+ border-color: var(--accent);
243
+ }
244
+
245
+ .btn:focus-visible {
246
+ outline: 2px solid var(--accent);
247
+ outline-offset: 2px;
248
+ }
249
+
250
+ .btn--icon {
251
+ padding: 7px;
252
+ }
253
+
254
+ .btn--ghost {
255
+ border-color: transparent;
256
+ background: none;
257
+ color: var(--muted);
258
+ }
259
+
260
+ .btn--link {
261
+ border-color: transparent;
262
+ background: none;
263
+ color: var(--accent);
264
+ padding: 7px 4px;
265
+ }
266
+
267
+ .btn--primary {
268
+ background: var(--accent);
269
+ border-color: var(--accent);
270
+ color: #ffffff;
271
+ font-weight: 600;
272
+ padding: 10px 12px;
273
+ }
274
+
275
+ .btn--primary:hover {
276
+ filter: brightness(1.05);
277
+ }
278
+
279
+ .btn--block {
280
+ width: 100%;
281
+ }
282
+
283
+ /* --- Connexion ------------------------------------------------------------ */
284
+
285
+ .login {
286
+ display: flex;
287
+ justify-content: center;
288
+ padding: 120px 20px 20px;
289
+ }
290
+
291
+ .card {
292
+ width: 420px;
293
+ max-width: 100%;
294
+ padding: 32px;
295
+ border-radius: 12px;
296
+ border: 1px solid var(--border);
297
+ background: var(--panel);
298
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.06);
299
+ text-align: center;
300
+ }
301
+
302
+ .card-badge {
303
+ width: 48px;
304
+ height: 48px;
305
+ margin: 0 auto 16px;
306
+ border-radius: 50%;
307
+ display: grid;
308
+ place-items: center;
309
+ background: var(--accent-soft);
310
+ color: var(--accent);
311
+ }
312
+
313
+ .card-badge .icon {
314
+ width: 22px;
315
+ height: 22px;
316
+ }
317
+
318
+ .card h2 {
319
+ margin: 0;
320
+ font-size: 18px;
321
+ }
322
+
323
+ .card-sub {
324
+ margin: 4px 0 0;
325
+ font-size: 13px;
326
+ color: var(--muted);
327
+ }
328
+
329
+ .card-note {
330
+ margin: 16px 0 0;
331
+ font-size: 12px;
332
+ line-height: 1.4;
333
+ color: var(--muted);
334
+ text-align: left;
335
+ }
336
+
337
+ .field {
338
+ display: block;
339
+ margin: 24px 0 16px;
340
+ text-align: left;
341
+ }
342
+
343
+ .field-label {
344
+ display: block;
345
+ font-size: 13px;
346
+ font-weight: 600;
347
+ margin-bottom: 6px;
348
+ }
349
+
350
+ .field-input {
351
+ display: flex;
352
+ align-items: center;
353
+ gap: 8px;
354
+ padding: 0 12px;
355
+ height: 40px;
356
+ border-radius: var(--radius);
357
+ border: 1px solid var(--border);
358
+ background: var(--panel);
359
+ color: var(--muted);
360
+ }
361
+
362
+ .field-input:focus-within {
363
+ border-color: var(--accent);
364
+ }
365
+
366
+ .field-input input {
367
+ flex: 1;
368
+ min-width: 0;
369
+ border: 0;
370
+ background: none;
371
+ font: inherit;
372
+ color: var(--text);
373
+ outline: none;
374
+ }
375
+
376
+ .field-eye {
377
+ border: 0;
378
+ background: none;
379
+ padding: 0;
380
+ color: var(--muted);
381
+ cursor: pointer;
382
+ display: flex;
383
+ }
384
+
385
+ .field-error {
386
+ display: block;
387
+ margin-top: 8px;
388
+ min-height: 16px;
389
+ font-size: 12px;
390
+ color: var(--danger);
391
+ }
392
+
393
+ /* Le champ vire au rouge en même temps que le message : l'erreur est portée par les deux. */
394
+ .field.is-invalid .field-input {
395
+ border-color: var(--danger);
396
+ }
397
+
398
+ /* --- Console -------------------------------------------------------------- */
399
+
400
+ .console {
401
+ display: grid;
402
+ grid-template-columns: 240px 400px minmax(0, 1fr);
403
+ height: calc(100vh - var(--topbar-h));
404
+ }
405
+
406
+ .console.has-sheet {
407
+ grid-template-columns: 240px 360px minmax(0, 1fr) 360px;
408
+ }
409
+
410
+ .console.is-collapsed {
411
+ grid-template-columns: 57px 360px minmax(0, 1fr);
412
+ }
413
+
414
+ .console.is-collapsed.has-sheet {
415
+ grid-template-columns: 57px 360px minmax(0, 1fr) 360px;
416
+ }
417
+
418
+ /* --- Colonne des agents --------------------------------------------------- */
419
+
420
+ .agents {
421
+ border-right: 1px solid var(--border);
422
+ overflow-y: auto;
423
+ display: flex;
424
+ flex-direction: column;
425
+ }
426
+
427
+ .agents-head {
428
+ display: flex;
429
+ align-items: center;
430
+ justify-content: space-between;
431
+ padding: 18px 12px 8px 20px;
432
+ }
433
+
434
+ .section-label {
435
+ font-size: 12px;
436
+ font-weight: 600;
437
+ letter-spacing: 0.06em;
438
+ text-transform: uppercase;
439
+ color: var(--muted);
440
+ }
441
+
442
+ .agent-list {
443
+ list-style: none;
444
+ margin: 0;
445
+ padding: 0 8px;
446
+ flex: 1;
447
+ }
448
+
449
+ .agent {
450
+ display: flex;
451
+ align-items: center;
452
+ gap: 8px;
453
+ width: 100%;
454
+ padding: 10px;
455
+ border: 0;
456
+ border-radius: var(--radius);
457
+ background: none;
458
+ font: inherit;
459
+ color: var(--text);
460
+ text-align: left;
461
+ cursor: pointer;
462
+ }
463
+
464
+ .agent:hover {
465
+ background: var(--border-soft);
466
+ }
467
+
468
+ .agent.is-selected {
469
+ background: var(--accent-soft);
470
+ }
471
+
472
+ .agent:focus-visible {
473
+ outline: 2px solid var(--accent);
474
+ outline-offset: -2px;
475
+ }
476
+
477
+ .agent-text {
478
+ flex: 1;
479
+ min-width: 0;
480
+ }
481
+
482
+ .agent-name {
483
+ font-weight: 600;
484
+ white-space: nowrap;
485
+ overflow: hidden;
486
+ text-overflow: ellipsis;
487
+ }
488
+
489
+ /* Le nom de la boîte dit de quoi la session s'occupe : sous le nom de l'agent, en second. */
490
+ .agent-box {
491
+ font-size: 12px;
492
+ color: var(--muted);
493
+ white-space: nowrap;
494
+ overflow: hidden;
495
+ text-overflow: ellipsis;
496
+ }
497
+
498
+ .agent-box.is-absent {
499
+ font-style: italic;
500
+ }
501
+
502
+ .agent--muted .agent-name {
503
+ color: var(--muted);
504
+ }
505
+
506
+ .agents-foot {
507
+ padding: 16px 20px;
508
+ font-size: 12px;
509
+ border-top: 1px solid var(--border-soft);
510
+ }
511
+
512
+ /* Avatar : les initiales de l'agent, teintées par son adresse. Pas de couleur seule — le
513
+ nom reste écrit à côté partout où l'avatar n'est pas le seul repère. */
514
+ .avatar {
515
+ width: 28px;
516
+ height: 28px;
517
+ border-radius: 50%;
518
+ display: grid;
519
+ place-items: center;
520
+ font-size: 11px;
521
+ font-weight: 600;
522
+ color: #ffffff;
523
+ flex: none;
524
+ }
525
+
526
+ .avatar--sm {
527
+ width: 24px;
528
+ height: 24px;
529
+ font-size: 10px;
530
+ }
531
+
532
+ .avatar--stack {
533
+ box-shadow: 0 0 0 2px var(--panel);
534
+ }
535
+
536
+ .avatar--c0 { background: #2f6feb; }
537
+ .avatar--c1 { background: #7c3aed; }
538
+ .avatar--c2 { background: #0f9d58; }
539
+ .avatar--c3 { background: #d9480f; }
540
+ .avatar--c4 { background: #0b7285; }
541
+ .avatar--c5 { background: #b02a6f; }
542
+ .avatar--c6 { background: #5b6472; }
543
+ .avatar--c7 { background: #7048e8; }
544
+
545
+ /* Boîte jamais connectée : contour au lieu d'aplat, pour la distinguer sans l'effacer. */
546
+ .avatar--absent {
547
+ background: var(--panel);
548
+ border: 1px solid var(--border);
549
+ color: var(--muted);
550
+ }
551
+
552
+ .count {
553
+ min-width: 24px;
554
+ padding: 0 7px;
555
+ height: 18px;
556
+ border-radius: 999px;
557
+ display: inline-flex;
558
+ align-items: center;
559
+ justify-content: center;
560
+ font-size: 11px;
561
+ font-weight: 600;
562
+ background: var(--neutral-soft);
563
+ color: var(--muted);
564
+ flex: none;
565
+ }
566
+
567
+ .count--accent {
568
+ background: var(--accent);
569
+ color: #ffffff;
570
+ }
571
+
572
+ .count--soft {
573
+ background: var(--accent-softer);
574
+ color: var(--accent);
575
+ }
576
+
577
+ /* Colonne repliée : il ne reste que les avatars, chacun avec son nom en info-bulle. */
578
+ .is-collapsed .agents-head,
579
+ .is-collapsed .agent-text,
580
+ .is-collapsed .agents-foot,
581
+ .is-collapsed .agent .count {
582
+ display: none;
583
+ }
584
+
585
+ .is-collapsed .agent-list {
586
+ padding: 16px 6px;
587
+ }
588
+
589
+ .is-collapsed .agent {
590
+ padding: 8px;
591
+ justify-content: center;
592
+ }
593
+
594
+ /* Le badge des non-lus survit au repli, réduit à une pastille sur l'avatar. */
595
+ .is-collapsed .agent.has-unread .avatar {
596
+ box-shadow: 0 0 0 2px var(--bg), 0 0 0 4px var(--accent);
597
+ }
598
+
599
+ .is-collapsed .agents {
600
+ overflow-x: hidden;
601
+ }
602
+
603
+ /* --- Colonne des fils ----------------------------------------------------- */
604
+
605
+ .threads {
606
+ background: var(--panel);
607
+ border-right: 1px solid var(--border);
608
+ overflow-y: auto;
609
+ min-width: 0;
610
+ }
611
+
612
+ .threads-head {
613
+ padding: 16px 20px 12px;
614
+ }
615
+
616
+ .threads-head h2 {
617
+ margin: 0;
618
+ font-size: 15px;
619
+ }
620
+
621
+ .threads-head p {
622
+ margin: 2px 0 0;
623
+ font-size: 12px;
624
+ }
625
+
626
+ .chips {
627
+ display: flex;
628
+ flex-wrap: wrap;
629
+ gap: 8px;
630
+ margin-top: 12px;
631
+ }
632
+
633
+ .chip {
634
+ font: inherit;
635
+ font-size: 12px;
636
+ padding: 3px 12px;
637
+ border-radius: 999px;
638
+ border: 1px solid var(--border);
639
+ background: var(--panel);
640
+ color: var(--text);
641
+ cursor: pointer;
642
+ white-space: nowrap;
643
+ }
644
+
645
+ .chip:hover {
646
+ border-color: var(--accent);
647
+ }
648
+
649
+ .chip.is-active {
650
+ background: var(--text);
651
+ border-color: var(--text);
652
+ color: var(--panel);
653
+ font-weight: 600;
654
+ }
655
+
656
+ .chip:focus-visible {
657
+ outline: 2px solid var(--accent);
658
+ outline-offset: 2px;
659
+ }
660
+
661
+ .thread-list {
662
+ list-style: none;
663
+ margin: 0;
664
+ padding: 0;
665
+ }
666
+
667
+ .thread {
668
+ display: block;
669
+ width: 100%;
670
+ padding: 12px 16px 12px 32px;
671
+ border: 0;
672
+ border-top: 1px solid var(--border-soft);
673
+ background: none;
674
+ font: inherit;
675
+ color: var(--text);
676
+ text-align: left;
677
+ cursor: pointer;
678
+ position: relative;
679
+ }
680
+
681
+ .thread:hover {
682
+ background: var(--border-soft);
683
+ }
684
+
685
+ .thread.is-selected {
686
+ background: var(--accent-soft);
687
+ border-top-color: transparent;
688
+ }
689
+
690
+ /* Barre d'accent à gauche : le fil ouvert, repérable sans lire. */
691
+ .thread.is-selected::before {
692
+ content: "";
693
+ position: absolute;
694
+ inset: 0 auto 0 0;
695
+ width: 3px;
696
+ background: var(--accent);
697
+ }
698
+
699
+ .thread:focus-visible {
700
+ outline: 2px solid var(--accent);
701
+ outline-offset: -2px;
702
+ }
703
+
704
+ /* Point bleu du fil non lu, dans la gouttière réservée à gauche. */
705
+ .thread.is-unread::after {
706
+ content: "";
707
+ position: absolute;
708
+ left: 14px;
709
+ top: 19px;
710
+ width: 8px;
711
+ height: 8px;
712
+ border-radius: 50%;
713
+ background: var(--accent);
714
+ }
715
+
716
+ .thread.is-selected.is-unread::after {
717
+ left: 17px;
718
+ }
719
+
720
+ .thread-top {
721
+ display: flex;
722
+ align-items: baseline;
723
+ gap: 8px;
724
+ }
725
+
726
+ .thread-title {
727
+ font-weight: 600;
728
+ flex: 1;
729
+ min-width: 0;
730
+ white-space: nowrap;
731
+ overflow: hidden;
732
+ text-overflow: ellipsis;
733
+ }
734
+
735
+ .thread.is-unread .thread-title {
736
+ font-weight: 700;
737
+ }
738
+
739
+ .thread-time {
740
+ font-size: 12px;
741
+ color: var(--muted);
742
+ white-space: nowrap;
743
+ flex: none;
744
+ }
745
+
746
+ .thread.is-unread .thread-time {
747
+ color: var(--accent);
748
+ }
749
+
750
+ .thread-who {
751
+ font-size: 12px;
752
+ color: var(--muted);
753
+ margin-top: 2px;
754
+ white-space: nowrap;
755
+ overflow: hidden;
756
+ text-overflow: ellipsis;
757
+ }
758
+
759
+ .thread-bottom {
760
+ display: flex;
761
+ align-items: center;
762
+ gap: 8px;
763
+ margin-top: 4px;
764
+ }
765
+
766
+ .thread-preview {
767
+ flex: 1;
768
+ min-width: 0;
769
+ font-size: 13px;
770
+ color: var(--muted);
771
+ white-space: nowrap;
772
+ overflow: hidden;
773
+ text-overflow: ellipsis;
774
+ }
775
+
776
+ .thread.is-unread .thread-preview {
777
+ color: var(--text);
778
+ }
779
+
780
+ .tag {
781
+ display: inline-flex;
782
+ align-items: center;
783
+ gap: 4px;
784
+ padding: 1px 8px;
785
+ border-radius: 999px;
786
+ font-size: 11px;
787
+ font-weight: 600;
788
+ background: var(--neutral-soft);
789
+ color: var(--muted);
790
+ flex: none;
791
+ }
792
+
793
+ .tag--high {
794
+ background: var(--danger-soft);
795
+ color: var(--danger);
796
+ }
797
+
798
+ .tag--ok {
799
+ background: var(--ok-soft);
800
+ color: var(--ok);
801
+ }
802
+
803
+ .tag--warn {
804
+ background: var(--warn-soft);
805
+ color: var(--warn);
806
+ }
807
+
808
+ .tag .icon {
809
+ width: 10px;
810
+ height: 10px;
811
+ stroke-width: 2.5;
812
+ }
813
+
814
+ /* --- Lecteur du fil ------------------------------------------------------- */
815
+
816
+ .reader {
817
+ overflow-y: auto;
818
+ background: var(--panel);
819
+ min-width: 0;
820
+ }
821
+
822
+ .reader-head {
823
+ padding: 24px 32px 16px;
824
+ border-bottom: 1px solid var(--border);
825
+ }
826
+
827
+ .reader-head h2 {
828
+ margin: 0;
829
+ font-size: 18px;
830
+ }
831
+
832
+ .reader-desc {
833
+ margin: 6px 0 0;
834
+ font-size: 13px;
835
+ color: var(--muted);
836
+ }
837
+
838
+ .reader-meta {
839
+ display: flex;
840
+ align-items: center;
841
+ gap: 10px;
842
+ margin-top: 14px;
843
+ }
844
+
845
+ .avatar-stack {
846
+ display: flex;
847
+ }
848
+
849
+ .avatar-stack .avatar + .avatar {
850
+ margin-left: -8px;
851
+ }
852
+
853
+ .reader-participants {
854
+ font-size: 12px;
855
+ color: var(--muted);
856
+ flex: 1;
857
+ min-width: 0;
858
+ }
859
+
860
+ .messages {
861
+ list-style: none;
862
+ margin: 0;
863
+ padding: 20px 32px 40px;
864
+ }
865
+
866
+ .message {
867
+ display: flex;
868
+ gap: 12px;
869
+ padding: 12px;
870
+ margin: 0 -12px;
871
+ border-radius: var(--radius);
872
+ }
873
+
874
+ /* Le dernier message du fil : posé sur un fond discret, sans bordure ni couleur d'état. */
875
+ .message.is-last {
876
+ background: var(--bg);
877
+ }
878
+
879
+ .message.is-open {
880
+ background: var(--accent-soft);
881
+ box-shadow: inset 0 0 0 1px var(--accent);
882
+ }
883
+
884
+ .message-body-col {
885
+ flex: 1;
886
+ min-width: 0;
887
+ }
888
+
889
+ .message-head {
890
+ display: flex;
891
+ align-items: baseline;
892
+ gap: 8px;
893
+ flex-wrap: wrap;
894
+ }
895
+
896
+ .message-from {
897
+ font-weight: 600;
898
+ }
899
+
900
+ .message-to {
901
+ font-size: 13px;
902
+ color: var(--muted);
903
+ }
904
+
905
+ .message-time {
906
+ margin-left: auto;
907
+ font-size: 12px;
908
+ color: var(--muted);
909
+ white-space: nowrap;
910
+ }
911
+
912
+ .message-subject {
913
+ margin: 8px 0 0;
914
+ font-size: 13px;
915
+ font-weight: 600;
916
+ color: var(--muted);
917
+ }
918
+
919
+ .message-text {
920
+ margin: 6px 0 0;
921
+ white-space: pre-wrap;
922
+ overflow-wrap: anywhere;
923
+ }
924
+
925
+ .message-foot {
926
+ display: flex;
927
+ align-items: center;
928
+ gap: 12px;
929
+ margin-top: 10px;
930
+ }
931
+
932
+ .message-foot .btn--link {
933
+ margin-left: auto;
934
+ font-size: 12px;
935
+ }
936
+
937
+ /* --- Volet de détail ------------------------------------------------------ */
938
+
939
+ .sheet {
940
+ border-left: 1px solid var(--border);
941
+ background: var(--panel);
942
+ overflow-y: auto;
943
+ min-width: 0;
944
+ }
945
+
946
+ .sheet-head {
947
+ display: flex;
948
+ align-items: flex-start;
949
+ gap: 8px;
950
+ padding: 18px 20px 14px;
951
+ border-bottom: 1px solid var(--border);
952
+ }
953
+
954
+ .sheet-head h3 {
955
+ margin: 0;
956
+ font-size: 15px;
957
+ }
958
+
959
+ .sheet-subject {
960
+ margin: 4px 0 0;
961
+ font-size: 13px;
962
+ color: var(--muted);
963
+ }
964
+
965
+ .sheet-head .btn {
966
+ margin-left: auto;
967
+ }
968
+
969
+ .sheet-section {
970
+ padding: 16px 20px;
971
+ border-bottom: 1px solid var(--border);
972
+ }
973
+
974
+ .sheet-section:last-of-type {
975
+ border-bottom: 0;
976
+ }
977
+
978
+ .sheet-section .section-label {
979
+ display: block;
980
+ margin-bottom: 12px;
981
+ }
982
+
983
+ .kv {
984
+ display: grid;
985
+ grid-template-columns: 96px minmax(0, 1fr) auto;
986
+ align-items: center;
987
+ gap: 8px;
988
+ margin-bottom: 10px;
989
+ }
990
+
991
+ .kv:last-child {
992
+ margin-bottom: 0;
993
+ }
994
+
995
+ .kv-key {
996
+ font-size: 12px;
997
+ color: var(--muted);
998
+ }
999
+
1000
+ .kv-value {
1001
+ font-size: 13px;
1002
+ overflow-wrap: anywhere;
1003
+ }
1004
+
1005
+ /* Une pastille est large de son texte : en cellule de grille, elle s'étirerait sinon. */
1006
+ .kv > .tag {
1007
+ justify-self: start;
1008
+ }
1009
+
1010
+ /* Les adresses ne se recopient pas à la main : elles s'affichent en mono, avec un bouton. */
1011
+ .mono {
1012
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1013
+ font-size: 12px;
1014
+ }
1015
+
1016
+ .party {
1017
+ display: flex;
1018
+ gap: 10px;
1019
+ }
1020
+
1021
+ .party-name {
1022
+ font-size: 13px;
1023
+ font-weight: 600;
1024
+ }
1025
+
1026
+ .party-box {
1027
+ font-size: 12px;
1028
+ color: var(--muted);
1029
+ }
1030
+
1031
+ .party-addr {
1032
+ display: flex;
1033
+ align-items: center;
1034
+ gap: 6px;
1035
+ margin-top: 2px;
1036
+ color: var(--muted);
1037
+ }
1038
+
1039
+ .copy {
1040
+ border: 0;
1041
+ background: none;
1042
+ padding: 2px;
1043
+ color: var(--muted);
1044
+ cursor: pointer;
1045
+ display: inline-flex;
1046
+ border-radius: 4px;
1047
+ }
1048
+
1049
+ .copy:hover {
1050
+ color: var(--accent);
1051
+ }
1052
+
1053
+ .copy:focus-visible {
1054
+ outline: 2px solid var(--accent);
1055
+ outline-offset: 1px;
1056
+ }
1057
+
1058
+ .copy .icon {
1059
+ width: 14px;
1060
+ height: 14px;
1061
+ }
1062
+
1063
+ .deliveries {
1064
+ width: 100%;
1065
+ border-collapse: collapse;
1066
+ font-size: 13px;
1067
+ }
1068
+
1069
+ .deliveries th {
1070
+ text-align: left;
1071
+ font-size: 11px;
1072
+ font-weight: 400;
1073
+ color: var(--muted);
1074
+ padding: 0 8px 8px 0;
1075
+ border-bottom: 1px solid var(--border-soft);
1076
+ }
1077
+
1078
+ .deliveries td {
1079
+ padding: 8px 8px 8px 0;
1080
+ vertical-align: middle;
1081
+ }
1082
+
1083
+ .deliveries td.role,
1084
+ .deliveries td.folder {
1085
+ font-size: 12px;
1086
+ color: var(--muted);
1087
+ }
1088
+
1089
+ /* --- États vides et erreurs ----------------------------------------------- */
1090
+
1091
+ .empty {
1092
+ padding: 48px 24px;
1093
+ text-align: center;
1094
+ color: var(--muted);
1095
+ }
1096
+
1097
+ .empty-title {
1098
+ display: block;
1099
+ color: var(--text);
1100
+ font-weight: 600;
1101
+ margin-bottom: 4px;
1102
+ }
1103
+
1104
+ .banner {
1105
+ margin: 16px 20px;
1106
+ padding: 12px 14px;
1107
+ border-radius: var(--radius);
1108
+ background: var(--danger-soft);
1109
+ color: var(--danger);
1110
+ font-size: 13px;
1111
+ }
1112
+
1113
+ /* --- Écrans étroits ------------------------------------------------------- */
1114
+
1115
+ @media (max-width: 1200px) {
1116
+ .console.has-sheet,
1117
+ .console.is-collapsed.has-sheet {
1118
+ grid-template-columns: 57px 320px minmax(0, 1fr) 320px;
1119
+ }
1120
+ }
1121
+
1122
+ @media (max-width: 1000px) {
1123
+ .topbar-search {
1124
+ max-width: 240px;
1125
+ }
1126
+
1127
+ .console,
1128
+ .console.is-collapsed {
1129
+ grid-template-columns: 57px 300px minmax(0, 1fr);
1130
+ }
1131
+
1132
+ /* Trop étroit pour quatre colonnes : le volet recouvre le lecteur. */
1133
+ .console.has-sheet,
1134
+ .console.is-collapsed.has-sheet {
1135
+ grid-template-columns: 57px 300px minmax(0, 1fr);
1136
+ }
1137
+
1138
+ .console.has-sheet .sheet {
1139
+ position: fixed;
1140
+ top: var(--topbar-h);
1141
+ right: 0;
1142
+ bottom: 0;
1143
+ width: 340px;
1144
+ max-width: 100%;
1145
+ box-shadow: -8px 0 24px rgba(0, 0, 0, 0.12);
1146
+ }
1147
+ }