@agenticmail/api 0.7.8 → 0.7.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.
@@ -0,0 +1,668 @@
1
+ /* ─── Brand & palette ─────────────────────────────────────────────── */
2
+ :root {
3
+ --pink: #ec4899;
4
+ --pink-soft: #fdf2f8;
5
+ --pink-rule: #fbcfe8;
6
+ --ink: #202124;
7
+ --ink-soft: #3c4043;
8
+ --muted: #5f6368;
9
+ --line: #e8eaed;
10
+ --bg: #ffffff;
11
+ --bg-soft: #f8fafd; /* Gmail-style soft sidebar bg */
12
+ --bg-hover: #f1f3f4;
13
+ --bg-selected: #fce4ec; /* light pink for selected folder */
14
+ --bg-row-hover: #f5f5f5;
15
+ --accent-strong: #be185d;
16
+ --code-bg: #f1f3f4;
17
+ --code-fg: #c5221f;
18
+ --unread-bold: #202124;
19
+ --read-text: #5f6368;
20
+ }
21
+ @media (prefers-color-scheme: dark) {
22
+ :root {
23
+ --pink-soft: #2a1726;
24
+ --pink-rule: #5b1d44;
25
+ --ink: #e8eaed;
26
+ --ink-soft: #c4c7c5;
27
+ --muted: #9aa0a6;
28
+ --line: #3c4043;
29
+ --bg: #1f1f1f;
30
+ --bg-soft: #2a2a2c;
31
+ --bg-hover: #3c4043;
32
+ --bg-selected: #3a1f30;
33
+ --bg-row-hover: #303030;
34
+ --accent-strong: #f9a8d4;
35
+ --code-bg: #2a2a2c;
36
+ --code-fg: #fb7185;
37
+ --unread-bold: #e8eaed;
38
+ --read-text: #9aa0a6;
39
+ }
40
+ }
41
+
42
+ /* ─── Icons ────────────────────────────────────────────────────────── */
43
+ /* Inline SVGs from js/icons.js. Inherit colour from the parent so a
44
+ single palette token (e.g. --ink-soft, --pink) drives every glyph. */
45
+ .icon-svg { display: inline-block; vertical-align: middle; flex-shrink: 0; }
46
+ [data-icon] { display: inline-flex; align-items: center; justify-content: center; }
47
+
48
+ * { box-sizing: border-box; }
49
+ html, body { height: 100%; margin: 0; }
50
+ body {
51
+ font: 14px/1.5 'Google Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, system-ui, sans-serif;
52
+ color: var(--ink);
53
+ background: var(--bg-soft);
54
+ overflow: hidden;
55
+ }
56
+ button { font: inherit; cursor: pointer; border: none; background: none; color: inherit; }
57
+ a { color: var(--accent-strong); }
58
+ .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
59
+
60
+ /* ─── App shell ─────────────────────────────────────────────────────── */
61
+ .app {
62
+ display: grid;
63
+ grid-template-rows: 64px 1fr;
64
+ height: 100vh;
65
+ }
66
+
67
+ /* ─── Top bar ──────────────────────────────────────────────────────── */
68
+ .topbar {
69
+ display: flex; align-items: center; gap: 8px;
70
+ padding: 8px 16px;
71
+ background: var(--bg-soft);
72
+ position: relative; z-index: 10;
73
+ }
74
+ .menu-btn {
75
+ width: 40px; height: 40px; border-radius: 50%;
76
+ display: flex; align-items: center; justify-content: center;
77
+ color: var(--ink-soft); font-size: 20px;
78
+ }
79
+ .menu-btn:hover { background: var(--bg-hover); }
80
+ .brand {
81
+ display: flex; align-items: center; gap: 10px;
82
+ padding: 0 8px; min-width: 200px;
83
+ }
84
+ .brand-bow { font-size: 28px; line-height: 1; }
85
+ .brand-logo {
86
+ width: 32px; height: 32px;
87
+ border-radius: 8px;
88
+ flex-shrink: 0;
89
+ display: block;
90
+ }
91
+ .brand-name {
92
+ font: 500 22px/1 'Google Sans', sans-serif;
93
+ color: var(--pink);
94
+ }
95
+ /* Slightly bigger logo in the auth card. */
96
+ .auth-card .brand-logo {
97
+ width: 28px; height: 28px;
98
+ border-radius: 6px;
99
+ vertical-align: middle;
100
+ }
101
+
102
+ .search-container {
103
+ flex: 1; max-width: 720px;
104
+ position: relative;
105
+ }
106
+ .search-input {
107
+ width: 100%; height: 48px;
108
+ padding: 0 48px 0 48px;
109
+ border: none; border-radius: 8px;
110
+ background: var(--bg-hover);
111
+ color: var(--ink); font-size: 16px;
112
+ outline: none; transition: background .15s, box-shadow .15s;
113
+ }
114
+ .search-input:focus, .search-input:hover {
115
+ background: var(--bg);
116
+ box-shadow: 0 1px 3px rgba(0,0,0,.1);
117
+ }
118
+ .search-icon {
119
+ position: absolute; left: 14px; top: 50%;
120
+ transform: translateY(-50%); font-size: 18px;
121
+ color: var(--muted); pointer-events: none;
122
+ }
123
+ .search-clear-btn {
124
+ position: absolute; right: 8px; top: 50%;
125
+ transform: translateY(-50%);
126
+ width: 32px; height: 32px; border-radius: 50%;
127
+ display: none; align-items: center; justify-content: center;
128
+ color: var(--muted);
129
+ }
130
+ .search-clear-btn.show { display: flex; }
131
+ .search-clear-btn:hover { background: var(--bg-hover); color: var(--ink); }
132
+ .search-hint {
133
+ position: absolute; right: 50px; top: 50%;
134
+ transform: translateY(-50%);
135
+ font-size: 12px; color: var(--muted); pointer-events: none;
136
+ display: none;
137
+ }
138
+ .search-hint.show { display: block; }
139
+
140
+ .topbar-spacer { flex: 1; }
141
+ .icon-btn {
142
+ width: 40px; height: 40px; border-radius: 50%;
143
+ display: flex; align-items: center; justify-content: center;
144
+ color: var(--ink-soft); font-size: 18px;
145
+ }
146
+ .icon-btn:hover { background: var(--bg-hover); }
147
+
148
+ /* ─── Profile (top right) ─────────────────────────────────────────── */
149
+ .profile-trigger {
150
+ width: 40px; height: 40px; border-radius: 50%;
151
+ display: flex; align-items: center; justify-content: center;
152
+ cursor: pointer;
153
+ border: 2px solid transparent;
154
+ transition: border-color .15s;
155
+ }
156
+ .profile-trigger:hover { border-color: var(--line); }
157
+
158
+ .profile-menu {
159
+ position: absolute; top: 56px; right: 16px;
160
+ width: 360px; max-height: 80vh; overflow-y: auto;
161
+ background: var(--bg); border: 1px solid var(--line); border-radius: 12px;
162
+ box-shadow: 0 8px 32px rgba(0,0,0,0.15);
163
+ padding: 12px 0; z-index: 25;
164
+ display: none;
165
+ }
166
+ .profile-menu.open { display: block; }
167
+ .profile-menu-section {
168
+ padding: 8px 20px 6px; font-size: 11px; font-weight: 600;
169
+ color: var(--muted); text-transform: uppercase; letter-spacing: .06em;
170
+ }
171
+ .profile-menu-item {
172
+ display: flex; align-items: center; gap: 12px;
173
+ padding: 10px 20px; cursor: pointer;
174
+ color: var(--ink);
175
+ }
176
+ .profile-menu-item:hover { background: var(--bg-hover); }
177
+ .profile-menu-item .meta { flex: 1; min-width: 0; }
178
+ .profile-menu-item .name {
179
+ font-weight: 500; font-size: 14px;
180
+ display: flex; align-items: center; gap: 6px;
181
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
182
+ }
183
+ .profile-menu-item .email {
184
+ font-size: 12px; color: var(--muted);
185
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
186
+ }
187
+ .profile-menu-item .selected-check {
188
+ color: var(--pink); font-size: 20px; font-weight: 700;
189
+ margin-left: 4px;
190
+ }
191
+ .profile-menu-divider { height: 1px; background: var(--line); margin: 8px 0; }
192
+ .profile-menu-footer {
193
+ padding: 12px 20px; font-size: 13px; color: var(--muted);
194
+ display: flex; gap: 12px;
195
+ }
196
+ .profile-menu-footer a {
197
+ color: var(--accent-strong); cursor: pointer; text-decoration: none;
198
+ }
199
+ .profile-menu-footer a:hover { text-decoration: underline; }
200
+
201
+ /* ─── Avatars ──────────────────────────────────────────────────────── */
202
+ .avatar {
203
+ width: 32px; height: 32px; border-radius: 50%;
204
+ display: flex; align-items: center; justify-content: center;
205
+ font-size: 14px; font-weight: 500; color: white;
206
+ flex-shrink: 0; position: relative;
207
+ }
208
+ .avatar-sm { width: 24px; height: 24px; font-size: 11px; }
209
+ .avatar-md { width: 40px; height: 40px; font-size: 16px; }
210
+ .avatar-lg { width: 48px; height: 48px; font-size: 20px; }
211
+ .avatar-host { background: #fce8e0; color: #d97757; }
212
+ @media (prefers-color-scheme: dark) { .avatar-host { background: #2a1810; } }
213
+ .avatar svg { width: 60%; height: 60%; }
214
+ .avatar-img {
215
+ width: 70%; height: 70%;
216
+ object-fit: contain;
217
+ display: block;
218
+ }
219
+ .avatar-check {
220
+ position: absolute; bottom: -2px; right: -2px;
221
+ width: 14px; height: 14px; border-radius: 50%;
222
+ background: #22c55e; color: white;
223
+ display: flex; align-items: center; justify-content: center;
224
+ font-size: 9px; font-weight: 700;
225
+ border: 2px solid var(--bg);
226
+ }
227
+
228
+ .role-badge {
229
+ font-size: 10px; font-weight: 600;
230
+ padding: 2px 7px; border-radius: 10px;
231
+ text-transform: uppercase; letter-spacing: .04em;
232
+ flex-shrink: 0;
233
+ }
234
+ .role-badge-host { background: #fef3c7; color: #92400e; }
235
+ .role-badge-sub { background: var(--pink-soft); color: var(--accent-strong); }
236
+ @media (prefers-color-scheme: dark) {
237
+ .role-badge-host { background: #44290c; color: #fcd34d; }
238
+ }
239
+
240
+ /* ─── Main grid: sidebar + content ──────────────────────────────── */
241
+ .main {
242
+ display: grid;
243
+ grid-template-columns: 256px 1fr;
244
+ overflow: hidden;
245
+ background: var(--bg-soft);
246
+ position: relative;
247
+ }
248
+ .sidebar-backdrop {
249
+ display: none;
250
+ position: fixed; inset: 64px 0 0 0;
251
+ background: rgba(0,0,0,0.4);
252
+ z-index: 14;
253
+ }
254
+ /* ─── Mobile / narrow viewport ──────────────────────────────────── */
255
+ @media (max-width: 800px) {
256
+ .main { grid-template-columns: 1fr; }
257
+ .sidebar {
258
+ position: fixed; top: 64px; bottom: 0; left: 0;
259
+ width: 280px; max-width: 85vw;
260
+ background: var(--bg-soft);
261
+ z-index: 15;
262
+ transform: translateX(-100%);
263
+ transition: transform .22s ease;
264
+ box-shadow: 2px 0 16px rgba(0,0,0,0.1);
265
+ }
266
+ .main.sidebar-open .sidebar { transform: translateX(0); }
267
+ .main.sidebar-open .sidebar-backdrop { display: block; }
268
+ .content { border-radius: 0; margin: 0; }
269
+ .topbar { padding: 8px 8px; gap: 4px; }
270
+ .brand { min-width: auto; }
271
+ .brand-name { font-size: 18px; }
272
+ .search-container { max-width: none; }
273
+ .search-input { height: 40px; font-size: 14px; }
274
+ /* List rows lose the from column on narrow screens; the subject
275
+ gets full width with the sender folded into the preview. */
276
+ .list-row {
277
+ grid-template-columns: 24px 24px 1fr 70px;
278
+ height: 56px;
279
+ padding: 0 12px;
280
+ }
281
+ .list-row .from { display: none; }
282
+ .list-row .subject-cell {
283
+ flex-direction: column;
284
+ gap: 2px;
285
+ align-items: flex-start;
286
+ }
287
+ .list-row .subject { max-width: none; font-size: 14px; }
288
+ .list-row .preview { font-size: 13px; }
289
+ .list-row .preview::before { content: ''; }
290
+ .message-header { padding: 16px 16px 8px; }
291
+ .message-subject { font-size: 18px; }
292
+ .message-body { padding: 8px 16px 24px; max-width: none; }
293
+ .message-attachments { padding: 12px 16px; }
294
+ /* Compose modal goes full-screen on mobile rather than a tiny
295
+ bottom-right popup that nobody can type into. */
296
+ .compose-bg { padding: 0; align-items: stretch; justify-content: stretch; }
297
+ .compose-modal { width: 100%; max-height: 100vh; border-radius: 0; }
298
+ .compose-body textarea { min-height: 40vh; }
299
+ /* Hide non-essential top-bar buttons on narrow screens. */
300
+ .topbar-spacer { flex: 0; }
301
+ #refresh-btn { display: none; }
302
+ }
303
+ @media (min-width: 801px) {
304
+ /* Hamburger menu only matters on mobile; hide on desktop. */
305
+ .menu-btn { display: none; }
306
+ }
307
+
308
+ /* ─── Sidebar ──────────────────────────────────────────────────────── */
309
+ .sidebar {
310
+ padding: 8px 8px 16px 8px;
311
+ overflow-y: auto;
312
+ }
313
+ .compose-btn {
314
+ display: inline-flex; align-items: center; gap: 12px;
315
+ height: 56px; padding: 0 24px 0 16px;
316
+ margin-bottom: 16px;
317
+ background: var(--pink); color: white;
318
+ border-radius: 16px;
319
+ font: 500 14px/1 'Google Sans', sans-serif;
320
+ box-shadow: 0 1px 3px rgba(0,0,0,.1), 0 1px 2px rgba(0,0,0,.06);
321
+ transition: box-shadow .15s, background .15s;
322
+ }
323
+ .compose-btn:hover {
324
+ box-shadow: 0 2px 6px rgba(0,0,0,.15), 0 2px 4px rgba(0,0,0,.08);
325
+ background: var(--accent-strong);
326
+ }
327
+ .compose-btn .compose-icon { font-size: 20px; }
328
+
329
+ .folder-row {
330
+ display: flex; align-items: center; gap: 16px;
331
+ height: 32px; padding: 0 12px 0 26px;
332
+ border-radius: 0 16px 16px 0;
333
+ margin-right: 8px;
334
+ color: var(--ink-soft); cursor: pointer;
335
+ font-size: 14px; font-weight: 500;
336
+ }
337
+ .folder-row:hover { background: var(--bg-hover); }
338
+ .folder-row.active {
339
+ background: var(--bg-selected);
340
+ color: var(--accent-strong);
341
+ font-weight: 700;
342
+ }
343
+ .folder-row .icon { font-size: 18px; width: 20px; flex-shrink: 0; }
344
+ .folder-row .label { flex: 1; }
345
+ .folder-row .count {
346
+ font-size: 12px; font-weight: 700;
347
+ color: var(--accent-strong);
348
+ }
349
+ .folder-row .count[data-zero] { display: none; }
350
+
351
+ .sidebar-section {
352
+ padding: 16px 16px 4px;
353
+ font-size: 11px; font-weight: 600;
354
+ color: var(--muted); text-transform: uppercase; letter-spacing: .06em;
355
+ }
356
+
357
+ /* ─── Content area ─────────────────────────────────────────────────── */
358
+ .content {
359
+ background: var(--bg);
360
+ border-radius: 16px 0 0 0;
361
+ margin: 0 8px 8px 0;
362
+ overflow: hidden;
363
+ display: flex; flex-direction: column;
364
+ }
365
+
366
+ /* List header (above the list itself) */
367
+ .list-header {
368
+ display: flex; align-items: center; gap: 8px;
369
+ padding: 8px 16px; height: 48px;
370
+ border-bottom: 1px solid transparent;
371
+ position: sticky; top: 0; z-index: 5;
372
+ background: var(--bg);
373
+ flex-shrink: 0;
374
+ }
375
+ .list-header .icon-btn { width: 36px; height: 36px; font-size: 16px; }
376
+ .list-header .count-text {
377
+ margin-left: auto;
378
+ font-size: 12px; color: var(--muted);
379
+ }
380
+ .list-header .folder-title {
381
+ font: 500 18px/1 'Google Sans', sans-serif;
382
+ color: var(--ink); margin-left: 8px;
383
+ }
384
+
385
+ /* List rows */
386
+ .list-rows {
387
+ flex: 1; overflow-y: auto;
388
+ }
389
+ .list-row {
390
+ display: grid;
391
+ grid-template-columns: 24px 24px 240px 1fr 100px;
392
+ align-items: center; gap: 0;
393
+ padding: 0 16px; height: 40px;
394
+ cursor: pointer;
395
+ border-bottom: 1px solid var(--bg-soft);
396
+ position: relative;
397
+ }
398
+ @media (max-width: 1000px) { .list-row { grid-template-columns: 24px 24px 180px 1fr 80px; } }
399
+ .list-row:hover {
400
+ background: var(--bg-row-hover);
401
+ box-shadow: inset 0 0 0 1px rgba(0,0,0,.05);
402
+ z-index: 1;
403
+ }
404
+ .list-row.unread { background: var(--bg); }
405
+ .list-row.unread .from, .list-row.unread .subject {
406
+ color: var(--unread-bold); font-weight: 700;
407
+ }
408
+ .list-row:not(.unread) .from, .list-row:not(.unread) .subject {
409
+ color: var(--read-text);
410
+ }
411
+ .list-row .star {
412
+ font-size: 16px; color: #dadce0; cursor: pointer;
413
+ width: 24px; height: 24px;
414
+ display: flex; align-items: center; justify-content: center;
415
+ border-radius: 50%;
416
+ }
417
+ .list-row .star:hover { background: var(--bg-hover); }
418
+ .list-row .star.starred { color: #f4b400; }
419
+ .list-row .from {
420
+ font-size: 14px;
421
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
422
+ padding-right: 8px;
423
+ }
424
+ .list-row .subject-cell {
425
+ display: flex; gap: 8px; align-items: baseline;
426
+ overflow: hidden;
427
+ min-width: 0;
428
+ }
429
+ .list-row .subject {
430
+ font-size: 14px; flex-shrink: 0;
431
+ max-width: 50%;
432
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
433
+ }
434
+ .list-row .preview {
435
+ font-size: 14px; color: var(--muted);
436
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
437
+ flex: 1; min-width: 0;
438
+ }
439
+ .list-row .preview::before { content: '— '; opacity: .5; }
440
+ .list-row .date {
441
+ font-size: 12px; color: var(--muted); font-weight: 500;
442
+ text-align: right; padding-right: 4px;
443
+ }
444
+ .list-row.unread .date { color: var(--unread-bold); font-weight: 700; }
445
+ .list-row .dot {
446
+ width: 8px; height: 8px; border-radius: 50%;
447
+ background: var(--pink);
448
+ display: none;
449
+ margin: 0 auto;
450
+ }
451
+ .list-row.unread .dot { display: block; }
452
+
453
+ mark.search-hl {
454
+ background: #fff475; color: inherit;
455
+ padding: 0 1px;
456
+ }
457
+ @media (prefers-color-scheme: dark) {
458
+ mark.search-hl { background: #5b4d00; color: #fef9c3; }
459
+ }
460
+
461
+ .empty {
462
+ padding: 80px 24px; text-align: center;
463
+ color: var(--muted); font-size: 14px;
464
+ }
465
+ .empty .big { font-size: 48px; margin-bottom: 16px; opacity: .4; }
466
+
467
+ /* ─── Message detail view ──────────────────────────────────────── */
468
+ .message-view {
469
+ display: flex; flex-direction: column;
470
+ height: 100%; overflow-y: auto;
471
+ }
472
+ .message-toolbar {
473
+ display: flex; align-items: center; gap: 8px;
474
+ padding: 8px 16px; height: 48px;
475
+ border-bottom: 1px solid var(--line);
476
+ background: var(--bg);
477
+ position: sticky; top: 0; z-index: 5;
478
+ flex-shrink: 0;
479
+ }
480
+ .message-toolbar .icon-btn { width: 36px; height: 36px; font-size: 16px; }
481
+ .message-toolbar .toolbar-spacer { flex: 1; }
482
+
483
+ .message-header {
484
+ padding: 32px 32px 16px;
485
+ }
486
+ .message-subject {
487
+ font: 400 22px/1.3 'Google Sans', sans-serif;
488
+ color: var(--ink);
489
+ margin: 0 0 20px;
490
+ }
491
+ .message-sender-row {
492
+ display: flex; align-items: flex-start; gap: 16px;
493
+ }
494
+ .message-meta {
495
+ flex: 1; min-width: 0;
496
+ }
497
+ .message-from {
498
+ font-size: 14px; color: var(--ink);
499
+ }
500
+ .message-from .name { font-weight: 500; }
501
+ .message-from .addr { color: var(--muted); margin-left: 4px; }
502
+ .message-to { font-size: 12px; color: var(--muted); margin-top: 4px; }
503
+ .message-date {
504
+ font-size: 12px; color: var(--muted);
505
+ white-space: nowrap;
506
+ }
507
+
508
+ .message-body {
509
+ padding: 8px 32px 32px;
510
+ font-size: 14px; line-height: 1.65;
511
+ color: var(--ink);
512
+ white-space: pre-wrap; word-wrap: break-word;
513
+ max-width: 800px;
514
+ }
515
+ .message-body h1, .message-body h2, .message-body h3 {
516
+ color: var(--pink); margin: 1.2em 0 .4em;
517
+ }
518
+ .message-body h1 { font-size: 1.4em; }
519
+ .message-body h2 { font-size: 1.2em; }
520
+ .message-body h3 { font-size: 1.05em; }
521
+ .message-body code {
522
+ background: var(--code-bg); color: var(--code-fg);
523
+ padding: 1px 5px; border-radius: 4px; font-size: 13px;
524
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
525
+ }
526
+ .message-body pre {
527
+ background: var(--code-bg); padding: 12px 14px; border-radius: 8px;
528
+ overflow-x: auto; font-size: 13px;
529
+ }
530
+ .message-body pre code { background: transparent; padding: 0; color: var(--ink); }
531
+ .message-body strong { color: var(--ink); }
532
+ .message-body em { color: var(--ink-soft); }
533
+ .message-body blockquote {
534
+ border-left: 3px solid var(--pink-rule);
535
+ margin: .8em 0; padding: .2em 0 .2em 12px;
536
+ color: var(--muted); white-space: pre-wrap;
537
+ }
538
+ .message-body blockquote blockquote { border-left-color: #c084fc; }
539
+ .message-body blockquote blockquote blockquote { border-left-color: #f59e0b; }
540
+ .message-body table { border-collapse: collapse; margin: .5em 0; }
541
+ .message-body th, .message-body td { border: 1px solid var(--line); padding: 6px 10px; }
542
+ .message-body th { background: var(--bg-soft); font-weight: 600; }
543
+ .message-body ul, .message-body ol { padding-left: 24px; }
544
+ .message-body hr { border: none; border-top: 1px solid var(--line); margin: 1.2em 0; }
545
+ .message-body a { color: var(--accent-strong); }
546
+ .message-body input[type=checkbox] { margin-right: 6px; }
547
+
548
+ .message-attachments {
549
+ padding: 12px 32px; border-top: 1px solid var(--line);
550
+ display: flex; flex-wrap: wrap; gap: 8px;
551
+ }
552
+ .message-attachment {
553
+ display: inline-flex; align-items: center; gap: 8px;
554
+ padding: 8px 12px; border: 1px solid var(--line); border-radius: 8px;
555
+ font-size: 13px; color: var(--ink-soft);
556
+ }
557
+ .message-attachment .att-icon { font-size: 18px; }
558
+
559
+ /* ─── Auth gate ─────────────────────────────────────────────────────── */
560
+ .auth-gate {
561
+ position: fixed; inset: 0;
562
+ display: flex; align-items: center; justify-content: center;
563
+ background: var(--bg);
564
+ z-index: 100;
565
+ }
566
+ .auth-card {
567
+ width: 420px; padding: 36px;
568
+ background: var(--bg); border: 1px solid var(--line); border-radius: 14px;
569
+ box-shadow: 0 4px 16px rgba(0,0,0,.06);
570
+ }
571
+ .auth-card h1 { margin: 0 0 8px; font-size: 24px; color: var(--pink); font-weight: 500; }
572
+ .auth-card p { margin: 0 0 20px; color: var(--muted); font-size: 14px; line-height: 1.6; }
573
+ .auth-card input {
574
+ width: 100%; height: 44px; padding: 0 14px; margin-bottom: 12px;
575
+ border: 1px solid var(--line); border-radius: 8px;
576
+ background: var(--bg-soft); color: var(--ink); outline: none;
577
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
578
+ font-size: 13px;
579
+ }
580
+ .auth-card input:focus { border-color: var(--pink); background: var(--bg); }
581
+ .auth-card .submit {
582
+ width: 100%; height: 44px;
583
+ background: var(--pink); color: white; border-radius: 8px;
584
+ font-weight: 500; font-size: 14px;
585
+ }
586
+ .auth-card .submit:hover { background: var(--accent-strong); }
587
+ .auth-err { color: #d93025; font-size: 12px; margin-bottom: 12px; }
588
+
589
+ /* ─── Compose modal ─────────────────────────────────────────────────── */
590
+ .compose-bg {
591
+ position: fixed; inset: 0; background: rgba(0,0,0,.3);
592
+ display: flex; align-items: flex-end; justify-content: flex-end;
593
+ padding: 0 24px 0 0;
594
+ z-index: 50;
595
+ }
596
+ .compose-modal {
597
+ width: 560px; max-height: 80vh;
598
+ background: var(--bg); border-radius: 8px 8px 0 0;
599
+ box-shadow: 0 8px 24px rgba(0,0,0,.2);
600
+ display: grid; grid-template-rows: auto 1fr auto;
601
+ overflow: hidden;
602
+ }
603
+ .compose-head {
604
+ padding: 12px 16px;
605
+ background: #404040; color: white;
606
+ display: flex; justify-content: space-between; align-items: center;
607
+ font-size: 13px; font-weight: 500;
608
+ }
609
+ .compose-head button { color: white; font-size: 16px; opacity: .8; }
610
+ .compose-head button:hover { opacity: 1; }
611
+
612
+ .compose-body {
613
+ padding: 8px 16px; overflow-y: auto;
614
+ }
615
+ .compose-row {
616
+ display: grid; grid-template-columns: 60px 1fr;
617
+ border-bottom: 1px solid var(--line);
618
+ align-items: center;
619
+ padding: 4px 0;
620
+ }
621
+ .compose-row label { color: var(--muted); font-size: 13px; padding: 0 8px; }
622
+ .compose-row input, .compose-row select {
623
+ width: 100%; padding: 8px 4px;
624
+ border: none; outline: none;
625
+ background: transparent; color: var(--ink);
626
+ font: inherit; font-size: 14px;
627
+ }
628
+ .compose-row select { cursor: pointer; }
629
+ .compose-body textarea {
630
+ width: 100%; min-height: 240px;
631
+ padding: 12px 4px; margin-top: 8px;
632
+ border: none; outline: none; resize: vertical;
633
+ background: transparent; color: var(--ink);
634
+ font-family: inherit; font-size: 14px; line-height: 1.6;
635
+ }
636
+ .compose-foot {
637
+ padding: 12px 16px;
638
+ border-top: 1px solid var(--line);
639
+ display: flex; gap: 8px; align-items: center;
640
+ }
641
+ .btn-send {
642
+ background: var(--pink); color: white;
643
+ padding: 8px 24px; border-radius: 4px;
644
+ font-weight: 500; font-size: 14px;
645
+ }
646
+ .btn-send:hover { background: var(--accent-strong); }
647
+ .btn-discard {
648
+ margin-left: auto;
649
+ color: var(--muted);
650
+ padding: 8px 12px;
651
+ }
652
+ .btn-discard:hover { background: var(--bg-hover); color: var(--ink); }
653
+ .compose-hint {
654
+ font-size: 11px; color: var(--muted); padding: 0 8px;
655
+ }
656
+
657
+ /* ─── Toast ────────────────────────────────────────────────────────── */
658
+ .toast {
659
+ position: fixed; bottom: 24px; left: 24px; z-index: 60;
660
+ padding: 12px 20px; border-radius: 4px;
661
+ background: #323232; color: white; font-size: 14px;
662
+ opacity: 0; transform: translateY(8px);
663
+ transition: opacity .2s, transform .2s;
664
+ pointer-events: none;
665
+ max-width: 480px;
666
+ }
667
+ .toast.show { opacity: 1; transform: translateY(0); }
668
+ .toast.error { background: #d93025; }