@imenam/mcp-messenger 1.0.10 → 1.0.13

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,368 +1,1228 @@
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
- /* Historique du fil sous le message : discret replié, cité déplié. */
308
- .detail .history-toggle {
309
- margin-top: 14px;
310
- color: var(--accent);
311
- border-style: dashed;
312
- }
313
-
314
- .detail .history {
315
- margin-top: 10px;
316
- }
317
-
318
- /* Bordure d'accent à gauche : la convention du texte cité dans un client mail. */
319
- .detail .quoted {
320
- border-left: 2px solid var(--border);
321
- padding: 4px 0 4px 12px;
322
- margin-top: 12px;
323
- color: var(--muted);
324
- }
325
-
326
- .detail .quoted-head {
327
- font-size: 12px;
328
- word-break: break-all;
329
- }
330
-
331
- .detail .quoted-subject {
332
- font-weight: 600;
333
- color: var(--text);
334
- margin-top: 2px;
335
- }
336
-
337
- .detail .quoted-body {
338
- white-space: pre-wrap;
339
- word-wrap: break-word;
340
- margin-top: 6px;
341
- }
342
-
343
- .detail .thread-link {
344
- margin-top: 14px;
345
- }
346
-
347
- .detail .deliveries {
348
- margin-top: 16px;
349
- border-top: 1px solid var(--border);
350
- padding-top: 12px;
351
- }
352
-
353
- .detail .deliveries li {
354
- padding: 2px 0;
355
- color: var(--muted);
356
- }
357
-
358
- .thread-message {
359
- border-top: 1px solid var(--border);
360
- padding-top: 10px;
361
- margin-top: 10px;
362
- }
363
-
364
- .empty {
365
- color: var(--muted);
366
- padding: 24px 8px;
367
- text-align: center;
368
- }
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
+ /* --- Agent et ses boîtes --------------------------------------------------- */
507
+
508
+ /* Deux zones de clic sur une même ligne : le chevron ouvre, le reste filtre. */
509
+ .agent-head {
510
+ display: flex;
511
+ align-items: center;
512
+ }
513
+
514
+ .agent-toggle {
515
+ display: flex;
516
+ align-items: center;
517
+ justify-content: center;
518
+ width: 20px;
519
+ height: 28px;
520
+ padding: 0;
521
+ border: 0;
522
+ border-radius: 4px;
523
+ background: none;
524
+ color: var(--muted);
525
+ cursor: pointer;
526
+ flex: none;
527
+ }
528
+
529
+ .agent-toggle:hover {
530
+ color: var(--text);
531
+ }
532
+
533
+ .agent-toggle:focus-visible {
534
+ outline: 2px solid var(--accent);
535
+ outline-offset: 1px;
536
+ }
537
+
538
+ .agent-toggle .icon {
539
+ width: 14px;
540
+ height: 14px;
541
+ transition: transform 0.15s;
542
+ }
543
+
544
+ .agent-head.is-open .agent-toggle .icon {
545
+ transform: rotate(90deg);
546
+ }
547
+
548
+ /* Le chevron mange sa gouttière : la ligne d'agent reste alignée sur « Tous les agents ». */
549
+ .agent-head .agent {
550
+ padding-left: 4px;
551
+ }
552
+
553
+ /* Les boîtes vivent sous leur agent : un cran d'indentation et un filet de rattachement. */
554
+ .box-list {
555
+ list-style: none;
556
+ margin: 0 0 4px 22px;
557
+ padding: 0 0 0 14px;
558
+ border-left: 1px solid var(--border);
559
+ }
560
+
561
+ .box {
562
+ padding: 7px 10px;
563
+ }
564
+
565
+ .box .agent-name {
566
+ font-weight: 500;
567
+ font-size: 13px;
568
+ }
569
+
570
+ /* Une boîte sans nom se lit à son adresse : en mono, pour ce que c'est. */
571
+ .box .agent-name.is-absent {
572
+ font-weight: 400;
573
+ color: var(--muted);
574
+ }
575
+
576
+ .box .agent-box {
577
+ font-size: 11px;
578
+ }
579
+
580
+ .agents-foot {
581
+ padding: 16px 20px;
582
+ font-size: 12px;
583
+ border-top: 1px solid var(--border-soft);
584
+ }
585
+
586
+ /* Avatar : les initiales de l'agent, teintées par son adresse. Pas de couleur seule — le
587
+ nom reste écrit à côté partout où l'avatar n'est pas le seul repère. */
588
+ .avatar {
589
+ width: 28px;
590
+ height: 28px;
591
+ border-radius: 50%;
592
+ display: grid;
593
+ place-items: center;
594
+ font-size: 11px;
595
+ font-weight: 600;
596
+ color: #ffffff;
597
+ flex: none;
598
+ }
599
+
600
+ .avatar--sm {
601
+ width: 24px;
602
+ height: 24px;
603
+ font-size: 10px;
604
+ }
605
+
606
+ .avatar--stack {
607
+ box-shadow: 0 0 0 2px var(--panel);
608
+ }
609
+
610
+ .avatar--c0 { background: #2f6feb; }
611
+ .avatar--c1 { background: #7c3aed; }
612
+ .avatar--c2 { background: #0f9d58; }
613
+ .avatar--c3 { background: #d9480f; }
614
+ .avatar--c4 { background: #0b7285; }
615
+ .avatar--c5 { background: #b02a6f; }
616
+ .avatar--c6 { background: #5b6472; }
617
+ .avatar--c7 { background: #7048e8; }
618
+
619
+ /* Boîte jamais connectée : contour au lieu d'aplat, pour la distinguer sans l'effacer. */
620
+ .avatar--absent {
621
+ background: var(--panel);
622
+ border: 1px solid var(--border);
623
+ color: var(--muted);
624
+ }
625
+
626
+ .count {
627
+ min-width: 24px;
628
+ padding: 0 7px;
629
+ height: 18px;
630
+ border-radius: 999px;
631
+ display: inline-flex;
632
+ align-items: center;
633
+ justify-content: center;
634
+ font-size: 11px;
635
+ font-weight: 600;
636
+ background: var(--neutral-soft);
637
+ color: var(--muted);
638
+ flex: none;
639
+ }
640
+
641
+ .count--accent {
642
+ background: var(--accent);
643
+ color: #ffffff;
644
+ }
645
+
646
+ .count--soft {
647
+ background: var(--accent-softer);
648
+ color: var(--accent);
649
+ }
650
+
651
+ /* Colonne repliée : il ne reste que les avatars d'agents, nom en info-bulle. La
652
+ hiérarchie n'y tient pas — les boîtes se retrouvent en dépliant la colonne. */
653
+ .is-collapsed .agents-head,
654
+ .is-collapsed .agent-text,
655
+ .is-collapsed .agents-foot,
656
+ .is-collapsed .agent-toggle,
657
+ .is-collapsed .box-list,
658
+ .is-collapsed .agent .count {
659
+ display: none;
660
+ }
661
+
662
+ .is-collapsed .agent-list {
663
+ padding: 16px 6px;
664
+ }
665
+
666
+ .is-collapsed .agent {
667
+ padding: 8px;
668
+ justify-content: center;
669
+ }
670
+
671
+ .is-collapsed .agent-head .agent {
672
+ padding-left: 8px;
673
+ }
674
+
675
+ /* Le badge des non-lus survit au repli, réduit à une pastille sur l'avatar. */
676
+ .is-collapsed .agent.has-unread .avatar {
677
+ box-shadow: 0 0 0 2px var(--bg), 0 0 0 4px var(--accent);
678
+ }
679
+
680
+ .is-collapsed .agents {
681
+ overflow-x: hidden;
682
+ }
683
+
684
+ /* --- Colonne des fils ----------------------------------------------------- */
685
+
686
+ .threads {
687
+ background: var(--panel);
688
+ border-right: 1px solid var(--border);
689
+ overflow-y: auto;
690
+ min-width: 0;
691
+ }
692
+
693
+ .threads-head {
694
+ padding: 16px 20px 12px;
695
+ }
696
+
697
+ .threads-head h2 {
698
+ margin: 0;
699
+ font-size: 15px;
700
+ }
701
+
702
+ .threads-head p {
703
+ margin: 2px 0 0;
704
+ font-size: 12px;
705
+ }
706
+
707
+ .chips {
708
+ display: flex;
709
+ flex-wrap: wrap;
710
+ gap: 8px;
711
+ margin-top: 12px;
712
+ }
713
+
714
+ .chip {
715
+ font: inherit;
716
+ font-size: 12px;
717
+ padding: 3px 12px;
718
+ border-radius: 999px;
719
+ border: 1px solid var(--border);
720
+ background: var(--panel);
721
+ color: var(--text);
722
+ cursor: pointer;
723
+ white-space: nowrap;
724
+ }
725
+
726
+ .chip:hover {
727
+ border-color: var(--accent);
728
+ }
729
+
730
+ .chip.is-active {
731
+ background: var(--text);
732
+ border-color: var(--text);
733
+ color: var(--panel);
734
+ font-weight: 600;
735
+ }
736
+
737
+ .chip:focus-visible {
738
+ outline: 2px solid var(--accent);
739
+ outline-offset: 2px;
740
+ }
741
+
742
+ .thread-list {
743
+ list-style: none;
744
+ margin: 0;
745
+ padding: 0;
746
+ }
747
+
748
+ .thread {
749
+ display: block;
750
+ width: 100%;
751
+ padding: 12px 16px 12px 32px;
752
+ border: 0;
753
+ border-top: 1px solid var(--border-soft);
754
+ background: none;
755
+ font: inherit;
756
+ color: var(--text);
757
+ text-align: left;
758
+ cursor: pointer;
759
+ position: relative;
760
+ }
761
+
762
+ .thread:hover {
763
+ background: var(--border-soft);
764
+ }
765
+
766
+ .thread.is-selected {
767
+ background: var(--accent-soft);
768
+ border-top-color: transparent;
769
+ }
770
+
771
+ /* Barre d'accent à gauche : le fil ouvert, repérable sans lire. */
772
+ .thread.is-selected::before {
773
+ content: "";
774
+ position: absolute;
775
+ inset: 0 auto 0 0;
776
+ width: 3px;
777
+ background: var(--accent);
778
+ }
779
+
780
+ .thread:focus-visible {
781
+ outline: 2px solid var(--accent);
782
+ outline-offset: -2px;
783
+ }
784
+
785
+ /* Point bleu du fil non lu, dans la gouttière réservée à gauche. */
786
+ .thread.is-unread::after {
787
+ content: "";
788
+ position: absolute;
789
+ left: 14px;
790
+ top: 19px;
791
+ width: 8px;
792
+ height: 8px;
793
+ border-radius: 50%;
794
+ background: var(--accent);
795
+ }
796
+
797
+ .thread.is-selected.is-unread::after {
798
+ left: 17px;
799
+ }
800
+
801
+ .thread-top {
802
+ display: flex;
803
+ align-items: baseline;
804
+ gap: 8px;
805
+ }
806
+
807
+ .thread-title {
808
+ font-weight: 600;
809
+ flex: 1;
810
+ min-width: 0;
811
+ white-space: nowrap;
812
+ overflow: hidden;
813
+ text-overflow: ellipsis;
814
+ }
815
+
816
+ .thread.is-unread .thread-title {
817
+ font-weight: 700;
818
+ }
819
+
820
+ .thread-time {
821
+ font-size: 12px;
822
+ color: var(--muted);
823
+ white-space: nowrap;
824
+ flex: none;
825
+ }
826
+
827
+ .thread.is-unread .thread-time {
828
+ color: var(--accent);
829
+ }
830
+
831
+ .thread-who {
832
+ font-size: 12px;
833
+ color: var(--muted);
834
+ margin-top: 2px;
835
+ white-space: nowrap;
836
+ overflow: hidden;
837
+ text-overflow: ellipsis;
838
+ }
839
+
840
+ .thread-bottom {
841
+ display: flex;
842
+ align-items: center;
843
+ gap: 8px;
844
+ margin-top: 4px;
845
+ }
846
+
847
+ .thread-preview {
848
+ flex: 1;
849
+ min-width: 0;
850
+ font-size: 13px;
851
+ color: var(--muted);
852
+ white-space: nowrap;
853
+ overflow: hidden;
854
+ text-overflow: ellipsis;
855
+ }
856
+
857
+ .thread.is-unread .thread-preview {
858
+ color: var(--text);
859
+ }
860
+
861
+ .tag {
862
+ display: inline-flex;
863
+ align-items: center;
864
+ gap: 4px;
865
+ padding: 1px 8px;
866
+ border-radius: 999px;
867
+ font-size: 11px;
868
+ font-weight: 600;
869
+ background: var(--neutral-soft);
870
+ color: var(--muted);
871
+ flex: none;
872
+ }
873
+
874
+ .tag--high {
875
+ background: var(--danger-soft);
876
+ color: var(--danger);
877
+ }
878
+
879
+ .tag--ok {
880
+ background: var(--ok-soft);
881
+ color: var(--ok);
882
+ }
883
+
884
+ .tag--warn {
885
+ background: var(--warn-soft);
886
+ color: var(--warn);
887
+ }
888
+
889
+ .tag .icon {
890
+ width: 10px;
891
+ height: 10px;
892
+ stroke-width: 2.5;
893
+ }
894
+
895
+ /* --- Lecteur du fil ------------------------------------------------------- */
896
+
897
+ .reader {
898
+ overflow-y: auto;
899
+ background: var(--panel);
900
+ min-width: 0;
901
+ }
902
+
903
+ .reader-head {
904
+ padding: 24px 32px 16px;
905
+ border-bottom: 1px solid var(--border);
906
+ }
907
+
908
+ .reader-head h2 {
909
+ margin: 0;
910
+ font-size: 18px;
911
+ }
912
+
913
+ .reader-desc {
914
+ margin: 6px 0 0;
915
+ font-size: 13px;
916
+ color: var(--muted);
917
+ }
918
+
919
+ .reader-meta {
920
+ display: flex;
921
+ align-items: center;
922
+ gap: 10px;
923
+ margin-top: 14px;
924
+ }
925
+
926
+ .avatar-stack {
927
+ display: flex;
928
+ }
929
+
930
+ .avatar-stack .avatar + .avatar {
931
+ margin-left: -8px;
932
+ }
933
+
934
+ .reader-participants {
935
+ font-size: 12px;
936
+ color: var(--muted);
937
+ flex: 1;
938
+ min-width: 0;
939
+ }
940
+
941
+ .messages {
942
+ list-style: none;
943
+ margin: 0;
944
+ padding: 20px 32px 40px;
945
+ }
946
+
947
+ .message {
948
+ display: flex;
949
+ gap: 12px;
950
+ padding: 12px;
951
+ margin: 0 -12px;
952
+ border-radius: var(--radius);
953
+ }
954
+
955
+ /* Le dernier message du fil : posé sur un fond discret, sans bordure ni couleur d'état. */
956
+ .message.is-last {
957
+ background: var(--bg);
958
+ }
959
+
960
+ .message.is-open {
961
+ background: var(--accent-soft);
962
+ box-shadow: inset 0 0 0 1px var(--accent);
963
+ }
964
+
965
+ .message-body-col {
966
+ flex: 1;
967
+ min-width: 0;
968
+ }
969
+
970
+ .message-head {
971
+ display: flex;
972
+ align-items: baseline;
973
+ gap: 8px;
974
+ flex-wrap: wrap;
975
+ }
976
+
977
+ .message-from {
978
+ font-weight: 600;
979
+ }
980
+
981
+ .message-to {
982
+ font-size: 13px;
983
+ color: var(--muted);
984
+ }
985
+
986
+ .message-time {
987
+ margin-left: auto;
988
+ font-size: 12px;
989
+ color: var(--muted);
990
+ white-space: nowrap;
991
+ }
992
+
993
+ .message-subject {
994
+ margin: 8px 0 0;
995
+ font-size: 13px;
996
+ font-weight: 600;
997
+ color: var(--muted);
998
+ }
999
+
1000
+ .message-text {
1001
+ margin: 6px 0 0;
1002
+ white-space: pre-wrap;
1003
+ overflow-wrap: anywhere;
1004
+ }
1005
+
1006
+ .message-foot {
1007
+ display: flex;
1008
+ align-items: center;
1009
+ gap: 12px;
1010
+ margin-top: 10px;
1011
+ }
1012
+
1013
+ .message-foot .btn--link {
1014
+ margin-left: auto;
1015
+ font-size: 12px;
1016
+ }
1017
+
1018
+ /* --- Volet de détail ------------------------------------------------------ */
1019
+
1020
+ .sheet {
1021
+ border-left: 1px solid var(--border);
1022
+ background: var(--panel);
1023
+ overflow-y: auto;
1024
+ min-width: 0;
1025
+ }
1026
+
1027
+ .sheet-head {
1028
+ display: flex;
1029
+ align-items: flex-start;
1030
+ gap: 8px;
1031
+ padding: 18px 20px 14px;
1032
+ border-bottom: 1px solid var(--border);
1033
+ }
1034
+
1035
+ .sheet-head h3 {
1036
+ margin: 0;
1037
+ font-size: 15px;
1038
+ }
1039
+
1040
+ .sheet-subject {
1041
+ margin: 4px 0 0;
1042
+ font-size: 13px;
1043
+ color: var(--muted);
1044
+ }
1045
+
1046
+ .sheet-head .btn {
1047
+ margin-left: auto;
1048
+ }
1049
+
1050
+ .sheet-section {
1051
+ padding: 16px 20px;
1052
+ border-bottom: 1px solid var(--border);
1053
+ }
1054
+
1055
+ .sheet-section:last-of-type {
1056
+ border-bottom: 0;
1057
+ }
1058
+
1059
+ .sheet-section .section-label {
1060
+ display: block;
1061
+ margin-bottom: 12px;
1062
+ }
1063
+
1064
+ .kv {
1065
+ display: grid;
1066
+ grid-template-columns: 96px minmax(0, 1fr) auto;
1067
+ align-items: center;
1068
+ gap: 8px;
1069
+ margin-bottom: 10px;
1070
+ }
1071
+
1072
+ .kv:last-child {
1073
+ margin-bottom: 0;
1074
+ }
1075
+
1076
+ .kv-key {
1077
+ font-size: 12px;
1078
+ color: var(--muted);
1079
+ }
1080
+
1081
+ .kv-value {
1082
+ font-size: 13px;
1083
+ overflow-wrap: anywhere;
1084
+ }
1085
+
1086
+ /* Une pastille est large de son texte : en cellule de grille, elle s'étirerait sinon. */
1087
+ .kv > .tag {
1088
+ justify-self: start;
1089
+ }
1090
+
1091
+ /* Les adresses ne se recopient pas à la main : elles s'affichent en mono, avec un bouton. */
1092
+ .mono {
1093
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1094
+ font-size: 12px;
1095
+ }
1096
+
1097
+ .party {
1098
+ display: flex;
1099
+ gap: 10px;
1100
+ }
1101
+
1102
+ .party-name {
1103
+ font-size: 13px;
1104
+ font-weight: 600;
1105
+ }
1106
+
1107
+ .party-box {
1108
+ font-size: 12px;
1109
+ color: var(--muted);
1110
+ }
1111
+
1112
+ .party-addr {
1113
+ display: flex;
1114
+ align-items: center;
1115
+ gap: 6px;
1116
+ margin-top: 2px;
1117
+ color: var(--muted);
1118
+ }
1119
+
1120
+ .copy {
1121
+ border: 0;
1122
+ background: none;
1123
+ padding: 2px;
1124
+ color: var(--muted);
1125
+ cursor: pointer;
1126
+ display: inline-flex;
1127
+ border-radius: 4px;
1128
+ }
1129
+
1130
+ .copy:hover {
1131
+ color: var(--accent);
1132
+ }
1133
+
1134
+ .copy:focus-visible {
1135
+ outline: 2px solid var(--accent);
1136
+ outline-offset: 1px;
1137
+ }
1138
+
1139
+ .copy .icon {
1140
+ width: 14px;
1141
+ height: 14px;
1142
+ }
1143
+
1144
+ .deliveries {
1145
+ width: 100%;
1146
+ border-collapse: collapse;
1147
+ font-size: 13px;
1148
+ }
1149
+
1150
+ .deliveries th {
1151
+ text-align: left;
1152
+ font-size: 11px;
1153
+ font-weight: 400;
1154
+ color: var(--muted);
1155
+ padding: 0 8px 8px 0;
1156
+ border-bottom: 1px solid var(--border-soft);
1157
+ }
1158
+
1159
+ .deliveries td {
1160
+ padding: 8px 8px 8px 0;
1161
+ vertical-align: middle;
1162
+ }
1163
+
1164
+ .deliveries td.role,
1165
+ .deliveries td.folder {
1166
+ font-size: 12px;
1167
+ color: var(--muted);
1168
+ }
1169
+
1170
+ /* --- États vides et erreurs ----------------------------------------------- */
1171
+
1172
+ .empty {
1173
+ padding: 48px 24px;
1174
+ text-align: center;
1175
+ color: var(--muted);
1176
+ }
1177
+
1178
+ .empty-title {
1179
+ display: block;
1180
+ color: var(--text);
1181
+ font-weight: 600;
1182
+ margin-bottom: 4px;
1183
+ }
1184
+
1185
+ .banner {
1186
+ margin: 16px 20px;
1187
+ padding: 12px 14px;
1188
+ border-radius: var(--radius);
1189
+ background: var(--danger-soft);
1190
+ color: var(--danger);
1191
+ font-size: 13px;
1192
+ }
1193
+
1194
+ /* --- Écrans étroits ------------------------------------------------------- */
1195
+
1196
+ @media (max-width: 1200px) {
1197
+ .console.has-sheet,
1198
+ .console.is-collapsed.has-sheet {
1199
+ grid-template-columns: 57px 320px minmax(0, 1fr) 320px;
1200
+ }
1201
+ }
1202
+
1203
+ @media (max-width: 1000px) {
1204
+ .topbar-search {
1205
+ max-width: 240px;
1206
+ }
1207
+
1208
+ .console,
1209
+ .console.is-collapsed {
1210
+ grid-template-columns: 57px 300px minmax(0, 1fr);
1211
+ }
1212
+
1213
+ /* Trop étroit pour quatre colonnes : le volet recouvre le lecteur. */
1214
+ .console.has-sheet,
1215
+ .console.is-collapsed.has-sheet {
1216
+ grid-template-columns: 57px 300px minmax(0, 1fr);
1217
+ }
1218
+
1219
+ .console.has-sheet .sheet {
1220
+ position: fixed;
1221
+ top: var(--topbar-h);
1222
+ right: 0;
1223
+ bottom: 0;
1224
+ width: 340px;
1225
+ max-width: 100%;
1226
+ box-shadow: -8px 0 24px rgba(0, 0, 0, 0.12);
1227
+ }
1228
+ }