@ermis-network/ermis-chat-react 2.0.0 → 2.0.1

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.
Files changed (72) hide show
  1. package/README.md +144 -0
  2. package/dist/index.cjs +5087 -11279
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.css +632 -152
  5. package/dist/index.css.map +1 -1
  6. package/dist/index.d.mts +273 -9
  7. package/dist/index.d.ts +273 -9
  8. package/dist/index.mjs +5085 -11295
  9. package/dist/index.mjs.map +1 -1
  10. package/package.json +2 -2
  11. package/src/components/Channel.tsx +0 -3
  12. package/src/components/ChannelActions.tsx +6 -1
  13. package/src/components/ChannelHeader.tsx +8 -32
  14. package/src/components/ChannelInfo/AddMemberModal.tsx +7 -1
  15. package/src/components/ChannelInfo/ChannelInfo.tsx +82 -2
  16. package/src/components/ChannelInfo/EditChannelModal.tsx +2 -2
  17. package/src/components/ChannelInfo/MediaGridItem.tsx +215 -78
  18. package/src/components/ChannelInfo/useChannelInfoTabs.tsx +170 -129
  19. package/src/components/ChannelList.tsx +72 -13
  20. package/src/components/CreateChannelModal.tsx +131 -12
  21. package/src/components/FilesPreview.tsx +8 -12
  22. package/src/components/FlatTopicGroupItem.tsx +27 -16
  23. package/src/components/ForwardMessageModal.tsx +11 -3
  24. package/src/components/MediaLightbox.tsx +444 -304
  25. package/src/components/MessageActionsBox.tsx +2 -0
  26. package/src/components/MessageInput.tsx +41 -12
  27. package/src/components/MessageItem.tsx +70 -25
  28. package/src/components/MessageQuickReactions.tsx +131 -128
  29. package/src/components/MessageReactions.tsx +47 -2
  30. package/src/components/MessageRenderers.tsx +1030 -433
  31. package/src/components/PinnedMessages.tsx +40 -12
  32. package/src/components/QuotedMessagePreview.tsx +99 -8
  33. package/src/components/RecoveryPin/RecoveryPin.tsx +279 -0
  34. package/src/components/RecoveryPin/index.ts +19 -0
  35. package/src/components/TopicList.tsx +20 -5
  36. package/src/components/TypingIndicator.tsx +3 -3
  37. package/src/components/UserPicker.tsx +26 -25
  38. package/src/components/VirtualMessageList.tsx +345 -125
  39. package/src/context/ChatProvider.tsx +27 -1
  40. package/src/hooks/useChannelListUpdates.ts +22 -1
  41. package/src/hooks/useChannelMessages.ts +338 -51
  42. package/src/hooks/useChannelRowUpdates.ts +18 -6
  43. package/src/hooks/useChatUser.ts +9 -1
  44. package/src/hooks/useE2eeAttachmentRenderer.ts +204 -0
  45. package/src/hooks/useE2eeFileUpload.ts +38 -0
  46. package/src/hooks/useFileUpload.ts +25 -5
  47. package/src/hooks/useForwardMessage.ts +210 -13
  48. package/src/hooks/useLoadMessages.ts +16 -4
  49. package/src/hooks/useMentions.ts +60 -6
  50. package/src/hooks/useMessageActions.ts +14 -8
  51. package/src/hooks/useMessageSend.ts +64 -12
  52. package/src/hooks/usePendingE2eeSends.ts +29 -0
  53. package/src/hooks/useRecoveryPin.ts +287 -0
  54. package/src/hooks/useScrollToMessage.ts +29 -4
  55. package/src/hooks/useTopicGroupUpdates.ts +49 -11
  56. package/src/index.ts +23 -0
  57. package/src/messageTypeUtils.ts +14 -0
  58. package/src/styles/_channel-info.css +9 -0
  59. package/src/styles/_channel-list.css +37 -14
  60. package/src/styles/_media-lightbox.css +36 -3
  61. package/src/styles/_message-bubble.css +381 -41
  62. package/src/styles/_message-input.css +8 -0
  63. package/src/styles/_message-list.css +67 -10
  64. package/src/styles/_message-quick-reactions.css +101 -59
  65. package/src/styles/_message-reactions.css +18 -32
  66. package/src/styles/_recovery-pin.css +97 -0
  67. package/src/styles/_tokens.css +5 -5
  68. package/src/styles/_typing-indicator.css +23 -13
  69. package/src/styles/index.css +1 -0
  70. package/src/types.ts +115 -1
  71. package/src/utils/avatarColors.ts +1 -1
  72. package/src/utils.ts +38 -18
package/dist/index.css CHANGED
@@ -10,8 +10,8 @@
10
10
  --ermis-accent: #6366f1;
11
11
  --ermis-accent-hover: #818cf8;
12
12
  --ermis-text-primary: #e5e7eb;
13
- --ermis-text-secondary: #9ca3af;
14
- --ermis-text-muted: #6b7280;
13
+ --ermis-text-secondary: #abb4c6;
14
+ --ermis-text-muted: #abb4c6;
15
15
  --ermis-color-danger: #ef4444;
16
16
  --ermis-color-danger-hover: #dc2626;
17
17
  --ermis-color-success: #22c55e;
@@ -28,6 +28,8 @@
28
28
  --ermis-quote-own-author: #ffffff;
29
29
  --ermis-quote-own-text: rgba(255, 255, 255, 0.75);
30
30
  --ermis-font-family:
31
+ "SF Pro Display",
32
+ "SF Pro Text",
31
33
  -apple-system,
32
34
  BlinkMacSystemFont,
33
35
  "Segoe UI",
@@ -79,14 +81,14 @@
79
81
  --ermis-accent-hover: #0d00ff;
80
82
  --ermis-text-primary: #111827;
81
83
  --ermis-text-secondary: #6b7280;
82
- --ermis-text-muted: #9ca3af;
84
+ --ermis-text-muted: #545f71;
83
85
  --ermis-color-danger: #ef4444;
84
86
  --ermis-color-danger-hover: #dc2626;
85
87
  --ermis-color-success: #10b981;
86
88
  --ermis-color-success-hover: #059669;
87
89
  --ermis-bubble-own-bg: var(--ermis-accent);
88
90
  --ermis-bubble-own-text: #ffffff;
89
- --ermis-bubble-other-bg: #f3f4f6;
91
+ --ermis-bubble-other-bg: #f0f2f5;
90
92
  --ermis-bubble-other-text: var(--ermis-text-primary);
91
93
  --ermis-quote-other-bg: rgba(99, 102, 241, 0.06);
92
94
  --ermis-quote-other-bg-hover: rgba(99, 102, 241, 0.12);
@@ -354,10 +356,10 @@
354
356
  .ermis-channel-header {
355
357
  display: flex;
356
358
  align-items: center;
357
- gap: var(--ermis-spacing-md);
359
+ gap: var(--ermis-spacing-sm);
358
360
  padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
359
361
  border-bottom: 1px solid var(--ermis-border);
360
- background-color: var(--ermis-bg-secondary);
362
+ background-color: var(--ermis-bg-primary);
361
363
  font-family: var(--ermis-font-family);
362
364
  }
363
365
  .ermis-channel-header__info {
@@ -383,15 +385,15 @@
383
385
  text-overflow: ellipsis;
384
386
  }
385
387
  .ermis-channel-header__topic-avatar {
386
- width: 32px;
387
- height: 32px;
388
- min-width: 32px;
388
+ width: 44px;
389
+ height: 44px;
390
+ min-width: 44px;
389
391
  border-radius: var(--ermis-radius-md);
390
392
  background-color: var(--ermis-bg-primary);
391
393
  display: flex;
392
394
  align-items: center;
393
395
  justify-content: center;
394
- font-size: 16px;
396
+ font-size: 24px;
395
397
  color: var(--ermis-text-secondary);
396
398
  }
397
399
  .ermis-channel-header__subtitle {
@@ -461,7 +463,7 @@
461
463
  display: flex;
462
464
  align-items: center;
463
465
  gap: var(--ermis-spacing-md);
464
- padding: var(--ermis-spacing-md) var(--ermis-spacing-lg);
466
+ padding: calc(var(--ermis-spacing-md) - 0.05rem) var(--ermis-spacing-lg);
465
467
  cursor: pointer;
466
468
  border-left: 2px solid transparent;
467
469
  transition: background-color var(--ermis-transition), border-color var(--ermis-transition);
@@ -500,6 +502,29 @@
500
502
  .ermis-channel-list__online-dot--offline {
501
503
  background-color: var(--ermis-text-muted);
502
504
  }
505
+ .ermis-channel-list__avatar-unread-badge {
506
+ display: none;
507
+ position: absolute;
508
+ top: -2px;
509
+ right: -2px;
510
+ min-width: 16px;
511
+ height: 16px;
512
+ padding: 0 4px;
513
+ border-radius: var(--ermis-radius-full);
514
+ background-color: var(--ermis-color-danger, #ef4444);
515
+ color: #fff;
516
+ font-size: 9px;
517
+ font-weight: 700;
518
+ line-height: 1;
519
+ border: 1.5px solid var(--ermis-bg-primary);
520
+ z-index: 2;
521
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
522
+ }
523
+ .channel-sidebar-collapsed .ermis-channel-list__avatar-unread-badge {
524
+ display: flex;
525
+ align-items: center;
526
+ justify-content: center;
527
+ }
503
528
  .ermis-channel-list__item-top-row {
504
529
  display: flex;
505
530
  align-items: baseline;
@@ -514,7 +539,7 @@
514
539
  margin-top: 2px;
515
540
  }
516
541
  .ermis-channel-list__item-name {
517
- font-size: var(--ermis-font-size-sm);
542
+ font-size: calc(var(--ermis-font-size-sm) + 1px);
518
543
  font-weight: 500;
519
544
  color: var(--ermis-text-primary);
520
545
  white-space: nowrap;
@@ -530,7 +555,7 @@
530
555
  margin-top: 2px;
531
556
  }
532
557
  .ermis-channel-list__item-last-message {
533
- font-size: var(--ermis-font-size-xs);
558
+ font-size: calc(var(--ermis-font-size-sm));
534
559
  color: var(--ermis-text-muted);
535
560
  white-space: nowrap;
536
561
  overflow: hidden;
@@ -576,8 +601,7 @@
576
601
  color: var(--ermis-text-secondary);
577
602
  }
578
603
  .ermis-channel-list__item-last-message-source {
579
- color: var(--ermis-accent);
580
- font-weight: 500;
604
+ color: var(--ermis-text-secondary);
581
605
  }
582
606
  .ermis-channel-list__item-actions-wrapper,
583
607
  .ermis-channel-list__topic-actions-wrapper {
@@ -616,12 +640,11 @@
616
640
  color: var(--ermis-accent);
617
641
  }
618
642
  .ermis-channel-list__item--unread .ermis-channel-list__item-name {
619
- font-weight: 700;
643
+ font-weight: 600;
620
644
  color: var(--ermis-text-primary);
621
645
  }
622
646
  .ermis-channel-list__item--unread .ermis-channel-list__item-last-message {
623
647
  color: var(--ermis-text-secondary);
624
- font-weight: 600;
625
648
  }
626
649
  .ermis-channel-list__unread-badge {
627
650
  display: inline-flex;
@@ -820,17 +843,24 @@
820
843
  display: flex;
821
844
  flex-direction: column;
822
845
  flex: 1;
846
+ min-height: 0;
847
+ overflow: hidden;
823
848
  font-family: var(--ermis-font-family);
824
- gap: var(--ermis-spacing-xs);
825
849
  position: relative;
826
850
  }
827
851
  .ermis-message-list__vlist {
828
852
  display: flex !important;
829
853
  flex-direction: column !important;
854
+ flex: 1;
855
+ min-height: 0;
856
+ overflow-anchor: none;
830
857
  padding-left: 1rem;
831
858
  padding-right: 1rem;
832
- padding-top: var(--ermis-spacing-lg);
833
- padding-bottom: var(--ermis-spacing-lg);
859
+ padding-top: 1rem;
860
+ padding-bottom: 0.5rem;
861
+ }
862
+ .ermis-message-list__vlist * {
863
+ overflow-anchor: none;
834
864
  }
835
865
  .ermis-message-list__vlist > div {
836
866
  margin-top: auto;
@@ -885,12 +915,27 @@
885
915
  .ermis-message-list__date-separator-label {
886
916
  font-size: 11px;
887
917
  color: #fff;
888
- background-color: rgba(0, 0, 0, 0.2);
918
+ background-color: rgba(0, 0, 0, 0.3);
889
919
  padding: 4px 12px;
890
920
  border-radius: 12px;
891
921
  white-space: nowrap;
892
922
  font-weight: 500;
893
923
  }
924
+ .ermis-message-list__time-separator {
925
+ display: flex;
926
+ align-items: center;
927
+ justify-content: center;
928
+ padding: var(--ermis-spacing-xs) 0;
929
+ margin: var(--ermis-spacing-xs) 0;
930
+ align-self: stretch;
931
+ }
932
+ .ermis-message-list__time-separator-label {
933
+ font-size: 10px;
934
+ color: var(--ermis-text-muted);
935
+ padding: 2px 10px;
936
+ white-space: nowrap;
937
+ font-weight: 400;
938
+ }
894
939
  .ermis-message-list__empty {
895
940
  display: flex;
896
941
  flex-direction: column;
@@ -917,15 +962,41 @@
917
962
  font-size: var(--ermis-font-size-sm);
918
963
  color: var(--ermis-text-muted);
919
964
  }
965
+ .ermis-message-group {
966
+ display: flex;
967
+ align-items: flex-end;
968
+ gap: var(--ermis-spacing-sm);
969
+ width: 100%;
970
+ padding-top: 4px;
971
+ }
972
+ .ermis-message-group--own {
973
+ flex-direction: row-reverse;
974
+ }
975
+ .ermis-message-group--other {
976
+ flex-direction: row;
977
+ }
978
+ .ermis-message-group__avatar-col {
979
+ flex-shrink: 0;
980
+ position: sticky;
981
+ bottom: 0;
982
+ align-self: flex-end;
983
+ z-index: 5;
984
+ }
985
+ .ermis-message-group__messages-col {
986
+ display: flex;
987
+ flex-direction: column;
988
+ min-width: 0;
989
+ max-width: 75%;
990
+ }
920
991
  .ermis-message-list__item {
921
992
  display: flex;
922
- align-items: flex-start;
993
+ align-items: flex-end;
923
994
  gap: var(--ermis-spacing-sm);
924
995
  width: 100%;
925
996
  }
926
997
  .ermis-message-list__item--group-single,
927
998
  .ermis-message-list__item--group-top {
928
- padding-top: var(--ermis-spacing-sm);
999
+ padding-top: 0;
929
1000
  }
930
1001
  .ermis-message-list__item--group-middle,
931
1002
  .ermis-message-list__item--group-bottom {
@@ -1218,16 +1289,25 @@
1218
1289
  cursor: pointer;
1219
1290
  max-width: 100%;
1220
1291
  transition: background-color 0.15s;
1221
- margin-top: var(--ermis-spacing-sm);
1222
1292
  }
1223
1293
  .ermis-quoted-message:hover {
1224
1294
  background-color: var(--ermis-quote-other-bg-hover);
1225
1295
  }
1296
+ .ermis-quoted-message--unavailable {
1297
+ border-left-color: var(--ermis-text-muted);
1298
+ background-color: var(--ermis-bg-hover);
1299
+ }
1300
+ .ermis-quoted-message--unavailable:hover {
1301
+ background-color: var(--ermis-bg-hover);
1302
+ }
1226
1303
  .ermis-quoted-message__author {
1227
1304
  font-size: var(--ermis-font-size-xs);
1228
1305
  font-weight: 600;
1229
1306
  color: var(--ermis-accent);
1230
1307
  }
1308
+ .ermis-quoted-message--unavailable .ermis-quoted-message__author {
1309
+ color: var(--ermis-text-muted);
1310
+ }
1231
1311
  .ermis-quoted-message__text {
1232
1312
  font-size: var(--ermis-font-size-xs);
1233
1313
  color: var(--ermis-text-muted);
@@ -1235,14 +1315,20 @@
1235
1315
  text-overflow: ellipsis;
1236
1316
  white-space: nowrap;
1237
1317
  }
1318
+ .ermis-quoted-message--unavailable .ermis-quoted-message__text {
1319
+ font-style: italic;
1320
+ }
1238
1321
  .ermis-message-list__item-avatar {
1239
1322
  flex-shrink: 0;
1323
+ position: sticky;
1324
+ bottom: 0;
1325
+ align-self: flex-end;
1240
1326
  }
1241
1327
  .ermis-message-list__item-content {
1242
1328
  display: flex;
1243
1329
  flex-direction: column;
1244
1330
  min-width: 0;
1245
- max-width: 75%;
1331
+ max-width: 100%;
1246
1332
  gap: 2px;
1247
1333
  }
1248
1334
  .ermis-message-list__item--own .ermis-message-list__item-content {
@@ -1250,17 +1336,16 @@
1250
1336
  }
1251
1337
  .ermis-message-list__bubble-wrapper {
1252
1338
  display: flex;
1253
- flex-wrap: wrap;
1254
- flex-direction: row;
1255
- align-items: center;
1339
+ flex-direction: column;
1340
+ align-items: flex-start;
1256
1341
  position: relative;
1257
1342
  width: 100%;
1258
1343
  }
1259
1344
  .ermis-message-list__item--own .ermis-message-list__bubble-wrapper {
1260
- flex-direction: row-reverse;
1345
+ align-items: flex-end;
1261
1346
  }
1262
1347
  .ermis-message-list__item-user {
1263
- font-size: var(--ermis-font-size-xs);
1348
+ font-size: var(--ermis-font-size-sm);
1264
1349
  font-weight: 600;
1265
1350
  color: var(--ermis-accent);
1266
1351
  margin-bottom: 1px;
@@ -1273,18 +1358,24 @@
1273
1358
  opacity: 0.7;
1274
1359
  }
1275
1360
  .ermis-message-list__item-time {
1276
- font-size: 0.625rem;
1361
+ font-size: 0.6875rem;
1277
1362
  color: var(--ermis-text-muted);
1278
- margin-left: 0;
1279
- padding-top: 4px;
1280
1363
  white-space: nowrap;
1281
1364
  line-height: 1;
1282
- align-self: flex-start;
1283
- text-align: left;
1284
1365
  display: inline-flex;
1285
1366
  align-items: center;
1286
- justify-content: flex-start;
1287
- gap: 3px;
1367
+ gap: 2px;
1368
+ float: right;
1369
+ margin-left: 6px;
1370
+ margin-top: 4px;
1371
+ position: relative;
1372
+ }
1373
+ .ermis-message-list__item-time ~ .ermis-message-list__item-text::after,
1374
+ .ermis-message-list__item-time ~ * .ermis-message-list__item-text::after {
1375
+ content: "";
1376
+ display: inline-block;
1377
+ width: 15px;
1378
+ height: 0;
1288
1379
  }
1289
1380
  .ermis-message-list__edited-indicator {
1290
1381
  margin-right: 2px;
@@ -1314,10 +1405,47 @@
1314
1405
  .ermis-message-status-icon--failed {
1315
1406
  color: var(--ermis-color-danger);
1316
1407
  }
1408
+ .ermis-attachment-upload-overlay {
1409
+ position: absolute;
1410
+ inset: 0;
1411
+ z-index: 3;
1412
+ display: inline-flex;
1413
+ flex-direction: column;
1414
+ align-items: center;
1415
+ justify-content: center;
1416
+ gap: 6px;
1417
+ color: #fff;
1418
+ font-size: 12px;
1419
+ font-weight: 700;
1420
+ line-height: 1;
1421
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.36);
1422
+ background: rgba(17, 24, 39, 0.34);
1423
+ pointer-events: none;
1424
+ }
1425
+ .ermis-voice-upload-wrap {
1426
+ position: relative;
1427
+ }
1428
+ .ermis-voice-upload-progress {
1429
+ position: absolute;
1430
+ top: -6px;
1431
+ right: -6px;
1432
+ min-width: 30px;
1433
+ padding: 3px 6px;
1434
+ border-radius: 999px;
1435
+ background: rgba(17, 24, 39, 0.72);
1436
+ color: #fff;
1437
+ font-size: 11px;
1438
+ font-weight: 700;
1439
+ line-height: 1;
1440
+ }
1317
1441
  .ermis-message-bubble--own .ermis-message-list__item-time {
1318
1442
  color: var(--ermis-bubble-own-text);
1319
1443
  opacity: 0.6;
1320
1444
  }
1445
+ .ermis-message-bubble--own .ermis-message-list__item-time ~ .ermis-message-list__item-text::after,
1446
+ .ermis-message-bubble--own .ermis-message-list__item-time ~ * .ermis-message-list__item-text::after {
1447
+ width: 30px;
1448
+ }
1321
1449
  .ermis-message-list__item-text {
1322
1450
  font-size: var(--ermis-font-size-sm);
1323
1451
  line-height: 1.5;
@@ -1364,35 +1492,39 @@
1364
1492
  }
1365
1493
  .ermis-message-bubble {
1366
1494
  position: relative;
1367
- display: flex;
1368
- flex-direction: column;
1369
- align-items: flex-start;
1370
- padding: var(--ermis-spacing-sm) var(--ermis-spacing-md);
1495
+ display: flow-root;
1496
+ padding: 8px 10px;
1371
1497
  border-radius: var(--ermis-radius-lg);
1372
1498
  word-break: break-word;
1373
- border: 1px solid var(--ermis-border);
1499
+ overflow: visible;
1374
1500
  }
1375
1501
  .ermis-message-bubble--own {
1376
1502
  background-color: var(--ermis-bubble-own-bg);
1377
1503
  color: var(--ermis-bubble-own-text);
1378
1504
  border-color: var(--ermis-bubble-own-bg);
1379
1505
  }
1506
+ .ermis-message-bubble--own ::selection {
1507
+ background-color: rgba(255, 255, 255, 0.9);
1508
+ color: #111827;
1509
+ }
1510
+ .ermis-message-bubble--own::selection {
1511
+ background-color: rgba(255, 255, 255, 0.9);
1512
+ color: #111827;
1513
+ }
1380
1514
  .ermis-message-bubble--own .ermis-attachment__file-size,
1381
1515
  .ermis-message-bubble--own .ermis-attachment__link-url,
1382
1516
  .ermis-message-bubble--own .ermis-attachment__link-description,
1383
1517
  .ermis-message-bubble--own .ermis-attachment__voice-duration,
1384
- .ermis-message-bubble--own .ermis-message-list__forwarded-indicator,
1385
- .ermis-message-bubble--own .ermis-attachment--file {
1518
+ .ermis-message-bubble--own .ermis-message-list__forwarded-indicator {
1386
1519
  color: var(--ermis-bubble-own-text);
1387
1520
  opacity: 0.8;
1388
1521
  }
1389
1522
  .ermis-message-bubble--own .ermis-attachment--link-preview {
1390
- border-color: var(--ermis-bubble-own-text);
1391
- opacity: 0.3;
1523
+ border-color: color-mix(in srgb, var(--ermis-bubble-own-text) 30%, transparent);
1392
1524
  }
1393
1525
  .ermis-message-bubble--own .ermis-attachment--file {
1394
- background-color: var(--ermis-bubble-own-text);
1395
- opacity: 0.1;
1526
+ background-color: color-mix(in srgb, var(--ermis-bubble-own-text) 10%, transparent);
1527
+ color: var(--ermis-bubble-own-text);
1396
1528
  }
1397
1529
  .ermis-message-bubble--other {
1398
1530
  background-color: var(--ermis-bubble-other-bg);
@@ -1417,6 +1549,47 @@
1417
1549
  }
1418
1550
  .ermis-message-list__item--other.ermis-message-list__item--group-bottom .ermis-message-bubble {
1419
1551
  border-top-left-radius: 4px;
1552
+ border-bottom-left-radius: 0;
1553
+ }
1554
+ .ermis-message-list__item--other.ermis-message-list__item--group-bottom .ermis-message-bubble::after,
1555
+ .ermis-message-list__item--other.ermis-message-list__item--group-single .ermis-message-bubble::after {
1556
+ content: "";
1557
+ position: absolute;
1558
+ bottom: 0px;
1559
+ left: -9px;
1560
+ width: 9px;
1561
+ height: 17px;
1562
+ background-color: var(--ermis-bubble-other-bg);
1563
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='9' height='17' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z'/%3E%3C/svg%3E");
1564
+ mask-image: url("data:image/svg+xml,%3Csvg width='9' height='17' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z'/%3E%3C/svg%3E");
1565
+ -webkit-mask-size: 9px 17px;
1566
+ mask-size: 9px 17px;
1567
+ -webkit-mask-repeat: no-repeat;
1568
+ mask-repeat: no-repeat;
1569
+ }
1570
+ .ermis-message-list__item--own.ermis-message-list__item--group-bottom .ermis-message-bubble::after,
1571
+ .ermis-message-list__item--own.ermis-message-list__item--group-single .ermis-message-bubble::after {
1572
+ content: "";
1573
+ position: absolute;
1574
+ bottom: 0px;
1575
+ right: -9px;
1576
+ width: 9px;
1577
+ height: 17px;
1578
+ background-color: var(--ermis-bubble-own-bg);
1579
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='9' height='17' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 17H0V0c.193 2.84.876 5.767 2.05 8.782.904 2.325 2.446 4.485 4.625 6.48A1 1 0 016 17z'/%3E%3C/svg%3E");
1580
+ mask-image: url("data:image/svg+xml,%3Csvg width='9' height='17' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 17H0V0c.193 2.84.876 5.767 2.05 8.782.904 2.325 2.446 4.485 4.625 6.48A1 1 0 016 17z'/%3E%3C/svg%3E");
1581
+ -webkit-mask-size: 9px 17px;
1582
+ mask-size: 9px 17px;
1583
+ -webkit-mask-repeat: no-repeat;
1584
+ mask-repeat: no-repeat;
1585
+ }
1586
+ .ermis-message-list__item--other.ermis-message-list__item--group-bottom .ermis-message-bubble,
1587
+ .ermis-message-list__item--other.ermis-message-list__item--group-single .ermis-message-bubble {
1588
+ border-bottom-left-radius: 0;
1589
+ }
1590
+ .ermis-message-list__item--own.ermis-message-list__item--group-bottom .ermis-message-bubble,
1591
+ .ermis-message-list__item--own.ermis-message-list__item--group-single .ermis-message-bubble {
1592
+ border-bottom-right-radius: 0;
1420
1593
  }
1421
1594
  .ermis-message-list__system {
1422
1595
  display: flex;
@@ -1496,16 +1669,31 @@
1496
1669
  padding: 0 !important;
1497
1670
  border: none !important;
1498
1671
  }
1672
+ .ermis-message-list__item--signal .ermis-message-bubble::after {
1673
+ display: none;
1674
+ }
1499
1675
  .ermis-message-list__item-content--has-attachments {
1500
1676
  width: 350px;
1501
1677
  }
1502
1678
  .ermis-message-list__item-content--has-attachments .ermis-message-bubble {
1503
1679
  width: 100%;
1504
1680
  }
1681
+ .ermis-message-list__item-content--has-attachments:has(.ermis-message-content--with-e2ee-attachments) {
1682
+ width: fit-content;
1683
+ max-width: min(86vw, 350px);
1684
+ }
1685
+ .ermis-message-list__item-content--has-attachments:has(.ermis-message-content--with-e2ee-attachments) .ermis-message-bubble {
1686
+ width: auto;
1687
+ max-width: 100%;
1688
+ }
1505
1689
  .ermis-message-content--with-attachments {
1506
1690
  display: flex;
1507
1691
  flex-direction: column;
1508
1692
  width: 100%;
1693
+ max-width: 100%;
1694
+ }
1695
+ .ermis-message-content--with-e2ee-attachments {
1696
+ width: fit-content;
1509
1697
  }
1510
1698
  .ermis-message-content--with-attachments .ermis-message-list__item-text {
1511
1699
  word-wrap: break-word;
@@ -1517,6 +1705,10 @@
1517
1705
  gap: var(--ermis-spacing-xs);
1518
1706
  margin-top: var(--ermis-spacing-xs);
1519
1707
  width: 100%;
1708
+ max-width: 100%;
1709
+ }
1710
+ .ermis-message-content--with-e2ee-attachments .ermis-attachment-list {
1711
+ width: fit-content;
1520
1712
  }
1521
1713
  .ermis-attachment-grid {
1522
1714
  display: grid;
@@ -1724,13 +1916,100 @@
1724
1916
  background-color: var(--ermis-bg-active);
1725
1917
  color: var(--ermis-accent);
1726
1918
  }
1919
+ .ermis-attachment--e2ee {
1920
+ width: min(320px, calc(100vw - 96px));
1921
+ min-width: 220px;
1922
+ max-width: 320px;
1923
+ border: 1px solid color-mix(in srgb, var(--ermis-accent) 20%, transparent);
1924
+ }
1925
+ .ermis-e2ee-attachment__open {
1926
+ padding: 0;
1927
+ border: 0;
1928
+ background: transparent;
1929
+ color: inherit;
1930
+ text-align: left;
1931
+ cursor: pointer;
1932
+ }
1933
+ .ermis-e2ee-attachment__open:disabled,
1934
+ .ermis-attachment__file-download:disabled {
1935
+ cursor: wait;
1936
+ opacity: 0.6;
1937
+ }
1938
+ .ermis-e2ee-attachment-media {
1939
+ display: flex;
1940
+ flex-direction: column;
1941
+ gap: var(--ermis-spacing-xs);
1942
+ width: fit-content;
1943
+ max-width: min(100%, 340px);
1944
+ }
1945
+ .ermis-e2ee-attachment-media .ermis-attachment-aspect-box {
1946
+ max-width: 100%;
1947
+ }
1948
+ .ermis-e2ee-attachment-placeholder {
1949
+ padding: 0;
1950
+ border: 0;
1951
+ color: var(--ermis-text-primary);
1952
+ cursor: pointer;
1953
+ }
1954
+ .ermis-e2ee-attachment-placeholder:disabled {
1955
+ cursor: wait;
1956
+ }
1957
+ .ermis-e2ee-attachment-placeholder__center {
1958
+ position: absolute;
1959
+ inset: 0;
1960
+ z-index: 3;
1961
+ display: flex;
1962
+ flex-direction: column;
1963
+ align-items: center;
1964
+ justify-content: center;
1965
+ gap: 6px;
1966
+ padding: var(--ermis-spacing-md);
1967
+ text-align: center;
1968
+ }
1969
+ .ermis-e2ee-attachment-placeholder__icon {
1970
+ display: flex;
1971
+ align-items: center;
1972
+ justify-content: center;
1973
+ width: 44px;
1974
+ height: 44px;
1975
+ border-radius: var(--ermis-radius-full);
1976
+ background: color-mix(in srgb, var(--ermis-accent) 14%, var(--ermis-bg-secondary));
1977
+ color: var(--ermis-accent);
1978
+ }
1979
+ .ermis-e2ee-attachment-placeholder__title {
1980
+ max-width: 100%;
1981
+ overflow: hidden;
1982
+ color: var(--ermis-text-primary);
1983
+ font-size: var(--ermis-font-size-sm);
1984
+ font-weight: 600;
1985
+ text-overflow: ellipsis;
1986
+ white-space: nowrap;
1987
+ }
1988
+ .ermis-e2ee-attachment-placeholder__meta,
1989
+ .ermis-e2ee-attachment-actions__label {
1990
+ color: var(--ermis-text-muted);
1991
+ font-size: var(--ermis-font-size-xs);
1992
+ }
1993
+ .ermis-e2ee-attachment-actions {
1994
+ display: flex;
1995
+ align-items: center;
1996
+ justify-content: space-between;
1997
+ gap: var(--ermis-spacing-xs);
1998
+ width: 100%;
1999
+ min-width: 0;
2000
+ }
2001
+ .ermis-e2ee-attachment-actions__label {
2002
+ min-width: 0;
2003
+ overflow: hidden;
2004
+ text-overflow: ellipsis;
2005
+ white-space: nowrap;
2006
+ }
1727
2007
  .ermis-message-bubble--own .ermis-attachment__file-name {
1728
2008
  color: var(--ermis-bubble-own-text);
1729
2009
  }
1730
2010
  .ermis-message-bubble--own .ermis-attachment__file-icon {
1731
- background: var(--ermis-bubble-own-text);
1732
- opacity: 0.2;
1733
- color: inherit;
2011
+ background: color-mix(in srgb, var(--ermis-bubble-own-text) 20%, transparent);
2012
+ color: var(--ermis-bubble-own-text);
1734
2013
  }
1735
2014
  .ermis-message-bubble--own .ermis-attachment__file-ext {
1736
2015
  color: var(--ermis-bubble-own-text);
@@ -1741,10 +2020,25 @@
1741
2020
  opacity: 0.8;
1742
2021
  }
1743
2022
  .ermis-message-bubble--own .ermis-attachment__file-download:hover {
1744
- background-color: var(--ermis-bubble-own-text);
1745
- opacity: 0.15;
2023
+ background-color: color-mix(in srgb, var(--ermis-bubble-own-text) 15%, transparent);
1746
2024
  color: inherit;
1747
2025
  }
2026
+ .ermis-message-bubble--own .ermis-attachment--e2ee {
2027
+ border-color: color-mix(in srgb, var(--ermis-bubble-own-text) 25%, transparent);
2028
+ }
2029
+ .ermis-message-bubble--own .ermis-e2ee-attachment-placeholder,
2030
+ .ermis-message-bubble--own .ermis-e2ee-attachment-placeholder__title {
2031
+ color: var(--ermis-bubble-own-text);
2032
+ }
2033
+ .ermis-message-bubble--own .ermis-e2ee-attachment-placeholder__meta,
2034
+ .ermis-message-bubble--own .ermis-e2ee-attachment-actions__label {
2035
+ color: var(--ermis-bubble-own-text);
2036
+ opacity: 0.8;
2037
+ }
2038
+ .ermis-message-bubble--own .ermis-e2ee-attachment-placeholder__icon {
2039
+ background: color-mix(in srgb, var(--ermis-bubble-own-text) 20%, transparent);
2040
+ color: var(--ermis-bubble-own-text);
2041
+ }
1748
2042
  .ermis-custom-audio-player {
1749
2043
  display: flex;
1750
2044
  align-items: center;
@@ -1752,6 +2046,25 @@
1752
2046
  min-width: 240px;
1753
2047
  width: 100%;
1754
2048
  }
2049
+ .ermis-e2ee-voice-attachment {
2050
+ width: min(320px, calc(100vw - 96px));
2051
+ max-width: 100%;
2052
+ }
2053
+ .ermis-e2ee-voice-attachment .ermis-custom-audio-player {
2054
+ width: min(320px, calc(100vw - 96px));
2055
+ min-width: 260px;
2056
+ max-width: 100%;
2057
+ }
2058
+ .ermis-custom-audio-player--placeholder {
2059
+ padding: 0;
2060
+ border: 0;
2061
+ background: transparent;
2062
+ color: inherit;
2063
+ cursor: pointer;
2064
+ }
2065
+ .ermis-custom-audio-player--placeholder:disabled {
2066
+ cursor: wait;
2067
+ }
1755
2068
  .ermis-custom-audio-play-btn {
1756
2069
  display: flex;
1757
2070
  align-items: center;
@@ -1828,11 +2141,36 @@
1828
2141
  flex-shrink: 0;
1829
2142
  min-width: 32px;
1830
2143
  text-align: right;
1831
- opacity: 0.7;
1832
2144
  }
1833
2145
  .ermis-message-bubble--own .ermis-custom-audio-duration {
1834
2146
  color: var(--ermis-bubble-own-text);
1835
2147
  }
2148
+ .ermis-custom-audio-download-btn {
2149
+ display: flex;
2150
+ align-items: center;
2151
+ justify-content: center;
2152
+ width: 32px;
2153
+ height: 32px;
2154
+ border-radius: 50%;
2155
+ background: transparent;
2156
+ color: var(--ermis-colors-text-muted, #72767d);
2157
+ border: none;
2158
+ cursor: pointer;
2159
+ transition: background-color 0.2s, color 0.2s;
2160
+ flex-shrink: 0;
2161
+ margin-left: 8px;
2162
+ }
2163
+ .ermis-custom-audio-download-btn:hover {
2164
+ background-color: var(--ermis-colors-bg-hover, rgba(0, 0, 0, 0.05));
2165
+ color: var(--ermis-colors-text-normal, #36393f);
2166
+ }
2167
+ .ermis-message-bubble--own .ermis-custom-audio-download-btn {
2168
+ color: rgba(255, 255, 255, 0.8);
2169
+ }
2170
+ .ermis-message-bubble--own .ermis-custom-audio-download-btn:hover {
2171
+ background-color: rgba(255, 255, 255, 0.15);
2172
+ color: #fff;
2173
+ }
1836
2174
  .ermis-custom-audio-hidden {
1837
2175
  display: none;
1838
2176
  }
@@ -1939,6 +2277,9 @@
1939
2277
  border-radius: 0;
1940
2278
  display: inline-block;
1941
2279
  }
2280
+ .ermis-message-list__item--sticker .ermis-message-bubble::after {
2281
+ display: none;
2282
+ }
1942
2283
  .ermis-message-list__item--sticker .ermis-message-list__item-time {
1943
2284
  position: absolute;
1944
2285
  bottom: 8px;
@@ -1974,7 +2315,7 @@
1974
2315
  }
1975
2316
  .ermis-read-receipts--other {
1976
2317
  justify-content: flex-start;
1977
- padding-left: 36px;
2318
+ padding-left: 2.75rem;
1978
2319
  }
1979
2320
  @keyframes ermis-receipt-pop {
1980
2321
  0% {
@@ -2388,6 +2729,13 @@
2388
2729
  align-items: center;
2389
2730
  justify-content: center;
2390
2731
  }
2732
+ .ermis-files-preview__progress {
2733
+ color: #fff;
2734
+ font-size: 11px;
2735
+ font-weight: 600;
2736
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8);
2737
+ z-index: 2;
2738
+ }
2391
2739
  .ermis-files-preview__spinner {
2392
2740
  width: 20px;
2393
2741
  height: 20px;
@@ -2999,34 +3347,41 @@
2999
3347
  }
3000
3348
 
3001
3349
  /* src/styles/_typing-indicator.css */
3350
+ .ermis-typing-indicator-wrapper {
3351
+ height: 0;
3352
+ overflow: visible;
3353
+ padding-left: 16px;
3354
+ position: relative;
3355
+ z-index: 10;
3356
+ }
3002
3357
  .ermis-typing-indicator {
3003
- display: flex;
3358
+ display: inline-flex;
3004
3359
  align-items: center;
3005
3360
  gap: 6px;
3006
- padding: 0 16px;
3007
- height: 24px;
3008
3361
  font-size: 12px;
3009
3362
  color: var(--ermis-text-secondary);
3010
- overflow: hidden;
3011
- position: absolute;
3012
- bottom: 0;
3013
- left: 0;
3014
- right: 0;
3363
+ background-color: var(--ermis-bg-primary, #fff);
3364
+ padding: 4px 12px;
3365
+ border-radius: 999px;
3366
+ border: 1px solid var(--ermis-border, rgba(0, 0, 0, 0.08));
3367
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
3368
+ transform: translateY(-100%);
3369
+ margin-bottom: 8px;
3370
+ animation: ermis-typing-appear 0.2s ease-out forwards;
3015
3371
  }
3016
3372
  .ermis-typing-indicator__dots {
3017
3373
  display: flex;
3018
3374
  align-items: center;
3019
3375
  gap: 3px;
3020
- animation: ermis-typing-appear 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
3021
3376
  }
3022
3377
  @keyframes ermis-typing-appear {
3023
3378
  0% {
3024
3379
  opacity: 0;
3025
- transform: translateY(8px);
3380
+ transform: translateY(calc(-100% + 4px));
3026
3381
  }
3027
3382
  100% {
3028
3383
  opacity: 1;
3029
- transform: translateY(0);
3384
+ transform: translateY(-100%);
3030
3385
  }
3031
3386
  }
3032
3387
  .ermis-typing-indicator__dot {
@@ -3060,17 +3415,16 @@
3060
3415
  white-space: nowrap;
3061
3416
  overflow: hidden;
3062
3417
  text-overflow: ellipsis;
3063
- animation: ermis-typing-appear 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
3064
3418
  }
3065
3419
 
3066
3420
  /* src/styles/_message-reactions.css */
3067
3421
  .ermis-message-reactions {
3068
- display: flex;
3422
+ display: inline-flex;
3069
3423
  flex-wrap: wrap;
3070
3424
  gap: 4px;
3071
- margin-bottom: 2px;
3072
- margin-top: 2px;
3073
- width: 100%;
3425
+ margin-top: 4px;
3426
+ max-width: 100%;
3427
+ vertical-align: middle;
3074
3428
  }
3075
3429
  .ermis-message-reactions--disabled {
3076
3430
  opacity: 0.8;
@@ -3086,7 +3440,7 @@
3086
3440
  gap: 4px;
3087
3441
  padding: 2px 6px;
3088
3442
  border-radius: 12px;
3089
- background-color: var(--ermis-surface);
3443
+ background-color: var(--ermis-bg-hover);
3090
3444
  border: 1px solid var(--ermis-border);
3091
3445
  font-size: 11px;
3092
3446
  line-height: 1.2;
@@ -3095,35 +3449,21 @@
3095
3449
  transition: all 0.2s ease;
3096
3450
  user-select: none;
3097
3451
  }
3098
- .ermis-message-reactions__item::after {
3099
- content: attr(data-tooltip);
3100
- position: absolute;
3101
- bottom: 100%;
3102
- left: 50%;
3103
- transform: translateX(-50%);
3104
- background-color: rgba(0, 0, 0, 0.75);
3105
- color: #fff;
3106
- padding: 4px 8px;
3107
- border-radius: 6px;
3108
- font-size: 11px;
3109
- white-space: pre;
3110
- text-align: left;
3111
- pointer-events: none;
3112
- opacity: 0;
3113
- visibility: hidden;
3114
- transition: opacity 0.2s, visibility 0.2s;
3115
- margin-bottom: 6px;
3116
- z-index: 100;
3117
- }
3118
- .ermis-message-reactions__item:hover::after {
3119
- opacity: 1;
3120
- visibility: visible;
3121
- }
3122
3452
  .ermis-message-reactions__item--active {
3123
3453
  background-color: var(--ermis-bg-active, rgba(99, 102, 241, 0.12));
3124
3454
  border-color: var(--ermis-accent);
3125
3455
  color: var(--ermis-accent);
3126
3456
  }
3457
+ .ermis-message-bubble--own .ermis-message-reactions__item {
3458
+ background-color: rgba(255, 255, 255, 0.2);
3459
+ border-color: rgba(255, 255, 255, 0.3);
3460
+ color: rgba(255, 255, 255, 0.9);
3461
+ }
3462
+ .ermis-message-bubble--own .ermis-message-reactions__item--active {
3463
+ background-color: rgba(255, 255, 255, 0.35);
3464
+ border-color: rgba(255, 255, 255, 0.6);
3465
+ color: #ffffff;
3466
+ }
3127
3467
  .ermis-message-reactions__emoji {
3128
3468
  font-size: 14px;
3129
3469
  }
@@ -3132,90 +3472,112 @@
3132
3472
  }
3133
3473
 
3134
3474
  /* src/styles/_message-quick-reactions.css */
3135
- .ermis-message-quick-reactions {
3475
+ .ermis-qr-wrapper {
3476
+ position: relative;
3477
+ display: inline-flex;
3478
+ }
3479
+ .ermis-qr__strip--horizontal {
3136
3480
  position: absolute;
3137
- bottom: 100%;
3481
+ bottom: calc(100% + 8px);
3482
+ left: 50%;
3138
3483
  display: flex;
3484
+ flex-direction: row;
3139
3485
  align-items: center;
3140
3486
  gap: 2px;
3141
- padding: 4px;
3142
- padding-bottom: 8px;
3487
+ background-color: var(--ermis-bg-primary, #ffffff);
3488
+ border: 1px solid var(--ermis-border);
3143
3489
  border-radius: 20px;
3490
+ padding: 4px;
3491
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
3492
+ z-index: 101;
3493
+ width: max-content;
3144
3494
  opacity: 0;
3145
- visibility: hidden;
3146
- transform: translateY(4px);
3147
- transition:
3148
- opacity 0.1s ease,
3149
- transform 0.1s ease,
3150
- visibility 0.1s ease;
3151
- z-index: 20;
3495
+ transform: translateX(-50%) scale(0.95);
3496
+ animation: ermis-qr-pop-centered 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
3152
3497
  }
3153
- .ermis-message-quick-reactions::before {
3498
+ .ermis-qr__strip--horizontal::after {
3154
3499
  content: "";
3155
3500
  position: absolute;
3156
- top: 0;
3157
- left: 0;
3158
- right: 0;
3159
- bottom: 4px;
3160
- background-color: var(--ermis-bg-primary);
3161
- border: 1px solid var(--ermis-border);
3162
- border-radius: 20px;
3163
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
3164
- z-index: -1;
3165
- }
3166
- .ermis-message-quick-reactions {
3501
+ top: 100%;
3167
3502
  left: 0;
3503
+ width: 100%;
3504
+ height: 12px;
3168
3505
  }
3169
- .ermis-message-quick-reactions--own {
3170
- left: auto;
3171
- right: 0;
3172
- }
3173
- .ermis-message-list__bubble-wrapper:hover {
3174
- z-index: 100;
3175
- }
3176
- .ermis-message-list__bubble-wrapper:hover .ermis-message-quick-reactions,
3177
- .ermis-message-quick-reactions:hover {
3178
- opacity: 1;
3179
- visibility: visible;
3180
- transform: translateY(0);
3506
+ @keyframes ermis-qr-pop-centered {
3507
+ to {
3508
+ opacity: 1;
3509
+ transform: translateX(-50%) scale(1);
3510
+ }
3181
3511
  }
3182
- .ermis-message-quick-reactions--expanded {
3183
- opacity: 1;
3184
- visibility: visible;
3185
- transform: translateY(0);
3186
- transition: none !important;
3187
- will-change:
3188
- width,
3189
- height,
3190
- transform;
3512
+ @keyframes ermis-qr-pop {
3513
+ to {
3514
+ opacity: 1;
3515
+ transform: scale(1);
3516
+ }
3191
3517
  }
3192
- .ermis-message-quick-reactions--expanded::before {
3193
- display: none;
3518
+ .ermis-message-list__item--own .ermis-qr__strip--horizontal {
3519
+ left: 50%;
3194
3520
  }
3195
- .ermis-message-list__bubble-wrapper:hover .ermis-message-quick-reactions--disabled {
3196
- opacity: 0.5;
3197
- pointer-events: none;
3521
+ .ermis-message-list__item--other .ermis-qr__strip--horizontal {
3522
+ left: 50%;
3198
3523
  }
3199
- .ermis-message-quick-reactions__btn {
3524
+ .ermis-qr__emoji {
3200
3525
  display: flex;
3201
3526
  align-items: center;
3202
3527
  justify-content: center;
3203
- background: none;
3528
+ background: transparent;
3204
3529
  border: none;
3205
- font-size: 18px;
3530
+ font-size: 16px;
3206
3531
  line-height: 1;
3207
3532
  width: 32px;
3208
3533
  height: 32px;
3209
3534
  border-radius: 50%;
3210
3535
  cursor: pointer;
3211
3536
  transition: transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275), background-color 0.15s;
3537
+ padding: 0;
3538
+ outline: none;
3539
+ color: inherit;
3540
+ flex-shrink: 0;
3212
3541
  }
3213
- .ermis-message-quick-reactions__btn:hover {
3542
+ .ermis-qr__emoji:hover {
3214
3543
  transform: scale(1.2);
3215
- background-color: var(--ermis-bg-hover);
3544
+ background-color: rgba(0, 0, 0, 0.05);
3216
3545
  }
3217
- .ermis-message-quick-reactions__btn--active {
3218
- background-color: var(--ermis-bg-active, rgba(99, 102, 241, 0.12));
3546
+ .ermis-qr__emoji--active {
3547
+ background-color: rgba(99, 102, 241, 0.1);
3548
+ }
3549
+ .ermis-qr__emoji--more {
3550
+ color: var(--ermis-text-muted);
3551
+ font-size: 14px;
3552
+ }
3553
+ .ermis-qr__emoji--more:hover {
3554
+ color: var(--ermis-text-primary);
3555
+ }
3556
+ .ermis-qr__picker {
3557
+ position: absolute;
3558
+ width: 350px;
3559
+ height: 368px;
3560
+ border-radius: 16px;
3561
+ overflow: hidden;
3562
+ background-color: var(--ermis-bg-primary);
3563
+ border: 1px solid var(--ermis-border);
3564
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
3565
+ z-index: 102;
3566
+ opacity: 0;
3567
+ transform: scale(0.95);
3568
+ animation: ermis-qr-pop 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
3569
+ }
3570
+ .ermis-qr__picker--top {
3571
+ bottom: calc(100% + 8px);
3572
+ }
3573
+ .ermis-qr__picker--bottom {
3574
+ top: calc(100% + 8px);
3575
+ }
3576
+ .ermis-message-list__item--own .ermis-qr__picker {
3577
+ right: -8px;
3578
+ }
3579
+ .ermis-message-list__item--other .ermis-qr__picker {
3580
+ left: -8px;
3219
3581
  }
3220
3582
 
3221
3583
  /* src/styles/_channel-info.css */
@@ -3644,6 +4006,14 @@
3644
4006
  .ermis-channel-info__media-play-icon svg {
3645
4007
  margin-left: 2px;
3646
4008
  }
4009
+ .ermis-channel-info__media-spinner {
4010
+ width: 16px;
4011
+ height: 16px;
4012
+ border: 2px solid rgba(255, 255, 255, 0.35);
4013
+ border-top-color: #fff;
4014
+ border-radius: 50%;
4015
+ animation: ermis-lightbox-spin 0.8s linear infinite;
4016
+ }
3647
4017
  .ermis-channel-info__links-list {
3648
4018
  display: flex;
3649
4019
  flex-direction: column;
@@ -5575,6 +5945,10 @@
5575
5945
  background: rgba(255, 255, 255, 0.2);
5576
5946
  color: #fff;
5577
5947
  }
5948
+ .ermis-lightbox__action-btn:disabled {
5949
+ opacity: 0.4;
5950
+ cursor: not-allowed;
5951
+ }
5578
5952
  .ermis-lightbox__content {
5579
5953
  position: relative;
5580
5954
  z-index: 1;
@@ -5640,6 +6014,24 @@
5640
6014
  border-radius: 50%;
5641
6015
  animation: ermis-lightbox-spin 0.8s linear infinite;
5642
6016
  }
6017
+ .ermis-lightbox__video-retry {
6018
+ flex-direction: column;
6019
+ gap: 10px;
6020
+ }
6021
+ .ermis-lightbox__progress-label {
6022
+ color: rgba(255, 255, 255, 0.86);
6023
+ font-size: 13px;
6024
+ font-weight: 500;
6025
+ }
6026
+ .ermis-lightbox__media-placeholder {
6027
+ width: min(80vw, 720px);
6028
+ height: min(60vh, 420px);
6029
+ border-radius: 4px;
6030
+ background: rgba(255, 255, 255, 0.08);
6031
+ }
6032
+ .ermis-lightbox__image--poster {
6033
+ filter: none;
6034
+ }
5643
6035
  @keyframes ermis-lightbox-spin {
5644
6036
  to {
5645
6037
  transform: rotate(360deg);
@@ -5785,5 +6177,93 @@
5785
6177
  transform: scale(0.98);
5786
6178
  }
5787
6179
 
6180
+ /* src/styles/_recovery-pin.css */
6181
+ .ermis-recovery-pin {
6182
+ display: flex;
6183
+ flex-direction: column;
6184
+ gap: 10px;
6185
+ width: 100%;
6186
+ }
6187
+ .ermis-recovery-pin__header {
6188
+ align-items: center;
6189
+ display: flex;
6190
+ gap: 8px;
6191
+ justify-content: space-between;
6192
+ }
6193
+ .ermis-recovery-pin__header h3 {
6194
+ font-size: 16px;
6195
+ font-weight: 600;
6196
+ line-height: 1.3;
6197
+ margin: 0;
6198
+ }
6199
+ .ermis-recovery-pin__badge,
6200
+ .ermis-recovery-status {
6201
+ border: 1px solid var(--ermis-border-color, #d7dde5);
6202
+ border-radius: 999px;
6203
+ color: var(--ermis-text-muted, #596579);
6204
+ display: inline-flex;
6205
+ font-size: 12px;
6206
+ font-weight: 600;
6207
+ line-height: 1;
6208
+ padding: 5px 8px;
6209
+ white-space: nowrap;
6210
+ }
6211
+ .ermis-recovery-pin__input {
6212
+ background: var(--ermis-input-bg, #fff);
6213
+ border: 1px solid var(--ermis-border-color, #d7dde5);
6214
+ border-radius: 8px;
6215
+ color: var(--ermis-text-color, #111827);
6216
+ font-size: 14px;
6217
+ min-height: 38px;
6218
+ padding: 8px 10px;
6219
+ }
6220
+ .ermis-recovery-pin__button {
6221
+ align-items: center;
6222
+ background: var(--ermis-primary-color, #2563eb);
6223
+ border: 0;
6224
+ border-radius: 8px;
6225
+ color: #fff;
6226
+ cursor: pointer;
6227
+ display: inline-flex;
6228
+ font-size: 14px;
6229
+ font-weight: 600;
6230
+ justify-content: center;
6231
+ min-height: 38px;
6232
+ padding: 8px 12px;
6233
+ }
6234
+ .ermis-recovery-pin__button:disabled {
6235
+ cursor: not-allowed;
6236
+ opacity: 0.55;
6237
+ }
6238
+ .ermis-recovery-pin__error,
6239
+ .ermis-recovery-gap {
6240
+ background: var(--ermis-danger-bg, #fff1f2);
6241
+ border: 1px solid var(--ermis-danger-border, #fecdd3);
6242
+ border-radius: 8px;
6243
+ color: var(--ermis-danger-color, #be123c);
6244
+ font-size: 13px;
6245
+ line-height: 1.4;
6246
+ padding: 8px 10px;
6247
+ }
6248
+ .ermis-recovery-status--ready {
6249
+ background: var(--ermis-success-bg, #ecfdf5);
6250
+ border-color: var(--ermis-success-border, #bbf7d0);
6251
+ color: var(--ermis-success-color, #047857);
6252
+ }
6253
+ .ermis-recovery-status--working {
6254
+ background: var(--ermis-info-bg, #eff6ff);
6255
+ border-color: var(--ermis-info-border, #bfdbfe);
6256
+ color: var(--ermis-info-color, #1d4ed8);
6257
+ }
6258
+ .ermis-recovery-status--locked,
6259
+ .ermis-recovery-status--idle {
6260
+ background: var(--ermis-muted-bg, #f8fafc);
6261
+ }
6262
+ .ermis-recovery-status--error {
6263
+ background: var(--ermis-danger-bg, #fff1f2);
6264
+ border-color: var(--ermis-danger-border, #fecdd3);
6265
+ color: var(--ermis-danger-color, #be123c);
6266
+ }
6267
+
5788
6268
  /* src/styles/index.css */
5789
6269
  /*# sourceMappingURL=index.css.map */