@cratis/components 3.5.1 → 3.6.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 (153) hide show
  1. package/README.md +12 -1
  2. package/dist/esm/Canvas/Canvas.d.ts +2 -0
  3. package/dist/esm/Canvas/Canvas.d.ts.map +1 -1
  4. package/dist/esm/Canvas/Canvas.js +25 -5
  5. package/dist/esm/Canvas/Canvas.js.map +1 -1
  6. package/dist/esm/Canvas/CanvasItem.d.ts +1 -0
  7. package/dist/esm/Canvas/CanvasItem.d.ts.map +1 -1
  8. package/dist/esm/Canvas/CanvasItem.js +7 -2
  9. package/dist/esm/Canvas/CanvasItem.js.map +1 -1
  10. package/dist/esm/Canvas/index.js +8 -0
  11. package/dist/esm/Canvas/index.js.map +1 -1
  12. package/dist/esm/Canvas/messaging/useOptionalMessenger.d.ts +3 -0
  13. package/dist/esm/Canvas/messaging/useOptionalMessenger.d.ts.map +1 -0
  14. package/dist/esm/Canvas/messaging/useOptionalMessenger.js +41 -0
  15. package/dist/esm/Canvas/messaging/useOptionalMessenger.js.map +1 -0
  16. package/dist/esm/Canvas/shapes/ChatBubble/Chat.d.ts +3 -1
  17. package/dist/esm/Canvas/shapes/ChatBubble/Chat.d.ts.map +1 -1
  18. package/dist/esm/Canvas/shapes/ChatBubble/Chat.js +13 -3
  19. package/dist/esm/Canvas/shapes/ChatBubble/Chat.js.map +1 -1
  20. package/dist/esm/Canvas/shapes/ChatBubble/ChatComposer.d.ts +2 -1
  21. package/dist/esm/Canvas/shapes/ChatBubble/ChatComposer.d.ts.map +1 -1
  22. package/dist/esm/Canvas/shapes/ChatBubble/ChatComposer.js +52 -4
  23. package/dist/esm/Canvas/shapes/ChatBubble/ChatComposer.js.map +1 -1
  24. package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageAdded.d.ts +6 -0
  25. package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageAdded.d.ts.map +1 -0
  26. package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageAdded.js +18 -0
  27. package/dist/esm/Canvas/shapes/ChatBubble/ChatMessageAdded.js.map +1 -0
  28. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/extractMentions.d.ts +4 -0
  29. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/extractMentions.d.ts.map +1 -0
  30. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/extractMentions.js +24 -0
  31. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/extractMentions.js.map +1 -0
  32. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/findMentionRanges.d.ts +11 -0
  33. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/findMentionRanges.d.ts.map +1 -0
  34. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/findMentionRanges.js +40 -0
  35. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/findMentionRanges.js.map +1 -0
  36. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/index.d.ts +3 -0
  37. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/index.d.ts.map +1 -1
  38. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/index.js +3 -0
  39. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/index.js.map +1 -1
  40. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/mentionSegments.d.ts +10 -0
  41. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/mentionSegments.d.ts.map +1 -0
  42. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/mentionSegments.js +29 -0
  43. package/dist/esm/Canvas/shapes/ChatBubble/Mentions/mentionSegments.js.map +1 -0
  44. package/dist/esm/Canvas/shapes/ChatBubble/index.d.ts +1 -0
  45. package/dist/esm/Canvas/shapes/ChatBubble/index.d.ts.map +1 -1
  46. package/dist/esm/Canvas/shapes/ChatBubble/index.js +1 -0
  47. package/dist/esm/Canvas/shapes/ChatBubble/index.js.map +1 -1
  48. package/dist/esm/Canvas/shapes/Note/Note.d.ts.map +1 -1
  49. package/dist/esm/Canvas/shapes/Note/Note.js +11 -2
  50. package/dist/esm/Canvas/shapes/Note/Note.js.map +1 -1
  51. package/dist/esm/Canvas/shapes/Note/NoteTextChanged.d.ts +6 -0
  52. package/dist/esm/Canvas/shapes/Note/NoteTextChanged.d.ts.map +1 -0
  53. package/dist/esm/Canvas/shapes/Note/NoteTextChanged.js +18 -0
  54. package/dist/esm/Canvas/shapes/Note/NoteTextChanged.js.map +1 -0
  55. package/dist/esm/Canvas/shapes/Note/index.d.ts +1 -0
  56. package/dist/esm/Canvas/shapes/Note/index.d.ts.map +1 -1
  57. package/dist/esm/Canvas/shapes/Note/index.js +1 -0
  58. package/dist/esm/Canvas/shapes/Note/index.js.map +1 -1
  59. package/dist/esm/Canvas/shapes/Region/ItemAddedToRegion.d.ts +6 -0
  60. package/dist/esm/Canvas/shapes/Region/ItemAddedToRegion.d.ts.map +1 -0
  61. package/dist/esm/Canvas/shapes/Region/ItemAddedToRegion.js +20 -0
  62. package/dist/esm/Canvas/shapes/Region/ItemAddedToRegion.js.map +1 -0
  63. package/dist/esm/Canvas/shapes/Region/ItemRemovedFromRegion.d.ts +6 -0
  64. package/dist/esm/Canvas/shapes/Region/ItemRemovedFromRegion.d.ts.map +1 -0
  65. package/dist/esm/Canvas/shapes/Region/ItemRemovedFromRegion.js +19 -0
  66. package/dist/esm/Canvas/shapes/Region/ItemRemovedFromRegion.js.map +1 -0
  67. package/dist/esm/Canvas/shapes/Region/Region.d.ts.map +1 -1
  68. package/dist/esm/Canvas/shapes/Region/Region.js +51 -1
  69. package/dist/esm/Canvas/shapes/Region/Region.js.map +1 -1
  70. package/dist/esm/Canvas/shapes/Region/index.d.ts +4 -0
  71. package/dist/esm/Canvas/shapes/Region/index.d.ts.map +1 -1
  72. package/dist/esm/Canvas/shapes/Region/index.js +3 -0
  73. package/dist/esm/Canvas/shapes/Region/index.js.map +1 -1
  74. package/dist/esm/Canvas/shapes/Region/regionContainment.d.ts +8 -0
  75. package/dist/esm/Canvas/shapes/Region/regionContainment.d.ts.map +1 -0
  76. package/dist/esm/Canvas/shapes/Region/regionContainment.js +35 -0
  77. package/dist/esm/Canvas/shapes/Region/regionContainment.js.map +1 -0
  78. package/dist/esm/Chat/ChatAuthor.d.ts +9 -0
  79. package/dist/esm/Chat/ChatAuthor.d.ts.map +1 -0
  80. package/dist/esm/Chat/ChatAuthor.js +2 -0
  81. package/dist/esm/Chat/ChatAuthor.js.map +1 -0
  82. package/dist/esm/Chat/ChatConversation.d.ts +38 -0
  83. package/dist/esm/Chat/ChatConversation.d.ts.map +1 -0
  84. package/dist/esm/Chat/ChatConversation.js +73 -0
  85. package/dist/esm/Chat/ChatConversation.js.map +1 -0
  86. package/dist/esm/Chat/ChatIdentifier.d.ts +6 -0
  87. package/dist/esm/Chat/ChatIdentifier.d.ts.map +1 -0
  88. package/dist/esm/Chat/ChatIdentifier.js +19 -0
  89. package/dist/esm/Chat/ChatIdentifier.js.map +1 -0
  90. package/dist/esm/Chat/ChatMention.d.ts +8 -0
  91. package/dist/esm/Chat/ChatMention.d.ts.map +1 -0
  92. package/dist/esm/Chat/ChatMention.js +2 -0
  93. package/dist/esm/Chat/ChatMention.js.map +1 -0
  94. package/dist/esm/Chat/ChatMessage.d.ts +12 -0
  95. package/dist/esm/Chat/ChatMessage.d.ts.map +1 -0
  96. package/dist/esm/Chat/ChatMessage.js +2 -0
  97. package/dist/esm/Chat/ChatMessage.js.map +1 -0
  98. package/dist/esm/Chat/ChatMessageAction.d.ts +10 -0
  99. package/dist/esm/Chat/ChatMessageAction.d.ts.map +1 -0
  100. package/dist/esm/Chat/ChatMessageAction.js +2 -0
  101. package/dist/esm/Chat/ChatMessageAction.js.map +1 -0
  102. package/dist/esm/Chat/ChatMessageBody.d.ts +8 -0
  103. package/dist/esm/Chat/ChatMessageBody.d.ts.map +1 -0
  104. package/dist/esm/Chat/ChatMessageBody.js +17 -0
  105. package/dist/esm/Chat/ChatMessageBody.js.map +1 -0
  106. package/dist/esm/Chat/ChatSidebar.d.ts +38 -0
  107. package/dist/esm/Chat/ChatSidebar.d.ts.map +1 -0
  108. package/dist/esm/Chat/ChatSidebar.js +65 -0
  109. package/dist/esm/Chat/ChatSidebar.js.map +1 -0
  110. package/dist/esm/Chat/ChatSidebarForObservableQueries.d.ts +15 -0
  111. package/dist/esm/Chat/ChatSidebarForObservableQueries.d.ts.map +1 -0
  112. package/dist/esm/Chat/ChatSidebarForObservableQueries.js +27 -0
  113. package/dist/esm/Chat/ChatSidebarForObservableQueries.js.map +1 -0
  114. package/dist/esm/Chat/ChatTopic.d.ts +10 -0
  115. package/dist/esm/Chat/ChatTopic.d.ts.map +1 -0
  116. package/dist/esm/Chat/ChatTopic.js +2 -0
  117. package/dist/esm/Chat/ChatTopic.js.map +1 -0
  118. package/dist/esm/Chat/ChatTopicList.d.ts +26 -0
  119. package/dist/esm/Chat/ChatTopicList.d.ts.map +1 -0
  120. package/dist/esm/Chat/ChatTopicList.js +29 -0
  121. package/dist/esm/Chat/ChatTopicList.js.map +1 -0
  122. package/dist/esm/Chat/index.d.ts +29 -0
  123. package/dist/esm/Chat/index.d.ts.map +1 -0
  124. package/dist/esm/Chat/index.js +20 -0
  125. package/dist/esm/Chat/index.js.map +1 -0
  126. package/dist/esm/Chat/isTopicUnnamed.d.ts +3 -0
  127. package/dist/esm/Chat/isTopicUnnamed.d.ts.map +1 -0
  128. package/dist/esm/Chat/isTopicUnnamed.js +14 -0
  129. package/dist/esm/Chat/isTopicUnnamed.js.map +1 -0
  130. package/dist/esm/Chat/relativeTimestamp.d.ts +7 -0
  131. package/dist/esm/Chat/relativeTimestamp.d.ts.map +1 -0
  132. package/dist/esm/Chat/relativeTimestamp.js +25 -0
  133. package/dist/esm/Chat/relativeTimestamp.js.map +1 -0
  134. package/dist/esm/Chat/shouldRequestTopicName.d.ts +2 -0
  135. package/dist/esm/Chat/shouldRequestTopicName.d.ts.map +1 -0
  136. package/dist/esm/Chat/shouldRequestTopicName.js +15 -0
  137. package/dist/esm/Chat/shouldRequestTopicName.js.map +1 -0
  138. package/dist/esm/Chat/topicsByActivity.d.ts +3 -0
  139. package/dist/esm/Chat/topicsByActivity.d.ts.map +1 -0
  140. package/dist/esm/Chat/topicsByActivity.js +25 -0
  141. package/dist/esm/Chat/topicsByActivity.js.map +1 -0
  142. package/dist/esm/Dialogs/BusyIndicatorDialog.js +2 -2
  143. package/dist/esm/Dialogs/BusyIndicatorDialog.js.map +1 -1
  144. package/dist/esm/PivotViewer/components/pivot/colorResolver.d.ts.map +1 -1
  145. package/dist/esm/PivotViewer/components/pivot/colorResolver.js +16 -26
  146. package/dist/esm/PivotViewer/components/pivot/colorResolver.js.map +1 -1
  147. package/dist/esm/index.d.ts +2 -1
  148. package/dist/esm/index.d.ts.map +1 -1
  149. package/dist/esm/index.js +39 -37
  150. package/dist/esm/index.js.map +1 -1
  151. package/dist/esm/styles.css +498 -95
  152. package/dist/esm/theme.css +75 -14
  153. package/package.json +24 -4
@@ -246,6 +246,9 @@
246
246
  .sticky {
247
247
  position: sticky;
248
248
  }
249
+ .inset-0 {
250
+ inset: 0px;
251
+ }
249
252
  .bottom-4 {
250
253
  bottom: calc(var(--spacing) * 4);
251
254
  }
@@ -589,6 +592,9 @@
589
592
  .p-5 {
590
593
  padding: calc(var(--spacing) * 5);
591
594
  }
595
+ .p-8 {
596
+ padding: calc(var(--spacing) * 8);
597
+ }
592
598
  .px-1\.5 {
593
599
  padding-inline: calc(var(--spacing) * 1.5);
594
600
  }
@@ -1501,16 +1507,19 @@
1501
1507
  /* Copyright (c) Cratis. All rights reserved. */
1502
1508
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
1503
1509
 
1510
+ /* Every color comes from the --cratis-* token seam, so the conversation follows whatever theme
1511
+ the host runs — light, dark, or its own. */
1512
+
1504
1513
  /* ── Chat panel (floating dropdown from the chat button) ─────────────────── */
1505
1514
  .chat-panel {
1506
1515
  position: absolute;
1507
1516
  top: calc(100% + 6px);
1508
1517
  left: 0;
1509
1518
  width: 280px;
1510
- background: #1e1e2e;
1511
- border: 1px solid rgba(255, 255, 255, 0.12);
1519
+ background: var(--cratis-surface-overlay);
1520
+ border: 1px solid var(--cratis-surface-border);
1512
1521
  border-radius: 12px;
1513
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.55);
1522
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.35);
1514
1523
  display: flex;
1515
1524
  flex-direction: column;
1516
1525
  z-index: 300;
@@ -1523,14 +1532,14 @@
1523
1532
  align-items: center;
1524
1533
  justify-content: space-between;
1525
1534
  padding: 10px 14px 8px;
1526
- border-bottom: 1px solid rgba(255, 255, 255, 0.08);
1535
+ border-bottom: 1px solid var(--cratis-surface-border);
1527
1536
  flex-shrink: 0;
1528
1537
  }
1529
1538
 
1530
1539
  .chat-panel-title {
1531
1540
  font-size: 13px;
1532
1541
  font-weight: 600;
1533
- color: rgba(255, 255, 255, 0.85);
1542
+ color: var(--cratis-text-color);
1534
1543
  }
1535
1544
 
1536
1545
  .chat-panel-close {
@@ -1539,14 +1548,14 @@
1539
1548
  font-size: 20px;
1540
1549
  line-height: 1;
1541
1550
  cursor: pointer;
1542
- color: rgba(255, 255, 255, 0.45);
1551
+ color: var(--cratis-text-color-secondary);
1543
1552
  padding: 0 2px;
1544
1553
  border-radius: 4px;
1545
1554
  transition: color 0.12s;
1546
1555
  }
1547
1556
 
1548
1557
  .chat-panel-close:hover {
1549
- color: rgba(255, 255, 255, 0.85);
1558
+ color: var(--cratis-text-color);
1550
1559
  }
1551
1560
 
1552
1561
  /* ── Scrollable messages area ─────────────────────────────────────────────── */
@@ -1562,7 +1571,7 @@
1562
1571
 
1563
1572
  .chat-panel-empty {
1564
1573
  font-size: 12px;
1565
- color: rgba(255, 255, 255, 0.35);
1574
+ color: var(--cratis-text-color-secondary);
1566
1575
  text-align: center;
1567
1576
  margin: 16px 0;
1568
1577
  }
@@ -1588,7 +1597,7 @@
1588
1597
  .chat-bubble-name {
1589
1598
  font-size: 11px;
1590
1599
  font-weight: 600;
1591
- color: rgba(255, 255, 255, 0.75);
1600
+ color: var(--cratis-text-color);
1592
1601
  }
1593
1602
 
1594
1603
  .chat-bubble-body {
@@ -1599,12 +1608,12 @@
1599
1608
  }
1600
1609
 
1601
1610
  .chat-bubble-text {
1602
- background: rgba(255, 255, 255, 0.08);
1611
+ background: var(--cratis-surface-section);
1603
1612
  border-radius: 0 10px 10px 10px;
1604
1613
  padding: 7px 10px;
1605
1614
  margin: 0;
1606
1615
  font-size: 12px;
1607
- color: rgba(255, 255, 255, 0.85);
1616
+ color: var(--cratis-text-color);
1608
1617
  line-height: 1.45;
1609
1618
  white-space: pre-wrap;
1610
1619
  word-break: break-word;
@@ -1612,7 +1621,7 @@
1612
1621
 
1613
1622
  .chat-bubble-time {
1614
1623
  font-size: 10px;
1615
- color: rgba(255, 255, 255, 0.3);
1624
+ color: var(--cratis-text-color-secondary);
1616
1625
  padding-left: 2px;
1617
1626
  }
1618
1627
 
@@ -1704,24 +1713,24 @@
1704
1713
  /* Copyright (c) Cratis. All rights reserved. */
1705
1714
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
1706
1715
 
1707
- /* The compose row lives inside the chat panel, which is a dark surface of its own — these colors
1708
- match that panel deliberately rather than following the light/dark theme tokens. */
1716
+ /* Every color comes from the --cratis-* token seam, so the compose row follows whatever theme the
1717
+ host runs. */
1709
1718
  .chat-composer {
1710
1719
  position: relative;
1711
1720
  display: flex;
1712
1721
  align-items: flex-end;
1713
1722
  gap: 6px;
1714
1723
  padding: 8px 10px 10px;
1715
- border-top: 1px solid rgba(255, 255, 255, 0.08);
1724
+ border-top: 1px solid var(--cratis-surface-border);
1716
1725
  flex-shrink: 0;
1717
1726
  }
1718
1727
 
1719
1728
  .chat-composer__input {
1720
1729
  flex: 1;
1721
- background: rgba(255, 255, 255, 0.07);
1722
- border: 1px solid rgba(255, 255, 255, 0.1);
1730
+ background: var(--cratis-surface-0);
1731
+ border: 1px solid var(--cratis-surface-border);
1723
1732
  border-radius: 8px;
1724
- color: rgba(255, 255, 255, 0.85);
1733
+ color: var(--cratis-text-color);
1725
1734
  font-size: 12px;
1726
1735
  padding: 6px 8px;
1727
1736
  resize: none;
@@ -1732,16 +1741,16 @@
1732
1741
  }
1733
1742
 
1734
1743
  .chat-composer__input::placeholder {
1735
- color: rgba(255, 255, 255, 0.3);
1744
+ color: var(--cratis-text-color-secondary);
1736
1745
  }
1737
1746
 
1738
1747
  .chat-composer__input:focus {
1739
- border-color: rgba(99, 102, 241, 0.6);
1748
+ border-color: var(--cratis-primary-color);
1740
1749
  }
1741
1750
 
1742
1751
  .chat-composer__emoji-toggle {
1743
- background: rgba(255, 255, 255, 0.07);
1744
- border: 1px solid rgba(255, 255, 255, 0.1);
1752
+ background: var(--cratis-surface-100);
1753
+ border: 1px solid var(--cratis-surface-border);
1745
1754
  border-radius: 8px;
1746
1755
  width: 32px;
1747
1756
  height: 32px;
@@ -1749,7 +1758,7 @@
1749
1758
  align-items: center;
1750
1759
  justify-content: center;
1751
1760
  cursor: pointer;
1752
- color: rgba(255, 255, 255, 0.55);
1761
+ color: var(--cratis-text-color-secondary);
1753
1762
  font-size: 15px;
1754
1763
  line-height: 1;
1755
1764
  flex-shrink: 0;
@@ -1757,12 +1766,12 @@
1757
1766
  }
1758
1767
 
1759
1768
  .chat-composer__emoji-toggle:hover {
1760
- background: rgba(255, 255, 255, 0.14);
1761
- color: rgba(255, 255, 255, 0.85);
1769
+ background: var(--cratis-surface-hover);
1770
+ color: var(--cratis-text-color);
1762
1771
  }
1763
1772
 
1764
1773
  .chat-composer__send {
1765
- background: #6366f1;
1774
+ background: var(--cratis-primary-color);
1766
1775
  border: none;
1767
1776
  border-radius: 8px;
1768
1777
  width: 32px;
@@ -1771,13 +1780,13 @@
1771
1780
  align-items: center;
1772
1781
  justify-content: center;
1773
1782
  cursor: pointer;
1774
- color: #fff;
1783
+ color: var(--cratis-primary-color-text);
1775
1784
  flex-shrink: 0;
1776
1785
  transition: background 0.12s, opacity 0.12s;
1777
1786
  }
1778
1787
 
1779
1788
  .chat-composer__send:hover:not(:disabled) {
1780
- background: #4f46e5;
1789
+ background: var(--cratis-primary-600);
1781
1790
  }
1782
1791
 
1783
1792
  .chat-composer__send:disabled {
@@ -1789,6 +1798,9 @@
1789
1798
  /* Copyright (c) Cratis. All rights reserved. */
1790
1799
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
1791
1800
 
1801
+ /* Every color comes from the --cratis-* token seam, so the bubble follows whatever theme the host
1802
+ runs. */
1803
+
1792
1804
  /* The positioning context for the corner buttons — the message panel itself, so they straddle its
1793
1805
  bottom edge rather than sitting below whatever else the bubble carries. */
1794
1806
  .chat-bubble-panel {
@@ -1821,7 +1833,7 @@
1821
1833
 
1822
1834
  /* A stroke around a solid fill: the button lies across the bubble's edge, so a translucent fill would
1823
1835
  let that edge run straight through it and stop it reading as one round control. The fill is the
1824
- panel's own color, which is what the half hanging outside is sitting on. */
1836
+ panel's own surface, which is what the half hanging outside is sitting on. */
1825
1837
  .chat-bubble-action {
1826
1838
  display: flex;
1827
1839
  align-items: center;
@@ -1829,10 +1841,10 @@
1829
1841
  width: 22px;
1830
1842
  height: 22px;
1831
1843
  padding: 0;
1832
- border: 1px solid rgba(255, 255, 255, 0.28);
1844
+ border: 1px solid var(--cratis-surface-border);
1833
1845
  border-radius: 999px;
1834
- background: #24243a;
1835
- color: rgba(255, 255, 255, 0.55);
1846
+ background: var(--cratis-surface-overlay);
1847
+ color: var(--cratis-text-color-secondary);
1836
1848
  font-size: 12px;
1837
1849
  line-height: 1;
1838
1850
  cursor: pointer;
@@ -1840,17 +1852,17 @@
1840
1852
 
1841
1853
  .chat-bubble-action:hover,
1842
1854
  .chat-bubble-action:focus-visible {
1843
- border-color: rgba(255, 255, 255, 0.55);
1844
- background: #32324e;
1845
- color: rgba(255, 255, 255, 0.95);
1855
+ border-color: var(--cratis-text-color-secondary);
1856
+ background: var(--cratis-surface-hover);
1857
+ color: var(--cratis-text-color);
1846
1858
  }
1847
1859
 
1848
1860
  /* Once a person has reacted, the button shows their emoji as real state rather than a hover-only
1849
1861
  affordance, so it stays visible without hovering. */
1850
1862
  .chat-bubble-action--own-reaction {
1851
- border-color: rgba(255, 255, 255, 0.45);
1852
- background: #32324e;
1853
- color: rgba(255, 255, 255, 0.9);
1863
+ border-color: var(--cratis-text-color-secondary);
1864
+ background: var(--cratis-surface-hover);
1865
+ color: var(--cratis-text-color);
1854
1866
  font-size: 13px;
1855
1867
  }
1856
1868
 
@@ -1858,16 +1870,17 @@
1858
1870
  /* Copyright (c) Cratis. All rights reserved. */
1859
1871
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
1860
1872
 
1861
- /* Sits over the dark chat panel, so its colors match that panel deliberately rather than the
1862
- light/dark theme tokens — the same convention ReactionPicker.css and MentionSuggestions.css follow. */
1873
+ /* Every color comes from the --cratis-* token seam, so the picker follows whatever theme the host
1874
+ runs — the same convention ReactionPicker.css and MentionSuggestions.css
1875
+ follow. */
1863
1876
  .emoji-picker {
1864
1877
  display: flex;
1865
1878
  flex-direction: column;
1866
1879
  width: 296px;
1867
- background: #262637;
1868
- border: 1px solid rgba(255, 255, 255, 0.12);
1880
+ background: var(--cratis-surface-overlay);
1881
+ border: 1px solid var(--cratis-surface-border);
1869
1882
  border-radius: 12px;
1870
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.55);
1883
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.35);
1871
1884
  overflow: hidden;
1872
1885
  }
1873
1886
 
@@ -1898,19 +1911,19 @@
1898
1911
 
1899
1912
  .emoji-picker__emoji:hover,
1900
1913
  .emoji-picker__emoji:focus-visible {
1901
- background: rgba(255, 255, 255, 0.12);
1914
+ background: var(--cratis-surface-hover);
1902
1915
  }
1903
1916
 
1904
1917
  .emoji-picker__emoji--selected {
1905
- background: rgba(99, 102, 241, 0.35);
1918
+ background: var(--cratis-highlight-bg);
1906
1919
  }
1907
1920
 
1908
1921
  .emoji-picker__tabs {
1909
1922
  display: flex;
1910
1923
  gap: 2px;
1911
1924
  padding: 6px;
1912
- border-top: 1px solid rgba(255, 255, 255, 0.1);
1913
- background: rgba(0, 0, 0, 0.2);
1925
+ border-top: 1px solid var(--cratis-surface-border);
1926
+ background: var(--cratis-surface-ground);
1914
1927
  }
1915
1928
 
1916
1929
  .emoji-picker__tab {
@@ -1937,7 +1950,7 @@
1937
1950
  }
1938
1951
 
1939
1952
  .emoji-picker__tab--current {
1940
- background: rgba(255, 255, 255, 0.12);
1953
+ background: var(--cratis-surface-hover);
1941
1954
  filter: none;
1942
1955
  opacity: 1;
1943
1956
  }
@@ -1946,16 +1959,16 @@
1946
1959
  /* Copyright (c) Cratis. All rights reserved. */
1947
1960
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
1948
1961
 
1949
- /* Rendered inside the chat panel, which is a dark surface of its own these colors match that
1950
- panel deliberately rather than following the light/dark theme tokens, the same way the typing
1951
- indicator beside it does. */
1962
+ /* Every color comes from the --cratis-* token seam, so the failure line follows whatever theme
1963
+ the host runs. The warning tint is mixed from the orange token because
1964
+ the seam ships no alpha variants. */
1952
1965
  .chat-failed-reply {
1953
1966
  display: flex;
1954
1967
  flex-direction: column;
1955
1968
  gap: 4px;
1956
1969
  padding: 6px 8px;
1957
- border-left: 2px solid rgba(248, 180, 100, 0.65);
1958
- background: rgba(248, 180, 100, 0.08);
1970
+ border-left: 2px solid var(--cratis-orange-500);
1971
+ background: color-mix(in srgb, var(--cratis-orange-500) 10%, transparent);
1959
1972
  border-radius: 0 6px 6px 0;
1960
1973
  }
1961
1974
 
@@ -1967,12 +1980,12 @@
1967
1980
 
1968
1981
  .chat-failed-reply__icon {
1969
1982
  font-size: 12px;
1970
- color: rgba(248, 180, 100, 0.9);
1983
+ color: var(--cratis-orange-500);
1971
1984
  }
1972
1985
 
1973
1986
  .chat-failed-reply__text {
1974
1987
  font-size: 12px;
1975
- color: rgba(255, 255, 255, 0.75);
1988
+ color: var(--cratis-text-color);
1976
1989
  }
1977
1990
 
1978
1991
  .chat-failed-reply__actions {
@@ -1987,21 +2000,21 @@
1987
2000
  border: none;
1988
2001
  padding: 0;
1989
2002
  font-size: 11px;
1990
- color: rgba(255, 255, 255, 0.55);
2003
+ color: var(--cratis-text-color-secondary);
1991
2004
  text-decoration: underline;
1992
2005
  cursor: pointer;
1993
2006
  }
1994
2007
 
1995
2008
  .chat-failed-reply__action:hover {
1996
- color: rgba(255, 255, 255, 0.9);
2009
+ color: var(--cratis-text-color);
1997
2010
  }
1998
2011
 
1999
2012
  .chat-failed-reply__detail {
2000
2013
  margin: 0;
2001
2014
  padding: 12px;
2002
2015
  border-radius: 6px;
2003
- background: var(--surface-100);
2004
- color: var(--text-color);
2016
+ background: var(--cratis-surface-100);
2017
+ color: var(--cratis-text-color);
2005
2018
  font-size: 12px;
2006
2019
  line-height: 1.5;
2007
2020
  white-space: pre-wrap;
@@ -2014,8 +2027,8 @@
2014
2027
  /* Copyright (c) Cratis. All rights reserved. */
2015
2028
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
2016
2029
 
2017
- /* Sits above the compose row inside the chat panel, which is a dark surface of its own — the colors
2018
- here match that panel deliberately rather than following the light/dark theme tokens. */
2030
+ /* Sits above the compose row inside the chat panel. Every color comes from the --cratis-* token
2031
+ seam, so the list follows whatever theme the host runs. */
2019
2032
  .mention-suggestions {
2020
2033
  position: absolute;
2021
2034
  bottom: calc(100% + 4px);
@@ -2023,10 +2036,10 @@
2023
2036
  right: 8px;
2024
2037
  max-height: 180px;
2025
2038
  overflow-y: auto;
2026
- background: #262637;
2027
- border: 1px solid rgba(255, 255, 255, 0.12);
2039
+ background: var(--cratis-surface-overlay);
2040
+ border: 1px solid var(--cratis-surface-border);
2028
2041
  border-radius: 10px;
2029
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
2042
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
2030
2043
  padding: 4px;
2031
2044
  display: flex;
2032
2045
  flex-direction: column;
@@ -2043,14 +2056,15 @@
2043
2056
  border: none;
2044
2057
  border-radius: 7px;
2045
2058
  background: transparent;
2046
- color: rgba(255, 255, 255, 0.85);
2059
+ color: var(--cratis-text-color);
2047
2060
  font-size: 12px;
2048
2061
  text-align: left;
2049
2062
  cursor: pointer;
2050
2063
  }
2051
2064
 
2052
2065
  .mention-suggestions__item--highlighted {
2053
- background: rgba(99, 102, 241, 0.35);
2066
+ background: var(--cratis-highlight-bg);
2067
+ color: var(--cratis-highlight-text-color);
2054
2068
  }
2055
2069
 
2056
2070
  .mention-suggestions__name {
@@ -2063,8 +2077,8 @@
2063
2077
  /* Copyright (c) Cratis. All rights reserved. */
2064
2078
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
2065
2079
 
2066
- /* Sits inside a chat bubble's dark panel colors match that panel deliberately, the same convention
2067
- ReactionPicker.css and MentionSuggestions.css follow. */
2080
+ /* Every color comes from the --cratis-* token seam, so the badges follow whatever theme the host
2081
+ runs. */
2068
2082
  .message-reactions {
2069
2083
  position: relative;
2070
2084
  display: flex;
@@ -2082,14 +2096,14 @@
2082
2096
  align-items: center;
2083
2097
  gap: 2px;
2084
2098
  padding: 2px 6px 2px 4px;
2085
- border: 1px solid rgba(255, 255, 255, 0.12);
2099
+ border: 1px solid var(--cratis-surface-border);
2086
2100
  border-radius: 999px;
2087
- background: rgba(255, 255, 255, 0.06);
2101
+ background: var(--cratis-surface-100);
2088
2102
  cursor: pointer;
2089
2103
  }
2090
2104
 
2091
2105
  .message-reactions__badge:hover {
2092
- background: rgba(255, 255, 255, 0.12);
2106
+ background: var(--cratis-surface-hover);
2093
2107
  }
2094
2108
 
2095
2109
  /* A stack of the same emoji from different people overlaps slightly rather than repeating flat. */
@@ -2108,17 +2122,17 @@
2108
2122
 
2109
2123
  .message-reactions__count {
2110
2124
  font-size: 10px;
2111
- color: rgba(255, 255, 255, 0.6);
2125
+ color: var(--cratis-text-color-secondary);
2112
2126
  }
2113
2127
 
2114
2128
  /* Positioned by AnchoredOverlay, which portals it to <body> — so this only describes the bubble
2115
2129
  itself, never where it sits. */
2116
2130
  .message-reactions__tooltip {
2117
2131
  min-width: 120px;
2118
- background: #262637;
2119
- border: 1px solid rgba(255, 255, 255, 0.12);
2132
+ background: var(--cratis-surface-overlay);
2133
+ border: 1px solid var(--cratis-surface-border);
2120
2134
  border-radius: 10px;
2121
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
2135
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
2122
2136
  padding: 6px 8px;
2123
2137
  display: flex;
2124
2138
  flex-direction: column;
@@ -2138,7 +2152,7 @@
2138
2152
 
2139
2153
  .message-reactions__tooltip-name {
2140
2154
  font-size: 11px;
2141
- color: rgba(255, 255, 255, 0.85);
2155
+ color: var(--cratis-text-color);
2142
2156
  white-space: nowrap;
2143
2157
  }
2144
2158
 
@@ -2148,8 +2162,8 @@
2148
2162
 
2149
2163
  /* Portaled to <body> by AnchoredOverlay rather than positioned by its parent: the chat panel is a
2150
2164
  scrolling sidebar, and anything positioned inside it is clipped the moment it reaches the edge.
2151
- Colors match that dark panel deliberately rather than the light/dark theme tokens (see
2152
- MentionSuggestions.css for the same convention). */
2165
+ Every color comes from the --cratis-* token seam, so the picker follows whatever theme the host
2166
+ runs. */
2153
2167
  .reaction-picker {
2154
2168
  display: flex;
2155
2169
  flex-direction: column;
@@ -2161,10 +2175,10 @@
2161
2175
  display: flex;
2162
2176
  gap: 2px;
2163
2177
  align-items: center;
2164
- background: #262637;
2165
- border: 1px solid rgba(255, 255, 255, 0.12);
2178
+ background: var(--cratis-surface-overlay);
2179
+ border: 1px solid var(--cratis-surface-border);
2166
2180
  border-radius: 999px;
2167
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
2181
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
2168
2182
  padding: 4px;
2169
2183
  }
2170
2184
 
@@ -2185,11 +2199,11 @@
2185
2199
 
2186
2200
  .reaction-picker__item:hover,
2187
2201
  .reaction-picker__item:focus-visible {
2188
- background: rgba(255, 255, 255, 0.12);
2202
+ background: var(--cratis-surface-hover);
2189
2203
  }
2190
2204
 
2191
2205
  .reaction-picker__item--selected {
2192
- background: rgba(99, 102, 241, 0.35);
2206
+ background: var(--cratis-highlight-bg);
2193
2207
  }
2194
2208
 
2195
2209
  /* Deliberately the quiet one on the row: it opens the rest of the emojis rather than being an emoji,
@@ -2205,8 +2219,8 @@
2205
2219
  padding: 0;
2206
2220
  border: none;
2207
2221
  border-radius: 999px;
2208
- background: rgba(255, 255, 255, 0.08);
2209
- color: rgba(255, 255, 255, 0.45);
2222
+ background: var(--cratis-surface-100);
2223
+ color: var(--cratis-text-color-secondary);
2210
2224
  font-size: 15px;
2211
2225
  line-height: 1;
2212
2226
  cursor: pointer;
@@ -2215,8 +2229,8 @@
2215
2229
  .reaction-picker__more:hover,
2216
2230
  .reaction-picker__more:focus-visible,
2217
2231
  .reaction-picker__more--open {
2218
- background: rgba(255, 255, 255, 0.16);
2219
- color: rgba(255, 255, 255, 0.85);
2232
+ background: var(--cratis-surface-hover);
2233
+ color: var(--cratis-text-color);
2220
2234
  }
2221
2235
 
2222
2236
  /* Who has reacted so far, under the quick row — the same list a badge shows, so opening the picker
@@ -2228,10 +2242,10 @@
2228
2242
  align-self: stretch;
2229
2243
  max-height: 148px;
2230
2244
  overflow-y: auto;
2231
- background: #262637;
2232
- border: 1px solid rgba(255, 255, 255, 0.12);
2245
+ background: var(--cratis-surface-overlay);
2246
+ border: 1px solid var(--cratis-surface-border);
2233
2247
  border-radius: 10px;
2234
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
2248
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
2235
2249
  padding: 6px 8px;
2236
2250
  }
2237
2251
 
@@ -2248,7 +2262,7 @@
2248
2262
 
2249
2263
  .reaction-picker__given-name {
2250
2264
  font-size: 11px;
2251
- color: rgba(255, 255, 255, 0.85);
2265
+ color: var(--cratis-text-color);
2252
2266
  white-space: nowrap;
2253
2267
  }
2254
2268
 
@@ -2256,8 +2270,8 @@
2256
2270
  /* Copyright (c) Cratis. All rights reserved. */
2257
2271
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
2258
2272
 
2259
- /* Rendered inside the chat panel, which is a dark surface of its own these colors match that
2260
- panel deliberately rather than following the light/dark theme tokens. */
2273
+ /* Every color comes from the --cratis-* token seam, so the indicator follows whatever theme the
2274
+ host runs. */
2261
2275
  .chat-typing {
2262
2276
  display: flex;
2263
2277
  align-items: center;
@@ -2276,7 +2290,7 @@
2276
2290
 
2277
2291
  .chat-typing__label {
2278
2292
  font-size: 11px;
2279
- color: rgba(255, 255, 255, 0.5);
2293
+ color: var(--cratis-text-color-secondary);
2280
2294
  }
2281
2295
 
2282
2296
  .chat-typing__dots {
@@ -2290,7 +2304,7 @@
2290
2304
  width: 5px;
2291
2305
  height: 5px;
2292
2306
  border-radius: 50%;
2293
- background: rgba(255, 255, 255, 0.55);
2307
+ background: var(--cratis-text-color-secondary);
2294
2308
  animation: chat-typing-jump 1.2s infinite ease-in-out;
2295
2309
  }
2296
2310
 
@@ -2584,6 +2598,335 @@
2584
2598
  pointer-events: auto;
2585
2599
  }
2586
2600
 
2601
+ /* ── ./Chat/ChatConversation.css ─────────────────────────────────────── */
2602
+ /* Copyright (c) Cratis. All rights reserved. */
2603
+ /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
2604
+
2605
+ /* Every color comes from the --cratis-* token seam so the conversation follows whatever theme the
2606
+ host runs. */
2607
+ .cratis-chat-conversation {
2608
+ flex: 1;
2609
+ min-height: 0;
2610
+ display: flex;
2611
+ flex-direction: column;
2612
+ }
2613
+
2614
+ .cratis-chat-conversation__messages {
2615
+ flex: 1;
2616
+ min-height: 0;
2617
+ overflow-y: auto;
2618
+ padding: 0.75rem;
2619
+ display: flex;
2620
+ flex-direction: column;
2621
+ gap: 0.875rem;
2622
+ }
2623
+
2624
+ .cratis-chat-conversation__empty {
2625
+ margin: 0;
2626
+ padding: 1rem 0;
2627
+ text-align: center;
2628
+ font-size: 0.8125rem;
2629
+ color: var(--cratis-text-color-secondary);
2630
+ }
2631
+
2632
+ .cratis-chat-message {
2633
+ display: flex;
2634
+ flex-direction: column;
2635
+ gap: 0.25rem;
2636
+ }
2637
+
2638
+ .cratis-chat-message--continuation {
2639
+ margin-top: -0.625rem;
2640
+ }
2641
+
2642
+ .cratis-chat-message__author {
2643
+ display: flex;
2644
+ align-items: center;
2645
+ gap: 0.5rem;
2646
+ }
2647
+
2648
+ .cratis-chat-message__author-name {
2649
+ font-size: 0.8125rem;
2650
+ font-weight: 600;
2651
+ color: var(--cratis-text-color);
2652
+ }
2653
+
2654
+ .cratis-chat-message__content {
2655
+ display: flex;
2656
+ flex-direction: column;
2657
+ gap: 0.125rem;
2658
+ }
2659
+
2660
+ .cratis-chat-message__panel {
2661
+ position: relative;
2662
+ background: var(--cratis-surface-section);
2663
+ border: 1px solid var(--cratis-surface-border);
2664
+ border-radius: var(--cratis-border-radius);
2665
+ padding: 0.5rem 0.625rem;
2666
+ }
2667
+
2668
+ .cratis-chat-message__body {
2669
+ margin: 0;
2670
+ font-size: 0.8125rem;
2671
+ line-height: 1.45;
2672
+ color: var(--cratis-text-color);
2673
+ white-space: pre-wrap;
2674
+ overflow-wrap: anywhere;
2675
+ }
2676
+
2677
+ .cratis-chat-message__mention {
2678
+ color: var(--cratis-primary-color);
2679
+ background: var(--cratis-highlight-bg);
2680
+ border-radius: 4px;
2681
+ padding: 0 0.2em;
2682
+ font-weight: 600;
2683
+ }
2684
+
2685
+ .cratis-chat-message__mention[data-kind='agent'] {
2686
+ text-decoration: underline dotted;
2687
+ text-underline-offset: 2px;
2688
+ }
2689
+
2690
+ /* The action buttons hang over the message's top-right corner and only show while the message is
2691
+ hovered — or while one of them holds keyboard focus, which is why they hide through opacity
2692
+ rather than display (a display:none button can never receive focus in the first place). */
2693
+ .cratis-chat-message__actions {
2694
+ position: absolute;
2695
+ top: -0.75rem;
2696
+ right: 0.375rem;
2697
+ display: flex;
2698
+ gap: 2px;
2699
+ padding: 2px;
2700
+ background: var(--cratis-surface-overlay);
2701
+ border: 1px solid var(--cratis-surface-border);
2702
+ border-radius: 6px;
2703
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
2704
+ opacity: 0;
2705
+ pointer-events: none;
2706
+ transition: opacity 0.12s;
2707
+ }
2708
+
2709
+ .cratis-chat-message:hover .cratis-chat-message__actions,
2710
+ .cratis-chat-message__actions:focus-within {
2711
+ opacity: 1;
2712
+ pointer-events: auto;
2713
+ }
2714
+
2715
+ .cratis-chat-message__action {
2716
+ background: transparent;
2717
+ border: none;
2718
+ border-radius: 4px;
2719
+ width: 1.5rem;
2720
+ height: 1.5rem;
2721
+ display: flex;
2722
+ align-items: center;
2723
+ justify-content: center;
2724
+ cursor: pointer;
2725
+ color: var(--cratis-text-color-secondary);
2726
+ font-size: 0.75rem;
2727
+ transition: background 0.12s, color 0.12s;
2728
+ }
2729
+
2730
+ .cratis-chat-message__action:hover {
2731
+ background: var(--cratis-surface-hover);
2732
+ color: var(--cratis-text-color);
2733
+ }
2734
+
2735
+ .cratis-chat-message__time {
2736
+ font-size: 0.6875rem;
2737
+ color: var(--cratis-text-color-secondary);
2738
+ padding-left: 0.125rem;
2739
+ }
2740
+
2741
+ /* ── ./Chat/ChatSidebar.css ─────────────────────────────────────── */
2742
+ /* Copyright (c) Cratis. All rights reserved. */
2743
+ /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
2744
+
2745
+ /* Baseline chat sidebar — a panel needs a visible surface even before a theme preset is applied,
2746
+ so this ships a token-based default that a preset or `pt` can still override. Every color comes
2747
+ from the --cratis-* token seam so the sidebar follows whatever theme the host runs. */
2748
+ .cratis-chat-sidebar {
2749
+ position: fixed;
2750
+ top: 0;
2751
+ bottom: 0;
2752
+ right: 0;
2753
+ display: flex;
2754
+ flex-direction: column;
2755
+ background: var(--cratis-surface-overlay);
2756
+ color: var(--cratis-text-color);
2757
+ border-left: 1px solid var(--cratis-surface-border);
2758
+ box-shadow: 0 0 24px rgba(0, 0, 0, 0.35);
2759
+ z-index: 1100;
2760
+ }
2761
+
2762
+ .cratis-chat-sidebar[data-position='left'] {
2763
+ left: 0;
2764
+ right: auto;
2765
+ border-left: none;
2766
+ border-right: 1px solid var(--cratis-surface-border);
2767
+ }
2768
+
2769
+ .cratis-chat-sidebar__header {
2770
+ display: flex;
2771
+ align-items: center;
2772
+ gap: 0.5rem;
2773
+ padding: 0.75rem 1rem;
2774
+ border-bottom: 1px solid var(--cratis-surface-border);
2775
+ flex-shrink: 0;
2776
+ }
2777
+
2778
+ .cratis-chat-sidebar__title {
2779
+ flex: 1;
2780
+ min-width: 0;
2781
+ font-size: 0.9375rem;
2782
+ font-weight: 600;
2783
+ overflow: hidden;
2784
+ text-overflow: ellipsis;
2785
+ white-space: nowrap;
2786
+ }
2787
+
2788
+ .cratis-chat-sidebar__title--pending {
2789
+ font-style: italic;
2790
+ font-weight: 400;
2791
+ color: var(--cratis-text-color-secondary);
2792
+ }
2793
+
2794
+ .cratis-chat-sidebar__back,
2795
+ .cratis-chat-sidebar__close {
2796
+ background: transparent;
2797
+ border: none;
2798
+ border-radius: var(--cratis-border-radius);
2799
+ width: 1.75rem;
2800
+ height: 1.75rem;
2801
+ display: flex;
2802
+ align-items: center;
2803
+ justify-content: center;
2804
+ cursor: pointer;
2805
+ color: var(--cratis-text-color-secondary);
2806
+ font-size: 0.875rem;
2807
+ flex-shrink: 0;
2808
+ transition: color 0.12s, background 0.12s;
2809
+ }
2810
+
2811
+ .cratis-chat-sidebar__back:hover,
2812
+ .cratis-chat-sidebar__close:hover {
2813
+ background: var(--cratis-surface-hover);
2814
+ color: var(--cratis-text-color);
2815
+ }
2816
+
2817
+ .cratis-chat-sidebar__content {
2818
+ flex: 1;
2819
+ min-height: 0;
2820
+ display: flex;
2821
+ flex-direction: column;
2822
+ overflow: hidden;
2823
+ }
2824
+
2825
+ /* ── ./Chat/ChatTopicList.css ─────────────────────────────────────── */
2826
+ /* Copyright (c) Cratis. All rights reserved. */
2827
+ /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
2828
+
2829
+ /* Every color comes from the --cratis-* token seam so the list follows whatever theme the host
2830
+ runs. */
2831
+ .cratis-chat-topics {
2832
+ flex: 1;
2833
+ min-height: 0;
2834
+ display: flex;
2835
+ flex-direction: column;
2836
+ gap: 0.5rem;
2837
+ padding: 0.75rem;
2838
+ overflow-y: auto;
2839
+ }
2840
+
2841
+ .cratis-chat-topics__start {
2842
+ align-self: flex-start;
2843
+ display: inline-flex;
2844
+ align-items: center;
2845
+ gap: 0.4rem;
2846
+ background: var(--cratis-primary-color);
2847
+ color: var(--cratis-primary-color-text);
2848
+ border: none;
2849
+ border-radius: var(--cratis-border-radius);
2850
+ padding: 0.4rem 0.75rem;
2851
+ font-size: 0.8125rem;
2852
+ cursor: pointer;
2853
+ transition: background 0.12s;
2854
+ }
2855
+
2856
+ .cratis-chat-topics__start:hover {
2857
+ background: var(--cratis-primary-600);
2858
+ }
2859
+
2860
+ .cratis-chat-topics__empty {
2861
+ margin: 0;
2862
+ padding: 1rem 0;
2863
+ text-align: center;
2864
+ font-size: 0.8125rem;
2865
+ color: var(--cratis-text-color-secondary);
2866
+ }
2867
+
2868
+ .cratis-chat-topics__list {
2869
+ display: flex;
2870
+ flex-direction: column;
2871
+ gap: 2px;
2872
+ }
2873
+
2874
+ .cratis-chat-topics__topic {
2875
+ display: flex;
2876
+ align-items: center;
2877
+ gap: 0.625rem;
2878
+ width: 100%;
2879
+ padding: 0.5rem 0.625rem;
2880
+ background: transparent;
2881
+ border: none;
2882
+ border-radius: var(--cratis-border-radius);
2883
+ text-align: left;
2884
+ cursor: pointer;
2885
+ color: var(--cratis-text-color);
2886
+ transition: background 0.12s;
2887
+ }
2888
+
2889
+ .cratis-chat-topics__topic:hover {
2890
+ background: var(--cratis-surface-hover);
2891
+ }
2892
+
2893
+ .cratis-chat-topics__details {
2894
+ flex: 1;
2895
+ min-width: 0;
2896
+ display: flex;
2897
+ flex-direction: column;
2898
+ gap: 0.125rem;
2899
+ }
2900
+
2901
+ .cratis-chat-topics__name {
2902
+ font-size: 0.875rem;
2903
+ font-weight: 600;
2904
+ overflow: hidden;
2905
+ text-overflow: ellipsis;
2906
+ white-space: nowrap;
2907
+ }
2908
+
2909
+ .cratis-chat-topics__name--pending {
2910
+ font-style: italic;
2911
+ font-weight: 400;
2912
+ color: var(--cratis-text-color-secondary);
2913
+ }
2914
+
2915
+ .cratis-chat-topics__started-by {
2916
+ font-size: 0.75rem;
2917
+ color: var(--cratis-text-color-secondary);
2918
+ overflow: hidden;
2919
+ text-overflow: ellipsis;
2920
+ white-space: nowrap;
2921
+ }
2922
+
2923
+ .cratis-chat-topics__activity {
2924
+ align-self: flex-start;
2925
+ flex-shrink: 0;
2926
+ font-size: 0.6875rem;
2927
+ color: var(--cratis-text-color-secondary);
2928
+ }
2929
+
2587
2930
  /* ── ./CommandDialog/CommandStepper.css ─────────────────────────────────────── */
2588
2931
  /* Copyright (c) Cratis. All rights reserved. */
2589
2932
  /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
@@ -2612,11 +2955,38 @@
2612
2955
  opacity: 0.5;
2613
2956
  }
2614
2957
 
2958
+ /* The header button has no built-in spacing between its number badge and
2959
+ title in v11 — without this, consecutive steps read as "1Basic Info2Details". */
2960
+ .cratis-command-stepper [data-scope="stepper"][data-part="header"] {
2961
+ display: flex;
2962
+ align-items: center;
2963
+ gap: 0.5rem;
2964
+ }
2965
+
2966
+ .cratis-command-stepper [data-scope="stepper"][data-part="number"] {
2967
+ display: inline-flex;
2968
+ align-items: center;
2969
+ justify-content: center;
2970
+ flex-shrink: 0;
2971
+ width: 1.75rem;
2972
+ height: 1.75rem;
2973
+ border-radius: 50%;
2974
+ background: var(--cratis-surface-hover);
2975
+ color: var(--cratis-text-color);
2976
+ font-size: 0.85rem;
2977
+ }
2978
+
2979
+ .cratis-command-stepper [data-scope="stepper"][data-part="step"][data-active] [data-part="number"] {
2980
+ background: var(--cratis-primary-color);
2981
+ color: var(--cratis-primary-color-text);
2982
+ }
2983
+
2615
2984
  /* Horizontal (default): the step list flows left-to-right. */
2616
2985
  .cratis-command-stepper--horizontal [data-scope="stepper"][data-part="list"] {
2617
2986
  display: flex;
2618
2987
  flex-direction: row;
2619
2988
  align-items: center;
2989
+ gap: 1rem;
2620
2990
  }
2621
2991
 
2622
2992
  /* Vertical: the step list is a stacked column beside the panels. */
@@ -2796,6 +3166,32 @@
2796
3166
  padding: 0 0.5rem;
2797
3167
  }
2798
3168
 
3169
+ /* ── ./Display/ProgressSpinner.css ─────────────────────────────────────── */
3170
+ /* Copyright (c) Cratis. All rights reserved. */
3171
+ /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
3172
+
3173
+ /* PrimeReact 11's ProgressSpinner primitive is a bare, unsized, unstroked SVG circle
3174
+ pair (Track + Range) with no built-in visual — give it a size, a visible ring and
3175
+ motion unconditionally, so it renders in every styling path (unstyled, baseline
3176
+ theme, styled mode), not only when the baseline theme opts in. */
3177
+ [data-scope='progressspinner'][data-part='root'] {
3178
+ display: inline-block;
3179
+ width: 2.5rem;
3180
+ height: 2.5rem;
3181
+ animation: cratis-progressspinner-spin 1s linear infinite;
3182
+ }
3183
+ [data-scope='progressspinner'] svg { width: 100%; height: 100%; }
3184
+ [data-scope='progressspinner'] circle {
3185
+ fill: none;
3186
+ stroke: var(--cratis-primary-color, #3b82f6);
3187
+ stroke-width: 4;
3188
+ stroke-linecap: round;
3189
+ stroke-dasharray: 80 200;
3190
+ }
3191
+ @keyframes cratis-progressspinner-spin {
3192
+ to { transform: rotate(360deg); }
3193
+ }
3194
+
2799
3195
  /* ── ./Filter/FilterPanel.css ─────────────────────────────────────── */
2800
3196
  /* -----------------------------------------------------------------------
2801
3197
  * Standalone FilterPanel styles.
@@ -4637,6 +5033,13 @@
4637
5033
  .pv-toolbar {
4638
5034
  flex-wrap: wrap;
4639
5035
  gap: 1rem;
5036
+ /* The base rule pins a fixed `height: 3.5rem` for the single-row layout;
5037
+ once wrapping is enabled here, the box must grow to fit the wrapped
5038
+ rows instead of clipping them (this is `overflow: visible`, so a
5039
+ fixed height doesn't clip the extra row — it lets it spill onto
5040
+ the canvas below instead). `min-height` from the base rule still
5041
+ applies. */
5042
+ height: auto;
4640
5043
  }
4641
5044
 
4642
5045
  .pv-toolbar-right {