@devchitchat/chat 4.4.3 → 4.5.0

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,16 @@ 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;
442
+ position: sticky;
443
+ bottom: 0;
444
+ background: var(--bg-sidebar);
433
445
  }
434
446
 
435
447
  .sidebar-username {
436
- font-size: 12px;
437
- color: var(--text-muted);
448
+ font-size: 13px;
449
+ font-weight: 500;
450
+ color: var(--text-secondary);
438
451
  padding: 0 2px;
439
452
  }
440
453
 
@@ -446,35 +459,35 @@ details summary {
446
459
  .sidebar-footer-controls select {
447
460
  flex: 1;
448
461
  min-width: 0;
449
- font-size: 12px;
450
- padding: 4px 6px;
451
- border-radius: var(--radius-sm);
462
+ font-size: 13px;
463
+ padding: 5px 8px;
464
+ border-radius: var(--radius-md);
452
465
  border: 1px solid var(--border);
453
466
  background: var(--bg-input);
454
467
  color: var(--text-secondary);
455
468
  cursor: pointer;
456
469
  }
457
470
  .btn-sm {
458
- font-size: 12px;
459
- padding: 4px 8px;
471
+ font-size: 13px;
472
+ padding: 5px 10px;
460
473
  white-space: nowrap;
461
474
  }
462
475
 
463
476
  .btn-new-hub {
464
477
  width: 100%;
465
- padding: 7px 10px;
466
- border-radius: 6px;
467
- border: 1px dashed var(--border);
478
+ padding: 8px 10px;
479
+ border-radius: var(--radius-md);
480
+ border: 1px solid var(--border);
468
481
  background: transparent;
469
- color: var(--text-secondary);
470
- font-size: 13px;
482
+ color: var(--accent);
483
+ font-size: 14px;
484
+ font-weight: 500;
471
485
  cursor: pointer;
472
486
  text-align: left;
487
+ transition: background var(--transition);
473
488
  }
474
489
  .btn-new-hub:hover {
475
- background: var(--bg-input);
476
- color: var(--text-primary);
477
- border-color: var(--accent);
490
+ background: var(--bg-hover);
478
491
  }
479
492
 
480
493
  .btn-enable-push {
@@ -540,10 +553,23 @@ details summary {
540
553
 
541
554
  /* ── Chat panel ──────────────────────────────────────────────────────────── */
542
555
  .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; }
556
+ .chat-header {
557
+ padding: 12px 20px;
558
+ padding-top: calc(12px + env(safe-area-inset-top));
559
+ border-bottom: 1px solid var(--border);
560
+ display: flex;
561
+ align-items: center;
562
+ gap: 12px;
563
+ background: var(--bg-topbar);
564
+ backdrop-filter: blur(20px);
565
+ -webkit-backdrop-filter: blur(20px);
566
+ flex-shrink: 0;
567
+ }
544
568
  .chat-title {
545
- font-size: 1rem;
546
- margin-bottom: 7px;
569
+ font-size: 16px;
570
+ font-weight: 600;
571
+ letter-spacing: -0.2px;
572
+ margin-bottom: 0;
547
573
  }
548
574
  .chat-topic {
549
575
  color: var(--text-secondary);
@@ -569,23 +595,41 @@ details summary {
569
595
  padding: 16px 20px;
570
596
  display: flex;
571
597
  flex-direction: column;
572
- gap: 4px;
598
+ gap: 2px;
573
599
  scroll-behavior: smooth;
574
600
  }
575
601
 
576
602
  .message {
577
- padding: 4px 0;
603
+ display: grid;
604
+ grid-template-columns: auto 1fr;
605
+ column-gap: 8px;
606
+ row-gap: 2px;
607
+ padding: 3px 0;
578
608
  }
579
609
  .message pre {
580
610
  padding: 1rem;
581
- font-family: 'Courier New', Courier, monospace;
611
+ font-family: var(--font-mono);
582
612
  font-size: .8rem;
583
613
  background: var(--code-background);
584
614
  }
585
- .message-handle { font-weight: 600; color: var(--accent); grid-column: 1; grid-row: 1; }
615
+ .message-handle {
616
+ font-size: 14px;
617
+ font-weight: 600;
618
+ color: var(--text-primary);
619
+ grid-column: 1;
620
+ grid-row: 1;
621
+ letter-spacing: -0.1px;
622
+ }
586
623
  .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; }
624
+ .message-handle.dm-trigger:hover { color: var(--accent); }
625
+ .message-time {
626
+ font-size: 11px;
627
+ color: var(--text-muted);
628
+ grid-column: 2;
629
+ grid-row: 1;
630
+ align-self: center;
631
+ text-align: right;
632
+ }
589
633
  .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
634
  .message-text p { white-space: pre-wrap; margin: 0 0 4px; }
591
635
  .message-text p:last-child { margin-bottom: 0; }
@@ -611,28 +655,27 @@ details summary {
611
655
  flex-wrap: wrap;
612
656
  gap: 4px;
613
657
  margin-top: 4px;
658
+ grid-column: 1 / -1; /* span full width in message grid */
614
659
  }
615
660
  .reaction-pill {
616
661
  display: inline-flex;
617
662
  align-items: center;
618
- gap: 3px;
619
- background: none;
620
- border: 1px solid var(--border);
621
- border-radius: 12px;
622
- padding: 2px 7px;
663
+ gap: 4px;
664
+ background: var(--fill-quaternary);
665
+ border: none;
666
+ border-radius: var(--radius-pill);
667
+ padding: 3px 9px;
623
668
  font-size: 13px;
624
669
  cursor: pointer;
625
670
  color: var(--text-secondary);
626
- transition: border-color var(--transition), background var(--transition);
671
+ transition: background var(--transition);
627
672
  line-height: 1.4;
628
673
  }
629
674
  .reaction-pill:hover {
630
- border-color: var(--accent);
631
- background: color-mix(in srgb, var(--accent) 8%, transparent);
675
+ background: var(--fill-tertiary);
632
676
  }
633
677
  .reaction-pill.reacted {
634
- border-color: var(--accent);
635
- background: color-mix(in srgb, var(--accent) 15%, transparent);
678
+ background: color-mix(in srgb, var(--accent) 18%, transparent);
636
679
  color: var(--accent);
637
680
  font-weight: 600;
638
681
  }
@@ -641,53 +684,56 @@ details summary {
641
684
  display: inline-flex;
642
685
  align-items: center;
643
686
  justify-content: center;
644
- background: none;
645
- border: 1px dashed var(--border);
646
- border-radius: 12px;
647
- padding: 2px 7px;
687
+ background: var(--fill-quaternary);
688
+ border: none;
689
+ border-radius: var(--radius-pill);
690
+ padding: 3px 9px;
648
691
  font-size: 13px;
649
692
  cursor: pointer;
650
693
  color: var(--text-muted);
651
- transition: border-color var(--transition), color var(--transition);
694
+ transition: background var(--transition), color var(--transition);
652
695
  line-height: 1.4;
653
696
  }
654
- .reaction-add:hover { border-color: var(--accent); color: var(--accent); }
697
+ .reaction-add:hover { background: var(--fill-tertiary); color: var(--accent); }
655
698
 
656
- /* ── Message context menu (right-click) ─────────────────────────────────── */
699
+ /* ── Message context menu (right-click) Apple-style popover ────────────── */
657
700
  .msg-context-menu {
658
701
  position: absolute;
659
702
  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);
703
+ border: none;
704
+ border-radius: var(--radius-lg);
705
+ box-shadow: var(--shadow-md);
663
706
  z-index: 300;
664
- min-width: 140px;
707
+ min-width: 160px;
665
708
  overflow: hidden;
666
709
  }
667
710
  .msg-context-menu-item {
668
711
  display: block;
669
712
  width: 100%;
670
- padding: 0 14px;
671
- height: 32px;
713
+ padding: 0 16px;
714
+ height: 40px;
672
715
  background: none;
673
716
  border: none;
717
+ border-top: 0.5px solid var(--border);
674
718
  cursor: pointer;
675
719
  text-align: left;
676
720
  color: var(--text-primary);
677
- font-size: 14px;
721
+ font-size: 15px;
722
+ transition: background var(--transition);
678
723
  }
679
- .msg-context-menu-item:hover { background: color-mix(in srgb, var(--accent) 12%, transparent); }
724
+ .msg-context-menu-item:first-child { border-top: none; }
725
+ .msg-context-menu-item:hover { background: var(--bg-hover); }
680
726
  .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); }
727
+ .msg-context-menu-item--danger:hover { background: color-mix(in srgb, var(--color-danger) 8%, transparent); }
682
728
 
683
729
  /* ── Emoji picker ────────────────────────────────────────────────────────── */
684
730
  .emoji-picker {
685
731
  max-width: 320px;
686
732
  width: 320px;
687
733
  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);
734
+ border: none;
735
+ border-radius: var(--radius-lg);
736
+ box-shadow: var(--shadow-lg);
691
737
  overflow: hidden;
692
738
  display: flex;
693
739
  flex-direction: column;
@@ -764,31 +810,35 @@ details summary {
764
810
  flex-wrap: wrap;
765
811
  align-items: flex-end;
766
812
  gap: 8px;
767
- padding: 20px 20px;
813
+ padding: 12px 16px;
768
814
  padding-bottom: calc(12px + env(safe-area-inset-bottom));
769
815
  border-top: 1px solid var(--border);
770
- background: var(--bg-base);
816
+ background: var(--bg-topbar);
817
+ backdrop-filter: blur(20px);
818
+ -webkit-backdrop-filter: blur(20px);
771
819
  position: relative;
772
820
  }
773
821
  .composer textarea {
774
822
  flex: 1;
775
- padding: 10px 14px;
776
- border-radius: var(--radius-md);
823
+ padding: 9px 14px;
824
+ border-radius: var(--radius-pill);
777
825
  border: 1px solid var(--border);
778
826
  background: var(--bg-input);
779
827
  color: var(--text-primary);
780
828
  font-family: var(--font-sans);
781
829
  resize: none;
782
830
  line-height: 1.5;
783
- height: calc(1.5em + 20px); /* lock to 1 row; iOS Safari expands textarea when placeholder wraps */
831
+ height: calc(1.5em + 18px); /* lock to 1 row; iOS Safari expands textarea when placeholder wraps */
784
832
  max-height: 160px;
785
833
  overflow-y: auto;
834
+ transition: border-color var(--transition);
786
835
  }
787
- .composer textarea:focus { outline: none; border-color: var(--accent); }
836
+ .composer textarea:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent); }
788
837
  .composer textarea::placeholder {
789
838
  white-space: nowrap;
790
839
  overflow: hidden;
791
840
  text-overflow: ellipsis;
841
+ color: var(--text-muted);
792
842
  }
793
843
  /* Urgent toggle button */
794
844
  .btn-urgent-toggle {
@@ -914,8 +964,8 @@ details summary {
914
964
  .date-separator {
915
965
  display: flex;
916
966
  align-items: center;
917
- gap: 8px;
918
- margin: 16px 0 8px;
967
+ gap: 10px;
968
+ margin: 20px 0 10px;
919
969
  color: var(--text-muted);
920
970
  font-size: 12px;
921
971
  }
@@ -923,13 +973,14 @@ details summary {
923
973
  .date-separator::after {
924
974
  content: '';
925
975
  flex: 1;
926
- height: 1px;
976
+ height: 0.5px;
927
977
  background: var(--border);
928
978
  }
929
979
  .date-separator-label {
930
980
  white-space: nowrap;
931
981
  padding: 0 6px;
932
982
  font-weight: 500;
983
+ letter-spacing: 0.02em;
933
984
  }
934
985
 
935
986
  /* ── @mention inline highlight ───────────────────────────────────────────── */
@@ -939,13 +990,13 @@ details summary {
939
990
  /* ── @mention picker popup ───────────────────────────────────────────────── */
940
991
  .mention-picker {
941
992
  position: absolute;
942
- bottom: calc(100% + 4px);
993
+ bottom: calc(100% + 8px);
943
994
  left: 0;
944
995
  right: 0;
945
996
  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);
997
+ border: none;
998
+ border-radius: var(--radius-lg);
999
+ box-shadow: var(--shadow-lg);
949
1000
  z-index: 200;
950
1001
  max-height: 240px;
951
1002
  overflow-y: auto;
@@ -953,81 +1004,142 @@ details summary {
953
1004
  .mention-option {
954
1005
  display: flex;
955
1006
  align-items: center;
956
- gap: 8px;
1007
+ gap: 10px;
957
1008
  width: 100%;
958
- padding: 7px 12px;
1009
+ padding: 10px 14px;
959
1010
  background: none;
960
1011
  border: none;
1012
+ border-top: 0.5px solid var(--border);
961
1013
  cursor: pointer;
962
1014
  text-align: left;
963
1015
  color: var(--text-primary);
964
- font-size: 14px;
1016
+ font-size: 15px;
1017
+ transition: background var(--transition);
965
1018
  }
1019
+ .mention-option:first-child { border-top: none; }
966
1020
  .mention-option:hover,
967
- .mention-option.selected { background: color-mix(in srgb, var(--accent) 12%, transparent); }
1021
+ .mention-option.selected { background: var(--bg-hover); }
968
1022
  .mention-option-name { font-weight: 600; color: var(--text-primary); }
969
- .mention-option-handle { color: var(--text-muted); font-size: 13px; }
1023
+ .mention-option-handle { color: var(--text-secondary); font-size: 13px; }
970
1024
 
971
- /* ── Auth page ───────────────────────────────────────────────────────────── */
1025
+ /* ── Auth page Apple-style centered card ───────────────────────────────── */
972
1026
  .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); }
1027
+ .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); }
1028
+ .auth-brand h1 { font-weight: 700; color: var(--accent); letter-spacing: -0.5px; }
1029
+ .auth-brand p { color: var(--text-secondary); margin-top: 4px; margin-bottom: 28px; font-size: 15px; }
1030
+ .auth-tabs { display: flex; gap: 0; margin-bottom: 24px; border-bottom: 1px solid var(--border); }
1031
+ .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
1032
  .auth-tabs a[aria-selected="true"] { color: var(--accent); border-bottom-color: var(--accent); }
979
1033
 
980
1034
  .auth-form { display: flex; flex-direction: column; gap: 16px; }
981
1035
  .field { display: flex; flex-direction: column; gap: 6px; }
982
- .field label { font-weight: 600; color: var(--text-secondary); }
1036
+ .field label { font-size: 13px; font-weight: 500; color: var(--text-secondary); }
983
1037
  .field input {
984
- padding: 10px 14px; border-radius: var(--radius-md); border: 1px solid var(--border); background: var(--bg-input); color: var(--text-primary);
1038
+ padding: 11px 14px;
1039
+ border-radius: var(--radius-md);
1040
+ border: 1px solid var(--border);
1041
+ background: var(--bg-input);
1042
+ color: var(--text-primary);
1043
+ font-size: 16px; /* 16px prevents iOS zoom on focus */
1044
+ transition: border-color var(--transition), box-shadow var(--transition);
1045
+ }
1046
+ .field input:focus {
1047
+ outline: none;
1048
+ border-color: var(--accent);
1049
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent);
985
1050
  }
986
- .field input:focus { outline: none; border-color: var(--accent); }
987
1051
 
988
- /* ── Buttons ─────────────────────────────────────────────────────────────── */
1052
+ /* ── Buttons Apple HIG button styles ───────────────────────────────────── */
989
1053
  .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);
1054
+ padding: 10px 20px;
1055
+ border: none;
1056
+ border-radius: var(--radius-pill);
1057
+ background: var(--accent);
1058
+ color: white;
1059
+ font-weight: 600;
1060
+ font-size: 15px;
1061
+ cursor: pointer;
1062
+ transition: opacity var(--transition);
1063
+ min-height: 44px;
993
1064
  }
994
1065
  .btn-primary:hover { opacity: 0.85; }
1066
+ .btn-primary:active { opacity: 0.75; transform: scale(0.98); }
995
1067
  .btn-ghost {
996
1068
  border: none;
997
- padding: 6px 12px;
998
- border-radius: var(--radius-sm);
999
- color: var(--text-muted);
1069
+ padding: 8px 14px;
1070
+ border-radius: var(--radius-md);
1071
+ color: var(--accent);
1000
1072
  cursor: pointer;
1073
+ font-size: 15px;
1074
+ font-weight: 400;
1075
+ background: none;
1076
+ transition: background var(--transition), opacity var(--transition);
1001
1077
  }
1002
- .btn-ghost:hover { background: var(--bg-hover); color: var(--text-primary); }
1078
+ .btn-ghost:hover { background: var(--bg-hover); }
1003
1079
  .btn-icon {
1004
- background: none; border: none; padding: 8px; border-radius: var(--radius-sm); color: var(--text-muted); cursor: pointer;
1080
+ background: none;
1081
+ border: none;
1082
+ padding: 8px;
1083
+ border-radius: var(--radius-md);
1084
+ color: var(--text-secondary);
1085
+ cursor: pointer;
1086
+ min-width: 36px;
1087
+ min-height: 36px;
1088
+ display: inline-flex;
1089
+ align-items: center;
1090
+ justify-content: center;
1091
+ transition: background var(--transition), color var(--transition);
1005
1092
  }
1006
1093
  .btn-icon:hover { background: var(--bg-hover); color: var(--text-primary); }
1094
+ .btn-icon:active { background: var(--fill-secondary); }
1007
1095
  .btn-icon.active { color: var(--accent); }
1008
1096
  .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;
1097
+ padding: 8px 18px;
1098
+ background: var(--color-success);
1099
+ color: white;
1100
+ border: none;
1101
+ border-radius: var(--radius-pill);
1102
+ font-weight: 600;
1103
+ cursor: pointer;
1011
1104
  }
1012
1105
  .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;
1106
+ padding: 8px 18px;
1107
+ background: var(--color-danger);
1108
+ color: white;
1109
+ border: none;
1110
+ border-radius: var(--radius-pill);
1111
+ font-weight: 600;
1112
+ cursor: pointer;
1113
+ }
1114
+ .btn-send {
1115
+ padding: 8px 18px;
1116
+ background: var(--accent);
1117
+ color: white;
1118
+ border: none;
1119
+ border-radius: var(--radius-pill);
1120
+ font-size: 15px;
1121
+ font-weight: 600;
1122
+ cursor: pointer;
1123
+ min-height: 36px;
1124
+ transition: opacity var(--transition);
1015
1125
  }
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; }
1126
+ .btn-send:hover { opacity: 0.85; }
1127
+ .btn-send:active { opacity: 0.75; }
1017
1128
 
1018
- /* ── Alerts ──────────────────────────────────────────────────────────────── */
1129
+ /* ── Alerts Apple HIG toast notifications ──────────────────────────────── */
1019
1130
  .alert {
1020
- padding: 10px 14px;
1021
- border-radius: var(--radius-md);
1131
+ padding: 10px 16px;
1132
+ border-radius: var(--radius-lg);
1022
1133
  margin: 0 auto;
1023
1134
  position: absolute;
1024
1135
  top: 3.5rem;
1136
+ box-shadow: var(--shadow-md);
1025
1137
  }
1026
1138
 
1027
1139
  .alert-error {
1028
- background: color-mix(in srgb, var(--color-danger) 15%, transparent);
1140
+ background: color-mix(in srgb, var(--color-danger) 12%, var(--bg-sidebar));
1029
1141
  color: var(--color-danger);
1030
- border: 1px solid var(--color-danger);
1142
+ border: none;
1031
1143
  opacity: 1;
1032
1144
  animation: fadeOut 2s forwards;
1033
1145
  }
@@ -1048,7 +1160,12 @@ details summary {
1048
1160
 
1049
1161
  /* ── Theme picker ────────────────────────────────────────────────────────── */
1050
1162
  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);
1163
+ padding: 5px 10px;
1164
+ border-radius: var(--radius-md);
1165
+ border: 1px solid var(--border);
1166
+ background: var(--bg-input);
1167
+ color: var(--text-primary);
1168
+ font-size: 13px;
1052
1169
  cursor: pointer;
1053
1170
  }
1054
1171
 
@@ -1103,7 +1220,7 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1103
1220
  height: 100dvh;
1104
1221
  width: 100%;
1105
1222
  transform: translateX(0);
1106
- transition: transform var(--transition);
1223
+ transition: transform 300ms cubic-bezier(0.32, 0.72, 0, 1);
1107
1224
  overflow-y: auto;
1108
1225
  }
1109
1226
 
@@ -1115,7 +1232,7 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1115
1232
  height: 100dvh;
1116
1233
  width: 100%;
1117
1234
  transform: translateX(100%);
1118
- transition: transform var(--transition);
1235
+ transition: transform 300ms cubic-bezier(0.32, 0.72, 0, 1);
1119
1236
  overflow: hidden;
1120
1237
  }
1121
1238
 
@@ -1136,21 +1253,22 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1136
1253
  transform: translateX(100%);
1137
1254
  }
1138
1255
 
1139
- /* Show back button */
1256
+ /* Show back button — Apple chevron style */
1140
1257
  .btn-back-mobile {
1141
1258
  display: flex;
1142
1259
  align-items: center;
1143
- justify-content: center;
1260
+ gap: 3px;
1144
1261
  background: none;
1145
1262
  border: none;
1146
1263
  cursor: pointer;
1147
- color: var(--text-muted);
1148
- padding: 6px 10px 6px 4px;
1149
- font-size: 1.2rem;
1150
- border-radius: var(--radius-sm);
1264
+ color: var(--accent);
1265
+ padding: 6px 8px 6px 4px;
1266
+ font-size: 15px;
1267
+ font-weight: 400;
1268
+ border-radius: var(--radius-md);
1151
1269
  flex-shrink: 0;
1152
1270
  }
1153
- .btn-back-mobile:hover { color: var(--text-primary); }
1271
+ .btn-back-mobile:hover { opacity: 0.75; }
1154
1272
 
1155
1273
  /* Hover toolbar: no hover on touch — always visible, tucked inside message */
1156
1274
  .message-hover-actions {
@@ -1358,15 +1476,19 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1358
1476
  .thread-panel-header {
1359
1477
  display: flex;
1360
1478
  align-items: center;
1361
- padding: 14px 20px;
1479
+ padding: 12px 16px;
1362
1480
  border-bottom: 1px solid var(--border);
1363
1481
  background: var(--bg-topbar);
1482
+ backdrop-filter: blur(20px);
1483
+ -webkit-backdrop-filter: blur(20px);
1364
1484
  flex-shrink: 0;
1485
+ gap: 8px;
1365
1486
  }
1366
1487
  .thread-panel-title {
1367
1488
  flex: 1;
1368
- font-size: 14px;
1489
+ font-size: 15px;
1369
1490
  font-weight: 600;
1491
+ letter-spacing: -0.1px;
1370
1492
  }
1371
1493
  .thread-panel-close {
1372
1494
  font-size: 14px;
@@ -1431,27 +1553,33 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1431
1553
  .thread-textarea {
1432
1554
  width: 100%;
1433
1555
  box-sizing: border-box;
1434
- padding: 8px;
1435
- background: var(--bg-input, var(--bg));
1556
+ padding: 9px 12px;
1557
+ background: var(--bg-input);
1436
1558
  border: 1px solid var(--border);
1437
- border-radius: var(--radius-sm, 4px);
1438
- color: var(--color-text);
1559
+ border-radius: var(--radius-pill);
1560
+ color: var(--text-primary);
1439
1561
  font-family: inherit;
1440
- font-size: 13px;
1562
+ font-size: 15px;
1441
1563
  resize: none;
1442
- min-height: 56px;
1564
+ min-height: 38px;
1565
+ transition: border-color var(--transition), box-shadow var(--transition);
1566
+ }
1567
+ .thread-textarea:focus {
1568
+ outline: none;
1569
+ border-color: var(--accent);
1570
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent);
1443
1571
  }
1444
- .thread-textarea:focus { outline: none; border-color: var(--color-accent); }
1445
1572
  .thread-send-btn { align-self: flex-end; }
1446
1573
 
1447
1574
  /* "View N replies" link under messages */
1448
1575
  .thread-replies-link {
1449
1576
  display: inline-block;
1450
1577
  font-size: 12px;
1451
- color: var(--color-link, var(--color-accent));
1578
+ color: var(--accent);
1452
1579
  margin: 2px 0 0;
1453
1580
  cursor: pointer;
1454
1581
  text-decoration: none;
1582
+ grid-column: 1 / -1; /* span full width in message grid */
1455
1583
  }
1456
1584
  .thread-replies-link:hover { text-decoration: underline; }
1457
1585
 
@@ -1484,15 +1612,16 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1484
1612
  display: flex;
1485
1613
  align-items: center;
1486
1614
  gap: 10px;
1487
- padding: 6px 16px;
1488
- background: var(--bg-topbar);
1615
+ padding: 8px 16px;
1616
+ background: color-mix(in srgb, var(--color-success) 8%, var(--bg-topbar));
1489
1617
  border-bottom: 1px solid var(--border);
1490
- font-size: 13px;
1618
+ font-size: 14px;
1491
1619
  }
1492
1620
  .call-status[hidden] { display: none; }
1493
1621
  .call-status-dot {
1494
1622
  width: 8px; height: 8px; border-radius: 50%;
1495
- background: var(--color-success, #3ba55c); flex-shrink: 0;
1623
+ background: var(--color-success); flex-shrink: 0;
1624
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-success) 30%, transparent);
1496
1625
  }
1497
1626
  .call-status-info { flex: 1; color: var(--text-secondary); }
1498
1627
  .call-status-avatars { display: flex; }
@@ -1517,10 +1646,15 @@ mark { background: color-mix(in srgb, var(--accent) 30%, transparent); color: va
1517
1646
  .call-peer-count { color: var(--text-muted); font-size: 13px; }
1518
1647
  .btn-leave {
1519
1648
  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;
1649
+ padding: 6px 14px;
1650
+ background: var(--color-danger, #FF453A);
1651
+ color: white;
1652
+ border: none;
1653
+ border-radius: var(--radius-pill);
1654
+ font-weight: 600;
1655
+ cursor: pointer;
1656
+ font-size: 13px;
1657
+ transition: opacity var(--transition);
1524
1658
  }
1525
1659
  .btn-leave:hover { opacity: 0.85; }
1526
1660
 
@@ -1776,12 +1910,20 @@ body:has(.admin-topbar) main {
1776
1910
  .form-row input[type="text"],
1777
1911
  .form-row input[type="password"],
1778
1912
  .form-row input[type="number"] {
1779
- padding: 7px 10px;
1780
- border-radius: 6px;
1913
+ padding: 9px 12px;
1914
+ border-radius: var(--radius-md);
1781
1915
  border: 1px solid var(--border);
1782
1916
  background: var(--bg-input);
1783
1917
  color: var(--text-primary);
1784
- font-size: 14px;
1918
+ font-size: 15px;
1919
+ transition: border-color var(--transition), box-shadow var(--transition);
1920
+ }
1921
+ .form-row input[type="text"]:focus,
1922
+ .form-row input[type="password"]:focus,
1923
+ .form-row input[type="number"]:focus {
1924
+ outline: none;
1925
+ border-color: var(--accent);
1926
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent);
1785
1927
  }
1786
1928
 
1787
1929
  .checkbox-label {
@@ -1985,23 +2127,25 @@ form.inline { display: inline; }
1985
2127
  .attachment-image {
1986
2128
  max-width: min(400px, 100%);
1987
2129
  max-height: 300px;
1988
- border-radius: var(--radius-md);
2130
+ border-radius: var(--radius-lg);
1989
2131
  object-fit: contain;
1990
2132
  display: block;
1991
2133
  }
1992
2134
  .attachment-file {
1993
2135
  display: inline-flex;
1994
2136
  align-items: center;
1995
- gap: 6px;
2137
+ gap: 8px;
1996
2138
  margin-top: 6px;
1997
- padding: 6px 12px;
1998
- border-radius: var(--radius-md);
2139
+ padding: 8px 14px;
2140
+ border-radius: var(--radius-lg);
1999
2141
  background: var(--bg-input);
2000
- border: 1px solid var(--border);
2142
+ border: none;
2143
+ box-shadow: var(--shadow-sm);
2001
2144
  text-decoration: none;
2002
2145
  color: var(--text-secondary);
2003
- font-size: 13px;
2146
+ font-size: 14px;
2004
2147
  max-width: 340px;
2148
+ transition: background var(--transition);
2005
2149
  }
2006
2150
  .attachment-file:hover { background: var(--bg-hover); color: var(--text-primary); }
2007
2151
  .attachment-file-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@@ -2021,14 +2165,15 @@ form.inline { display: inline; }
2021
2165
  bottom: 60px;
2022
2166
  left: 12px;
2023
2167
  right: 12px;
2024
- padding: 8px 12px;
2025
- background: var(--bg-topbar);
2026
- border: 1px solid var(--border);
2027
- border-radius: var(--radius-md);
2168
+ padding: 10px 14px;
2169
+ background: var(--bg-elevated, var(--bg-topbar));
2170
+ border: none;
2171
+ border-radius: var(--radius-lg);
2028
2172
  font-size: 13px;
2029
2173
  color: var(--text-primary);
2030
2174
  z-index: 200;
2031
- animation: toast-in 0.15s ease;
2175
+ box-shadow: var(--shadow-md);
2176
+ animation: toast-in 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
2032
2177
  }
2033
2178
  @keyframes toast-in {
2034
2179
  from { opacity: 0; transform: translateY(8px); }
@@ -2046,9 +2191,10 @@ form.inline { display: inline; }
2046
2191
  .message-edit-wrap {
2047
2192
  grid-column: 1 / -1;
2048
2193
  border: 1px solid var(--accent);
2049
- border-radius: var(--radius-md);
2194
+ border-radius: var(--radius-lg);
2050
2195
  overflow: hidden;
2051
2196
  background: var(--bg-input, var(--bg-sidebar));
2197
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent);
2052
2198
  }
2053
2199
 
2054
2200
  .message-edit-tabs {
@@ -2119,45 +2265,48 @@ form.inline { display: inline; }
2119
2265
  font-size: 13px;
2120
2266
  }
2121
2267
 
2122
- /* Hover action toolbar — floats above the message on hover (Discord-style) */
2268
+ /* Hover action toolbar — floats above the message on hover */
2123
2269
  article.message { position: relative; }
2124
2270
  .message-hover-actions {
2125
2271
  position: absolute;
2126
- top: -20px;
2272
+ top: -22px;
2127
2273
  right: 4px;
2128
2274
  display: flex;
2129
- gap: 1px;
2275
+ gap: 0;
2130
2276
  align-items: center;
2131
2277
  opacity: 0;
2132
2278
  pointer-events: none;
2133
- transition: opacity 0.1s;
2279
+ transition: opacity 150ms;
2134
2280
  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);
2281
+ border: none;
2282
+ border-radius: var(--radius-lg);
2283
+ padding: 3px;
2284
+ box-shadow: var(--shadow-md);
2139
2285
  z-index: 10;
2140
2286
  }
2141
2287
  article.message:hover .message-hover-actions { opacity: 1; pointer-events: auto; }
2142
2288
  .quick-picks { display: contents; }
2143
- .quick-picks:not(:empty) + .btn-react { border-left: 1px solid var(--border); margin-left: 1px; padding-left: 6px; }
2289
+ .quick-picks:not(:empty) + .btn-react { border-left: 0.5px solid var(--border); margin-left: 2px; padding-left: 6px; }
2144
2290
  .btn-quick-react,
2145
2291
  .btn-react,
2146
2292
  .btn-msg-actions {
2147
2293
  background: none;
2148
2294
  border: none;
2149
2295
  cursor: pointer;
2150
- padding: 3px 7px;
2151
- border-radius: calc(var(--radius-md) - 2px);
2296
+ padding: 4px 8px;
2297
+ border-radius: var(--radius-md);
2152
2298
  font-size: 15px;
2153
2299
  line-height: 1;
2154
2300
  color: var(--text-secondary);
2155
2301
  transition: background var(--transition), color var(--transition);
2302
+ min-height: 30px;
2303
+ display: inline-flex;
2304
+ align-items: center;
2156
2305
  }
2157
2306
  .btn-quick-react:hover,
2158
2307
  .btn-react:hover,
2159
2308
  .btn-msg-actions:hover {
2160
- background: color-mix(in srgb, var(--accent) 15%, transparent);
2309
+ background: var(--bg-hover);
2161
2310
  color: var(--text-primary);
2162
2311
  }
2163
2312
 
@@ -2187,38 +2336,42 @@ article.message:hover .message-hover-actions { opacity: 1; pointer-events: auto;
2187
2336
  .msg-context-menu-item--danger { color: var(--color-danger, #e74c3c); }
2188
2337
  .msg-context-menu-item--danger:hover { background: color-mix(in srgb, var(--color-danger, #e74c3c) 12%, transparent); }
2189
2338
 
2190
- /* Bottom sheet (mobile long-press) */
2339
+ /* Bottom sheet (mobile long-press) — Apple iOS style */
2191
2340
  .action-sheet {
2192
2341
  position: fixed;
2193
2342
  bottom: 0;
2194
2343
  left: 0;
2195
2344
  right: 0;
2196
2345
  background: var(--bg-sidebar);
2197
- border-top: 1px solid var(--border);
2198
- border-radius: 12px 12px 0 0;
2346
+ border-top: none;
2347
+ border-radius: 20px 20px 0 0;
2199
2348
  z-index: 400;
2200
2349
  transform: translateY(100%);
2201
- transition: transform 220ms ease-out;
2202
- padding-bottom: env(safe-area-inset-bottom, 0);
2350
+ transition: transform 300ms cubic-bezier(0.32, 0.72, 0, 1);
2351
+ padding-bottom: env(safe-area-inset-bottom, 0px);
2352
+ box-shadow: var(--shadow-lg);
2203
2353
  }
2204
2354
  .action-sheet.open { transform: translateY(0); }
2205
2355
  .action-sheet-handle {
2206
- width: 40px;
2356
+ width: 36px;
2207
2357
  height: 4px;
2208
2358
  background: var(--border);
2209
2359
  border-radius: 2px;
2210
2360
  margin: 10px auto 6px;
2211
2361
  }
2212
- .action-sheet-body { padding: 8px 0 16px; }
2362
+ .action-sheet-body { padding: 0 0 4px; }
2213
2363
  .action-sheet-item {
2214
2364
  display: block;
2215
2365
  width: 100%;
2216
- padding: 12px 20px;
2366
+ padding: 16px 20px;
2217
2367
  text-align: left;
2218
2368
  background: none;
2219
2369
  border: none;
2370
+ border-top: 0.5px solid var(--border);
2220
2371
  color: var(--text-primary);
2221
- font-size: 15px;
2372
+ font-size: 17px;
2222
2373
  cursor: pointer;
2374
+ transition: background var(--transition);
2223
2375
  }
2224
- .action-sheet-item:hover { background: color-mix(in srgb, var(--accent) 15%, transparent); }
2376
+ .action-sheet-item:first-of-type { border-top: none; }
2377
+ .action-sheet-item:hover { background: var(--bg-hover); }