@adatechnology/conversations-ui 0.6.1 → 0.8.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.
Files changed (119) hide show
  1. package/README.md +221 -19
  2. package/dist/{ConversationSimulatorPanel-CrfFjiWh.d.ts → ConversationSimulatorPanel-q-wVgBCN.d.ts} +1 -1
  3. package/dist/{chunk-HOKNKXIT.js → chunk-HMCOTZAX.js} +1 -1
  4. package/dist/{chunk-FAQLC3TX.js → chunk-L3OFAQPS.js} +2 -4
  5. package/dist/{chunk-CBYEHPX6.js → chunk-PJNR6UMN.js} +63 -1
  6. package/dist/flows/index.js +3 -5
  7. package/dist/index.d.ts +4 -4
  8. package/dist/index.js +834 -764
  9. package/dist/participant/index.d.ts +62 -3
  10. package/dist/participant/index.js +1444 -394
  11. package/dist/preview/index.d.ts +3 -3
  12. package/dist/preview/index.js +2 -3
  13. package/dist/{quickReply.types-B4gmZsSr.d.ts → quickReply.types-DzWH3NYV.d.ts} +1 -1
  14. package/dist/styles.css +629 -20
  15. package/package.json +3 -3
  16. package/src/participant/ConversationThread.test.tsx +165 -0
  17. package/src/participant/ConversationThread.tsx +117 -0
  18. package/src/participant/ParticipantAuthorAvatar.test.tsx +30 -0
  19. package/src/participant/ParticipantAuthorAvatar.tsx +24 -0
  20. package/src/participant/ParticipantBackButton.tsx +14 -0
  21. package/src/participant/ParticipantBubbleStatus.tsx +67 -0
  22. package/src/participant/ParticipantChannelBadges.tsx +13 -4
  23. package/src/participant/ParticipantComposer.tsx +8 -40
  24. package/src/participant/ParticipantComposerControls.tsx +83 -0
  25. package/src/participant/ParticipantConversationAvatar.tsx +13 -0
  26. package/src/participant/ParticipantConversations.tsx +7 -0
  27. package/src/participant/ParticipantConversationsOptions.test.tsx +87 -0
  28. package/src/participant/ParticipantCopyAnnouncer.tsx +48 -0
  29. package/src/participant/ParticipantCopyableToken.tsx +51 -0
  30. package/src/participant/ParticipantDayDivider.tsx +18 -0
  31. package/src/participant/ParticipantInbox.tsx +3 -1
  32. package/src/participant/ParticipantInboxRow.tsx +6 -4
  33. package/src/participant/ParticipantMessageBubble.test.tsx +52 -5
  34. package/src/participant/ParticipantMessageBubble.tsx +32 -84
  35. package/src/participant/ParticipantMessageNodes.tsx +54 -0
  36. package/src/participant/ParticipantMessageText.test.tsx +106 -0
  37. package/src/participant/ParticipantMessageText.tsx +52 -0
  38. package/src/participant/ParticipantProtocolBadge.tsx +15 -7
  39. package/src/participant/ParticipantProtocolView.test.tsx +4 -6
  40. package/src/participant/ParticipantScrollToLatest.test.tsx +153 -0
  41. package/src/participant/ParticipantScrollToLatest.tsx +40 -0
  42. package/src/participant/ParticipantThread.test.tsx +37 -0
  43. package/src/participant/ParticipantThread.tsx +54 -95
  44. package/src/participant/ParticipantThreadAvatarSequence.test.tsx +65 -0
  45. package/src/participant/ParticipantThreadHeader.test.tsx +181 -0
  46. package/src/participant/ParticipantThreadHeader.tsx +83 -0
  47. package/src/participant/ParticipantThreadScreen.tsx +30 -56
  48. package/src/participant/ParticipantTimeline.tsx +106 -0
  49. package/src/participant/conversationThreadApi.test.ts +27 -0
  50. package/src/participant/conversationThreadApi.ts +24 -0
  51. package/src/participant/conversationThreadCss.test.ts +116 -0
  52. package/src/participant/conversationThreadSummary.ts +34 -0
  53. package/src/participant/index.ts +4 -0
  54. package/src/participant/participantAutoGrow.test.ts +43 -0
  55. package/src/participant/participantAutoGrow.ts +12 -0
  56. package/src/participant/participantAvatar.test.ts +74 -0
  57. package/src/participant/participantAvatar.ts +48 -0
  58. package/src/participant/participantBubbleTail.test.tsx +107 -0
  59. package/src/participant/participantChatDesign.test.tsx +198 -0
  60. package/src/participant/participantContrast.test-helper.ts +116 -0
  61. package/src/participant/participantCopyAnnouncement.test.ts +52 -0
  62. package/src/participant/participantCopyAnnouncement.ts +37 -0
  63. package/src/participant/participantCss.test-helper.ts +34 -0
  64. package/src/participant/participantDay.test.ts +22 -0
  65. package/src/participant/participantDay.ts +8 -0
  66. package/src/participant/participantDocuments.ts +45 -0
  67. package/src/participant/participantGolden.test.tsx +46 -0
  68. package/src/participant/participantGoldenScenarios.test-helper.tsx +57 -0
  69. package/src/participant/participantHeaderA11y.test.tsx +85 -0
  70. package/src/participant/participantHeaderDesign.test.tsx +111 -0
  71. package/src/participant/participantLabels.ts +11 -0
  72. package/src/participant/participantMessageAtoms.ts +53 -0
  73. package/src/participant/participantMessageCopyables.test.ts +141 -0
  74. package/src/participant/participantMessageCopyables.ts +76 -0
  75. package/src/participant/participantMessageFormat.test-helper.ts +21 -0
  76. package/src/participant/participantMessageFormat.test.ts +177 -0
  77. package/src/participant/participantMessageFormat.ts +135 -0
  78. package/src/participant/participantMessageFormat.types.ts +22 -0
  79. package/src/participant/participantMessageInline.test.ts +82 -0
  80. package/src/participant/participantMessageInline.ts +99 -0
  81. package/src/participant/participantMessageLinks.test.ts +100 -0
  82. package/src/participant/participantMessageLinks.ts +54 -0
  83. package/src/participant/participantMessageTextStyle.test.ts +137 -0
  84. package/src/participant/participantMessages.ts +4 -3
  85. package/src/participant/participantNewMessages.test.ts +21 -0
  86. package/src/participant/participantNewMessages.ts +8 -3
  87. package/src/participant/participantPerspective.test.ts +67 -0
  88. package/src/participant/participantPerspective.ts +50 -0
  89. package/src/participant/participantPerspectiveRender.test.tsx +94 -0
  90. package/src/participant/participantScrollFocus.test.ts +22 -0
  91. package/src/participant/participantScrollFocus.ts +10 -0
  92. package/src/participant/participantScrollView.test.ts +74 -0
  93. package/src/participant/participantScrollView.ts +38 -0
  94. package/src/participant/participantScrollbars.test.ts +156 -0
  95. package/src/participant/participantSubjectIcon.test.tsx +27 -0
  96. package/src/participant/participantSubjectIcon.ts +26 -0
  97. package/src/participant/participantThemeContrast.test.ts +98 -0
  98. package/src/participant/test-fixtures/conversations-list.golden.html +1 -0
  99. package/src/participant/test-fixtures/conversations-selected.golden.html +1 -0
  100. package/src/participant/test-fixtures/thread-avatars-initials.golden.html +1 -0
  101. package/src/participant/test-fixtures/thread-closed.golden.html +1 -0
  102. package/src/participant/test-fixtures/thread-default.golden.html +1 -0
  103. package/src/participant/test-fixtures/thread-error.golden.html +1 -0
  104. package/src/participant/test-fixtures/thread-loading.golden.html +1 -0
  105. package/src/participant/test-fixtures/thread-plain.golden.html +1 -0
  106. package/src/participant/test-fixtures/thread-tail-off.golden.html +1 -0
  107. package/src/participant/useParticipantConversationView.ts +3 -0
  108. package/src/participant/useParticipantCopyFeedback.ts +33 -0
  109. package/src/participant/useParticipantThread.ts +13 -2
  110. package/src/participant/useParticipantThreadController.ts +112 -0
  111. package/src/participant/useParticipantThreadScroll.ts +13 -3
  112. package/src/participant/useParticipantUnread.test.tsx +40 -0
  113. package/src/participant/useParticipantUnread.ts +38 -0
  114. package/src/participant/useRevealActiveChip.ts +20 -0
  115. package/src/participant/useScrollAwayState.ts +24 -0
  116. package/src/participant/useStickToBottom.ts +16 -2
  117. package/src/styles.css +151 -23
  118. package/dist/chunk-MRVFFJEH.js +0 -64
  119. package/dist/chunk-OVFCLRQQ.js +0 -84
package/dist/styles.css CHANGED
@@ -1314,10 +1314,24 @@
1314
1314
  --cv-p-i-border: var(--cv-p-border, #d5d9df);
1315
1315
  --cv-p-i-accent: var(--cv-p-accent, #a85a1c);
1316
1316
  --cv-p-i-accent-contrast: var(--cv-p-accent-contrast, #ffffff);
1317
- --cv-p-i-highlight: var(--cv-p-highlight, #fbefe2);
1317
+ --cv-p-i-highlight: var(--cv-p-highlight, #fcf3ea);
1318
1318
  --cv-p-i-danger: var(--cv-p-danger, #c62828);
1319
1319
  --cv-p-i-radius: var(--cv-p-radius, 0);
1320
1320
  --cv-p-i-touch: 2.75rem;
1321
+ --cv-p-i-scrollbar-thumb: var(--cv-p-scrollbar-thumb, var(--cv-p-i-border));
1322
+ --cv-p-i-scrollbar-thumb-hover: var(--cv-p-scrollbar-thumb-hover, var(--cv-p-i-accent));
1323
+ --cv-p-i-tick: var(--cv-p-tick, var(--cv-p-i-text-muted));
1324
+ --cv-p-i-tick-read: var(--cv-p-tick-read, #0369a1);
1325
+ --cv-p-i-wallpaper-ink: var(--cv-p-i-border);
1326
+ --cv-p-i-wallpaper:
1327
+ radial-gradient(
1328
+ circle at 2px 2px,
1329
+ var(--cv-p-i-wallpaper-ink) 1px,
1330
+ transparent 1.5px),
1331
+ radial-gradient(
1332
+ circle at 14px 14px,
1333
+ var(--cv-p-i-wallpaper-ink) 1px,
1334
+ transparent 1.5px);
1321
1335
  display: flex;
1322
1336
  flex-direction: column;
1323
1337
  min-height: 0;
@@ -1342,6 +1356,7 @@
1342
1356
  --cv-p-i-accent-contrast: var(--cv-p-accent-contrast, #10222c);
1343
1357
  --cv-p-i-highlight: var(--cv-p-highlight, rgb(213 138 71 / 10%));
1344
1358
  --cv-p-i-danger: var(--cv-p-danger, #ff6b63);
1359
+ --cv-p-i-tick-read: var(--cv-p-tick-read, #5cc8ff);
1345
1360
  }
1346
1361
  .cv-p *,
1347
1362
  .cv-p *::before,
@@ -1423,6 +1438,7 @@
1423
1438
  }
1424
1439
  .cv-p-inbox {
1425
1440
  overflow-y: auto;
1441
+ touch-action: pan-y pinch-zoom;
1426
1442
  }
1427
1443
  .cv-p-inbox__title {
1428
1444
  margin: 0;
@@ -1431,6 +1447,7 @@
1431
1447
  border-bottom: 1px solid var(--cv-p-i-border);
1432
1448
  }
1433
1449
  .cv-p-filters {
1450
+ --cv-p-i-fade: 1rem;
1434
1451
  display: flex;
1435
1452
  gap: 0.5rem;
1436
1453
  padding: 0.625rem 1rem;
@@ -1449,6 +1466,9 @@
1449
1466
  .cv-p-error__message {
1450
1467
  margin: 0;
1451
1468
  }
1469
+ .cv-p-thread__scroll > .cv-p-error {
1470
+ background: var(--cv-p-i-surface);
1471
+ }
1452
1472
  .cv-p-loading {
1453
1473
  display: flex;
1454
1474
  flex-direction: column;
@@ -1615,22 +1635,118 @@
1615
1635
  display: flex;
1616
1636
  align-items: center;
1617
1637
  gap: 0.5rem;
1618
- padding: 0.5rem 1rem;
1638
+ min-height: 4rem;
1639
+ padding: 0.25rem 0.75rem;
1640
+ background: var(--cv-p-i-surface-raised);
1619
1641
  border-bottom: 1px solid var(--cv-p-i-border);
1620
1642
  }
1643
+ .cv-p-thread__back {
1644
+ flex: 0 0 auto;
1645
+ display: inline-grid;
1646
+ place-items: center;
1647
+ min-width: var(--cv-p-i-touch);
1648
+ min-height: var(--cv-p-i-touch);
1649
+ margin-inline-start: -0.5rem;
1650
+ padding: 0;
1651
+ background: transparent;
1652
+ border: 0;
1653
+ border-radius: var(--cv-p-i-radius);
1654
+ color: var(--cv-p-i-text);
1655
+ font: inherit;
1656
+ cursor: pointer;
1657
+ }
1658
+ .cv-p-thread__back svg {
1659
+ display: block;
1660
+ }
1661
+ .cv-p-thread__avatar {
1662
+ flex: 0 0 auto;
1663
+ display: grid;
1664
+ place-items: center;
1665
+ width: 2.5rem;
1666
+ height: 2.5rem;
1667
+ background: var(--cv-p-i-surface);
1668
+ border: 1px solid var(--cv-p-i-border);
1669
+ border-radius: var(--cv-p-i-radius);
1670
+ color: var(--cv-p-i-accent);
1671
+ font:
1672
+ 700 0.75rem "SFMono-Regular",
1673
+ Consolas,
1674
+ monospace;
1675
+ text-transform: uppercase;
1676
+ }
1677
+ .cv-p-thread__avatar svg {
1678
+ width: 1.25rem;
1679
+ height: 1.25rem;
1680
+ }
1621
1681
  .cv-p-thread__heading {
1622
1682
  flex: 1;
1623
1683
  min-width: 0;
1624
1684
  display: flex;
1625
1685
  flex-direction: column;
1686
+ justify-content: center;
1687
+ }
1688
+ .cv-p-thread__eyebrow {
1689
+ margin: 0;
1690
+ font:
1691
+ 0.64rem "SFMono-Regular",
1692
+ Consolas,
1693
+ monospace;
1694
+ letter-spacing: 0.08em;
1695
+ text-transform: uppercase;
1696
+ color: var(--cv-p-i-text-muted);
1626
1697
  }
1627
1698
  .cv-p-thread__title {
1628
- flex: 1;
1629
1699
  margin: 0;
1630
1700
  font-size: 1rem;
1701
+ font-weight: 600;
1702
+ line-height: 1.3;
1703
+ min-width: 0;
1704
+ overflow-wrap: anywhere;
1705
+ }
1706
+ .cv-p-thread__title-text {
1707
+ display: -webkit-box;
1708
+ -webkit-box-orient: vertical;
1709
+ -webkit-line-clamp: 1;
1710
+ line-clamp: 1;
1711
+ overflow: hidden;
1712
+ text-overflow: ellipsis;
1713
+ min-width: 0;
1714
+ }
1715
+ .cv-p-thread__counterpart {
1716
+ margin: 0;
1717
+ overflow: hidden;
1718
+ text-overflow: ellipsis;
1719
+ white-space: nowrap;
1720
+ font-size: 0.78rem;
1721
+ line-height: 1.3;
1722
+ color: var(--cv-p-i-text-muted);
1723
+ }
1724
+ .cv-p-thread__actions {
1725
+ flex: 0 0 auto;
1726
+ display: flex;
1727
+ align-items: center;
1728
+ gap: 0.5rem;
1729
+ margin-inline-start: auto;
1730
+ max-width: 100%;
1731
+ }
1732
+ .cv-p-thread__header:has(.cv-p-thread__actions) {
1733
+ flex-wrap: wrap;
1734
+ }
1735
+ .cv-p-thread__header:has(.cv-p-thread__actions) .cv-p-thread__heading {
1736
+ min-width: 6rem;
1737
+ }
1738
+ .cv-p-thread__meta {
1739
+ display: flex;
1740
+ flex-wrap: wrap;
1741
+ align-items: center;
1742
+ gap: 0.125rem 0.5rem;
1631
1743
  min-width: 0;
1744
+ padding-top: 0.5rem;
1632
1745
  }
1633
1746
  .cv-p-thread__title-button {
1747
+ display: flex;
1748
+ align-items: center;
1749
+ max-width: 100%;
1634
1750
  min-height: var(--cv-p-i-touch);
1635
1751
  padding: 0;
1636
1752
  background: none;
@@ -1638,8 +1754,10 @@
1638
1754
  color: inherit;
1639
1755
  font: inherit;
1640
1756
  font-weight: 600;
1641
- text-align: left;
1757
+ text-align: start;
1642
1758
  text-decoration: underline;
1759
+ text-decoration-thickness: 1px;
1760
+ text-underline-offset: 0.2em;
1643
1761
  cursor: pointer;
1644
1762
  }
1645
1763
  .cv-p-thread__subject-card {
@@ -1650,12 +1768,18 @@
1650
1768
  border-radius: var(--cv-p-i-radius);
1651
1769
  font-size: 0.82rem;
1652
1770
  }
1771
+ .cv-p-thread__scroll:focus {
1772
+ outline: none;
1773
+ }
1653
1774
  .cv-p-thread__scroll {
1654
1775
  flex: 1;
1655
1776
  min-height: 0;
1656
1777
  overflow-y: auto;
1657
1778
  overflow-anchor: none;
1658
- padding: 0.5rem 1rem 1rem;
1779
+ touch-action: pan-y pinch-zoom;
1780
+ padding: 0.5rem 0.75rem 1rem;
1781
+ background-image: var(--cv-p-wallpaper, var(--cv-p-i-wallpaper));
1782
+ background-size: var(--cv-p-wallpaper-size, 24px 24px);
1659
1783
  }
1660
1784
  .cv-p-thread__older {
1661
1785
  display: block;
@@ -1675,6 +1799,7 @@
1675
1799
  padding: 0 1rem;
1676
1800
  font-size: 0.75rem;
1677
1801
  color: var(--cv-p-i-accent);
1802
+ background: var(--cv-p-i-surface-raised);
1678
1803
  }
1679
1804
  .cv-p-thread__live:empty {
1680
1805
  position: absolute;
@@ -1697,29 +1822,141 @@
1697
1822
  .cv-p-day {
1698
1823
  align-self: center;
1699
1824
  margin: 0.5rem 0;
1825
+ padding: 0.25rem 0.75rem;
1826
+ background: var(--cv-p-i-surface-raised);
1827
+ border: 1px solid var(--cv-p-i-border);
1828
+ border-radius: var(--cv-p-i-radius);
1700
1829
  font:
1701
1830
  0.65rem "SFMono-Regular",
1702
1831
  Consolas,
1703
1832
  monospace;
1833
+ letter-spacing: 0.06em;
1704
1834
  text-transform: uppercase;
1705
1835
  color: var(--cv-p-i-text-muted);
1706
1836
  }
1707
1837
  .cv-p-bubble {
1708
- max-width: 82%;
1838
+ max-width: 85%;
1709
1839
  align-self: flex-start;
1840
+ position: relative;
1841
+ display: flex;
1842
+ flex-wrap: wrap;
1843
+ align-items: flex-end;
1844
+ column-gap: 0.5rem;
1710
1845
  padding: 0.5rem 0.7rem;
1711
1846
  font-size: 0.88rem;
1712
1847
  background: var(--cv-p-i-surface-raised);
1713
1848
  border: 1px solid var(--cv-p-i-border);
1714
1849
  border-radius: var(--cv-p-i-radius);
1850
+ border-bottom-left-radius: 0;
1851
+ --cv-p-tail-edge: var(--cv-p-i-border);
1852
+ --cv-p-tail-fill: var(--cv-p-i-surface-raised);
1853
+ }
1854
+ .cv-p-bubble-row {
1855
+ display: flex;
1856
+ align-items: flex-start;
1857
+ gap: 0.5rem;
1858
+ align-self: flex-start;
1859
+ max-width: 92%;
1860
+ }
1861
+ .cv-p-bubble-row__avatar {
1862
+ flex: 0 0 auto;
1863
+ width: 2rem;
1864
+ }
1865
+ .cv-p-bubble-row > .cv-p-bubble {
1866
+ max-width: none;
1867
+ min-width: 0;
1868
+ }
1869
+ .cv-p-avatar {
1870
+ display: grid;
1871
+ place-items: center;
1872
+ width: 2rem;
1873
+ height: 2rem;
1874
+ overflow: hidden;
1875
+ background: var(--cv-p-i-surface-raised);
1876
+ border: 1px solid var(--cv-p-i-border);
1877
+ border-radius: var(--cv-p-i-radius);
1878
+ color: var(--cv-p-i-text);
1879
+ font:
1880
+ 700 0.7rem "SFMono-Regular",
1881
+ Consolas,
1882
+ monospace;
1883
+ letter-spacing: 0.02em;
1884
+ }
1885
+ .cv-p-avatar > img {
1886
+ display: block;
1887
+ width: 100%;
1888
+ height: 100%;
1889
+ object-fit: cover;
1715
1890
  }
1716
1891
  .cv-p-bubble--mine {
1717
1892
  align-self: flex-end;
1718
1893
  background: var(--cv-p-i-highlight);
1719
1894
  border-color: var(--cv-p-i-accent);
1895
+ --cv-p-tail-edge: var(--cv-p-i-accent);
1896
+ --cv-p-tail-fill: var(--cv-p-i-highlight);
1897
+ border-bottom-left-radius: var(--cv-p-i-radius);
1898
+ border-bottom-right-radius: 0;
1899
+ }
1900
+ .cv-p-bubble::before,
1901
+ .cv-p-bubble::after {
1902
+ content: "";
1903
+ position: absolute;
1904
+ width: 0;
1905
+ height: 0;
1906
+ border-style: solid;
1907
+ border-color: transparent;
1908
+ pointer-events: none;
1909
+ }
1910
+ .cv-p-bubble::before {
1911
+ left: -10px;
1912
+ bottom: -1px;
1913
+ border-width: 0 0 9px 9px;
1914
+ border-bottom-color: var(--cv-p-tail-edge);
1915
+ }
1916
+ .cv-p-bubble::after {
1917
+ left: -8px;
1918
+ bottom: 0;
1919
+ border-width: 0 0 8px 8px;
1920
+ border-bottom-color: var(--cv-p-tail-fill);
1921
+ }
1922
+ .cv-p-bubble--mine::before {
1923
+ left: auto;
1924
+ right: -10px;
1925
+ border-width: 0 9px 9px 0;
1926
+ border-bottom-color: var(--cv-p-tail-edge);
1927
+ }
1928
+ .cv-p-bubble--mine::after {
1929
+ left: auto;
1930
+ right: -8px;
1931
+ border-width: 0 8px 8px 0;
1932
+ border-bottom-color: var(--cv-p-tail-fill);
1933
+ }
1934
+ .cv-p-bubble-row > .cv-p-bubble:not(.cv-p-bubble--no-tail) {
1935
+ margin-left: 0.25rem;
1936
+ }
1937
+ .cv-p-bubble--no-tail {
1938
+ border-radius: var(--cv-p-i-radius);
1939
+ }
1940
+ .cv-p-bubble--no-tail::before,
1941
+ .cv-p-bubble--no-tail::after {
1942
+ content: none;
1943
+ }
1944
+ @media print {
1945
+ .cv-p-bubble::before,
1946
+ .cv-p-bubble::after {
1947
+ content: none;
1948
+ }
1949
+ .cv-p-bubble,
1950
+ .cv-p-bubble--mine {
1951
+ border-radius: var(--cv-p-i-radius);
1952
+ }
1953
+ .cv-p-thread__scroll {
1954
+ background-image: none;
1955
+ }
1720
1956
  }
1721
1957
  .cv-p-bubble__author {
1722
1958
  display: block;
1959
+ flex: 1 0 100%;
1723
1960
  margin-bottom: 0.15rem;
1724
1961
  font:
1725
1962
  0.65rem "SFMono-Regular",
@@ -1728,11 +1965,22 @@
1728
1965
  text-transform: uppercase;
1729
1966
  color: var(--cv-p-i-accent);
1730
1967
  }
1968
+ .cv-p-bubble > .cv-p-text {
1969
+ flex: 0 1 auto;
1970
+ min-width: 0;
1971
+ margin-inline-end: auto;
1972
+ }
1973
+ .cv-p-bubble > .cv-p-attachment,
1974
+ .cv-p-bubble > .cv-p-bubble__actions {
1975
+ flex: 1 0 100%;
1976
+ }
1731
1977
  .cv-p-bubble__meta {
1732
1978
  display: flex;
1979
+ flex: 0 0 auto;
1733
1980
  justify-content: flex-end;
1734
1981
  align-items: center;
1735
1982
  gap: 0.35rem;
1983
+ margin-inline-start: auto;
1736
1984
  margin-top: 0.25rem;
1737
1985
  font:
1738
1986
  0.65rem "SFMono-Regular",
@@ -1745,6 +1993,17 @@
1745
1993
  align-items: center;
1746
1994
  gap: 0.25rem;
1747
1995
  }
1996
+ .cv-p-bubble .cv-status-ticks--queued,
1997
+ .cv-p-bubble .cv-status-ticks--sent,
1998
+ .cv-p-bubble .cv-status-ticks--delivered {
1999
+ color: var(--cv-p-i-tick);
2000
+ }
2001
+ .cv-p-bubble .cv-status-ticks--read {
2002
+ color: var(--cv-p-i-tick-read);
2003
+ }
2004
+ .cv-p-bubble .cv-status-ticks--failed {
2005
+ color: var(--cv-p-i-danger);
2006
+ }
1748
2007
  .cv-p-bubble__retry {
1749
2008
  min-height: var(--cv-p-i-touch);
1750
2009
  display: inline-flex;
@@ -1806,20 +2065,45 @@
1806
2065
  display: flex;
1807
2066
  flex-direction: column;
1808
2067
  gap: 0.5rem;
1809
- padding: 0.5rem 1rem 1rem;
2068
+ padding: 0.5rem 0.75rem 0.75rem;
2069
+ background: var(--cv-p-i-surface-raised);
1810
2070
  border-top: 1px solid var(--cv-p-i-border);
1811
2071
  }
1812
2072
  .cv-p-composer__row {
1813
2073
  display: flex;
1814
2074
  align-items: flex-end;
1815
- gap: 0.5rem;
2075
+ gap: 0.25rem;
2076
+ }
2077
+ .cv-p-composer__attach {
2078
+ flex: 0 0 auto;
2079
+ display: inline-grid;
2080
+ place-items: center;
2081
+ min-width: var(--cv-p-i-touch);
2082
+ min-height: var(--cv-p-i-touch);
2083
+ padding: 0;
2084
+ background: transparent;
2085
+ border: 0;
2086
+ border-radius: var(--cv-p-i-radius);
2087
+ color: var(--cv-p-i-text-muted);
2088
+ font: inherit;
2089
+ cursor: pointer;
2090
+ }
2091
+ .cv-p-composer__attach:disabled {
2092
+ opacity: 0.45;
2093
+ cursor: not-allowed;
2094
+ }
2095
+ .cv-p-composer__attach svg,
2096
+ .cv-p-composer__send svg {
2097
+ display: block;
1816
2098
  }
1817
2099
  .cv-p-composer__input {
1818
- flex: 1;
2100
+ flex: 1 1 auto;
2101
+ min-width: 0;
1819
2102
  min-height: var(--cv-p-i-touch);
1820
- max-height: 8rem;
2103
+ max-height: 6.5rem;
2104
+ overflow-y: auto;
1821
2105
  resize: none;
1822
- padding: 0.7rem;
2106
+ padding: 0.7rem 0.75rem;
1823
2107
  font: inherit;
1824
2108
  font-size: 0.9rem;
1825
2109
  color: inherit;
@@ -1827,15 +2111,23 @@
1827
2111
  border: 1px solid var(--cv-p-i-border);
1828
2112
  border-radius: var(--cv-p-i-radius);
1829
2113
  }
2114
+ .cv-p-composer__send {
2115
+ flex: 0 0 auto;
2116
+ padding: 0;
2117
+ margin-inline-start: 0.25rem;
2118
+ }
1830
2119
  .cv-p-composer__error {
1831
2120
  margin: 0;
1832
2121
  font-size: 0.8rem;
1833
2122
  color: var(--cv-p-i-danger);
1834
2123
  }
1835
2124
  .cv-p-quick {
2125
+ --cv-p-i-fade: 0.75rem;
1836
2126
  display: flex;
1837
2127
  gap: 0.5rem;
1838
2128
  overflow-x: auto;
2129
+ margin: -0.25rem calc(-1 * var(--cv-p-i-fade));
2130
+ padding-block: 0.25rem;
1839
2131
  }
1840
2132
  .cv-p-files {
1841
2133
  display: flex;
@@ -1880,22 +2172,31 @@
1880
2172
  color: var(--cv-p-i-text-muted);
1881
2173
  }
1882
2174
  .cv-p-protocol--header {
1883
- display: flex;
2175
+ display: inline-flex;
1884
2176
  align-items: center;
1885
- gap: 0.5rem;
2177
+ gap: 0.125rem;
1886
2178
  }
1887
2179
  .cv-p-protocol__copy {
1888
- min-height: var(--cv-p-i-touch);
1889
- min-width: var(--cv-p-i-touch);
1890
- padding: 0 0.75rem;
2180
+ display: inline-flex;
2181
+ align-items: center;
2182
+ justify-content: center;
2183
+ gap: 0.25rem;
2184
+ min-height: 2.25rem;
2185
+ min-width: 2.75rem;
2186
+ margin: -0.5rem -0.5rem;
2187
+ padding: 0 0.5rem;
1891
2188
  background: transparent;
1892
- border: 1px solid var(--cv-p-i-border);
2189
+ border: 0;
1893
2190
  border-radius: var(--cv-p-i-radius);
1894
- color: var(--cv-p-i-text);
2191
+ color: var(--cv-p-i-text-muted);
1895
2192
  font: inherit;
1896
- font-size: 0.75rem;
1897
2193
  cursor: pointer;
1898
2194
  }
2195
+ .cv-p-protocol__copied {
2196
+ font-size: 0.7rem;
2197
+ color: var(--cv-p-i-accent);
2198
+ white-space: nowrap;
2199
+ }
1899
2200
  .cv-p-search {
1900
2201
  padding: 0.625rem 1rem;
1901
2202
  border-bottom: 1px solid var(--cv-p-i-border);
@@ -1918,16 +2219,152 @@
1918
2219
  outline-offset: 2px;
1919
2220
  }
1920
2221
  @media (prefers-reduced-motion: no-preference) {
2222
+ .cv-p-inbox,
2223
+ .cv-p-filters,
2224
+ .cv-p-quick {
2225
+ scroll-behavior: smooth;
2226
+ }
2227
+ .cv-p-thread__latest-button {
2228
+ animation: cv-p-latest-in 0.16s ease-out;
2229
+ }
1921
2230
  .cv-p-protocol__copy,
1922
2231
  .cv-p-search__input {
1923
2232
  transition: border-color 0.12s, background-color 0.12s;
1924
2233
  }
1925
2234
  .cv-p-row,
1926
2235
  .cv-p-button,
1927
- .cv-p-chip {
2236
+ .cv-p-chip,
2237
+ .cv-p-thread__back,
2238
+ .cv-p-composer__attach {
1928
2239
  transition: background-color 0.12s, border-color 0.12s;
1929
2240
  }
1930
2241
  }
2242
+ .cv-p-thread__scroll,
2243
+ .cv-p-inbox,
2244
+ .cv-p-composer__input {
2245
+ scrollbar-width: thin;
2246
+ scrollbar-color: var(--cv-p-i-scrollbar-thumb) transparent;
2247
+ overscroll-behavior-y: contain;
2248
+ }
2249
+ @media not (forced-colors: active) {
2250
+ .cv-p-thread__scroll::-webkit-scrollbar,
2251
+ .cv-p-inbox::-webkit-scrollbar,
2252
+ .cv-p-composer__input::-webkit-scrollbar {
2253
+ width: 6px;
2254
+ height: 6px;
2255
+ }
2256
+ .cv-p-thread__scroll::-webkit-scrollbar-track,
2257
+ .cv-p-inbox::-webkit-scrollbar-track,
2258
+ .cv-p-composer__input::-webkit-scrollbar-track {
2259
+ background: transparent;
2260
+ }
2261
+ .cv-p-thread__scroll::-webkit-scrollbar-button,
2262
+ .cv-p-inbox::-webkit-scrollbar-button,
2263
+ .cv-p-composer__input::-webkit-scrollbar-button {
2264
+ display: none;
2265
+ }
2266
+ .cv-p-thread__scroll::-webkit-scrollbar-thumb,
2267
+ .cv-p-inbox::-webkit-scrollbar-thumb,
2268
+ .cv-p-composer__input::-webkit-scrollbar-thumb {
2269
+ background-color: var(--cv-p-i-scrollbar-thumb);
2270
+ border-radius: var(--cv-p-i-radius);
2271
+ }
2272
+ .cv-p-thread__scroll::-webkit-scrollbar-thumb:hover,
2273
+ .cv-p-inbox::-webkit-scrollbar-thumb:hover,
2274
+ .cv-p-composer__input::-webkit-scrollbar-thumb:hover,
2275
+ .cv-p-thread__scroll::-webkit-scrollbar-thumb:active,
2276
+ .cv-p-inbox::-webkit-scrollbar-thumb:active,
2277
+ .cv-p-composer__input::-webkit-scrollbar-thumb:active {
2278
+ background-color: var(--cv-p-i-scrollbar-thumb-hover);
2279
+ }
2280
+ }
2281
+ .cv-p-filters,
2282
+ .cv-p-quick {
2283
+ padding-inline: var(--cv-p-i-fade);
2284
+ scroll-padding-inline: var(--cv-p-i-fade);
2285
+ scrollbar-width: none;
2286
+ -ms-overflow-style: none;
2287
+ overscroll-behavior-x: contain;
2288
+ -webkit-overflow-scrolling: touch;
2289
+ scroll-snap-type: x proximity;
2290
+ mask-image:
2291
+ linear-gradient(
2292
+ to right,
2293
+ transparent,
2294
+ #000 var(--cv-p-i-fade),
2295
+ #000 calc(100% - var(--cv-p-i-fade)),
2296
+ transparent);
2297
+ -webkit-mask-image:
2298
+ linear-gradient(
2299
+ to right,
2300
+ transparent,
2301
+ #000 var(--cv-p-i-fade),
2302
+ #000 calc(100% - var(--cv-p-i-fade)),
2303
+ transparent);
2304
+ }
2305
+ .cv-p-filters::-webkit-scrollbar,
2306
+ .cv-p-quick::-webkit-scrollbar {
2307
+ display: none;
2308
+ }
2309
+ .cv-p-filters > .cv-p-chip,
2310
+ .cv-p-quick > .cv-p-chip {
2311
+ scroll-snap-align: start;
2312
+ }
2313
+ .cv-p-thread__latest {
2314
+ position: sticky;
2315
+ bottom: 0;
2316
+ height: 0;
2317
+ }
2318
+ .cv-p-thread__latest-button {
2319
+ position: absolute;
2320
+ inset-inline-end: 0.25rem;
2321
+ bottom: 0.75rem;
2322
+ display: grid;
2323
+ place-items: center;
2324
+ width: var(--cv-p-i-touch);
2325
+ height: var(--cv-p-i-touch);
2326
+ padding: 0;
2327
+ background: var(--cv-p-i-surface-raised);
2328
+ border: 1px solid var(--cv-p-i-border);
2329
+ border-radius: var(--cv-p-i-radius);
2330
+ color: var(--cv-p-i-text);
2331
+ box-shadow: 0 1px 4px rgb(0 0 0 / 35%);
2332
+ font: inherit;
2333
+ cursor: pointer;
2334
+ }
2335
+ .cv-p-thread__latest-button:hover {
2336
+ border-color: var(--cv-p-i-accent);
2337
+ }
2338
+ .cv-p-thread__latest-button svg {
2339
+ display: block;
2340
+ }
2341
+ .cv-p-thread__latest-badge {
2342
+ position: absolute;
2343
+ top: -0.5rem;
2344
+ inset-inline-end: -0.375rem;
2345
+ display: grid;
2346
+ place-items: center;
2347
+ min-width: 1.25rem;
2348
+ height: 1.25rem;
2349
+ padding: 0 0.3rem;
2350
+ background: var(--cv-p-i-accent);
2351
+ color: var(--cv-p-i-accent-contrast);
2352
+ border-radius: var(--cv-p-i-radius);
2353
+ font:
2354
+ 700 0.7rem "SFMono-Regular",
2355
+ Consolas,
2356
+ monospace;
2357
+ }
2358
+ @keyframes cv-p-latest-in {
2359
+ from {
2360
+ opacity: 0;
2361
+ transform: translateY(0.5rem);
2362
+ }
2363
+ to {
2364
+ opacity: 1;
2365
+ transform: none;
2366
+ }
2367
+ }
1931
2368
  .cv-p-filters,
1932
2369
  .cv-p-quick,
1933
2370
  .cv-p-search,
@@ -1948,3 +2385,175 @@
1948
2385
  flex: 1;
1949
2386
  min-height: 0;
1950
2387
  }
2388
+ .cv-p-text {
2389
+ font-size: 14.2px;
2390
+ line-height: 19px;
2391
+ white-space: pre-wrap;
2392
+ overflow-wrap: break-word;
2393
+ word-break: break-word;
2394
+ user-select: text;
2395
+ }
2396
+ .cv-p-text__code,
2397
+ .cv-p-text__pre {
2398
+ font-family:
2399
+ "SFMono-Regular",
2400
+ Consolas,
2401
+ monospace;
2402
+ background: color-mix(in srgb, var(--cv-p-i-border) 45%, var(--cv-p-i-surface));
2403
+ }
2404
+ .cv-p-text__code {
2405
+ padding: 0 0.25rem;
2406
+ font-size: 0.9em;
2407
+ border-radius: var(--cv-p-i-radius);
2408
+ }
2409
+ .cv-p-text__pre {
2410
+ display: block;
2411
+ margin: 0.25rem 0;
2412
+ padding: 0.5rem;
2413
+ overflow-x: auto;
2414
+ white-space: pre;
2415
+ font-size: 0.9em;
2416
+ line-height: 1.4;
2417
+ border-inline-start: 2px solid var(--cv-p-i-accent);
2418
+ border-radius: var(--cv-p-i-radius);
2419
+ scrollbar-width: thin;
2420
+ scrollbar-color: var(--cv-p-i-scrollbar-thumb) transparent;
2421
+ }
2422
+ .cv-p-text__pre > code {
2423
+ font: inherit;
2424
+ }
2425
+ .cv-p-text__quote {
2426
+ margin: 0.25rem 0;
2427
+ padding-inline-start: 0.5rem;
2428
+ border-inline-start: 3px solid var(--cv-p-i-border);
2429
+ color: var(--cv-p-i-text-muted);
2430
+ }
2431
+ .cv-p-text__list {
2432
+ margin: 0.25rem 0;
2433
+ padding-inline-start: 1.25rem;
2434
+ }
2435
+ .cv-p-text__link {
2436
+ color: var(--cv-p-i-accent);
2437
+ text-decoration: underline;
2438
+ text-underline-offset: 0.15em;
2439
+ padding-block: 0.2em;
2440
+ overflow-wrap: anywhere;
2441
+ }
2442
+ .cv-p-text__link:focus-visible,
2443
+ .cv-p-text__link-copy:focus-visible,
2444
+ .cv-p-copyable:focus-visible {
2445
+ outline: 2px solid var(--cv-p-i-accent);
2446
+ outline-offset: 2px;
2447
+ }
2448
+ .cv-p-text__link-group {
2449
+ white-space: normal;
2450
+ }
2451
+ .cv-p-text__link-copy,
2452
+ .cv-p-copyable {
2453
+ position: relative;
2454
+ display: inline;
2455
+ margin: 0;
2456
+ padding: 0;
2457
+ background: transparent;
2458
+ border: 0;
2459
+ color: inherit;
2460
+ font: inherit;
2461
+ text-align: inherit;
2462
+ cursor: pointer;
2463
+ user-select: text;
2464
+ }
2465
+ .cv-p-text__link-copy {
2466
+ margin-inline-start: 0.25rem;
2467
+ color: var(--cv-p-i-text-muted);
2468
+ vertical-align: -0.1em;
2469
+ }
2470
+ .cv-p-text__link-copy::after,
2471
+ .cv-p-copyable::after {
2472
+ content: "";
2473
+ position: absolute;
2474
+ inset-inline: 0;
2475
+ top: 50%;
2476
+ min-height: 1.5rem;
2477
+ transform: translateY(-50%);
2478
+ }
2479
+ .cv-p-text__link-copy::after {
2480
+ inset-inline: 0 auto;
2481
+ min-width: var(--cv-p-i-touch);
2482
+ }
2483
+ .cv-p-copyable {
2484
+ padding: 0 0.15rem;
2485
+ font-family:
2486
+ "SFMono-Regular",
2487
+ Consolas,
2488
+ monospace;
2489
+ font-size: 0.92em;
2490
+ background: color-mix(in srgb, var(--cv-p-i-accent) 14%, transparent);
2491
+ border-bottom: 1px dotted var(--cv-p-i-accent);
2492
+ border-radius: var(--cv-p-i-radius);
2493
+ }
2494
+ .cv-p-copyable--email {
2495
+ font-family: inherit;
2496
+ }
2497
+ .cv-p-copyable__done {
2498
+ margin-inline-start: 0.35rem;
2499
+ font-size: 0.85em;
2500
+ color: var(--cv-p-i-text);
2501
+ }
2502
+ @media (forced-colors: active) {
2503
+ .cv-p-bubble::before,
2504
+ .cv-p-bubble::after {
2505
+ content: none;
2506
+ }
2507
+ .cv-p-bubble,
2508
+ .cv-p-bubble--mine {
2509
+ border-radius: var(--cv-p-i-radius);
2510
+ }
2511
+ .cv-p-thread__scroll {
2512
+ background-image: none;
2513
+ }
2514
+ .cv-p-thread__scroll,
2515
+ .cv-p-inbox,
2516
+ .cv-p-composer__input {
2517
+ scrollbar-width: auto;
2518
+ scrollbar-color: auto;
2519
+ }
2520
+ .cv-p-filters,
2521
+ .cv-p-quick {
2522
+ mask-image: none;
2523
+ -webkit-mask-image: none;
2524
+ }
2525
+ .cv-p-thread__latest-badge {
2526
+ border: 1px solid ButtonText;
2527
+ }
2528
+ .cv-p-bubble .cv-status-ticks,
2529
+ .cv-p-copyable__done {
2530
+ color: CanvasText;
2531
+ }
2532
+ }
2533
+ @media (forced-colors: active) {
2534
+ .cv-p-text__code,
2535
+ .cv-p-text__pre,
2536
+ .cv-p-copyable {
2537
+ border: 1px solid;
2538
+ background: none;
2539
+ }
2540
+ .cv-p-text__link,
2541
+ .cv-p-text__link-copy {
2542
+ color: LinkText;
2543
+ }
2544
+ }
2545
+ @media not (forced-colors: active) {
2546
+ .cv-p-text__pre::-webkit-scrollbar {
2547
+ height: 6px;
2548
+ }
2549
+ .cv-p-text__pre::-webkit-scrollbar-track {
2550
+ background: transparent;
2551
+ }
2552
+ .cv-p-text__pre::-webkit-scrollbar-thumb {
2553
+ background-color: var(--cv-p-i-scrollbar-thumb);
2554
+ border-radius: var(--cv-p-i-radius);
2555
+ }
2556
+ .cv-p-text__pre::-webkit-scrollbar-thumb:hover {
2557
+ background-color: var(--cv-p-i-scrollbar-thumb-hover);
2558
+ }
2559
+ }