@devchitchat/chat 4.4.3 → 4.4.4

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.
@@ -9,18 +9,25 @@
9
9
  input, textarea, select, button { font: inherit; }
10
10
 
11
11
  :root {
12
- --font-sans: system-ui, -apple-system, 'Segoe UI', sans-serif;
13
- --font-mono: 'Cascadia Code', 'Fira Code', 'JetBrains Mono', monospace;
14
- --font-size: 17px;
15
- --radius-sm: 4px;
16
- --radius-md: 8px;
17
- --radius-lg: 16px;
18
-
19
- --sidebar-width: 240px;
12
+ --font-sans: -apple-system, 'SF Pro Text', system-ui, 'Segoe UI', sans-serif;
13
+ --font-mono: 'SF Mono', ui-monospace, 'Cascadia Code', 'Fira Code', 'JetBrains Mono', monospace;
14
+ --font-size: 16px;
15
+ --radius-sm: 6px;
16
+ --radius-md: 10px;
17
+ --radius-lg: 14px;
18
+ --radius-xl: 20px;
19
+ --radius-pill: 999px;
20
+
21
+ --sidebar-width: 260px;
20
22
  --composer-height: 80px;
21
23
  --call-bar-height: 0px; /* expands when a call is active */
22
24
 
23
- --transition: 150ms ease;
25
+ --transition: 200ms cubic-bezier(0.25, 0.1, 0.25, 1);
26
+
27
+ /* Fallback shadows for themes that don't define them */
28
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.12);
29
+ --shadow-md: 0 4px 16px rgba(0,0,0,0.12);
30
+ --shadow-lg: 0 10px 40px rgba(0,0,0,0.14);
24
31
  }
25
32
 
26
33
  html, body { height: 100%; font-family: var(--font-sans); }
@@ -57,26 +64,29 @@ details summary {
57
64
  padding-top: env(safe-area-inset-top);
58
65
  }
59
66
 
60
- .hub-group { padding: 8px 0; }
67
+ .hub-group { padding: 0 0 4px; }
61
68
  .hub-header {
62
- padding: 6px 16px;
63
- font-weight: 700;
64
- text-transform: uppercase;
65
- letter-spacing: 0.8px;
66
- color: var(--text-muted);
69
+ /* <details> container — no visual padding of its own */
67
70
  }
68
71
  .channel-list {
69
72
  list-style: none;
70
73
  text-transform: none;
74
+ padding: 2px 0;
71
75
  }
72
76
 
73
77
  .hub-name {
74
78
  display: flex;
75
79
  align-items: center;
76
80
  gap: 2px;
81
+ padding: 16px 16px 4px;
82
+ font-size: 12px;
83
+ font-weight: 600;
84
+ letter-spacing: 0.02em;
85
+ color: var(--text-secondary);
77
86
  user-select: none;
78
87
  -webkit-user-select: none;
79
88
  -webkit-touch-callout: none;
89
+ cursor: pointer;
80
90
  }
81
91
  .hub-name > span { flex: 1; }
82
92
 
@@ -93,11 +103,12 @@ details summary {
93
103
  text-decoration: none;
94
104
  flex: 1;
95
105
  min-width: 0;
96
- height: 2.3rem;
106
+ height: 34px;
97
107
  display: block;
98
- line-height: 2.3rem;
99
- padding-left: .7rem;
100
- padding-right: .7rem;
108
+ line-height: 34px;
109
+ padding: 0 8px;
110
+ margin: 0 6px;
111
+ border-radius: var(--radius-md);
101
112
  user-select: none;
102
113
  -webkit-user-select: none;
103
114
  -webkit-touch-callout: none;
@@ -105,30 +116,23 @@ details summary {
105
116
  overflow: hidden;
106
117
  white-space: nowrap;
107
118
  text-overflow: ellipsis;
119
+ font-size: 15px;
108
120
  }
109
121
 
110
122
  .channel-item a:hover {
111
123
  color: var(--text-primary);
124
+ background: var(--bg-hover);
112
125
  }
113
126
 
114
127
  .channel-item.active a {
115
128
  color: var(--text-primary);
116
129
  background: var(--bg-active);
117
130
  font-weight: 600;
118
- border-radius: var(--radius-sm);
119
131
  }
120
132
 
121
- /* Left accent bar on selected channel */
133
+ /* No left accent bar Apple uses full-width pill selection */
122
134
  .channel-item.active::before {
123
- content: '';
124
- position: absolute;
125
- left: 0;
126
- top: 50%;
127
- transform: translateY(-50%);
128
- width: 3px;
129
- height: 1.4rem;
130
- background: var(--accent);
131
- border-radius: 0 2px 2px 0;
135
+ content: none;
132
136
  }
133
137
 
134
138
  /* ── Channel + hub drag-and-drop reordering (desktop) ───────────────────── */
@@ -162,33 +166,23 @@ details summary {
162
166
  /* ── Direct Messages section ─────────────────────────────────────────────── */
163
167
  .dm-section {
164
168
  margin-top: 4px;
165
- padding: 8px 0 4px;
169
+ padding: 4px 0 8px;
166
170
  border-top: 1px solid var(--border);
167
171
  }
168
172
 
169
173
  .dm-section-title {
170
- padding: 4px 16px 6px;
171
- font-size: 11px;
172
- font-weight: 700;
173
- text-transform: uppercase;
174
- letter-spacing: 1px;
175
- color: var(--text-muted);
174
+ padding: 20px 16px 5px;
175
+ font-size: 12px;
176
+ font-weight: 600;
177
+ letter-spacing: 0.02em;
178
+ color: var(--text-secondary);
176
179
  display: flex;
177
180
  align-items: center;
178
181
  gap: 6px;
179
182
  }
180
183
 
181
- /* Avatar-style bullet before "Direct Messages" label */
182
- .dm-section-title::before {
183
- content: '';
184
- display: inline-block;
185
- width: 6px;
186
- height: 6px;
187
- border-radius: 50%;
188
- background: var(--accent);
189
- opacity: 0.6;
190
- flex-shrink: 0;
191
- }
184
+ /* No decorative bullet Apple sidebars use clean section headers */
185
+ .dm-section-title::before { display: none; }
192
186
 
193
187
  .dm-list {
194
188
  list-style: none;
@@ -205,11 +199,13 @@ details summary {
205
199
  align-items: center;
206
200
  gap: 8px;
207
201
  flex: 1;
208
- height: 2rem;
209
- padding: 0 16px;
202
+ height: 34px;
203
+ padding: 0 8px;
204
+ margin: 0 6px;
205
+ border-radius: var(--radius-md);
210
206
  color: var(--text-secondary);
211
207
  text-decoration: none;
212
- font-size: 0.9em;
208
+ font-size: 15px;
213
209
  user-select: none;
214
210
  -webkit-user-select: none;
215
211
  -webkit-touch-callout: none;
@@ -227,17 +223,9 @@ details summary {
227
223
  font-weight: 600;
228
224
  }
229
225
 
230
- /* Left accent bar on selected DM mirrors selected channel */
226
+ /* No left accent bar pill selection matches channel items */
231
227
  .dm-item.dm-selected::before {
232
- content: '';
233
- position: absolute;
234
- left: 0;
235
- top: 50%;
236
- transform: translateY(-50%);
237
- width: 3px;
238
- height: 1.4rem;
239
- background: var(--accent);
240
- border-radius: 0 2px 2px 0;
228
+ content: none;
241
229
  }
242
230
 
243
231
  .dm-name {
@@ -282,15 +270,17 @@ details summary {
282
270
  flex-shrink: 0;
283
271
  }
284
272
 
285
- /* ── Action sheet (mobile + iPad) ────────────────────────────────────────── */
273
+ /* ── Action sheet (mobile + iPad) Apple iOS style ─────────────────────── */
286
274
  .action-sheet-backdrop {
287
275
  position: fixed;
288
276
  inset: 0;
289
277
  z-index: 200;
290
- background: rgba(0, 0, 0, 0.45);
278
+ background: rgba(0, 0, 0, 0.40);
291
279
  opacity: 0;
292
280
  pointer-events: none;
293
281
  transition: opacity var(--transition);
282
+ backdrop-filter: blur(2px);
283
+ -webkit-backdrop-filter: blur(2px);
294
284
  }
295
285
  .action-sheet-backdrop.open {
296
286
  opacity: 1;
@@ -302,14 +292,15 @@ details summary {
302
292
  left: 0; right: 0; bottom: 0;
303
293
  z-index: 201;
304
294
  background: var(--bg-sidebar);
305
- border-top: 1px solid var(--border);
306
- border-radius: var(--radius-lg) var(--radius-lg) 0 0;
307
- padding: 12px 0;
308
- padding-bottom: env(safe-area-inset-bottom, 16px);
295
+ border-top: none;
296
+ border-radius: 20px 20px 0 0;
297
+ padding: 0;
298
+ padding-bottom: env(safe-area-inset-bottom, 0px);
309
299
  transform: translateY(100%);
310
- transition: transform var(--transition);
300
+ transition: transform 300ms cubic-bezier(0.32, 0.72, 0, 1);
311
301
  max-width: 640px;
312
302
  margin: 0 auto;
303
+ box-shadow: var(--shadow-lg);
313
304
  }
314
305
  .action-sheet.open { transform: translateY(0); }
315
306
 
@@ -317,47 +308,51 @@ details summary {
317
308
  width: 36px; height: 4px;
318
309
  background: var(--border);
319
310
  border-radius: 2px;
320
- margin: 0 auto 12px;
311
+ margin: 10px auto 6px;
321
312
  }
322
313
 
323
314
  .action-sheet-label {
324
- padding: 4px 20px 8px;
325
- font-size: 12px;
326
- font-weight: 700;
327
- text-transform: uppercase;
328
- letter-spacing: 0.8px;
329
- color: var(--text-muted);
315
+ padding: 6px 20px 10px;
316
+ font-size: 13px;
317
+ font-weight: 400;
318
+ color: var(--text-secondary);
319
+ text-align: center;
330
320
  }
331
321
 
332
322
  .action-sheet-item {
333
323
  display: flex;
334
324
  align-items: center;
335
325
  width: 100%;
336
- padding: 14px 20px;
326
+ padding: 16px 20px;
337
327
  background: none;
338
328
  border: none;
329
+ border-top: 0.5px solid var(--border);
339
330
  color: var(--text-primary);
340
- font-size: 1rem;
331
+ font-size: 17px;
341
332
  text-align: left;
342
333
  cursor: pointer;
334
+ transition: background var(--transition);
343
335
  }
336
+ .action-sheet-item:first-of-type { border-top: none; }
344
337
  .action-sheet-item:hover,
345
338
  .action-sheet-item:active { background: var(--bg-hover); }
346
339
  .action-sheet-item.danger { color: var(--color-danger); }
347
340
  .action-sheet-item:disabled { color: var(--text-muted); cursor: default; opacity: 0.45; pointer-events: none; }
348
341
 
349
- /* ── Modal (desktop) ─────────────────────────────────────────────────────── */
342
+ /* ── Modal (desktop) Apple sheet / alert style ─────────────────────────── */
350
343
  .modal-backdrop {
351
344
  position: fixed;
352
345
  inset: 0;
353
346
  z-index: 200;
354
- background: rgba(0, 0, 0, 0.55);
347
+ background: rgba(0, 0, 0, 0.50);
355
348
  display: flex;
356
349
  align-items: center;
357
350
  justify-content: center;
358
351
  opacity: 0;
359
352
  pointer-events: none;
360
353
  transition: opacity var(--transition);
354
+ backdrop-filter: blur(4px);
355
+ -webkit-backdrop-filter: blur(4px);
361
356
  }
362
357
  .modal-backdrop.open {
363
358
  opacity: 1;
@@ -366,30 +361,42 @@ details summary {
366
361
 
367
362
  .modal {
368
363
  background: var(--bg-sidebar);
369
- border: 1px solid var(--border);
370
- border-radius: var(--radius-lg);
364
+ border: none;
365
+ border-radius: var(--radius-xl);
371
366
  width: 100%;
372
367
  max-width: 480px;
373
368
  padding: 28px 32px;
374
369
  display: flex;
375
370
  flex-direction: column;
376
371
  gap: 20px;
377
- transform: scale(0.97);
378
- transition: transform var(--transition);
372
+ box-shadow: var(--shadow-lg);
373
+ transform: scale(0.95) translateY(8px);
374
+ transition: transform 300ms cubic-bezier(0.32, 0.72, 0, 1);
379
375
  }
380
- .modal-backdrop.open .modal { transform: scale(1); }
376
+ .modal-backdrop.open .modal { transform: scale(1) translateY(0); }
381
377
 
382
378
  .modal-header {
383
379
  display: flex;
384
380
  align-items: center;
385
381
  justify-content: space-between;
386
382
  }
387
- .modal-title { font-size: 1.1rem; font-weight: 700; }
383
+ .modal-title { font-size: 17px; font-weight: 600; letter-spacing: -0.2px; }
388
384
  .modal-close {
389
- background: none; border: none; cursor: pointer;
390
- color: var(--text-muted); font-size: 1.2rem; padding: 4px;
385
+ background: var(--bg-hover);
386
+ border: none;
387
+ cursor: pointer;
388
+ color: var(--text-secondary);
389
+ font-size: 14px;
390
+ padding: 6px;
391
+ border-radius: var(--radius-pill);
392
+ width: 28px;
393
+ height: 28px;
394
+ display: flex;
395
+ align-items: center;
396
+ justify-content: center;
397
+ transition: background var(--transition), color var(--transition);
391
398
  }
392
- .modal-close:hover { color: var(--text-primary); }
399
+ .modal-close:hover { background: var(--fill-secondary); color: var(--text-primary); }
393
400
 
394
401
  .modal-body { display: flex; flex-direction: column; gap: 16px; }
395
402
 
@@ -412,15 +419,17 @@ details summary {
412
419
  .modal-danger-zone p { font-size: 13px; color: var(--text-muted); }
413
420
  .btn-danger {
414
421
  align-self: flex-start;
415
- padding: 8px 16px;
416
- border: 1px solid var(--color-danger);
417
- border-radius: var(--radius-sm);
418
- background: none;
422
+ padding: 8px 18px;
423
+ border: none;
424
+ border-radius: var(--radius-pill);
425
+ background: color-mix(in srgb, var(--color-danger) 12%, transparent);
419
426
  color: var(--color-danger);
420
- font-weight: 600;
427
+ font-size: 15px;
428
+ font-weight: 500;
421
429
  cursor: pointer;
430
+ transition: background var(--transition);
422
431
  }
423
- .btn-danger:hover { background: color-mix(in srgb, var(--color-danger) 12%, transparent); }
432
+ .btn-danger:hover { background: color-mix(in srgb, var(--color-danger) 20%, transparent); }
424
433
 
425
434
  .sidebar-footer {
426
435
  margin-top: auto;
@@ -429,12 +438,13 @@ details summary {
429
438
  border-top: 1px solid var(--border);
430
439
  display: flex;
431
440
  flex-direction: column;
432
- gap: 8px;
441
+ gap: 10px;
433
442
  }
434
443
 
435
444
  .sidebar-username {
436
- font-size: 12px;
437
- color: var(--text-muted);
445
+ font-size: 13px;
446
+ font-weight: 500;
447
+ color: var(--text-secondary);
438
448
  padding: 0 2px;
439
449
  }
440
450
 
@@ -446,35 +456,35 @@ details summary {
446
456
  .sidebar-footer-controls select {
447
457
  flex: 1;
448
458
  min-width: 0;
449
- font-size: 12px;
450
- padding: 4px 6px;
451
- border-radius: var(--radius-sm);
459
+ font-size: 13px;
460
+ padding: 5px 8px;
461
+ border-radius: var(--radius-md);
452
462
  border: 1px solid var(--border);
453
463
  background: var(--bg-input);
454
464
  color: var(--text-secondary);
455
465
  cursor: pointer;
456
466
  }
457
467
  .btn-sm {
458
- font-size: 12px;
459
- padding: 4px 8px;
468
+ font-size: 13px;
469
+ padding: 5px 10px;
460
470
  white-space: nowrap;
461
471
  }
462
472
 
463
473
  .btn-new-hub {
464
474
  width: 100%;
465
- padding: 7px 10px;
466
- border-radius: 6px;
467
- border: 1px dashed var(--border);
475
+ padding: 8px 10px;
476
+ border-radius: var(--radius-md);
477
+ border: 1px solid var(--border);
468
478
  background: transparent;
469
- color: var(--text-secondary);
470
- font-size: 13px;
479
+ color: var(--accent);
480
+ font-size: 14px;
481
+ font-weight: 500;
471
482
  cursor: pointer;
472
483
  text-align: left;
484
+ transition: background var(--transition);
473
485
  }
474
486
  .btn-new-hub:hover {
475
- background: var(--bg-input);
476
- color: var(--text-primary);
477
- border-color: var(--accent);
487
+ background: var(--bg-hover);
478
488
  }
479
489
 
480
490
  .btn-enable-push {
@@ -540,10 +550,23 @@ details summary {
540
550
 
541
551
  /* ── Chat panel ──────────────────────────────────────────────────────────── */
542
552
  .chat-panel { flex: 1; display: flex; flex-direction: column; min-height: 0; position: relative; }
543
- .chat-header { padding: 14px 20px; padding-top: calc(14px + env(safe-area-inset-top)); border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 12px; }
553
+ .chat-header {
554
+ padding: 12px 20px;
555
+ padding-top: calc(12px + env(safe-area-inset-top));
556
+ border-bottom: 1px solid var(--border);
557
+ display: flex;
558
+ align-items: center;
559
+ gap: 12px;
560
+ background: var(--bg-topbar);
561
+ backdrop-filter: blur(20px);
562
+ -webkit-backdrop-filter: blur(20px);
563
+ flex-shrink: 0;
564
+ }
544
565
  .chat-title {
545
- font-size: 1rem;
546
- margin-bottom: 7px;
566
+ font-size: 16px;
567
+ font-weight: 600;
568
+ letter-spacing: -0.2px;
569
+ margin-bottom: 0;
547
570
  }
548
571
  .chat-topic {
549
572
  color: var(--text-secondary);
@@ -569,23 +592,41 @@ details summary {
569
592
  padding: 16px 20px;
570
593
  display: flex;
571
594
  flex-direction: column;
572
- gap: 4px;
595
+ gap: 2px;
573
596
  scroll-behavior: smooth;
574
597
  }
575
598
 
576
599
  .message {
577
- padding: 4px 0;
600
+ display: grid;
601
+ grid-template-columns: auto 1fr;
602
+ column-gap: 8px;
603
+ row-gap: 2px;
604
+ padding: 3px 0;
578
605
  }
579
606
  .message pre {
580
607
  padding: 1rem;
581
- font-family: 'Courier New', Courier, monospace;
608
+ font-family: var(--font-mono);
582
609
  font-size: .8rem;
583
610
  background: var(--code-background);
584
611
  }
585
- .message-handle { font-weight: 600; color: var(--accent); grid-column: 1; grid-row: 1; }
612
+ .message-handle {
613
+ font-size: 14px;
614
+ font-weight: 600;
615
+ color: var(--text-primary);
616
+ grid-column: 1;
617
+ grid-row: 1;
618
+ letter-spacing: -0.1px;
619
+ }
586
620
  .message-handle.dm-trigger { cursor: pointer; }
587
- .message-handle.dm-trigger:hover { text-decoration: underline; }
588
- .message-time { font-size: 11px; color: var(--text-muted); grid-column: 2; grid-row: 1; align-self: end; }
621
+ .message-handle.dm-trigger:hover { color: var(--accent); }
622
+ .message-time {
623
+ font-size: 11px;
624
+ color: var(--text-muted);
625
+ grid-column: 2;
626
+ grid-row: 1;
627
+ align-self: center;
628
+ text-align: right;
629
+ }
589
630
  .message-text { grid-column: 1 / -1; grid-row: 2; line-height: 1.5; color: var(--text-primary); word-break: break-word; overflow-wrap: anywhere; }
590
631
  .message-text p { white-space: pre-wrap; margin: 0 0 4px; }
591
632
  .message-text p:last-child { margin-bottom: 0; }
@@ -611,28 +652,27 @@ details summary {
611
652
  flex-wrap: wrap;
612
653
  gap: 4px;
613
654
  margin-top: 4px;
655
+ grid-column: 1 / -1; /* span full width in message grid */
614
656
  }
615
657
  .reaction-pill {
616
658
  display: inline-flex;
617
659
  align-items: center;
618
- gap: 3px;
619
- background: none;
620
- border: 1px solid var(--border);
621
- border-radius: 12px;
622
- padding: 2px 7px;
660
+ gap: 4px;
661
+ background: var(--fill-quaternary);
662
+ border: none;
663
+ border-radius: var(--radius-pill);
664
+ padding: 3px 9px;
623
665
  font-size: 13px;
624
666
  cursor: pointer;
625
667
  color: var(--text-secondary);
626
- transition: border-color var(--transition), background var(--transition);
668
+ transition: background var(--transition);
627
669
  line-height: 1.4;
628
670
  }
629
671
  .reaction-pill:hover {
630
- border-color: var(--accent);
631
- background: color-mix(in srgb, var(--accent) 8%, transparent);
672
+ background: var(--fill-tertiary);
632
673
  }
633
674
  .reaction-pill.reacted {
634
- border-color: var(--accent);
635
- background: color-mix(in srgb, var(--accent) 15%, transparent);
675
+ background: color-mix(in srgb, var(--accent) 18%, transparent);
636
676
  color: var(--accent);
637
677
  font-weight: 600;
638
678
  }
@@ -641,53 +681,56 @@ details summary {
641
681
  display: inline-flex;
642
682
  align-items: center;
643
683
  justify-content: center;
644
- background: none;
645
- border: 1px dashed var(--border);
646
- border-radius: 12px;
647
- padding: 2px 7px;
684
+ background: var(--fill-quaternary);
685
+ border: none;
686
+ border-radius: var(--radius-pill);
687
+ padding: 3px 9px;
648
688
  font-size: 13px;
649
689
  cursor: pointer;
650
690
  color: var(--text-muted);
651
- transition: border-color var(--transition), color var(--transition);
691
+ transition: background var(--transition), color var(--transition);
652
692
  line-height: 1.4;
653
693
  }
654
- .reaction-add:hover { border-color: var(--accent); color: var(--accent); }
694
+ .reaction-add:hover { background: var(--fill-tertiary); color: var(--accent); }
655
695
 
656
- /* ── Message context menu (right-click) ─────────────────────────────────── */
696
+ /* ── Message context menu (right-click) Apple-style popover ────────────── */
657
697
  .msg-context-menu {
658
698
  position: absolute;
659
699
  background: var(--bg-sidebar);
660
- border: 1px solid var(--border);
661
- border-radius: var(--radius-md);
662
- box-shadow: 0 4px 20px rgba(0,0,0,.35);
700
+ border: none;
701
+ border-radius: var(--radius-lg);
702
+ box-shadow: var(--shadow-md);
663
703
  z-index: 300;
664
- min-width: 140px;
704
+ min-width: 160px;
665
705
  overflow: hidden;
666
706
  }
667
707
  .msg-context-menu-item {
668
708
  display: block;
669
709
  width: 100%;
670
- padding: 0 14px;
671
- height: 32px;
710
+ padding: 0 16px;
711
+ height: 40px;
672
712
  background: none;
673
713
  border: none;
714
+ border-top: 0.5px solid var(--border);
674
715
  cursor: pointer;
675
716
  text-align: left;
676
717
  color: var(--text-primary);
677
- font-size: 14px;
718
+ font-size: 15px;
719
+ transition: background var(--transition);
678
720
  }
679
- .msg-context-menu-item:hover { background: color-mix(in srgb, var(--accent) 12%, transparent); }
721
+ .msg-context-menu-item:first-child { border-top: none; }
722
+ .msg-context-menu-item:hover { background: var(--bg-hover); }
680
723
  .msg-context-menu-item--danger { color: var(--color-danger); }
681
- .msg-context-menu-item--danger:hover { background: color-mix(in srgb, var(--color-danger) 10%, transparent); }
724
+ .msg-context-menu-item--danger:hover { background: color-mix(in srgb, var(--color-danger) 8%, transparent); }
682
725
 
683
726
  /* ── Emoji picker ────────────────────────────────────────────────────────── */
684
727
  .emoji-picker {
685
728
  max-width: 320px;
686
729
  width: 320px;
687
730
  background: var(--bg-sidebar);
688
- border: 1px solid var(--border);
689
- border-radius: var(--radius-md);
690
- box-shadow: 0 8px 32px rgba(0,0,0,.4);
731
+ border: none;
732
+ border-radius: var(--radius-lg);
733
+ box-shadow: var(--shadow-lg);
691
734
  overflow: hidden;
692
735
  display: flex;
693
736
  flex-direction: column;
@@ -764,31 +807,35 @@ details summary {
764
807
  flex-wrap: wrap;
765
808
  align-items: flex-end;
766
809
  gap: 8px;
767
- padding: 20px 20px;
810
+ padding: 12px 16px;
768
811
  padding-bottom: calc(12px + env(safe-area-inset-bottom));
769
812
  border-top: 1px solid var(--border);
770
- background: var(--bg-base);
813
+ background: var(--bg-topbar);
814
+ backdrop-filter: blur(20px);
815
+ -webkit-backdrop-filter: blur(20px);
771
816
  position: relative;
772
817
  }
773
818
  .composer textarea {
774
819
  flex: 1;
775
- padding: 10px 14px;
776
- border-radius: var(--radius-md);
820
+ padding: 9px 14px;
821
+ border-radius: var(--radius-pill);
777
822
  border: 1px solid var(--border);
778
823
  background: var(--bg-input);
779
824
  color: var(--text-primary);
780
825
  font-family: var(--font-sans);
781
826
  resize: none;
782
827
  line-height: 1.5;
783
- height: calc(1.5em + 20px); /* lock to 1 row; iOS Safari expands textarea when placeholder wraps */
828
+ height: calc(1.5em + 18px); /* lock to 1 row; iOS Safari expands textarea when placeholder wraps */
784
829
  max-height: 160px;
785
830
  overflow-y: auto;
831
+ transition: border-color var(--transition);
786
832
  }
787
- .composer textarea:focus { outline: none; border-color: var(--accent); }
833
+ .composer textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent); }
788
834
  .composer textarea::placeholder {
789
835
  white-space: nowrap;
790
836
  overflow: hidden;
791
837
  text-overflow: ellipsis;
838
+ color: var(--text-muted);
792
839
  }
793
840
  /* Urgent toggle button */
794
841
  .btn-urgent-toggle {
@@ -914,8 +961,8 @@ details summary {
914
961
  .date-separator {
915
962
  display: flex;
916
963
  align-items: center;
917
- gap: 8px;
918
- margin: 16px 0 8px;
964
+ gap: 10px;
965
+ margin: 20px 0 10px;
919
966
  color: var(--text-muted);
920
967
  font-size: 12px;
921
968
  }
@@ -923,13 +970,14 @@ details summary {
923
970
  .date-separator::after {
924
971
  content: '';
925
972
  flex: 1;
926
- height: 1px;
973
+ height: 0.5px;
927
974
  background: var(--border);
928
975
  }
929
976
  .date-separator-label {
930
977
  white-space: nowrap;
931
978
  padding: 0 6px;
932
979
  font-weight: 500;
980
+ letter-spacing: 0.02em;
933
981
  }
934
982
 
935
983
  /* ── @mention inline highlight ───────────────────────────────────────────── */
@@ -939,13 +987,13 @@ details summary {
939
987
  /* ── @mention picker popup ───────────────────────────────────────────────── */
940
988
  .mention-picker {
941
989
  position: absolute;
942
- bottom: calc(100% + 4px);
990
+ bottom: calc(100% + 8px);
943
991
  left: 0;
944
992
  right: 0;
945
993
  background: var(--bg-sidebar);
946
- border: 1px solid var(--border);
947
- border-radius: 6px;
948
- box-shadow: 0 4px 24px rgba(0,0,0,.4);
994
+ border: none;
995
+ border-radius: var(--radius-lg);
996
+ box-shadow: var(--shadow-lg);
949
997
  z-index: 200;
950
998
  max-height: 240px;
951
999
  overflow-y: auto;
@@ -953,81 +1001,142 @@ details summary {
953
1001
  .mention-option {
954
1002
  display: flex;
955
1003
  align-items: center;
956
- gap: 8px;
1004
+ gap: 10px;
957
1005
  width: 100%;
958
- padding: 7px 12px;
1006
+ padding: 10px 14px;
959
1007
  background: none;
960
1008
  border: none;
1009
+ border-top: 0.5px solid var(--border);
961
1010
  cursor: pointer;
962
1011
  text-align: left;
963
1012
  color: var(--text-primary);
964
- font-size: 14px;
1013
+ font-size: 15px;
1014
+ transition: background var(--transition);
965
1015
  }
1016
+ .mention-option:first-child { border-top: none; }
966
1017
  .mention-option:hover,
967
- .mention-option.selected { background: color-mix(in srgb, var(--accent) 12%, transparent); }
1018
+ .mention-option.selected { background: var(--bg-hover); }
968
1019
  .mention-option-name { font-weight: 600; color: var(--text-primary); }
969
- .mention-option-handle { color: var(--text-muted); font-size: 13px; }
1020
+ .mention-option-handle { color: var(--text-secondary); font-size: 13px; }
970
1021
 
971
- /* ── Auth page ───────────────────────────────────────────────────────────── */
1022
+ /* ── Auth page Apple-style centered card ───────────────────────────────── */
972
1023
  .auth-page { display: flex; align-items: center; justify-content: center; min-height: 100vh; }
973
- .auth-shell { width: 100%; max-width: 420px; padding: 40px 32px; background: var(--bg-sidebar); border-radius: var(--radius-lg); border: 1px solid var(--border); }
974
- .auth-brand h1 { font-weight: 800; color: var(--accent); letter-spacing: -0.5px; }
975
- .auth-brand p { color: var(--text-muted); margin-top: 4px; margin-bottom: 28px; }
976
- .auth-tabs { display: flex; gap: 4px; margin-bottom: 24px; border-bottom: 1px solid var(--border); }
977
- .auth-tabs a { background: none; border: none; padding: 8px 16px; font-size: 14px; font-weight: 600; cursor: pointer; color: var(--text-muted); border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color var(--transition), border-color var(--transition); }
1024
+ .auth-shell { width: 100%; max-width: 420px; padding: 40px 32px; background: var(--bg-sidebar); border-radius: var(--radius-xl); border: none; box-shadow: var(--shadow-lg); }
1025
+ .auth-brand h1 { font-weight: 700; color: var(--accent); letter-spacing: -0.5px; }
1026
+ .auth-brand p { color: var(--text-secondary); margin-top: 4px; margin-bottom: 28px; font-size: 15px; }
1027
+ .auth-tabs { display: flex; gap: 0; margin-bottom: 24px; border-bottom: 1px solid var(--border); }
1028
+ .auth-tabs a { background: none; border: none; padding: 10px 16px; font-size: 15px; font-weight: 500; cursor: pointer; color: var(--text-secondary); border-bottom: 2px solid transparent; margin-bottom: -1px; transition: color var(--transition), border-color var(--transition); }
978
1029
  .auth-tabs a[aria-selected="true"] { color: var(--accent); border-bottom-color: var(--accent); }
979
1030
 
980
1031
  .auth-form { display: flex; flex-direction: column; gap: 16px; }
981
1032
  .field { display: flex; flex-direction: column; gap: 6px; }
982
- .field label { font-weight: 600; color: var(--text-secondary); }
1033
+ .field label { font-size: 13px; font-weight: 500; color: var(--text-secondary); }
983
1034
  .field input {
984
- padding: 10px 14px; border-radius: var(--radius-md); border: 1px solid var(--border); background: var(--bg-input); color: var(--text-primary);
1035
+ padding: 11px 14px;
1036
+ border-radius: var(--radius-md);
1037
+ border: 1px solid var(--border);
1038
+ background: var(--bg-input);
1039
+ color: var(--text-primary);
1040
+ font-size: 16px; /* 16px prevents iOS zoom on focus */
1041
+ transition: border-color var(--transition), box-shadow var(--transition);
1042
+ }
1043
+ .field input:focus {
1044
+ outline: none;
1045
+ border-color: var(--accent);
1046
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent);
985
1047
  }
986
- .field input:focus { outline: none; border-color: var(--accent); }
987
1048
 
988
- /* ── Buttons ─────────────────────────────────────────────────────────────── */
1049
+ /* ── Buttons Apple HIG button styles ───────────────────────────────────── */
989
1050
  .btn-primary {
990
- padding: 10px 20px; border: none; border-radius: var(--radius-md);
991
- background: var(--accent); color: white; font-weight: 700;
992
- cursor: pointer; transition: opacity var(--transition);
1051
+ padding: 10px 20px;
1052
+ border: none;
1053
+ border-radius: var(--radius-pill);
1054
+ background: var(--accent);
1055
+ color: white;
1056
+ font-weight: 600;
1057
+ font-size: 15px;
1058
+ cursor: pointer;
1059
+ transition: opacity var(--transition);
1060
+ min-height: 44px;
993
1061
  }
994
1062
  .btn-primary:hover { opacity: 0.85; }
1063
+ .btn-primary:active { opacity: 0.75; transform: scale(0.98); }
995
1064
  .btn-ghost {
996
1065
  border: none;
997
- padding: 6px 12px;
998
- border-radius: var(--radius-sm);
999
- color: var(--text-muted);
1066
+ padding: 8px 14px;
1067
+ border-radius: var(--radius-md);
1068
+ color: var(--accent);
1000
1069
  cursor: pointer;
1070
+ font-size: 15px;
1071
+ font-weight: 400;
1072
+ background: none;
1073
+ transition: background var(--transition), opacity var(--transition);
1001
1074
  }
1002
- .btn-ghost:hover { background: var(--bg-hover); color: var(--text-primary); }
1075
+ .btn-ghost:hover { background: var(--bg-hover); }
1003
1076
  .btn-icon {
1004
- background: none; border: none; padding: 8px; border-radius: var(--radius-sm); color: var(--text-muted); cursor: pointer;
1077
+ background: none;
1078
+ border: none;
1079
+ padding: 8px;
1080
+ border-radius: var(--radius-md);
1081
+ color: var(--text-secondary);
1082
+ cursor: pointer;
1083
+ min-width: 36px;
1084
+ min-height: 36px;
1085
+ display: inline-flex;
1086
+ align-items: center;
1087
+ justify-content: center;
1088
+ transition: background var(--transition), color var(--transition);
1005
1089
  }
1006
1090
  .btn-icon:hover { background: var(--bg-hover); color: var(--text-primary); }
1091
+ .btn-icon:active { background: var(--fill-secondary); }
1007
1092
  .btn-icon.active { color: var(--accent); }
1008
1093
  .btn-call-join {
1009
- padding: 6px 16px; background: var(--color-success); color: white; border: none; border-radius: var(--radius-sm);
1010
- font-weight: 600; cursor: pointer;
1094
+ padding: 8px 18px;
1095
+ background: var(--color-success);
1096
+ color: white;
1097
+ border: none;
1098
+ border-radius: var(--radius-pill);
1099
+ font-weight: 600;
1100
+ cursor: pointer;
1011
1101
  }
1012
1102
  .btn-call-leave {
1013
- padding: 6px 16px; background: var(--color-danger); color: white; border: none; border-radius: var(--radius-sm);
1014
- font-weight: 600; cursor: pointer;
1103
+ padding: 8px 18px;
1104
+ background: var(--color-danger);
1105
+ color: white;
1106
+ border: none;
1107
+ border-radius: var(--radius-pill);
1108
+ font-weight: 600;
1109
+ cursor: pointer;
1110
+ }
1111
+ .btn-send {
1112
+ padding: 8px 18px;
1113
+ background: var(--accent);
1114
+ color: white;
1115
+ border: none;
1116
+ border-radius: var(--radius-pill);
1117
+ font-size: 15px;
1118
+ font-weight: 600;
1119
+ cursor: pointer;
1120
+ min-height: 36px;
1121
+ transition: opacity var(--transition);
1015
1122
  }
1016
- .btn-send { padding: 10px 18px; background: var(--accent); color: white; border: none; border-radius: var(--radius-md); font-size: 14px; font-weight: 700; cursor: pointer; }
1123
+ .btn-send:hover { opacity: 0.85; }
1124
+ .btn-send:active { opacity: 0.75; }
1017
1125
 
1018
- /* ── Alerts ──────────────────────────────────────────────────────────────── */
1126
+ /* ── Alerts Apple HIG toast notifications ──────────────────────────────── */
1019
1127
  .alert {
1020
- padding: 10px 14px;
1021
- border-radius: var(--radius-md);
1128
+ padding: 10px 16px;
1129
+ border-radius: var(--radius-lg);
1022
1130
  margin: 0 auto;
1023
1131
  position: absolute;
1024
1132
  top: 3.5rem;
1133
+ box-shadow: var(--shadow-md);
1025
1134
  }
1026
1135
 
1027
1136
  .alert-error {
1028
- background: color-mix(in srgb, var(--color-danger) 15%, transparent);
1137
+ background: color-mix(in srgb, var(--color-danger) 12%, var(--bg-sidebar));
1029
1138
  color: var(--color-danger);
1030
- border: 1px solid var(--color-danger);
1139
+ border: none;
1031
1140
  opacity: 1;
1032
1141
  animation: fadeOut 2s forwards;
1033
1142
  }
@@ -1048,7 +1157,12 @@ details summary {
1048
1157
 
1049
1158
  /* ── Theme picker ────────────────────────────────────────────────────────── */
1050
1159
  select#theme-picker {
1051
- padding: 4px 8px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--bg-input); color: var(--text-primary);
1160
+ padding: 5px 10px;
1161
+ border-radius: var(--radius-md);
1162
+ border: 1px solid var(--border);
1163
+ background: var(--bg-input);
1164
+ color: var(--text-primary);
1165
+ font-size: 13px;
1052
1166
  cursor: pointer;
1053
1167
  }
1054
1168
 
@@ -1103,7 +1217,7 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1103
1217
  height: 100dvh;
1104
1218
  width: 100%;
1105
1219
  transform: translateX(0);
1106
- transition: transform var(--transition);
1220
+ transition: transform 300ms cubic-bezier(0.32, 0.72, 0, 1);
1107
1221
  overflow-y: auto;
1108
1222
  }
1109
1223
 
@@ -1115,7 +1229,7 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1115
1229
  height: 100dvh;
1116
1230
  width: 100%;
1117
1231
  transform: translateX(100%);
1118
- transition: transform var(--transition);
1232
+ transition: transform 300ms cubic-bezier(0.32, 0.72, 0, 1);
1119
1233
  overflow: hidden;
1120
1234
  }
1121
1235
 
@@ -1136,21 +1250,22 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1136
1250
  transform: translateX(100%);
1137
1251
  }
1138
1252
 
1139
- /* Show back button */
1253
+ /* Show back button — Apple chevron style */
1140
1254
  .btn-back-mobile {
1141
1255
  display: flex;
1142
1256
  align-items: center;
1143
- justify-content: center;
1257
+ gap: 3px;
1144
1258
  background: none;
1145
1259
  border: none;
1146
1260
  cursor: pointer;
1147
- color: var(--text-muted);
1148
- padding: 6px 10px 6px 4px;
1149
- font-size: 1.2rem;
1150
- border-radius: var(--radius-sm);
1261
+ color: var(--accent);
1262
+ padding: 6px 8px 6px 4px;
1263
+ font-size: 15px;
1264
+ font-weight: 400;
1265
+ border-radius: var(--radius-md);
1151
1266
  flex-shrink: 0;
1152
1267
  }
1153
- .btn-back-mobile:hover { color: var(--text-primary); }
1268
+ .btn-back-mobile:hover { opacity: 0.75; }
1154
1269
 
1155
1270
  /* Hover toolbar: no hover on touch — always visible, tucked inside message */
1156
1271
  .message-hover-actions {
@@ -1358,15 +1473,19 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1358
1473
  .thread-panel-header {
1359
1474
  display: flex;
1360
1475
  align-items: center;
1361
- padding: 14px 20px;
1476
+ padding: 12px 16px;
1362
1477
  border-bottom: 1px solid var(--border);
1363
1478
  background: var(--bg-topbar);
1479
+ backdrop-filter: blur(20px);
1480
+ -webkit-backdrop-filter: blur(20px);
1364
1481
  flex-shrink: 0;
1482
+ gap: 8px;
1365
1483
  }
1366
1484
  .thread-panel-title {
1367
1485
  flex: 1;
1368
- font-size: 14px;
1486
+ font-size: 15px;
1369
1487
  font-weight: 600;
1488
+ letter-spacing: -0.1px;
1370
1489
  }
1371
1490
  .thread-panel-close {
1372
1491
  font-size: 14px;
@@ -1431,27 +1550,33 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1431
1550
  .thread-textarea {
1432
1551
  width: 100%;
1433
1552
  box-sizing: border-box;
1434
- padding: 8px;
1435
- background: var(--bg-input, var(--bg));
1553
+ padding: 9px 12px;
1554
+ background: var(--bg-input);
1436
1555
  border: 1px solid var(--border);
1437
- border-radius: var(--radius-sm, 4px);
1438
- color: var(--color-text);
1556
+ border-radius: var(--radius-pill);
1557
+ color: var(--text-primary);
1439
1558
  font-family: inherit;
1440
- font-size: 13px;
1559
+ font-size: 15px;
1441
1560
  resize: none;
1442
- min-height: 56px;
1561
+ min-height: 38px;
1562
+ transition: border-color var(--transition), box-shadow var(--transition);
1563
+ }
1564
+ .thread-textarea:focus {
1565
+ outline: none;
1566
+ border-color: var(--accent);
1567
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent);
1443
1568
  }
1444
- .thread-textarea:focus { outline: none; border-color: var(--color-accent); }
1445
1569
  .thread-send-btn { align-self: flex-end; }
1446
1570
 
1447
1571
  /* "View N replies" link under messages */
1448
1572
  .thread-replies-link {
1449
1573
  display: inline-block;
1450
1574
  font-size: 12px;
1451
- color: var(--color-link, var(--color-accent));
1575
+ color: var(--accent);
1452
1576
  margin: 2px 0 0;
1453
1577
  cursor: pointer;
1454
1578
  text-decoration: none;
1579
+ grid-column: 1 / -1; /* span full width in message grid */
1455
1580
  }
1456
1581
  .thread-replies-link:hover { text-decoration: underline; }
1457
1582
 
@@ -1484,15 +1609,16 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1484
1609
  display: flex;
1485
1610
  align-items: center;
1486
1611
  gap: 10px;
1487
- padding: 6px 16px;
1488
- background: var(--bg-topbar);
1612
+ padding: 8px 16px;
1613
+ background: color-mix(in srgb, var(--color-success) 8%, var(--bg-topbar));
1489
1614
  border-bottom: 1px solid var(--border);
1490
- font-size: 13px;
1615
+ font-size: 14px;
1491
1616
  }
1492
1617
  .call-status[hidden] { display: none; }
1493
1618
  .call-status-dot {
1494
1619
  width: 8px; height: 8px; border-radius: 50%;
1495
- background: var(--color-success, #3ba55c); flex-shrink: 0;
1620
+ background: var(--color-success); flex-shrink: 0;
1621
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-success) 30%, transparent);
1496
1622
  }
1497
1623
  .call-status-info { flex: 1; color: var(--text-secondary); }
1498
1624
  .call-status-avatars { display: flex; }
@@ -1517,10 +1643,15 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1517
1643
  .call-peer-count { color: var(--text-muted); font-size: 13px; }
1518
1644
  .btn-leave {
1519
1645
  margin-left: auto;
1520
- padding: 4px 12px;
1521
- background: var(--color-danger, #ed4245);
1522
- color: white; border: none; border-radius: var(--radius-sm);
1523
- font-weight: 600; cursor: pointer; font-size: 13px;
1646
+ padding: 6px 14px;
1647
+ background: var(--color-danger, #FF453A);
1648
+ color: white;
1649
+ border: none;
1650
+ border-radius: var(--radius-pill);
1651
+ font-weight: 600;
1652
+ cursor: pointer;
1653
+ font-size: 13px;
1654
+ transition: opacity var(--transition);
1524
1655
  }
1525
1656
  .btn-leave:hover { opacity: 0.85; }
1526
1657
 
@@ -1776,12 +1907,20 @@ body:has(.admin-topbar) main {
1776
1907
  .form-row input[type="text"],
1777
1908
  .form-row input[type="password"],
1778
1909
  .form-row input[type="number"] {
1779
- padding: 7px 10px;
1780
- border-radius: 6px;
1910
+ padding: 9px 12px;
1911
+ border-radius: var(--radius-md);
1781
1912
  border: 1px solid var(--border);
1782
1913
  background: var(--bg-input);
1783
1914
  color: var(--text-primary);
1784
- font-size: 14px;
1915
+ font-size: 15px;
1916
+ transition: border-color var(--transition), box-shadow var(--transition);
1917
+ }
1918
+ .form-row input[type="text"]:focus,
1919
+ .form-row input[type="password"]:focus,
1920
+ .form-row input[type="number"]:focus {
1921
+ outline: none;
1922
+ border-color: var(--accent);
1923
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent);
1785
1924
  }
1786
1925
 
1787
1926
  .checkbox-label {
@@ -1985,23 +2124,25 @@ form.inline { display: inline; }
1985
2124
  .attachment-image {
1986
2125
  max-width: min(400px, 100%);
1987
2126
  max-height: 300px;
1988
- border-radius: var(--radius-md);
2127
+ border-radius: var(--radius-lg);
1989
2128
  object-fit: contain;
1990
2129
  display: block;
1991
2130
  }
1992
2131
  .attachment-file {
1993
2132
  display: inline-flex;
1994
2133
  align-items: center;
1995
- gap: 6px;
2134
+ gap: 8px;
1996
2135
  margin-top: 6px;
1997
- padding: 6px 12px;
1998
- border-radius: var(--radius-md);
2136
+ padding: 8px 14px;
2137
+ border-radius: var(--radius-lg);
1999
2138
  background: var(--bg-input);
2000
- border: 1px solid var(--border);
2139
+ border: none;
2140
+ box-shadow: var(--shadow-sm);
2001
2141
  text-decoration: none;
2002
2142
  color: var(--text-secondary);
2003
- font-size: 13px;
2143
+ font-size: 14px;
2004
2144
  max-width: 340px;
2145
+ transition: background var(--transition);
2005
2146
  }
2006
2147
  .attachment-file:hover { background: var(--bg-hover); color: var(--text-primary); }
2007
2148
  .attachment-file-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@@ -2021,14 +2162,15 @@ form.inline { display: inline; }
2021
2162
  bottom: 60px;
2022
2163
  left: 12px;
2023
2164
  right: 12px;
2024
- padding: 8px 12px;
2025
- background: var(--bg-topbar);
2026
- border: 1px solid var(--border);
2027
- border-radius: var(--radius-md);
2165
+ padding: 10px 14px;
2166
+ background: var(--bg-elevated, var(--bg-topbar));
2167
+ border: none;
2168
+ border-radius: var(--radius-lg);
2028
2169
  font-size: 13px;
2029
2170
  color: var(--text-primary);
2030
2171
  z-index: 200;
2031
- animation: toast-in 0.15s ease;
2172
+ box-shadow: var(--shadow-md);
2173
+ animation: toast-in 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
2032
2174
  }
2033
2175
  @keyframes toast-in {
2034
2176
  from { opacity: 0; transform: translateY(8px); }
@@ -2046,9 +2188,10 @@ form.inline { display: inline; }
2046
2188
  .message-edit-wrap {
2047
2189
  grid-column: 1 / -1;
2048
2190
  border: 1px solid var(--accent);
2049
- border-radius: var(--radius-md);
2191
+ border-radius: var(--radius-lg);
2050
2192
  overflow: hidden;
2051
2193
  background: var(--bg-input, var(--bg-sidebar));
2194
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent);
2052
2195
  }
2053
2196
 
2054
2197
  .message-edit-tabs {
@@ -2119,45 +2262,48 @@ form.inline { display: inline; }
2119
2262
  font-size: 13px;
2120
2263
  }
2121
2264
 
2122
- /* Hover action toolbar — floats above the message on hover (Discord-style) */
2265
+ /* Hover action toolbar — floats above the message on hover */
2123
2266
  article.message { position: relative; }
2124
2267
  .message-hover-actions {
2125
2268
  position: absolute;
2126
- top: -20px;
2269
+ top: -22px;
2127
2270
  right: 4px;
2128
2271
  display: flex;
2129
- gap: 1px;
2272
+ gap: 0;
2130
2273
  align-items: center;
2131
2274
  opacity: 0;
2132
2275
  pointer-events: none;
2133
- transition: opacity 0.1s;
2276
+ transition: opacity 150ms;
2134
2277
  background: var(--bg-sidebar);
2135
- border: 1px solid var(--border);
2136
- border-radius: var(--radius-md);
2137
- padding: 2px;
2138
- box-shadow: 0 2px 8px rgba(0,0,0,0.15);
2278
+ border: none;
2279
+ border-radius: var(--radius-lg);
2280
+ padding: 3px;
2281
+ box-shadow: var(--shadow-md);
2139
2282
  z-index: 10;
2140
2283
  }
2141
2284
  article.message:hover .message-hover-actions { opacity: 1; pointer-events: auto; }
2142
2285
  .quick-picks { display: contents; }
2143
- .quick-picks:not(:empty) + .btn-react { border-left: 1px solid var(--border); margin-left: 1px; padding-left: 6px; }
2286
+ .quick-picks:not(:empty) + .btn-react { border-left: 0.5px solid var(--border); margin-left: 2px; padding-left: 6px; }
2144
2287
  .btn-quick-react,
2145
2288
  .btn-react,
2146
2289
  .btn-msg-actions {
2147
2290
  background: none;
2148
2291
  border: none;
2149
2292
  cursor: pointer;
2150
- padding: 3px 7px;
2151
- border-radius: calc(var(--radius-md) - 2px);
2293
+ padding: 4px 8px;
2294
+ border-radius: var(--radius-md);
2152
2295
  font-size: 15px;
2153
2296
  line-height: 1;
2154
2297
  color: var(--text-secondary);
2155
2298
  transition: background var(--transition), color var(--transition);
2299
+ min-height: 30px;
2300
+ display: inline-flex;
2301
+ align-items: center;
2156
2302
  }
2157
2303
  .btn-quick-react:hover,
2158
2304
  .btn-react:hover,
2159
2305
  .btn-msg-actions:hover {
2160
- background: color-mix(in srgb, var(--accent) 15%, transparent);
2306
+ background: var(--bg-hover);
2161
2307
  color: var(--text-primary);
2162
2308
  }
2163
2309
 
@@ -2187,38 +2333,42 @@ article.message:hover .message-hover-actions { opacity: 1; pointer-events: auto;
2187
2333
  .msg-context-menu-item--danger { color: var(--color-danger, #e74c3c); }
2188
2334
  .msg-context-menu-item--danger:hover { background: color-mix(in srgb, var(--color-danger, #e74c3c) 12%, transparent); }
2189
2335
 
2190
- /* Bottom sheet (mobile long-press) */
2336
+ /* Bottom sheet (mobile long-press) — Apple iOS style */
2191
2337
  .action-sheet {
2192
2338
  position: fixed;
2193
2339
  bottom: 0;
2194
2340
  left: 0;
2195
2341
  right: 0;
2196
2342
  background: var(--bg-sidebar);
2197
- border-top: 1px solid var(--border);
2198
- border-radius: 12px 12px 0 0;
2343
+ border-top: none;
2344
+ border-radius: 20px 20px 0 0;
2199
2345
  z-index: 400;
2200
2346
  transform: translateY(100%);
2201
- transition: transform 220ms ease-out;
2202
- padding-bottom: env(safe-area-inset-bottom, 0);
2347
+ transition: transform 300ms cubic-bezier(0.32, 0.72, 0, 1);
2348
+ padding-bottom: env(safe-area-inset-bottom, 0px);
2349
+ box-shadow: var(--shadow-lg);
2203
2350
  }
2204
2351
  .action-sheet.open { transform: translateY(0); }
2205
2352
  .action-sheet-handle {
2206
- width: 40px;
2353
+ width: 36px;
2207
2354
  height: 4px;
2208
2355
  background: var(--border);
2209
2356
  border-radius: 2px;
2210
2357
  margin: 10px auto 6px;
2211
2358
  }
2212
- .action-sheet-body { padding: 8px 0 16px; }
2359
+ .action-sheet-body { padding: 0 0 4px; }
2213
2360
  .action-sheet-item {
2214
2361
  display: block;
2215
2362
  width: 100%;
2216
- padding: 12px 20px;
2363
+ padding: 16px 20px;
2217
2364
  text-align: left;
2218
2365
  background: none;
2219
2366
  border: none;
2367
+ border-top: 0.5px solid var(--border);
2220
2368
  color: var(--text-primary);
2221
- font-size: 15px;
2369
+ font-size: 17px;
2222
2370
  cursor: pointer;
2371
+ transition: background var(--transition);
2223
2372
  }
2224
- .action-sheet-item:hover { background: color-mix(in srgb, var(--accent) 15%, transparent); }
2373
+ .action-sheet-item:first-of-type { border-top: none; }
2374
+ .action-sheet-item:hover { background: var(--bg-hover); }